Archive: ‘journal’ Category

New Blog

1 comment March 19th, 2011

I create a new Blog with nanoc3? , static website/blog is enough for me, I think.
Here is code BTlog, and here is the demo. It’s simple now, maybe I’ll update someday…

工作为了什么

13 comments November 27th, 2010

我承认我是一个低俗的人,我像别人一样的高考,像别人一样的为了保研而争取拿那些没有嚼头的高分,像别人一样想着挣钱了买好车买房子娶漂亮极品的媳妇,当然也像别人一样拼命工作,因为我们的低俗导致了我们为了低俗的事做了更低俗的事。
我要解释一下,因为我表达能力有限,有时候多多少少在这字里行间中会使得很多人理解有所偏差,所以我得解释。我说的这个工作是指潜意识不喜欢做或者是!喜欢做的事情,之所以做这个工作不是你愿意的,不是你想做的,不是你内心中的那种可以为工作废寝忘食却依然享受在乐趣之中的工作,可能你之所以做这种工作是迫于生计,迫于压力,迫于各种舆论,总之你会有你的理由和苦衷,但是你永远不会有”歇斯底里”的快乐。(在我这,hysteria是褒义的,多少人能有这种疯狂的感觉呢)。
前阵子和板牛聊过一些关于毕业、工作之类的事情,我个人感觉现在很多大学生的思维模式和想法都是惊人的相似的,“工作两年,然后跳个巢,或者咱可以自己出去创业、单干呗”,这正常么?这tm太正常不过了,不这么想的我跟你说,你八成是有问题的,因为不这么想的就两种人:“牛逼”的和“傻逼”的;牛逼人会坚持自己的理想,任评风吹雨打,“我愿化身石桥,任伍佰年风吹雨打……”,这种人我只能说超然于外,笑看潮起潮落,而心如止水;另一类人就不用说啥了,混一辈子不知道自己干啥,不知道自己想干啥,不知道应该干啥,得了,这种人我只能说白瞎了,那么多粮食。
罗里罗唆这么多话,其实我就想知道我们的工作为了什么,还没有走入工作岗位的各位大神,想想你以后工作为了什么,正在工作前线的同胞们,想想你现在工作为了什么,毕竟人不能不问一己良知、不问一己私欲而昏昏度日,那样与猪狗又有何分别。
print '-' x 80 if you could intepret perl :D
前几日用G1的时候,发现G1这个键盘真是有点不爽,没有tab键啊!输入个命令费死劲了,所以就想:连个外置键盘吧,这多爽啊,打字速度飞一般的感觉。对面坐着小龙同学马上给我泼了盆冷水“插上不能用吧,你得有驱动啊”,我里个擦,我又傻逼了,把这个最基本的都忘了。没搞过kernel & driver,这可让我咋整。。。
然后,我就去看看有没有人干过这事啊,其实不用想也知道肯定有人这么想过,谁?那群geeks呗。由于我朝的GFW,导致很多的资源不能及时的更新,所以google出来的链接几乎都被盾掉,当然你得先能google再说,强大的GFW还能检测到你关键字是不是敏感的,orz……让我们这搞nlp的人情何以堪,你丫这么牛逼怎么不能干点正事。(baidu? 百度的结果你应该晓得,在国内摆渡拉的客,基本上都是自己人。)
所以我只能找个梯子,爬到墙上,跳出去;院子里的出了烂的食物还有什么能吃的呢?我本以为我是个良民,但是当我意识到做久了良民就会变成愚民的时候,我决定做个“伪良民”,肉体上我们可以且应当服从党国,至少精神上我们应该是自由的。
然后,我又一次上了twitter,然后发现了所谓微博这个东西还真是浪费时间的东西,可能我们都太“孤独了“,只能在这个东西上寻找精神的慰藉,或者我们的“暴露癖”太严重了。在不会分散注意力影响其他事情的情况下,这个东西还是不错的,个人感受。
捅咕了一周,我的G1能识别外置键盘外置硬盘了,但是我不会access……然后知道了android & debian in G1 together这么个东西,后来发现我的1G micro sd card显然是不够用的;算下来鼓捣这1周花了100多rmb了,既然通货膨胀了,钱就不是钱了,为何不花呢。
要是我能使外置键盘在我的G1上work了,我想我会写个总结性的东西,毕竟一路走来不容易。
我比较喜欢天国王朝里巴里安说的一句话,送给大家:”大丈夫,当造福苍生“。

记下最近二三事

5 comments November 16th, 2010

从后往前说吧。
刚刚发现.subversion/config中~是不能被解析成/home/xxx/的,原来配置svn好使总是有警告说xxx文件找不到,没在意;现在才知道确实是找不到啊,原来能连接是因为我的private key都放在.ssh/下,ssh自己会搜索这个路径下的key,所以说呢,我又犯了一次2。
也是刚才,发现我的adsense中Page impressions总共才4000多,收入$2.5…曾几何时我还梦想着收回成本呢。
再之前的这两天,断断续续的改程序,跑程序,体会就是无论多么小的系统,设计都是很重要的;
我的程序功能很简单,弄一堆候选词,抓网页,看这些词是不是在网络词典里出现;
最开始设计成了碎文件的存储,总是担心要是文件系统的node用光了怎么办,没实际算过。。。所以又改成数据库方式存储,这么干缺点是太慢了,数据规模变大了,数据库存取很慢;最后又改成了碎文件存储。。。而且我还要寄希望于这些个“词典”不要“屏蔽”我,毕竟慢慢的用代理偷偷摸摸抓也是抓,明目张胆赤裸裸的疯狂抓也是抓。
另外一点,我的感悟就是代码与数据的分离也是很重要的;
版本控制也是重要的,一个好的习惯是:checkout -> commit…checkout -> commit. 而我的做法是copy -> edit…copy -> edit。
最往前几天,帮助锋哥写了些hash函数,测试这些函数的优劣。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
u_int elfHash(const char *str) {
	u_int code = 0;
	u_int ans = 0;
 
	while(*str) {
		code = (code<<4) + (*str++);
		if((ans = (code & 0xf0000000)) != 0) {
			code ^= (ans >> 24);
			code ^= ans;
		}
	}
	return code & 0x7fffffff;
}
u_int nrHash(const char *str) {
	u_int code = 0;
	while(*str) {
		code *= 16777619;
		code ^= (u_int) *(unsigned char*)str;
		++str;
	}
	return code;
}
u_int stlHash(const char *str) {
	/*
	inline size_t __stl_hash_string(const char* __s)
	{
	  unsigned long __h = 0; 
	  for ( ; *__s; ++__s)
		__h = 5*__h + *__s;
 
	  return size_t(__h);
	}
	*/
	return __stl_hash_string(str);
}

实际上这些hash函数都差不多,其思想也是相似的;我的实践经验发现:模数底M对结果影响很大,M取得很大与很小hash效果都不好;最后比较好的结果是M取8-10w之间的素数。我猜测sgi的hash_set有可能也是这么干的。
再往前几天,hbx同学某天晚上说我怎么变高了,我倒是希望变高,不过这是不可能的,我都什么岁数的人了,要是还能长,那么500w也离我不远了。
再之前几天,我实在想不起来具体都干什么了,就记着写程序了。有一天随便看了看一本什么数据存储查询的书,书上介绍了huffman编码压缩,算术编码压缩方法;就想起来曾经在acmClub时候,最开始就是学的这个,呵呵,真怀念啊。然后,花了点时间写了个压缩解压缩的程序,虽然压缩比很差,但是思路还是很清晰的;btw: wordpress添加downloads真麻烦,而且中文编码也有问题。
回想这些天,除了写写代码,配置这个那个,还真没干什么了。也许,所谓的什么个性化推荐才是我们应该走的道路,毕竟我们还是所谓的研究生。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <map>
#include <queue>
#include <cassert>
#include <cstring>
 
using namespace std;
typedef unsigned int u_int;
struct Node {
	char key;
	u_int freq;
	Node *self;
	Node *left, *right;
	Node() { left = right = 0; key = 0; self = this;}
	bool operator<(const Node & _n) const {
		return freq > _n.freq ? true : freq < _n.freq ? false : key < _n.key ? true : false;
	}
};
const u_int BLOCK_SIZE = 1024;
class Huffman {
	public:
		Node *buildTree() {
			priority_queue<Node> Q;
			u_int num = 0;
			for(u_int i = 0; i < 256; ++i) {
				if(counter[i] == 0) continue;
				Node *ans = new Node();
				ans->key = i, ans->freq = counter[i], ans->self = ans;
				//fprintf(stderr, "%d - %d\n", ans->key, ans->freq);
				Q.push(*ans);
				++num;
			}
			for(int i = 1; i < num; ++i) {
				assert(!Q.empty());
				Node first = Q.top(); Q.pop();
				assert(!Q.empty());
				Node second = Q.top(); Q.pop();
				//fprintf(stderr, "(%d - %d)\n", first.freq, second.freq);
				Node *ans = new Node();
				ans->left = first.self, ans->right = second.self;
				ans->freq = first.freq + second.freq;
				Q.push(*ans);
			}
			assert(!Q.empty());
			return Q.top().self;
		}
		void trace(char *_code, u_int depth, const Node * _node) {
			if(_node->left == NULL && _node->right == NULL) {
				fprintf(stderr, "key: %d\tdepth: %d\tcode: ", _node->key, depth);
				for(int i = 0; i < depth; i++)
					fprintf(stderr, "%d", *(_code - depth + i));
				fprintf(stderr, "\n");
				return;
			}
			if(_node->left) {
				//fprintf(stderr, "(");
				*_code = 0;
				trace(_code+1, depth + 1, _node->left);
				*_code = 2;
			}
			if(_node->right) {
				*_code = 1;
				trace(_code+1, depth+1, _node->right);
				*_code = 2;
				//fprintf(stderr, ")");
			}
		}
		void readFile(const char *file) {
			FILE *fin = fopen(file, "rb");
			if(fin== NULL) {
				fprintf(stderr, "fopen fail.\n");
				exit(-1);
			}
			char str[BLOCK_SIZE];
			u_int n;
			memset(counter, 0, sizeof(counter));
			while((n = fread(str, sizeof(char), BLOCK_SIZE, fin)) > 0) 
				for(u_int i = 0; i < n; ++i) counter[(int)str[i]]++;
			//for(int i = 0; i < 256; ++i) fprintf(stderr, "counter[%d]: %d\n", i, counter[i]);
			fclose(fin);
		}
		void compress(const char *file, const char *outFile) {
			readFile(file);
			Node *root = buildTree();
			char _code[256];
			//trace(_code, 0, root);
			encode(_code, 0, root);
			writeFile(file, outFile);
		}
		void i2ch(u_int n, char *str) {
 
			for(int i = 0; i < 4; ++i) {
				*(str+i) = 0xff & (n >> ((3-i)*8));
			}
		}
		void writeFile(const char *file, const char *com) {
			FILE *fin = fopen(file, "rb");
			FILE *fout = fopen(com, "wb");
			if(fin== NULL || fout == NULL) {
				fprintf(stderr, "fopen fail.\n");
				exit(-1);
			}
			u_int num = 0;
			for(int i = 0; i < 256; ++i) if(counter[i] > 0) num++;
			char ntr[8] = {0};
			i2ch(num, ntr);
			//fprintf(stderr, "num : %d-%d-%d-%d  - %u \n", ntr[0], ntr[1], ntr[2], ntr[3], num);
			if(fwrite(ntr, sizeof(char), 4, fout) < 4) {
					fprintf(stderr, "fwrite 4 error.\n");
					exit(-1);
				}
 
			for(int i = 0; i < 256; ++i) {
				if(counter[i] == 0) continue;
				char ttr[8] = {0};
				ttr[0] = i; 
				i2ch(counter[i], ttr+1);
				if(fwrite(ttr, sizeof(char), 5, fout) < 5) {
					fprintf(stderr, "fwrite 5 error.\n");
					exit(-1);
				}
			}
			char str[BLOCK_SIZE];
			char ctr[BLOCK_SIZE];
			memset(ctr, 0, sizeof(ctr));
			u_int n, ex = 0;
			int ix = 7;
			while((n = fread(str, sizeof(char), BLOCK_SIZE, fin)) > 0) {
				for(u_int i = 0; i < n; ++i) {
					for(int j = 0; j < mask[str[i]]; ++j) {
						if(code[str[i]][j] == 1)
						ctr[ex] = ctr[ex] | (1<<ix);
						ix--;
						if(ix < 0) ex++, ix = 7;
						if(ex == BLOCK_SIZE) {
							//写入文件
							if(fwrite(ctr, sizeof(char), ex, fout) < ex) {
								fprintf(stderr, "fwrite error.\n");
								exit(-1);
							}
							memset(ctr, 0, sizeof(ctr));
							ex = 0, ix = 7;
						}
 
					}
				}
			}
			//fprintf(stderr, "write in to compress ex %d\n", ex);
			if(fwrite(ctr, sizeof(char), ex, fout) < ex) {
				fprintf(stderr, "fwrite error.\n");
				exit(-1);
			}
			fclose(fin);
			fclose(fout);
		}
		void binaryPrint(char n) {
		 	for(int i = 7; i >= 0; --i)
				fprintf(stderr, "%d", ((1<<i) & (0x000000ff & n)) ? 1 : 0);
		}
		//_code : 0, _mask : 0
		void encode(char *_code, char _mask, const Node *node) {
			if(node->left == NULL && node->right == NULL) {
				for(int i = 0; i < _mask; ++i) {
					code[node->key][i] = *(_code-_mask+i);
				}
				mask[node->key] = _mask;
				return ;
			}
			if(node->left) {
				*_code = 0;
				encode(_code+1, _mask+1, node->left);
			}
			if(node->right) {
				*_code = 1;
				encode(_code+1, _mask+1, node->right);
			}
		}
 
		void decompress(const char *file, const char *outFile) {
			FILE *fin = fopen(file, "rb");
			FILE *fout = fopen(outFile, "wb");
			if(fin == NULL || fout == NULL) {
				fprintf(stderr, "fopen fail.\n");
				exit(-1);
			}
			char str[BLOCK_SIZE] = {0};
			memset(counter, 0, sizeof(counter));
			if(fread(str, sizeof(char), 4, fin) < 4) {
				fprintf(stderr, "fread first 4 char fail.\n");
				exit(-1);
			}
			u_int n = ch2i(str);
			//fprintf(stderr, "n : %d-%d-%d-%d  - %u \n", str[0], str[1], str[2], str[3], n);
			for(u_int i = 0; i < n; ++i) {
				if(fread(str, sizeof(char), 5, fin) < 5) {
					fprintf(stderr, "fread 5-group fail.\n");
					exit(-1);
				}
				counter[(int)str[0]] = ch2i(str+1);
			}
			Node *root = buildTree();
			Node *ans = root;
			char _code[256];
			//trace(_code, 0, ans);
			u_int ix = 0;
			char ctr[BLOCK_SIZE];
 
			while((n = fread(str, sizeof(char), BLOCK_SIZE, fin)) > 0) {
				for(u_int i = 0; i < n; ++i) {
					for(int j = 7; j >= 0; --j) {
						//fprintf(stderr, "%d",((1<<j) & (0x000000ff & str[i])) ? 1 : 0); 
						if(((1<<j) & (0x000000ff & str[i]))) {
							assert(ans->right != NULL);
							ans = ans->right;
						}
						else {
							assert(ans->left != NULL);
							ans = ans->left;
						}
						if(ans->left == NULL && ans->right == NULL) {
							//fprintf(stderr, "\n");
							ctr[ix++] = ans->key;
							if(ix == BLOCK_SIZE) {
								//写入文件
								fwrite(ctr, sizeof(char), ix, fout);		
								ix = 0;
							}
							ans = root;
						}
					}
				}
			}
			fwrite(ctr, sizeof(char), ix, fout);		
			fclose(fin);
			fclose(fout);
		}
		u_int ch2i(const char *str) {
			u_int res = 0;
			for(int i = 0; i < 4; ++i) res = (res<<8) | (0x000000ff & str[i]);
			return res;
		}
	private:
		char mask[256];
		char code[256][256];
		u_int counter[256];
};
int
main(int argc, char **argv) {
	Huffman huff;
	// huffman -c compress compressed
	// huffman -d decompress decompressed
	if(argc < 4) {
		fprintf(stderr, "usage: huffman -cd file.in file.out\n");
		exit(-1);
	}
	if(strcmp(argv[1], "-c") == 0) {
		huff.compress(argv[2], argv[3]);
	}
	else if(strcmp(argv[1], "-d") == 0) {
		huff.decompress(argv[2], argv[3]);
	}
	else {
		fprintf(stderr, "usage: option -c or -d.\n");
		exit(-1);
	}
 
	return 0;
}

hostMonster配置svn

4 comments November 9th, 2010

过去写的代码很少,当然现在也很少;这些天发现自己真可以称得上是游击队队员,在这放一泼代码然后走人,再去那放一泼走人,最后到处是代码,不知道什么玩意是什么玩意,所以有了把代码都导入到svn server上,很多人都用code.google来管理project,我知道;不过我总有一个潜意识告诉自己:不要钱的东西是不可靠的。所以打算自己弄一下,要不空间就浪费了。
无论是baidu还是google都可以找到一些资料,告诉你怎样在hostMonster上配置svn;就我切身体会,这些帖子的方法应该都能解决问题,我也是尝试了好几次才勉强算是成功了,说勉强是因为我还有一些问题没解决,这是后话。按照我最后参考的帖子的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mkdir src
cd src
wget http://archive.apache.org/dist/apr/apr-1.4.2.tar.bz2
wget http://archive.apache.org/dist/apr/apr-util-1.3.9.tar.gz
wget http://subversion.tigris.org/downloads/subversion-1.6.9.tar.gz
wget http://www.webdav.org/neon/neon-0.29.3.tar.gz
wget http://www.sqlite.org/sqlite-amalgamation-3.6.22.tar.gz
 
tar -xzf apr-util-1.3.9.tar.gz
tar -xzf apr-1.4.2.tar.gz
tar -xzf subversion-1.6.9.tar.gz
tar -xzf neon-0.29.3.tar.gz
tar -xzvf sqlite-amalgamation-3.6.22.tar.gz 
 
cd apr-1.4.2
./configure --prefix=$HOME LDFLAGS="-L/lib64"
make
make install
 
cd ../apr-util-1.3.9
./configure --prefix=$HOME --with-apr=$HOME LDFLAGS="-L/lib64"
make
make install
 
cd ../neon-0.29.3
./configure --enable-shared --prefix=$HOME LDFLAGS="-L/lib64"
make
make install
 
cd ../sqlite-3.6.22/
mkdir ~/src/subversion-1.6.9/sqlite-amalgamation
cp sqlite3.c ~/src/subversion-1.6.9/sqlite-amalgamation/
 
cd ../subversion-1.6.9
./configure --with-apr=$HOME --prefix=$HOME --without-berkeley-db --with-zlib=/usr --with-ssl LDFLAGS="-L/lib64"
make
make install

执行如上脚本即可安装svn,如果不出意外应该和我一样最后遇到个什么权限导致的错误,无视之,反正我的权限就这么点,不可能得到root权限。接着,创建一个目录svnroot作为版本库的根目录,然后再在svnroot/下创建个版本库:

svn create code_xiaoe

貌似这样就完事了,当然实践连接一下的话(通过ssh连接):

svn list svn+ssh://sshUser@yourHost/code_xiaoe

如果不出意外应该和我一样遇到:

bash: svnserve: command not found

显然是没找到svnserve在哪,普遍想法就是去.bashrc文件下,把svnserve的位置加入到PATH,当然我曾经也是这么干的,问题没有解决。根据我找到的帖子等,比较正确的说法是:

因为svn调用ssh后得到是非登陆shell。

还有个老外说:
.bash_profile is only loaded if you actually have a “login” session.
.bashrc is always loaded for your user
但是实际情况是.bashrc不好使,不排除我用的不对,对bash了解有限。
最终,解决方法如下:
用ssh-keygen生成一对公钥(user.public)和密钥(user.private),把user.public弄到hostMonster自己$HOME目录下,然后用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/bash
# this script assists in adding an svn user to a hostmonster account.
# they have to authenticate each with their own ssh key than only allows ssh access for their
# svn username as we're only allowed one ssh login for root
# and this prevents people give svn accounts having root access to the hostmonster account!
# written by Jon Booth see www.sharpstep.com/Articles/HostMonster-svn
 
# check for an argument - the username to add
if [ "$1" == "" ]; then
	echo Usage $0 [username] [public key file]
	exit
fi
 
#check for the second argument - the public key file.
if [ "$2" == "" ]; then
	echo Usage $0 [username] [public key file]
	exit
fi
 
if [ -f "$2" ]; then
	echo public keyfile "$2" found
else
	echo unable to find public key "$2"
	echo Usage $0 [username] [public key file]
	exit
fi
 
# check to see if the given username already exists in the keys (only works if added with this script).
if [ -f  ~/.ssh/authorized_keys ]; then
	if [ "$(cat ~/.ssh/authorized_keys | grep svnrepos | grep \\-\\-tunnel-user=$1\\\" | egrep $1\$)" != "" ]; then
		echo it appears svn user \"$1\" already exists
		exit
	fi
else
	echo no authorized keys file found... skipping existing check
fi
# check that svnserve is properly in the path
if [ "$(which svnserve)" == "" ]; then
	echo
	echo Can\'t continue as svnserve doesn\'t appear to be installed on the path.
	echo it\'s part of the svn package
	exit
fi
 
echo Creating svn user $1
# create the keys
# this is no good as putty on windows won't use them - also it's safer for the users to provide the key files so now
# I'm checking them as the second argument.
#ssh-keygen -q -t rsa -f $1_key -N "" -C "svn user $1"
# append the user line to the authorised keys
echo command=\"$(which svnserve) -t -r ~/svnrepos --tunnel-user=$1\",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty $(cat "$2") svn user $1 &gt;&gt; ~/.ssh/authorized_keys
# remove the public key now it's in the authorized_keys file
rm $2
echo user $1 now added and authenticated

此脚本create_svn_user.sh,运行 sh create_svn_user.sh user.public user.public,把用户公钥等信息加入$HOME/.ssh/authorized_keys文件里;然后authorized_keys文件中:

command="/home2/liulinli/bin/bin/svnserve -t -r /home2/liulinli/svnroot

-t之前是svnserve的位置,-r后边是版本库的根目录,这里根据自己情况相应修改即可。
本地机器上也有相应的修改,这里以*nix为例(winXP系统我没有测试通过,这就是我为什么说勉强成功。。。在写完这篇文档后,又修改了下居然成功了。。),修改~/.subversion/config,在文件中[tunnels]之后加入一行:ssh=ssh -i /home/rt77789/.ssh/user.private -q
/home/rt77789/.ssh/user.private就是刚生成的私钥,就是说导入私钥。然后,测试:

svn list svn+ssh://sshUser@yourHost/code_xiaoe

这次没有bash: svnserve: command not found出现,svn + ssh成功。
另外,还有一个问题就是密钥公钥的问题,开始在winXP下用PuTTyGen生成一对,但是在ubuntu下死活不好使,最后用ssh-keygen才好使;可能,svn不能识别puttyGen生成的private key吧。有这一出后,我想难道winXP下tortoiseSVN可能也是密钥之类的问题呗,然后用putty读入ssh-keygen生成的密钥,保存一下不就是putty的格式了么,然后修改tortoiseSVN配置文件[tunnels]后边加了句话:

ssh = "D:/Program Files/TortoiseSVN/bin/TortoisePlink.exe" -i "d:/xiaoe.org/xiaoe.org.private.key.nix.ppk" -q

结果这样不work啊。。。xiaoe.org.private.key.nix.ppk是puttyGen导出的由ubuntu生成的密钥。
接着,我在setting->network->ssh client直接写

"D:\Program Files\TortoiseSVN\bin\TortoisePlink.exe" -i "D:\xiaoe.org\xiaoe.org.private.key.nix.ppk"

这样就好使了。。。
配置这个东西耗了一天多,别人有的几乎没有问题就搞定了,由此证明技术上的差距是很大的;有时间再看看tortoise怎么才好使吧,累得我屁颠屁颠的。
参考文献:

http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631043803b5c0ecb743ca08d552ac9d11bc6334640426cf4ba535e0705a5b368225cef1f53baa37728200250a09abb9f4aacfad6746edf6770270b873105d26ab8cb37749c7fcf09b5f90ee7cbac6fd5b9d2a28b09149605&p=87769a46d2840bff57ed9529427acd&user=baidu

http://sharpstep.com/Articles/HostMonster-svn/
http://hostmonsterforum.com/showthread.php?1294-Subversion

http://archive.apache.org/dist/apr/

http://bbs.idcspy.com/thread-94575-1-1.html

字对齐

2 comments October 9th, 2010

前些天版牛问了我这样一个问题:

struct s1{
char a;
}
struct s2{
char a, *b;
}
sizeof(s1)= 1
sizeof(s2)=8 而不是5

是啊,sizeof(s2)为啥是8呢,咋不是5呢?
其实原理说起来很简单,就是:字对齐,提高寻址速度。
画个图容易理解:
oooo
oooo
o表示都是可用的空间,一个o 8bit
aooo
bbbb
a表示a占用的空间,b表示b占用的空间,上边是实际编译器给出的存储方式。
abbb
booo
这个是我们用sizeof(s2) == 5去理解的存储方式。显著的缺点是:我们存取b的时候要寻址访存两次。
对于

struct s3{
char a, b, c;
double d;
}

这个s3的存储方式如下,这里用长度64bit的字来对齐。
abco
oooo
dddd
dddd
编译器一般都把struct里的变量连续存储,当然这取决于编译器的设计者,至少我记着我用过的gcc以及以前的vc 6都是这么设计的; 上边的例子都是win32下gcc的存储方式,我平时用的是mingw developer studio。
这些东西貌似体系结构或者组成原理讲过吧,要不我怎么有印象呢。
btw:祝福这群兄弟姐妹们都找到满意的工作。

I love Inter

2 comments May 23rd, 2010

我真他妈爱死Milito了,一个不拉屎的摸围棋真应该看看这才叫前锋。
对于魔力鸟,我真他娘佩服的五体投地,这是怎样一种对境界啊,他玩的不是足球,是寂寞啊。
我们继续我们30%的控球率,我们也继续着我们90%的高效率;你会发现这才是真正的意大利的防守反击,一个葡萄牙人怎么他妈的对意大利的足球理解的这么深邃。我只能感慨,战术不是喊出来的,所谓同样的战术,在不同的人用来,真的是太不一样的。教练不用,球员不同,效果不同;你给中国队打防守反击,其实就是和防守不反击是一回事。
I love Inter,我们也三冠了,和曼联和巴萨不一样的三冠,他们有着漂亮的场面,有着不错的控球率;当然我们也有自己的特点,我们的禁区周围总是站着8-9个人,我们总是把球踢还给对方,如果有人说我们踢得难看,我不会否认,但也不会赞同;如果有人说我们简直就是糟蹋足球的话,我会认为这样的人是绝对不懂足球的,我绝对不赞同这样的观点;因为防守也是足球的一面,艺术是没有界限的;当我们把防守做的无懈可击的时候,你是不是应该给我们竖起大拇指,赞赏我们一下呢,更何况,在优秀的防守后面,还有我们优秀的反击,漂亮的反击和高效的反击。每每我看到我们从中后场断球,快速攻防转换,3两个人简单的3两脚传递就取得进球后,我不由得赞叹,这进攻太漂亮了。
我只想说,很多人喜欢巴萨式的控制球打法是可以理解的,说他们踢得漂亮呢我也不反对,但也不尽赞同;我只想说,天下没有无敌的打法,只可能有无敌的队伍;要感谢魔力鸟,是他让那么多盲目崇拜的人能够静下来想一想,足球不仅仅只有进攻这一项,足球也不仅仅只有控球率,足球也不是什么艺术行为,足球是竞技体育,美其名曰踢得漂亮,那我要问是结果重要还是过程重要?
我国的所有队员都辛苦了,无论是马里奥还是萨队抑或没上场的夸雷斯马,都是好样的。I love Inter~~

我相信奇迹

9 comments April 5th, 2010

有人说:近视眼是没办法治愈的。很多很多的人这样说。我在网上看到几个帖子,是讲述自己通过练习自愈了近视的,听上去似乎很神奇,我就想:要是我坚持练习的话,应该也有可能有效果。
还有人说:偏头痛,耳鸣这类疾病是无法根治的,很多人这样说,可是我听说还是有痊愈的,我就想:要是我努努力也是有希望的啊。
上学期末,师兄说要参加评测,对于我这种各种事都冒充的选手,要真去搞个系统还是几乎要从头开始的,当时我就想:要是我自己搞,能行么?原以为是师兄我们俩弄,结果回学校后,他就跑去实习了,我真的要自己弄了……然后我这一个月就彻底连个电影都没看成。
看看雨哥的签名,日出东海路西山,喜也一天,愁也一天;然后就想到了一个老外写的xx天自愈视力的一本书,这人身体的各个器官什么的还真是有关系的啊,精神不好,身体也会有影响。于是,我就想,那就坚持吧,因为,我相信奇迹。

人之初

5 comments March 8th, 2010

寒假从家返校的那几天,我想我永远都不会忘记。
24号的飞机,我的意思是争取买个卧铺回去的,父母大人说遭罪而且没法买票(如果24号走,就要大年初一去买票),让我坐飞机回去,老爸的话很有意思“还没自己坐过飞机把?”,然后就是一如既往的笑不露声;后来我一想,我记忆中父亲也只坐过一次飞机,而且还带着我。
23号的计划,24号早上父亲开车送我和妹妹去哈尔滨,因为妹妹要去办点事,考虑到一天可能办不完,所以父亲陪着去安全一些。晚上我查了一下天气,网上说哈尔滨地区有中到大雪,我隔着墙告诉了父亲,结果是没了下文。
24号的早上,6点一刻左右,我们出发了,天还没有完全亮。在车上,妹妹一如既往的说的最多,其次是父亲,最后是我。大概1个半小时之后,我们被迫停车了,因为前边有个卡车横在了道上,无法继续前行,下车放风才发现,这哪是路面,是冰面。
停了近3个小时,期间有若干车辆因为车速过快因为道路上的冰,所以有撞车的,有撞人的,还有撞道路护栏的。后来,交警通知说今天去不成哈了,说回牡丹江是可以的,说走老道,就是旧的国道,去哈也是应该没问题的,听到这,父亲立马掉头往回开,往那据说可以去哈尔滨的旧国道开。我说不用急,赶不上就退票,怎么回去再说;结果仍然没有下文。
从横道出高速,走上了旧国道,开始都很正常,雪地路面,不过都压实诚了;后来到了大岭上,发现积雪有30-40公分厚,恰巧对面有个ivco车唔在雪里了,因为雪厚,所以只有单行的一趟路被压实了。没辙,车都过不去了。好在,我们前边的一个越野车的人帮了忙,连个绳子把ivco拽了出来,然后越野车从雪里唰唰的就走了,我们剩下的这些小汽车还有这个ivco向在那,谁都过不去。然后,不知谁说的要压出条路,反正是走不了,死马当活马医了。先是一个捷达扎进雪里,我和父亲就过去帮着推,还有其他的一些人也帮着推;就这么一个个推,推了两个,就到了我们的车,一样的加速,一样的冲刺,一样的扎进雪里,不一样的是我们的车没有从雪里出来,可能是车确实是比其他的车稍重了点,可能是我们没有去恳求大家帮帮忙,可能是因为我们扎的位置恰好没有挡住他们正常前进的路线,也可能像父亲说的:要是有个宁安的车,应该就能认识。
天,下起了雪;地面上的雪依然是那么厚;我们三个人用上了车上所有的工具:一把军用小锹,几个玻璃丝口袋,车依然没有从雪里出来。
迎面过来了几辆车,有越野车有小汽车,我在旁边招了招手,结果不一样的车,一样的冷漠,没有一个车停下,更别说是关问了,其中有一辆沈字的军区越野车来回两次经过,我记得很清楚。父亲也是当过兵的,恰好也在辽宁,如果换成是父亲,他看到这样的事情,他会怎么选择?
父亲、我还有妹妹,不知挖了多久,尝试了多少次,我仿佛感觉这个世界就只剩下了我们三个人,看到的只有飘动的雪花,听到的则是发动机的轰鸣。
车从雪里出来,大概是在下午1点半以后。父亲说:高速应该通了把,还能赶上。他依然没有放弃去哈尔滨的念头,依然想要让我赶上飞机。而我,却在为刚才的事情憋着气,感慨人情的冷漠,感叹人与人之间这份信任的脆弱。妹妹则是不停的骂那些不帮我们却煽动其他人不帮我们的人,我跟妹妹说:人和人不一样,所以就别指望别人了,咱只能靠咱自己。
父亲在车上几乎没说过几句话,我记着他说过的话只有一句:今天咱就当旅游了,这经历也不错。
尽管我一向劝别人不要生气不要恼火,可是这回我是真气的不轻,生谁的气,生自己的气。上次,在合肥有俩小子抢我们叫的出租车,我就挺不爽,说他们他们他妈的还装深沉,他们要是顶我两句就好了,正好和他们干出出气;这一句话不说,弄的我很不爽。在我印象中,我一般不怎么生气,也不愿跟别人产生矛盾,和气生财,以和为贵,我就这想法,所以一般都是小事化了;我气自己错误的认为绝大部分人都是很善良的人,我气自己长这么大才看清楚一点社会上所谓的利益关系;这些事儿,父亲活了一把年纪,能看不清么?
我现在脑子里回响的一句话:不求无悔,但求无愧于心。
我猛然发现,我和父亲是如此的相似。父亲常和我争论,说人不用活的太久,活岁数太大对国家是种负担,人或者关键是能创造多少价值,看上去文绉绉的话,看上去大道理的话,却真是从他嘴里说出来的;而我呢,我强调人的健康是重要的,创造的价值也是重要的,至少不能活的太少把,在健康状况良好范围内创造更多的价值,这是我的观点,就是所谓的权衡折衷。因为作儿女的始终都是把父母的健康放在第一位的。
好了,现在来讨论下人之初,性本X的问题吧,我的观点:不同的人有不同性,我是男性。
完。

摆脱杂交水稻

2 comments February 4th, 2010

吃了半年的杂交水稻,才发现家里的米饭真是好啊。什么杂交优势,都是胡扯,你看那赛马都是纯种的好。
估计是这没营养的杂交水稻导致了我身体素质的下降,以后如果在学校尽量进食面食,好吧?
没啥说的,卷铺盖走人。

都球徒

4 comments January 22nd, 2010

可能全世界没有哪个国家的足球队能像我们中国这样,落后时候紧张,领先时候更紧张;
可能全世界没有哪个国家的足球能像我们中国这样,产生点事儿,全世界都来看;
也可能只有我们中国的足球,才会出现足协主席都被带去小黑屋问话。
我们从前关注的往往就是国足,偶尔也会关注下中超,可现在这乌烟瘴气的中国足协,终于成了主角,之前什么黑哨都是小巫见大巫了,赌球?听过吧,也许你不清楚这具体是怎么回事,不过听起来就知道不是什么好东西。
我亲眼看过几场中超,有些场次就是赤裸裸的假球啊……我怀疑有些人不知道他们是眼睛有问题还是脑子有问题,居然认为这些不是假球,认为是正常的失误,omg,要是真是失误的话,我只能说我们国家的最高级足球联赛,肯定连我们初中的足球队都玩不过。相信,那些搞足球的人必然不是眼睛有问题,那只能是脑子有问题了,要不能不知道这么假的假球。
大家老是说,中国足球怎么老是搞不上去,全世界人口最多的国家啊,11个人凑不出来?非要说是人种基因问题,那么好,比不过欧美,咱比比那些亚洲邻居也成啊,论身体素质,日本韩国哪个敢说比我们好,咱要求不高,和他们拼个半斤八两也成,那咱也可以说我们东亚人基因体质不适合踢足球。可是,这只能是我在这yy,就算和日韩,我们也差了十万八千里,咱呜呼哀哉吧。
再就有人说,我们的联赛不行,水平太低,ok……水平低这是事实,可是咱老邻居北朝鲜不又可以讽刺咱一下么,北朝鲜都不知道有没有联赛,估计没有,他们有一些在日韩踢球的球员,这就够了。那我们呢?看看所谓的欧洲球员所谓的海龟,至于我们联赛的那些球徒,不提也罢。
一批一批的球徒被关进了小黑屋,有老有少,有大有小,有胖有瘦,有球员也有领导。该反省反省了,想想我们几十年才进过一次世界杯决赛圈,想想我们即使进去了,却连个进球也没捞到,这正常么?看看我们国家,想发展经济,那我们必然能够保质保量完成任务,想去月球,好,不远了,都好几个中国人上天了。可咱为啥就不能把足球当回事搞一搞,是啊,领导人都介入了,足球的春天是不远了,可是冬天先到了。感谢这些都球徒,是他们的出现使得中国足球可以争取自己的一份净土,使他们的出现使得中国足球可以产生黑色裂变的契机。
作为一个关注中国足球的人,我可以接受国足战绩不佳,但是无法面对足球环境的恶劣。
革命尚未完成,大家尚需努力。
放假不能回家,待在学校搞抑郁,考验我是把。