|
| |
19 June, 2009 (23:51) | JavaScript, Programming |
I just saw a question regarding closures in JavaScript regarding code similar to the following:
for (i=0;i<n;i++){
foo.bind( function() { bar(i); } );
}
The question was why does every closure execute bar(i) with i as the value of n for every instance, rather than whatever the value of i was when the closure was defined. He had reckoned that i was being passed by reference than by copy and found that making a copy of i in a variable local to the closure solved the problem.
But what he’s really done is confused a closure with an eval() statement. If he had written the code similar to eval(”function(){bar(”+i+”);”); he would have gotten what he wanted. The difference being that when you use eval() the variable i is determined when the eval() is executed. But with a closure, i is determined when the closure is executed, and every time the closure is executed.
It’s also important to note that the i referenced inside the enclosure is not a reference to the i in the outer loop, rather it actually IS the same i in the outer loop. No parameter passing is going on.
One other possible solution is to define the closure to take a parameter, and pass i in as a parameter to the enclosure:
for (i=0;i<n;i++){
foo.bind( function(x) { bar(x); } )(i);
}
27 October, 2008 (21:41) | Linux |
I had an old Red Had Linux system I wanted to convert to a Virtual Machine. The typical method recommended by most people is to back up the system, then restore it inside the VM. The problem I had with that is that you end up wasting a lot of time creating an image you don’t need, plus you need a storage device large enough to hold the image which can be accessed from both systems.
My solution was to create the VM with a virtual drive the size I needed. Then use a Knoppix image to initially boot the VM, once you get to a command line, use the commands below.
On the receiving server:
sudo nc -p 2222 -l | dd of=/dev/hda
On the system to be copied:
sudo dd if=/dev/hda | nc 192.168.0.56 2222
If your CPU on each device is faster than the network, you could also gain some speed by piping the data stream through bzip2. E.g. “sudo nc -p 2222 -l | bzip2 -d | dd of=/dev/hda” and “sudo dd if=/dev/hda | bzip2 -c | nc 192.168.0.56 2222″. Whether or not it’s worth it depends on the speed of your CPUs and the speed of your network.
It’s not a requirement that you boot the system being imaged from a CD, nor that you shut down any services. But, if you don’t, it’s possible you might end up with some files that aren’t in a valid state from the application’s point of view. There’s no real method I know of to monitor the progress of the copy, but you can run “fdisk /dev/hda” to verify the copy at least got started. If the copy started OK, then you’ll see partition information the same as on the system being imaged. You can also run “ifconfig” and watch the “RX bytes” field to get an idea of how much data has been transferred, but the counter will eventually overflow and start back at 0.
9 August, 2008 (14:15) | Windows |
I had just ran into an issue attempting to activate my copy of Windows 2008 Server downloaded from MSDN. The error expands to “DNS Entry not found”, although all networking features work fine. The issue was that it was attempting to validate against an Activation Server rather than Microsoft’s website. The solution was to open “System” in the Control Panel, down at the bottom of that window is a link titled “Change Product Key”. I entered my key from the MSDN website and Windows activated automatically after the key was entered.
1 August, 2008 (12:49) | JavaScript, Programming |
From what I’ve seen, the problem most people have with the difference between these two JavaScript functions isn’t knowing what they do, but it’s knowing that they both exist. I’ve seen lots of people constantly call setTimeout() calling the same function over and over where the last line of the function calls setTimeout(), but setInterval() is probably what they really wanted, they just didn’t know it existed. But I’ve also seen lots of code that calls setInterval() to execute a function after a specific delay, and the first thing that function does is call clearInterval(), so they obviously really wanted the functionality of setTimeout(). I guess it’s mostly a result of people finding one thing that gets the job done, and never looking for anything else.
The difference between the two functions is fairly trivial. setTimeout() executes the function only once, unless you call it again; and setInterval() continuously calls the function until clearInterval() is called. The only disadvantage to using setTimeout() when you really wanted the functionality of setInterval is that the time between each call will vary depending on how long it takes your code to execute (and sometimes you actually want that feature). There is some danger in using setInterval() and hoping your code is fast enough to call clearInterval() before the interval time passes. In such a case, the next call is queued and will execute your function any number of times depending on how many times the interval time passed while your code was running.
20 June, 2008 (17:28) | Programming, Humor, Computer Science |
An experiment was conducted in order to study the differences between programmers, engineers, and mathematicians. One programmer, one engineer, and one mathematician were all locked in separate classrooms for one week. Each classroom contained all of the normal things you’d find in a classroom: chalkboard, chalk, desks, etc. In addition to that each classroom contained water, one can of food (enough to feed a person for a week), but no can opener. At the end of the week, they opened the programmer’s door first. The programmer walked out. When they looked in the classroom they saw the can beat to hell, but opened. When they opened the engineer’s door, the engineer walked out. In the classroom were a bunch of equations and diagrams written on the board, one small dent in the can which was all that was required to open it. Lastly they opened the mathematician’s door. No one came out. They looked in and saw the mathematician laying dead on the floor, the can of food untouched, and a long series of equations on the chalkboard. But at the end of the equations was written the phrase: “A solution exists”.
18 June, 2008 (13:20) | JavaScript, Programming |
When you develop a Firefox extension you’re required to specify the minimum and maximum versions of Firefox which your extension is known to work with. This is done by specifying a minVersion and maxVersion in the install.rdf file inside your plugin’s archive. Since my ClearSkyPlugin isn’t likely to break in any future version of Firefox, I attempted to bypass the version checking by setting the minVersion to 1.0, and the maxVersion to 9.0.
Of course, today Firefox 3.0 was released and my extension was detected as incompatible. After some twiddling I managed to figure out I had to set the minVersion to 1.0.* to get things to work.
If you’re having trouble getting your downloaded extensions to work, you might just disable extension version checking altogether.
12 May, 2008 (15:57) | .Net, Snippets |
This uses reflection to avoid the clerical task of adding a project reference:
System.Type t = System.Type.GetTypeFromProgID("SAPI.SpVoice");
object o = System.Activator.CreateInstance(t);
t.InvokeMember("Speak", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { "test", 0 });
If you don’t mind adding a reference, then the whole thing can be done in one line:
new SpeechLib.SpVoice().Speak("This is a test", SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);
25 April, 2008 (16:45) | Java, Programming |
The documentation for System.nanoTime() (and the function’s name itself) leads developers to believe it’s a much more accurate timer than anything else Java provides. Depending on which set of documentation you read, it claims to use “the most precise available system timer”. While I can’t speak for any architecture other than x86, I can state that System.nanoTime() is broken for multi-CPU or multi-core x86 systems, and generally unreliable on all x86 systems. The problem lies in the RDTSC instruction which retrieves the number of CPU ticks since the CPU started. On multi-core systems, each core will have its own tick count, and they will not match, so every time your process switches CPUs, you get a different measurement. The issue is compounded by the fact that some power management systems actually alter the CPU’s frequency to save power, which breaks the functionality even on single core, single CPU systems.
In general, do not use System.nanoTime() in any program which you don’t plan to strongly control how it is run, and the environment it is run in.
16 March, 2008 (23:31) | Cryptography, Security, Code, Computer Science |
Below is an implementation I did of DES back in the early 90’s while I was still in college. It’s one of the first complex C programs I wrote. It served its purpose back in the day, but now more advanced algorithms and APIs have eliminated the need for such things. It’s been heavily optimized, more so than is practical in today’s world, so you probably couldn’t get it to compile even if you wanted to use it. I post it here to reminisce on my programming ability at the time, and to give an example of the complexity/simplicity of implementing an encryption algorithm.
1 #include <stdio.h>
2
3 static int keyout[17][48];
4
5 void des_init(),lshift(),cypher(),des_encrypt(),des_descrypt();
6
7 void des_init(unsigned char *key){
8 unsigned char c[28],d[28];
9 static int pc1[56] = {57,49,41,33,25,17,9,
10 01,58,50,42,34,26,18,
11 10,02,59,51,43,35,27,
12 19,11,03,60,52,44,36,
13 63,55,47,39,31,23,15,
14 07,62,54,46,38,30,22,
15 14,06,61,53,45,37,29,
16 21,13,05,28,20,12,04};
17 static int pc2[48] = {14,17,11,24,1,5,
18 3,28,15,6,21,10,
19 23,19,12,4,26,8,
20 16,7,27,20,13,2,
21 41,52,31,37,47,55,
22 30,40,51,45,33,48,
23 44,49,39,56,34,53,
24 46,42,50,36,29,32};
25 static int nls[17] = {
26 0,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
27
28 static int cd[56],keyb[64];
29 static int cnt,n=0;
30 register int i,j;
31
32 for(i=0;i<8;i++) /*Read in key*/
33 for(j=0;j<8;j++) keyb[n++]=(key[i]>>j&0×01);
34
35 for(i=0;i<56;i++) /*Permuted choice 1*/
36 cd[i]=keyb[pc1[1]-1];
37 for(i=0;i<28;i++){
38 c[i]=cd[i];
39 d[i]=cd[i+28];
40 }
41 for(cnt=1;cnt<=16;cnt++){
42 for(i=0;i<nls[cnt];i++){
43 lshift(c); lshift(d);
44 }
45 for(i=0;i<28;i++){
46 cd[i]=c[i];
47 cd[i+28]=d[i];
48 }
49 for(i=0;i<48;i++) /*Permuted Choice 2*/
50 keyout[cnt][i]=cd[pc2[i]-1];
51 }
52 }
53
54 static void lshift(unsigned char shft[]){
55 register int temp,i;
56
57 temp=shft[0];
58 for(i=0;i<27;i++) shft[i]=shft[i+1];
59 shft[27]=temp;
60 }
61
62 static void cypher(int *r, int cnt, int *fout){
63 static int expand[48],b[8][6],sout[8],pin[48];
64 register int i,j;
65 static int n,row,col,scnt;
66 static int p[32]={
67 16,7,20,21,29,12,28,17,1,15,23,26,
68 5,18,31,10,2,8,24,14,32,27,3,9,
69 19,13,30,6,22,11,4,25};
70
71 static int e[48] = {32,1,2,3,4,5,
72 4,5,6,7,8,9,
73 8,9,10,11,12,13,
74 12,13,14,15,16,17,
75 16,17,18,19,20,21,
76 20,21,22,23,24,25,
77 24,25,26,27,28,29,
78 28,29,30,31,32,1};
79
80 static char s[8][64] = {
81 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, /*s1*/
82 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
83 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
84 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,
85 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, /*s2*/
86 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
87 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
88 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,
89 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, /*s3*/
90 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
91 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
92 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,
93 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,/*s4*/
94 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
95 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
96 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,
97 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,/*s5*/
98 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
99 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
100 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,
101 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, /*s6*/
102 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
103 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
104 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,
105 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,/*s7*/
106 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
107 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
108 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,
109 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, /*s8*/
110 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
111 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
112 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11
113 };
114
115 for(i=0;i<48;i++) expand[i]=r[e[i]-1]; /*Expansion Function*/
116 for(i=n=0;i<8;i++) {
117 for(j=0;j<6;j++,n++) b[i][j]=expand[n]^keyout[cnt][n];
118 }
119
120 /*Selection functions*/
121
122 for(scnt=n=0;scnt<8;scnt++){
123 row=(b[scnt][0]<<1)+b[scnt][5];
124 col=(b[scnt][1]<<3)+(b[scnt][2]<<2)+(b[scnt][3]<<1)+b[scnt][4];
125 sout[scnt]=s[scnt][(row<<4)+col];
126 for(i=3;i>=0;i–){
127 pin[n]=sout[scnt]>>i;
128 sout[scnt]=sout[scnt]-(pin[n++]<<i);
129 }
130 }
131 for(i=0;i<32;i++) fout[i]=pin[p[i]-1]; /*Permutation Function*/
132 }
133
134 static int p[64] = {58,50,42,34,26,18,10,2,
135 60,52,44,36,28,20,12,4,
136 62,54,46,38,30,22,14,6,
137 64,56,48,40,32,24,16,8,
138 5 = {58,50,42,34,26,18,10,2,
139 60,52,44,36,28,20,12,4,
140 62,54,46,38,30,22,14,6,
141 64,56,48,40,32,24,16,8,
142 57,49,41,33,25,17,9,1,
143 59,51,43,35,27,19,11,3,
144 61,53,45,37,29,21,13,5,
145 63,55,47,39,31,23,15,7};
146
147 static int invp[64]={
148 40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
149 38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
150 36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
151 34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25};
152
153 void des_encrypt(unsigned char *input){
154 static unsigned char out[64];
155 static int inputb[64],lr[64],l[32],r[32];
156 static int fn[32];
157 static int cnt,n;
158 register int i,j;
159
160 for(i=n=0;i<8;i++)
161 for(j=0;j<8;j++) inputb[n++]=(input[i]>>j&0×01);
162
163 for(i=0;i<64;i++){ /*Initial Permutation*/
164 lr[i]=inputb[p[i]-1];
165 if(i<32) l[i]=lr[i];
166 else r[i-32]=lr[i];
167 }
168 for(cnt=1;cnt<=16;cnt++){ /*Main encryption loop*/
169 cypher(r,cnt,fn);
170 for(i=0;i<32;i++){
171 j=r[i];
172 r[i]=l[i]^fn[i];
173 l[i]=j;
174 }
175 }
176 for(i=0;i<32;i++){
177 lr[i]=r[i];
178 lr[i+32]=l[i];
179 }
180 for(i=0;i<64;i++) out[i]=lr[invp[i]-1]; /*Inverse IP*/
181
182 for(i=1;i<=8;i++)
183 for(j=1;j<=8;j++) input[i-1]=(input[i-1]<<1)|out[i*8-j];
184 }
185
186 void des_decrypt(unsigned char *input){
187 static unsigned char out[64];
188 static int inputb[64],lr[64],l[32],r[32];
189 static int fn[32];
190 static int cnt,rtemp,n;
191 register int i,j;
192
193 for(i=n=0;i<8;i++)
194 for(j=0;j<8;j++) inputb[n++]=(input[i]>>j&0×01);
195
196 for(i=0;i<64;i++){ /*Initial Permutation*/
197 lr[i]=inputb[p[i]-1];
198 if(i<32) l[i]=lr[i];
199 else r[i-32]=lr[i];
200 }
201 for(cnt=16;cnt>0;cnt–){ /*Main decryption loop*/
202 cypher(r,cnt,fn);
203 for(i=0;i<32;i++){
204 rtemp=r[i];
205 if(l[i]==1 && fn[i]==1) r[i]=0;
206 else r[i]=(l[i] || fn[i]);
207 l[i]=rtemp;
208 }
209 }
210 for(i=0;i<32;i++){
211 lr[i]=r[i];
212 lr[i+32]=l[i];
213 }
214 for(i=0;i<64;i++) out[i]=lr[invp[i]-1]; /*Inverse IP*/
215
216 for(i=1;i<=8;i++)
217 for(j=1;j<=8;j++) input[i-1]=(input[i-1]<<1) | out[i*8-j];
218 }
219
220 int main(int argc, char *argv[]){
221 unsigned char *key;
222 unsigned char data[8];
223 int n;
224 FILE *in;
225 FILE *out;
226
227 if (argc!=4) {
228 printf("rnUsage: des [e][d] <source file> <destination file>rn");
229 return 1;
230 }
231
232 key=(unsigned char*)getpass("Enter Key:");
233 des_init(key);
234
235 if((in=fopen(argv[2],"rb"))==NULL){
236 fprintf(stderr,"rnCould not open input file: %s",argv[2]);
237 return 2;
238 }
239
240 if((out=fopen(argv[3],"wb"))==NULL){
241 fprintf(stderr,"rnCould not open output file: %s",argv[3]);
242 return 3;
243 }
244
245 if(argv[1][0]==‘e’){
246 while ((n=fread(data,1,8,in)) >0){
247 des_encrypt(data);
248 printf("data enctyted");
249 if(fwrite(data,1,8,out) < 8){
250 fprintf(stderr,"rnError writing to output filern");
251 return(3);
252 }
253 }
254 }
255
256 if(argv[1][0]==‘d’){
257 while ((n=fread(data,1,8,in)) >0){
258 des_decrypt(data);
259 if(fwrite(data,1,8,out) < 8){
260 fprintf(stderr,"rnError writing to output filern");
261 return(3);
262 }
263 }
264 }
265
266 fclose(in); fclose(out);
267 return 0;
268 }ntf(stderr,"rnError writing to output filern");
269 return(3);
270 }
271 }
272 }
273
274 fclose(in); fclose(out);
275 return 0;
276 }
|