wpe7.jpg (11495 bytes)

我的征尘是星辰大海。。。
The dirt and dust from my pilgrimage forms oceans of stars...

-------当记忆的篇章变得零碎,当追忆的图片变得模糊,我们只能求助于数字存储的永恒的回忆,

                                                                                                        作者:黄教授

上一个世纪的最后的日子里。。。无痕的岁月。。。     以前的杂记

 二零零二

十一月一日 雪

同志们对胡天八月即飞雪的正确性有了进一步的认识。

十一月二日 雪晴

来到加拿大就该有些新气象,所以我把以前的手记移到了这里。现在一时没什么东东好贴,干脆把作业贴上吧。

十一月六日 雪

作业做了两天,是一个搜索的问题(除了很短的源代码外,我还把7x7的尺寸的测试文件放上去供大家测试。顺便再贴一些数学老师出的Puzzle.

十一月九日  晴

接到了Concordia的录取通知着实高兴了一阵,又写了一篇作业

十二月一日 雪晴

加了一个计数器。是从网上拷贝一行代码,现在才体会到以前CoCo所说的网页制作的简单。然后又加了一个留言表

十二月二日 中雪

今天把我考试的作文放到这里供大家看看。

十二月七日 晴

今天给所有的puzzle加了解答。同时修改了留言的错误。

十二月十二日 晴

今天一早起来终于改正了程序最后一个bug,解决了爱因斯坦的问题--Zebra puzzle.这说明人类终究会将所有的脑力劳动都交给电脑去做的。今天心情不错,又把我钟爱的一首唐诗翻译成了英文。

十二月十五日 晴

今日无语,刚刚从洪炀得知黄勇明年夏天要来。

十二月十六日 小雪

今日完成一个简单的走迷宫的小程序。又作了加强,改变了“过家门而不入”的缺陷。

十二月十九日 晴

今天,朱春明来到了温哥华。我把迷宫程序又作了加强,解决了“原地打转”的问题,入口可以在任何位置。

十二月二十二日 小雪

今天,经过两天的辛苦终于完成了“四个数字凑成24的游戏”的完全解决。把它作为给大家的圣诞礼物,好不好?

十二月二十五日 晴

今天是圣诞节。我编了一个极简单的转换“墨尔斯”电码的小程序,主要是加强对编码的理解和shift操作的应用。同时补记一句,昨天大家去参观了“Saint Josuph” 大教堂,拍了不少照片,这个可是梦城的一大名胜啊!鉴于5M的空间已经不足,现决定将每页上的美女图都“打入冷宫”以便节约空间。今天又将以前的编程作业贴上来了--采用模板和回调函数的快速排序算法小程序

十二月二十六日 晴

今天是加拿大的Boxing Day,即劳动人民盲目抢购所谓降价物品的日子,好久没有看到排队买东西的情景了。加拿大劳动人民处在水深火热之中啊!今天把以前写的一个仿照Delphi的TList的模板化的类整理了一下,可以动态增加数组长度,自动按升序排列,自动插入元素的功能。

十二月二十七日  晴

今天,朱春民到了蒙城,带着他转了一天,好累啊!黄勇给我出了个关于5个智商超群的,知道进退的海盗的puzzle,很有意思的,我不敢确定是不是真的作对了,你有幸去看看吗?

十二月二十九日  晴

今天,心情很沮丧,因为奋战了近两天两夜,关于“5个海盗”的程序我终于放弃了。因为,第一,我的解答是不对的,两个MBA用“博弈论”和递归法总结出了一个答案。第二,问题的复杂程度远远超过我的想象,即便我想用程序解决一个简化的定性分析,也没有成功

 

             二零零

一月一日 晴

今天,收到黄勇的邮件并和他在线讨论,发现两个MBA的解答还不是最优解,虽然他们的理论是正确的,但是答案还不对。看这里。同时对6个海盗的情况引入了“数学期望”的考虑方法,修正了我和黄勇讨论中的错误。

我热切的期望有更多的朋友参加讨论,如果你们有什么建议和想法,不妨留话给我

一月六日  晴

今天是开学的第一天,又去找教务处关于免修课的事情,结果还是没有结果,想到林鹭浪的建议,以后可以写一个校园系列。奋战近一个星期终于完成了我的字典程序,这是一个利用二叉搜索树的可以存取到文件,并可以不断添加的字典(好像都是废话)。5M的空间上限到了只好狂删图片。

一月七日  晴

今天是开学第二天,我饿坏了!早上去TAV上数学,中午就吃了一块大饼,接着上C++的课,别看Fatty不学无术,他老婆Rita还是有点真才实学的,冲着这一点,他的作业就给他做吧。上完课回到家一看Concordia的上课时间到了,O.S.连着“概率论”,两门课上完回到家已经8:30了。真饿啊!写了一篇概率论的学习心得发给老师。

一月十日 晴(错了是小雪了)

累了两天终于可以休息一下.今天把昨天的离散数学及计算机组成原理的笔记完成了。Dr. Ford从善如流回信并在课堂上改正了小遗漏.又加了两三个黄勇推荐的小puzzle.

一月十一日  小雪

加了几个小puzzle据说是小学生的数学应用题,不过我实在是不敢保证大家都能做对,试一下?同时,我在网上看到说台湾搞教改,小学五年级的数学题竟然有:“爸爸出国旅行,一件行李25kg,另一件28kg,共多少kg?”者如果是真的,台湾也不用操心了,过20年他就要找上门来讨救济了。相比之下,大陆的小学数学有点太超前了吧!把feof()的问题作了两个测试

一月十二日  晴有小雪 

前天晚上吃晚饭的时候,我宣布要写一个逻辑的类,初步完成了基本的操作符重载,以后可以在家功能进去吧,明天又要上学了。半夜又加了一个小puzzle.

一月十三日  大雪

今天去学校买书注册,在地铁被一个穿着体面的中年白人妇女拦住用法国口音很重的英语解释说自己早晨被银行拒绝,现在没吃的,天又冷能否给她几块钱。我看她眼泪都快流出来了,急忙把钱包里所有的硬币都给了她,跟她说我也很穷只能这些了。那些quarter可都是我攒下来洗衣服的呀,看来这个月不用洗衣服了。事后我一直在想为什么那么多人她偏偏找上我?莫非她还是很识货的,一眼就看出我身上着价值三四千的防御力250,抗冷+50,抗电+20的皮夹克?转念一想不可能的,她肯定是知道我也是穷人,只有穷人才会帮助穷人了。

一月十四日  雪

一个今天概率课的简单证明

一月十八日  小雪

今天去学校听unix的讲座碰到反战大游行。然后宰了朱春明一顿以示庆祝,同时晚上终于可以开始这个星期一直计划写的Matrix的类

一月十九日  现在还是晴

一早起来把我的Matrix做了加强,实现了加法,乘法以及旋转等等。无聊之极写了一个模板化的stack.

一月二十二日  天气预报说非常非常冷。。。

夜不能寐,早起胡言乱语一通。对不起,我发现这实际上是Fuzzy Logic的意思。

一月二十五日   小雪

今天把头剃了,脑子清醒了一些就把离散数学的小作业用程序作了一下,这是一个极其简单的判断谁是罪犯的问题,因为只有三个嫌疑犯,而且只能有一个罪犯,所以太不值一提了,比爱因斯坦的问题还简单的多。 

一月二十六日 小雪

今天正在改我的字典,同时先写了一个极其简单的小函数给长征。同时把我以前写的一个从文件读字的简单的类(包含自增长的数组)简单整理了一下。 

一月二十七日 晴

终于胜利在领bursary之前完成了功能强大的Power Dictionary,增加了frequency和rank的功能,frequency也可以存入文件,rank也采用binary search tree以便经常更新的效率。

一月二十八日  小雪

今天把我的逻辑类小改了一下用来检验一组判断是否consistent也就是说给你一组“规则”和一些基本事实,你能否推理出某个结论,或判断这个结论是否可能? 

二月二日   小雪

今天真累啊,从早上10:00开始debug到下午18:00。晚上又花了两三个小时才完成了超级字典,即字典的第三个版本。改掉了ranking的一些错误。

二月五日  大风

今天偷懒就把前天做的作业贴一篇吧,是一个简单的统计输入单词的小题目,见笑了。

二月八日   阳光灿烂

今天终于完成了本星期最大的工程-- PowerLogic,这实际上是我的Logic类的第三个版本。这个版本无比强大,对于是非判断可以从结果倒推,他的完成总算没有辜负这个星期的辛劳。同时纠正了上一个版本的错误结果---我的输入数据错了,10个规则中的第六个少了一项。

二月十二日  小雪

色即是空,空即是色?今天讲的“空集合”真让人摸不着头脑。

二月十四日  晴

今天心情很不好,昨天看BBS到快两点,早上5点多起来挑战“Coding Competition”结果输了,我没有办法在3小时内完成最容易的题目,(虽然正常没有问题,我想,可是就如同后来的考试,可能和没有睡好有关系吧?)下午郁闷瞎闯到了“地下城”,真热闹。晚上为了排解郁闷把第三个题目也作了,这是次容易的。可是我还是超过了三小时。

二月十六日  晴

今天我都快要吐了。“Breadth First Search”怎么会这么复杂呢?我花了差不多一天半才解决第四题.现在我的胃一直在翻腾,头晕眼花,我要去跑步了。 

二月十八日 晴

昨天早上花了一上午为我的网页又找了一个免费的所在,现在再发生911我的资料还有一个备份,不过拷贝5,60个文件实在是一个无聊的工作。今天总算花了九牛二虎之力把第一个问题解决了,我认为是最难得,所以放在最后,可是那位写solution的大虾却不认为是最复杂的,虽然他自己也承认代码最多。

二月二十日 晴

有客自故乡来欲咨询此地如何?我实在不知所云

二月二十五日 晴

下了一场大雪,我也过完了一个堕落的春假!什么也没干除了打游戏,我要改变这个错,没什么好说的,贴一张汇编得作业吧,程序很简单但是能简单地描绘人类迁徙的一般规律,物以类聚,分久必合,合久必分。  

三月八日 晴

连着考试,作业不断,我最近什么都没干成,人变得又笨又懒,没东西贴了,就把c++的作业贴一贴吧。是一个很简单的模仿类似大富翁的Boardgame

三月十四日  晴

我的理由还是因为考试作业,什么也没有干成

三月十七日 晴

今天心里不好受。贴一个用汇编编的“二分法求平方根”。下载可执行程序试一下,运行然后输入一个小于65535的数字,回车。 

三月十九日 晴

平方根求法稍稍改进了一下,对于除法还是有疑惑。下载试一下。    

 三月二十二日 小雨

贴一张汇编的作业,是前一篇作业的加强班,是要用图形来描述数组元素的变化。我讨厌提供的library自己重写了一遍,当然因为都很简单其实相当于重新key了一遍,不过呢心理感觉不错啊。下载运行一下吧。 

三月二十六日  晴间多云

本来以为可以开辟一个“在Mcgill的日子里”,现在看来是不可能了,Admission根本不看你得TOFEL成绩,只看成绩单,可怜我花了一百多刀考了647也没有用。心情不好,离散数学又没考好。唉,天下不如意事常十之八九!不过将来他们总有一天会后悔没有招我进去的,这么一想心情顿时舒畅了。把作业也做了。

四月四日   阴

无所事事的生活让我感到可耻,虽说考试作业很多,可是我真的都在学习吗?这并不能成为我没有写新程序的理由。很多想法稍纵即逝,我却始终未能开始。今天,总算抽时间把以前的Matrix小改了一下,实现了几个简单功能,“与”和“或”和“乘方”的运算,“reflexive,symmetric, antisymmetric, transitive”的属性,以及“transitive closure”。为了节约宝贵的网络空间,以后输出结果不在贴图了,改用文件形式,想看自己下载。(除非你贡献一点银子让我多买几M的空间。)  

四月七日  晴

今天,我想开始我的一个长期计划:写MASM的库函数。即使都是没什么大用的小函数,可是毕竟是自己的版本啊!先加了个GCD,LCM,还有输入输出整数。哈哈没想到是这么简单的东东吧? 

四月八日  晴

今天实现了我长久的计划:完成一个逻辑集合类的主架构,初步用回调函数实现了“universal”和“existential” quantifier。接下去我就可以以此集合类为基础实现“function”和“relation”了。响应朱春明同学的倡议,计划将来合作一个国际象棋程序,先画了一个棋盘,很幼稚吧? 虽然现在空间很紧张,可是,还是忍不住加了一张厦门环岛路的魅力照片---世界上最美的赛道

四月十三日   晴

朱春明同学回国了,现在唯一能讨论讨论中断机制的机会没有了。呕心沥血穷一日一夜完成了三个证明, 不过不知道对不对。

四月十四日    晴

今天居然用了一整天在写汇编作业。工作量超过了我的估计,在我的Library里又加了一些小函数,现在我都快记不清楚各自的功能了。作业里要对鼠标直接控制,结果我发现我的USB鼠标好像不行啊,只好等到实验室在debug了。

四月十八日    阴

今天是两门课的作业的DUE DAY,昨晚,突击完了离散,今天又胡乱写了一下硬件结构的作业,实在搞不懂具体的DMA, INTERRUPT机制,我的笔记本又不能显示鼠标,汇编调试简直是闭着眼睛在找鼠标。现在去实验室调试汇编作业我的Library。 倒霉!又是不知名的什么节日,学校不开门,作业怎么交啊?

四月十九日   阴

伟大领袖毛主席教导我们:理论只有和实践相结合才能得到检验和发展。我写的“功能强大”的逻辑类如果不能得到实际应用的话,我为什么要去写呢?所以,今天我小小地改了两行代码用它来作了一个反证法的证明,从此,PowerLogic又有了反证法的功能。 复习硬件,忍不住又要在我的小函数库里加一个阶乘,全当复习吧?不过又碰到了令我长久头痛的问题,如何输入一个大整数?或者负数?或者小数?看起来挺复杂的,对吗?

四月二十日   看起来是晴

今天,还在为昨天的事感到高兴。又把我心爱的逻辑类做成了Library,其实是很简单的事情,只是很少有这方面的资料,vc++的编译环境指令又很多,我摸索试验了好几次才成功,但是对于如何从Library里输出变量还是不懂,有谁能指导我一下呢?躺在床上想着要从我的集合类(LogicSet)衍生出关系类(Relation),不知道今天是否可以开始?

Relation算是作出个雏形,可是这算类吗?我用了大量的回调函数,程序员根本无法使用!最痛苦的是c++里不能用类的成员函数作回调函数的参数。我最后想到了友元,可是我还没有看过书,不知道怎样用。集合和元素真是一对鸡生蛋,蛋生鸡的关系,不知道谁应该先出来,烦! 又看了一遍Matrix。There is a big difference between knowing the path and walking the path.

四月二十一日  密云欲雨(错了现在是黑云密雨)

仰头看看天,低头望望地。忍不住又在MyLib里加了一两个小函数。一个人有一个梦想

四月二十二日   密云欲雨

今天早上去实验室大有收获。终于完成了debug的工作。毛病真不容易想到,因为牵涉到windows刷新的问题,因为鼠标也是windows画出来的,我先画我的图,怎样让操作系统知道鼠标的部分要更新?我必须在我画我的图之前隐藏鼠标,画完以后在显示他。

“集合本非树,元素亦非台,原本应同路,何故要分开?”学离散数学真好比是参禅悟道,今天在bus上我才领悟了集合与元素并非是“鸡生蛋,蛋生鸡”的两难关系,其实,鸡即是蛋,蛋亦是鸡。我就是一开始没有领悟这层关系才会将集合和元素分开来,写成两个类,结果在实现“Relation”时候,从最外面的集合指向最里面的数据竟然要至少6重指针,这么基本的一个类,让我搞得好累啊!

四月二十三日   黑云密雨

早上冒雨跑步把脑子淋坏了,就胡言乱语起来,哈哈,请看“明天就要嫁给我了”。

四月二十四日   

人间四月芳菲尽,蒙特利尔飘雪花。哎,又下雪了。昨天晚上想了一晚上的“薄层集合”(ThinSet)还是不行,写了一半又放弃了。头疼!

喂,那个坐在前排穿绿衣服的圆脸的同学,你留的地址不对,讲习所的新通知发不出去。(说谁呢?)

我给Matrix加了两个及其简单的方法,以至于我觉得提起他们我都觉得可耻。

四月二十五日    现在是晴

下午要模拟考试,明天要考一门组成原理,可是我现在还是无心看书。哎,现在真是不见棺材不掉泪,进了棺材也无泪,没治了。蒙城四月的雪和温哥华五月的雪差不多,记得去年刚在温哥华落地时候住在同学家里,突然一早醒来觉得窗外格外的亮堂,开窗一览,雪下完了。还没吃午饭,再一看,雪化完了。昨天的雪也是这样,晚上出去散步时候,地面干干净净,连雨都没下过的样子。

今天,我又几乎完全推翻了自己的“集合就是元素,元素就是集合”的想法,又部分地回到了集合归集合,元素归元素的出发点。难怪人们说天下事分久必合,合久必分。毛主席也说了:“否定之否定!”不过,改进还是有的,并不是原地踏步。我的ThinSet写了快一天,下午模拟考试不是很理想,哎,也没办法。我的Relation在前一版的基础上去掉了元素这个类,但是,集合内部数据和子集却是分开了。又把回调函数调整了一下。

四月二十六日   天街小雨润如酥

下午要考试了,我还在想我的程序。我不出国我干啥?

四月二十七日    阴天吧?

看离散看到一个小puzzle,考考你,我是没有答对,但是,我把它总结成一般规律了。他的意思就是“与时俱进”的道理。 下午去感受了一下蒙特利尔的春天,拍了不少照片,当然风景是主要的,我作为风景的陪衬也在如坐春风一样。

四月二十八日   阳光灿烂

多好的天气啊!和同屋的MBA胡去跑步真是冬天以来的“在那阳光灿烂的日子里”。看离散里的概率问题真有意思,当然不考试就更有意思了。说的是一个错误和大家都相关可是假如大家都不去纠正,结果是比较出乎我们意料的。

五月一日    天阴沉沉的

看到以前作业里绞尽脑汁的证明题,忍不住作了一个自以为Elegant的证明

无聊。

五月二日  阴雨绵绵

复习离散,忍不住按照书上的余数应用的例子用汇编写了一个随机数的产生函数,不过为了使用方便,我没有像c++的srand函数一样开放一个随机种子函数,要做是可以的了,嫌麻烦。 又照着最简单的加密法作了一个加密和解密函数,不过,解密的时候,我实在想不出从余数求原值得方法,只好用倍数-1次的试验整除这种笨办法, 害得我trace了一个多小时。

五月四日    多好的天气啊

今天应该是青年节,我也可以过啊!下午跑完步,黄昏去对大教堂作第N次的观光,拍了一些夕阳下的风景,同时不忘了把我作为风景的陪衬

五月六日   老天阴着脸

我心里也很烦,几天来期末考试让我不敢写程序,精神萎靡不振,向鸦片瘾犯了一样难受,心神不定,脑子也迟钝了,有时候还会像思春的怨妇一样感伤,没办法只好赶在晚上考试前随便写一个排列的发生类,其实说是写,还不如说抄,因为离散里有现成的算法,我不过把它写成个类,一个产生通用的排列的序列号,用户的对象数组可以用这个序列号作具体的排列,省得我用回调函数越俎代庖。哎,随便写写,就好像找不着鸦片抽支香烟解解闷罢了。

晚上考概率烤得我是痛心疾首啊!回来一怒之下,把组合的发生器也加入了类,其实,很简单,像算盘进位一样。至于输出接口,我还没有想好是否用回调函数,还是让类有一个属性来存函数指针。

五月七日  天高云淡,没有阳光也灿烂

今天,咱老百姓可真高兴。一高兴又用我的逻辑类作了一个简单的推理。还是老一套,已知一系列规则,事实,推出结论。这次是关于动物的,我的程序推出了这只动物是“非洲象,而不是食蚁兽”。(外人看着很无聊,鄙人却乐此不疲。这就是程序员的生活。)

五月八日   神清气爽,风走云飞

人的希望本无所谓有,无所谓无。因为,世人都在嘴边挂着,一如男人嘴上叼的香烟,女人唇上抹的唇膏,有时候,不过掩饰内心的孤寂无聊,或者装扮不够靓丽的外表。希望真正的意义却不大有人关心,敲完门的砖头早被扔到了墙角。

真实地我。而不是活在虚无缥缈的回忆里的我。  

五月十日     天高云淡,阳光更是灿烂

今天,我又把昨天从书上抄来的RSA加密算法写成一个简单的类,加密算法很深奥,别看代码这么简单可是理解起来就不容易了。基本的算法有求“inverse of a modulo m”,用的是从Euclidean算法倒推的办法。GCD(即最大公约数)也是用Euclidean算法,这个我以前用汇编写过,现在发现 有大用处,又用c写了一遍,反正是很简单的东西。还有求一个数的幂除以某一个数的余数的快速算法,这个纯粹抄书上的,否则让我想一万年也许能想到。RSA算是一种“公匙”加密算法,不过我对这个公共密匙想了很久才明白一点。为了给我的密匙,找两个很大的质数,我 又写了一个最最原始的搜索质数的小程序,见笑了。这个破程序跑了几个小时 也没有完成搜索。

五月十一日     天晴

今天,修正了GCD里的大bug,现在两个合数的GCD也可以正确的出结果了。又增加了一个linearCombination函数,就是求两个数的线性组合为他们的GCD的系数,哈哈学过离散的就明白了吧?这样239的作业就可以不用动脑筋了。我一向主张computer science的学生应该全部用程序解决所有的作业和问题。从昨天到现在我的搜索质数的小程序还没有跑完,天哪!已经十几个小时了还没有完!

Dr.Ford真是Concordia难得的好老师,我加密的算法理解过程都是在他的耐心指点下,你能想象他半夜十二点回我的邮件吗?  

我的有意义的一个星期天。 

五月十二日   小雨纷纷

今天,收到了期盼已久的DVD《Amelie》,和大家分享一下法国式的电影风格,喜欢吗?

五月十四日    天黑黑,要下雨,结果还是下了

刘教授批评我今天没有更新,哎,写不出什么东西,就把comp239的部分作业用程序算得结果贴出来吧。我个人认为除法理论是看似容易,其实挺深奥的,不过让我们去计算17的23次方处以131的余数,实在不公平,还是用程序作比较好。第12题,我还没时间贴出来,等星期四上完课再说吧。  

五月十六日    晴间多云

“...it follows by the Chinese Remainder Theorem that...”简简单单的一句话让我想了一晚上,4:40分从睡梦中爬起来,呆坐了半天才弄明白真正的含义,可是,我开始却无法想到这一层。Mr. Rosen认为理所当然的事情,我却无法想到,真是惭愧。

躺在床上又想了想,肯定还有别的途径。果然它是可以证明的。 

心愿---我现在有够无聊的,半夜12点听音乐看着时间流逝,我想用PigeonHole来证明Fermat's Little Theorem.我想改正我长久以来的错误---爱因斯坦的puzzle里面,我的程序结果是错的,我早就发现了,也几次试图改正,可是,总是半途而废,这个夏天里,我一定要完成这个心愿。我想完成集合功能的程序,我想按照书上说的用集合语言来描述所有的数学表达式,可是这一切的一切都在我的无所事事的幻想中变得越来越遥远。。。 

五月十九日   在阳光灿烂的日子里的又一天

昨天折腾了一天也没有办法证明Fermat's Little Theorem,看来我是好高骛远了,不过还是有一点心得的,也不冤。今天才有时间把作业做一下,因为,明天要交了。看我的网页总要有所回报吧?程序结果程序下载。昨晚还去看了一场电影《Matrix2》,特技还可以,情节不怎样。前天,参加别人的birthday party,居然路上碰到章鸿宾夫妇,蒙特利尔真小。

看书时候想到的问题,谁能解答?

五月二十二日   风和日丽

关于一个集合有多少个partition的问题一直萦绕在我心里。当时Dr.Ford讲课时候,那个加拿大小子要和Ford打赌说他当场得出了递推公式,我对此始终是半信半疑,这的确是一个复杂的递推公式。

五月二十六日    讨厌的雨下不停

补记昨天的博物馆日

五月二十七日    总算天放晴了

今天总算把partition的发生器写出来了。方法很粗糙,就是在数组元素中间方挡板的办法来分割集合。输出很头痛我就选择输出挡板在数组下标的位置,这样你就可以根据这些位置来分割集合了。(早晨起来发现以上全不对!简直是大错特错!!!贻笑大方了,如果有的话!

五月二十九日    晴朗的天空飘着白云

有人怀疑我的加密程序运算结果不对,这一点让我实在不能接受,我虽然没有做大量的验算,可是单凭书上的两个例子的正确验算,我相信程序是正确的。试想,假如我的程序有错,那么981的937次方除以2537的余数能正好和书上的结果0704相等的概率有多少?这种繁琐的计算我之所以写程序做,就是因为我对人的计算能力的不信任,包括我自己。

五月三十一日     晴

昨晚打游戏到3点,因为又是要写breadth first search,这总是我长久的痛苦。我的想法就是“数数”,世界上任何问题都不过是divide and conquer,所以,我想人工智能的核心就是partition,因此,我把BFS写成一个类,有几个方法我把它做成virtual的,以便后代可以重载来解决专门的问题。解决问题不过是切分,记录,检验,再总结。

六月一日 天黑黑,气温降到了8度,仿佛又回到了冬天

昨晚鼓余勇追穷寇,又用BFS的框架来解决第15题。这是一个四度空间路径问题,虽然总共只有16步,可是,到了第11步以后生出的节点就 多到以至于内存不够的地步了。因为,单单第11层就是超过4百万个节点。没有办法我只好把问题简化成10步。另外,让我对C++感到恼火的是我因为使用了static的变量结果virtual的函数不起作用了,叫我白白辛苦没法继承了。(准确地说是不能多态。)

今天又用Depth-First-Search问题重新解决了一遍。DFS和BFS运行结果呈鲜明的对比:DFS使用内存极少,仅仅几百k,但是cpu被完全占用了,而BFS使用cpu很少,只有百分之几,但是内存要用到几拾兆,最后把磁盘的交换文件都用光了还是不够。这个问题的结果很夸张的,如果我的计算正确的话,结果文件大小会有1G多。我的D盘都撑破了!

六月二日  看窗外阳光灿烂,听树上小鸟唱歌

早晨终于抽时间验证我的加密程序了,我一直坚信我的程序没有错,可是为什么结果和老师的答案不一样呢?终于搞明白了,我的输入0667前面的这个0在害人,0代表8进制啊!

六月六日 昨天是什么天气我今天早晨实在想不起来了

昨天的考试简直是开玩笑,竟然和sample一样!简直就是cheating!回来后愤愤不平就写了这个无用的Container类,不知道这种动态二维数组用什么用,反正就算是练习一下模板类的继承吧?总算明白继承前要先给父类传递子类的类型参数,否则编译器怎么编呀?

六月七日  好像是晴吧,下午出门看就知道了

夙兴夜寐,殚精竭虑,苦苦想了将近一个月终于完成了Partition的发生器。我也终于明白了我前天潜意识里面写多维动态数组的意思了,就是为了存储partition啊!冥冥之中似乎有什么暗示,今天临辰5点从梦中醒来发现在梦里我已经有了程序的思路了。不过仔细一想,其实方法我老早就想过,只不过因为效率的因素,不想用递归,所以迟迟不能解决,当然存储的形式也是重要因素,像这种最少一个元素,最多n个的数列,存储实在是一个麻烦事。

六月八日  太阳真灿烂啊!

下午,一觉睡醒,硬拖着MBA胡去跑步,然后,躺在HEC前的草地上学洋人晒太阳,一边欣赏眼前身穿BIKINI也躺在草地上刻苦读书兼显示身材的法兰西MM,一边畅谈起我儿时的理想:小时候出生在西安,常听说当地的老农民的理想就是冬天里有太阳的日子里,躺在向阳背风的山坡上,边晒太阳边抓破棉袄里的虱子,然后,中午回家吃老婆从政府那里领回的救济粮做的饭。恍惚间,我正在实现一个中国农民当年的最高理想:来到加拿大晒着太阳,抓着从草地爬到身上的小虫子,然后,回去吃着QUEBEC政府的Bursary做的饭,唯一不同的是饭不是老婆做的。不过反正是有饭吃就是了,哈哈。。。

补记昨天的日记

六月十一日  下了一天的雨

真闷啊!胡思乱想就写了这么个无用的东西:Number Divider。比如一个数10,你知道有多少种和的形式吗?(正整数)10有39种组合方式。早上无聊之际又把我的矩阵类修正了一个bug,现在可以正确地求解多元一次方程组了,不过,这实在太简单了,都不好意思贴出来了。不过,为了维护程序版本的连续性还是贴吧?关于LHRRCC没有学过离散的我也懒得解释了。

六月十二日 Another day in Paradise

如果说蒙特利尔的冬天是地狱,那么这里的夏天就是天堂了。我今天当然就是在天堂里的又一天了。这年头不知还有多少人喜欢Phil Collins的歌了?这就是我

六月十四日   风雨如晦

老妈第一次写邮件给我,并把老爸的来鼓励我。下午去买了个数码相机,这是我认真学习的样子。今天,又胡思乱想一番,不知所云一通。 临辰三点我还在看DVD,有时候我对自己很绝望,18个鸡蛋如何放到四个篮子里呢?这个问题并不很难啊,可是我的程序却写不出。谁能指点我一下呢?

六月十六日   风轻云漫,阳光灿烂

读了离散里的Hamilton Path,决定响应毛主席号召理论结合实际,跑到公墓里在迷宫似的林荫道里寻找Euler Circuits.哈哈实际上是用我的新数码相机拍风景照了。晚上debug了半天,自己随手改了一个小东西,结果害得我吃尽了苦头。我把我的BFS类变得标准化了,程序员只需要重载一两个函数。并且又解决了离散里一个简单的小问题。

六月十七日   晴

晚上上课回来加夜班赶着写Dijkstra算法,就是图里面的最短路径算法,好累啊!眼睛都快睁不开了。我觉得算法可能有问题,因为,最小值是对的,但是路径却不对

六月十八日   还是晴天

早上醒来才完全明白为什么昨天的算法不能给出正确的路径:因为节点加入集合的顺序与路径是毫无关系的,我们只能记录每个节点的前一个节点来最后逆推路径,因此,我在display的函数里用个简单的栈就能给出正确的路径了。本来书里的算法只是算最短的长度,路径完全是副产品,所以,没有提到。

六月十九日   阴雨绵绵

在Matrix里加了一个Warshall算法,算是对求transitive closure的一种快速算法吧。别看简单实际上很不好理解的。关于递归公式的再思考

六月二十一日   晴

离散老师出的额外的题目

六月二十二日  晴

昨天为了写isomorphic,结果意外地想到了解决树根设为静态变量,后代无法继承重载虚拟函数的问题。这个静态变量我把它做成了指针,只有在开始搜索前,有对象传入自己的this指针,把自己设为根。同时在添加子节点的时候,必须重载createSon函数,正确地创建类的对象。我用这个方法作了一个寻找连续0的程序。昨天看焰火好累啊。

六月二十四日  烈日如火

痛苦的一天!从昨晚上就开始写prim的算法,前后整整一天了。图的最大问题输入输出,我用一个16x24的incidence矩阵来描述这个图,几乎所有的错误都来自于这个矩阵数据的错误。我把我的BFS搜索类进一步完善了,并且简化了matrix类。

六月二十五日  晴

Kruskal还没完成,运行了Dijkstra解决assignment。 我下午想出了判断图是否有circuit的办法:顶点数不等于边数。不过程序我来不及检验了,1。明天要考英语写作。2。程序跑到12层就等很久了,估计又是几百上千万个节点了。

六月二十六日  骄阳如火

早上考英语写作,那个小资产阶级的老太婆出的题目都是从她所钟爱的《gazette》小报上来的,让我气愤不已,一怒之下,就第一个交卷子去理发了。下午听rice大学来的教授的演讲,真是如醍醐灌顶啊!我坐在第一排谁也不知道我是representative of equivalence class of undergraduates。因为其他人都是研究生和博士生,哈哈。其实他讲的都是一些简单的逻辑学发展为计算机科学的基础前的历史,穿插不少人物简介和掌故,老教授的德国口音很重,不过我基本上能懂。

忽然想起TAV的不学无术的Fatty

六月二十七日    树欲静而风常不止

他们又怎知我的征尘是星辰大海。(为藏拙,不给链接,想看自己找.)

什么是树?

六月二十八日   风舞九天,云动四海

Is there "universal truth"?

I am stuck again.当我试图用DFS重做Kruskal时候我发现了大问题,我的顶点和边的数量关系的前提是connected graph才行,可是判断connected几乎和判断circuit一样的昂贵,我真是不清楚是否真的有人实际用这个看似简单其实复杂的Kruskal写过程序?谁能告诉我?

七月二日     风舞清扬

看离散时一个简单问题的另一种简单解法。昨天是加拿大国庆节,游行时候看到法轮公的盛大排场让我 气不打一处来,这帮恶棍为了拿着美元真是丧心病狂!

七月三日      东边日出西边雨

千古奇冤!蒙城一夜。离散数学的考试完全不像我估计的那么简单!最可恨的是我写了那么多BFS的程序,居然最后一题BFS不会做,真是程序员的耻辱!准备反省做最深刻的检讨。这两天把我最喜欢的王菲几首歌的歌词抄下来了。“我也不想这样”,因为不知道自己“是否太软弱”。看到“天空”“蝴蝶”,我沉醉,结果从此再也“醒不来”

七月四日    淅沥沥的小雨下个不停

为了改正我的错,我决定重写标准的BFS(用数组这样更快,虽然少了灵活性。)为此,先写一个简单的queue

七月七日    天是阴晴不定吧?

我的BFS计划又搁置了,部分技术因素,部分是我把时间都花在了测试中国互联网发展现状的调查中了。(这个说法是够含蓄了。)老师都是认真的。

七月八日     看起来天气挺不错的

什么是减法?

七月十一日    淫雨霏霏

netwalky探讨唐诗英译。

七月十二日    天是阴的

朱春明同学要回来了,我去接他的行李。(他的人我就不管了。哈哈)做了一个英文版,主要是方便只懂英文的朋友,也就是把这个网页里所有的英文及其程序部分挑出来而已。 再顺便把c++作业贴一下,这几天实在是太堕落了,什么也没有做。

七月十四日   今天天气真是好!

不是我不明白。我一直很不好意思把一个少于100行的程序贴上来,但是它毕竟解决了我一个长久的pain.朱春明同学指点我解决了一个小问题

七月十五日   阳光普照大地

把长久未解决的问题答案贴一下,是从离散里炒来的,这个问题太难了,要用到inclusion-exclusion原理。昨晚的小问题是关于new对长度为0的数组的内存分配会返回空指针吗?答案是不!你预计到了吗?

七月十六日   忽晴忽雨

安能辨尔是雌雄?贴简单的作业会有人笑吗?

七月十七日    又是一个好日子

我终于抽时间把我心爱的DFS基础类进行了标准化,我感觉我用BFS用的太多了。我的斑马问题不能再拖了,我设想用DFS来解决它。昨晚去看焰火节,澳大利亚的焰火真漂亮!

七月十九日    老天的脸色不代表我的心情

长久以来我的心里一直有一个痛苦的声音在呼唤我,今天,我终于。。。“正确”地解决了这个让我魂牵梦萦的斑马问题

七月二十二日   临辰就能知道当天的天气吗?

今天,应该完成DFS的标准化工作。买了一片《notting hill》很同情男主人公--open a pandora box with troubles inside。后来计划改变了,我该做作业了

七月二十三日   多云?有雨?

local variable的reference可以用吗?

七月二十四日     阴有雨

今天早上把作业又小小的修改了一下,主要是当所有项都为0时候也要显示一个0。再一个就是安全复制,当两个对象order一样时候,显然不用再分配内存,同时,只有当复制成功并且分配了新内存才需要delete,如果有任何的异常,原来的数据必须恢复。同时写了一个comprehensive的测试程序,结果是比较长的。

七月二十六日  风起于野,云舞长天

正如我以前所说的,每次写关于深度搜索的东西,对我都是一个恶梦,我不知道其他学计算机的人怎样,反正我是想得头疼,尤其要将其写为一个反复用的类,更是累。我已经用链表写过一个,可是从效率的角度来看数组更好,可是改旧的真不如重新写。写不出来先去长征家蹭晚饭。

晚上看焰火又是刮风又是下雨好冷。长征提供了一个puzzle,朱春明同学很敏锐地提出递归的思想

七月三十日   风舞九天之上,云动四海之边

I just want to say thank you for your great job!

八月一日         风舞云飞

关于256bit加密的猜想。还有昨天做的作业,实在是太简单了吧?

八月二日       凉夏一日

终于,终于,终于完成了烂尾工程----DFSArray,把我心爱的DFS类的内部结构改造为一个数组,我也是鬼使神差地心底里总觉得链表结构比数组效率来得稍低一些,改呀改,很简单的改造变成了漫长的马拉松--超过一个星期。程序这东西,中间一停,后面再接起来就很烦人了,哪怕再简单的东西。所以,完成了我的心愿,我很高兴。

可是,接到家里的电话,却把他们快气哭了,我也不想这样,我心里也很难过。可是,这个世上有人相信我的征尘是星辰大海吗?

八月三日     好热的一天

今天去看同性恋大游行,好热。回来把我的DFSArray基类变成lib形式的obj文件,并放在lib目录下,.h文件放在include目录下,这样就是我的一个新的library。又用它作了一个“三个传教士“过河的经典的应用程序。

八月四日    热可是下了一场阵雨

一点关于conversion constructor的小问题。And at least it is correct, right?

八月六日      又是阵雨

Is conversion constructor involved here?

八月七日   好像是晴天

作业越来越简单,我写信去complain也没有用。无聊的作业。

八月十日   晴

今天要搬家了。昨天(就是一个小时以前)花了快一天改造我的DFSArray标准类,总算有一点点成果:我认识到深度搜索因为内存使用是固定的,没有必要不停地动态分配释放内存,所以,我改为搜索开始前建立一个对象数组。

八月十二日   晴间多云

搬了家发现sympatico的高速网不能用,只能忍痛取消,发现一个小漏洞:就是我这块自留地还没有被取消,就先将就着用吧。

我在黑暗中搜索,没有一丝线索,除了天边一颗若明若暗的启明星。我想唯一可以做的就是从读字开始-wordRead.

八月十三日    晴天

虽然不能上网来更新主页,可是我的日记却应当继续纪录我的征途,因为我的征程只能是星辰大海。Do we lose file pointer? 又写了一个作业,我的测试魔板的程序本身也是一个魔板程序,因为我痛恨重复的代码。

八月十四日    又是一个晴天

我出了一道考题,因为老师要每个人都贡献一道题目。

八月十六日    早晨有小阵雨

昨天,又翻弄以前让我痛心不已的往事--Code Competition。关于最复杂的第一题,当我尝试着用我的DFS类来解决时,我以为我遇到了不可克服的障碍,想了一晚上,明白类似Turing Machine一样,对于一个确定的状态只能由一个输出结果,只不过这个状态也许是由某一个内部参数决定的内部状态,于是,我在类的内部加了一个状态参数,这样问题的options还是不变,不过状态多了,还是维持一一对应的关系---这好像是我们所有科学的基本形式,为什么?

八月十七日    艳阳天

A const demo.

八月十八日     锄禾日当午

Re: I am not asking for something, but I do want to make it clear that I finished assignment 6 early last week...

I was shocked...

八月二十一日    阳光灿烂

想起了忘却的誓言。。。

八月二十七日    好天气

也许这一个星期所做得值得记忆的事情就是发现了VC++可能的一个小问题:Is it a bug of vc++6?

八月二十九日     秋高气爽

也许计算机课程里唯一不能一目了然的并不是离散数学而是Formal Language。这是我去年在York大学偷听的一点心得,不过话说回来了,所谓语法难道不就是一种编码原则,不也就是所有语义元素的排列组合,不也就是一系列non-terminals到一系列terminals的函数关系吗?这些不全都是离散数学研究的课题吗?

胡思乱想犯下了不可饶恕的大错!从此再不得安宁!为什么人总是犯同样的错误?自罚跑操场7圈。

重新捡起几天前的计划--写一个poke的小咚咚,见笑了,现在还只能发牌,比较awkward.

九月一日   天高云淡

mathematical induction.其实我并没有什么心得,可是,为了凑数还是写了这么一段。听小皱讲曾国藩坚持几十年写日记,看来我应该学习他。明天就要开学上课了,我的征程又进入了一个新的阶段。誓言

九月五日    秋高气爽

晚上去看免费的电影,这真是劳动人民的享受啊!感谢Quebec政府,感谢Montreal政府,咱老百姓可以看上露天电影。电影是好莱坞的老片子,应该是西区克可的悬念片,因为他所有的特征都有:恐高症,失忆症,谋杀,爱情,喜剧悲剧的转换。。。

回来后作网线的水晶头,奋战到半夜,终于网络通了,真好。

九月十二日  天真热

一个星期没有做事了,一方面是小徐从温哥华来,另一方面是刚开学很紧张。这个学期的课程全是硬骨头,今天是中秋,晚上上自动机原理,真好似听天书一般。天上月圆,人间月半,年年岁岁人们都在憧憬着新的希望。我只能默默地盼望我的征途真的 如大海星辰般的灿烂。希望本无所谓有,无所谓无,想的多了就成了希望;有一份梦想总比无梦的岁月来的好,至少我每天可以去幻想。

Why should we use literals?

九月十七日   老天爷会发高烧吗?

我会的。

comp229的作业。

九月十九日   秋花落叶知多少?

最简单的作业。

九月二十一日  落花有意随流水,流水无心恋落花?

 I think there are quite a few mistakes.

九月二十二日  天空灰蒙蒙的,好像布满了征尘

我的haskell作业,一句代码想一天的作业,看来我还是太笨了。Why don't I check website first?  This is completely wrong!

335-1,335-2,335-3,335-4,335-5,335-6,335-7

The declaration of an object should not add parentheses after constructor

229-1,229-2

九月二十四日 终于云开雾散出太阳了

程序是有一个小小的错误,主要是原来改代码的时候,漏掉一行。数目应该是56个

九月二十五日  忽雨忽晴

自动机原理作业修正。335-8

我花了25块美金买的域名还是不能用,而且写信去问,始终没有回音,真担心被骗了。

九月二十六日  晴

吾尝终日而思也,不如须臾之所学。

九月二十七日  晴冷

我的域名迟迟不能兑现,我想这次是被美国鬼子骗了,上网去搜索了一个新的免费的host,没有广告,应该国内看得到吧?以后就到这里来吧,geocities的广告太讨厌了。

实际上是冤枉人家了,现在一切都好了,可惜我自作聪明把cgi脚本给删除了。因此,计数器暂时不能做了。

九月二十八日   凄风冷雨

写了差不多一天才写了一个小程序---Reduce。功能很单纯的,就是把一个NFA的Transition Diagram转换为Regular Expression。原理很简单的,就是一次次地去掉一个个的节点,合并expression。程序写的很ugly的。这里是输入文件,就是一个含有"baa"为substring的语言的DFA。

九月二十九日  风吹树摇

“蹄之”不如不“蹄之”。“提之”不如不“提之”!

九月三十日     风雨如晦

心情跌倒了冰点,我把我的座右铭中的journey改成了pilgrimage,因为,journey和joy的开头一样,而实际上真正的旅程只是一片艰辛的看不到尽头的征尘。我知道我看得越清楚,我就会越看到它的艰难,然而,这也更说明那尽头并非绝对遥不可及。

十月一日    寒风凛冽,冷雨飘零

今天是所谓的国庆节,我很高兴,因为我去学校做心理测试题赚了8块钱,是现金。又去把胡一刀仓皇逃回国时遗留下的财产捡了回来,让他们继续在加拿大这片土地上战斗。战利品包括:将近100个一分钱的硬币,一件很新的鸭鸭牌的羽绒衣,一件这小子在这里买的夹克,他穿太大,我穿才合适,毕竟咱的身材在加拿大是标准的嘛!还有那个宝贵的从ikea买回来的杂物架,放上我的printer和scanner, it's perfect!

十月二日   天气很冷,阳光还算灿烂

昨天折腾了一晚上也没有解决中文显示的问题。这个网站的server提供的脚本写出的字串不能正确显示为中文,所以,我只好把留言簿作为英文的小小BBS作为中文留言簿

作业太多了,因为,没有什么作业是容易的。除了自动机原理,三门课都有programming的作业,我虽然不怕,也很喜欢,可是,毕竟大都是新东西,要浸润几十个小时以上才能成为专家吧?反正我是这样,就好像汇编,总要自己写很多程序,才算比较熟悉吧?

十月三日 阳光也变得如室内的暖气一样捉摸不定

229的作业真是不好做啊!一上午也没有做完理论部分,最后一个关于bootstrap loader可能遇到的错误,我实在是想不出来,大家讨论一下吧

十月五日  阴雨绵绵

今天下了一天的雨,心情郁闷到了极点,脚本语言简直是垃圾一样,我已经决定不再尝试了。烦闷的打了一天的游戏。想象人就是这样,平常抓得再紧,偶尔一放松有全都废了。何况我平常也不是那么抓紧点滴时间。

花了一天时间写数据结构的程序,写得很开心,因为这样的C++程序才是我所乐意写的,不算复杂,可是写起来挺有意思。主要是我花了将近两个小时在胡思乱想一个毫无疑义的问题:能否把一个模板类作为类型参数传递给另一个模板类呢?这实在是无稽之谈,我却想了很久都不明白。最后还是放弃了,老老实实地按常规写吧。结果在这里,这是一个很简单的洗牌的模拟,主要是必须运用抽象的基类的方法来完成,同时,要分别用数组,合链表两种子类来检验。

十月八日  晴朗的天空

今天真不好意思,看书发现了我的reduce程序有大bug。原来我不能假设在最后的结果中间头不能从final到start。花了一上午改正,真累啊。夏天的回忆,一组夏天拍的风景。作业的简化版。

十月九日  多好的天气啊!

今天晚上考自动机原理,题目非常的简单,可是,让人担心期末会很难。一高兴就把Dr. Ford讲的minimize DFA算法写了一个小小的类,算是第三版吧!现在是一点钟了,我实在是没办法完成merge等价节点的程序了,这种活看起来简单,写起来很繁琐的。

十月十日 夏天最后的灿烂

今天我从别人那里偷来了脚本程序,改了改就准备交上去了,这是我的耻辱,可是我实在是没有办法,我对脚本语言深恶痛绝了,看见就恶心,叫我怎么去写?就如同我讨厌java,以至于离开几条街还讨厌听人说起他的名字。窃书不算偷,程序就更不算偷了,大不了我将来多写一些c++来弥补我的罪过就是了。但是今天的收获却是解决了长久困惑我的一个小问题,这个说出来会被人笑话的,就是在head file里声名的变量必须用extern关键字才能被多个cpp文件引用。或者就干脆把他声名为static。见笑了。

十月十一日   今天又享受了一下我最喜欢的炙烈的阳光

偶然看到文学城上的无名氏的文章把加拿大,尤其是把蒙特利尔说的一钱不值,跟美国比怎么怎么不行。心里真是很愤懑,既然你认为这里不好那就不要在这里呆,又不是加拿大魁北克政府请你来得,美国既然那么好,你就直接去美国好了。加拿大就是加拿大,并不是美国的第51个州,加拿大不叫州,和中国一样叫做省。真是讨厌的一帮家伙。估计作者说不定就是什么什么IT企业LAYOFF以后来到CONCORDIA领BURSARY的主呢,真是中国那一套端起碗来吃肉,放下筷子骂娘,一天到晚牢骚不断什么大事也做不成,在国营企业混久了的那一类人。

十月十四日   灿烂的阳光让我舍不得平平淡淡的度过

忘了今天考试,哎想想看还有比A++更重要的事要做,那么就原谅自己吧?把昨天拍的照片放在了“秋天的沉思”里。至于煞风景的我不看也罢。娃娃的照片--秋天的回忆。

十月十五日  凄风冷雨

做作业啊,做作业,做不完啊。comp229-3。 335-1, 335-2, 335-3, 335-4, 335-5, 335-6, 335-7, 335-8

十月十六日  下午日出早上雨

应大家的要求上传SSH的客户端,欲下从速,只挂一个星期,有5M太大了。

十月二十一日     淫雨霏霏

I think I messed up with "virtual fork" with real "fork", Haskell Assignment 2

十月二十四日   有雨

编229的程序简直让我发疯了,花了三四天还没有完成。到两点半,调试过程出了一些莫名奇妙的错误,我简直疯了。后来想也许是服务器要睡觉了吧?果然连不上了,那么我也睡觉吧。也许DFA就是让我们找到能实现函数对应的一种方法,比如,我们人类能够研究的所有问题都是函数类型的,即一个确定的定义域的只有一个确定的函数之对应。逻辑也好,functional programming也好都是遵循这个原则。

总算完成了,我觉得还是挺完美的嘛!一高兴就把所有的作业都集中起来了

十月二十六日   淅沥沥的小雨下个不停

奋战了一夜半日完成了352的程序作业,至于考试我就管不了了。题目看起来不难,无非就是应用二叉搜索树来完成数据的记录与添加删除,存盘。我的超级字典里就都写过,只不过我那时候傻傻地为了存盘后再读盘能够树的结构不变,专门用记录每个节点的顺序来实现,现在知道只要两行代码用preorder就可以了。也许真正困难的地方是看懂那些复杂的模板类,比如标准的BST魔板有四个类型参数要传进来,他的内部的节点也是一个小的模板类,其中的类型参数是我们自己定义的一个类。我感到比较满意的地方是我写了一个简单的菜单类,他接受用户传进来的一个字串数组作菜单标题,用户的输入就是返回值,用户也可以把每一个选择所对应的函数当作函数指针传进来以便实现自动反映,不过因为写回调函数麻烦,类的成员函数不能当作指针参数来传递我就没有用这个思想去做了。我眼睛睁不开了。

十月二十七日   雨下的不停

想起昨天看得《终结者3》实在是糟糕。因为果然不出我的所料,离开了James Cameron,整部片子毫无创意,既不能和以前的情节相联系,也不能超越旧的框架,实在是一个蹩脚的三流动作片。施瓦性格也是乱来一气,演得更像一个活人而不是机器人。

十月三十日   晴天?忘了?

昨天写了一个简化版的352的作业。今天晚上考自动机原理,题目比较容易,就又对我的NFA---REG EXP的转化类作了进一步修正,改掉了若干错误,增加了用户自定义的删除顺序,并用一个产生所有排列顺序的辅助类来对所有的删除顺序产生结果,出乎我的意料,结果竟然都一样!!!肯定是由bug!

十月三十一日  好天气,阳光明媚

做数据结构作业忍不住用程序来试验算法,就是把BST用逐行的方式输出,见笑了,我现在离开编译器就玩完了,考试怎么办?问题是这样一个简单的实验我居然用了5个大类,每个大类又有若干基类(一般为抽象类)和子类,或者兄弟类(如比较用到的几个类),其中几个大类又都是模板类,又把别的类作为内部对象或者模板参数。还不包括I/O用到的各种类。这是多么的奢侈啊。

十一月一日   阳光成了老天爷难得一见的笑脸

早上和黄教授慢跑,跑到了Angrignon公园,又一次欣赏了入画入诗的美丽风景A concise solution according to notes. 不敢藏拙,把352的作业贴出来供大家指正。我希望能对大家有启发,也希望别人能指出我的错误。

十一月三日   又是阴天

335的作业好像是猜谜语,写了涂,涂了写,写了10页还有两道题不会,只好放弃。

4.b)ii)  {a^kb^n|  2k<n<3k} 这一题我想了很久也写不出语法,谁做出来了?

6.c)  S=>aSb|aaSb|e     我知道ambiguous的例子,但是unambiguous grammar我写不出。

决定只保留最近5个月的日记,老的日记放在OldDays。这样打开首页不至于太慢。

我在想也许。。。

十一月四日   小雪

下了早课回来,天上飘起了雪花,路上行人的脸色也仿佛突然从往日的萧瑟变味了冷峻。冬天来了,车顶上的白色积雪小声提醒我,虽然水汲汲的人行道还在顽强地为秋天争辩,愈走愈低的温度却无情地宣判从此以后冬天将正式接管我们的生活了,前几天提前命名的“秋天的回忆”名副其实地成了回忆,从此以后,那短暂辉煌的秋天的金黄色会让位给冬天的雪白。冬天来了。昨天,张洪岸的解答很巧妙,我想了很久最后一步就是想不出来:

4.b)ii)  S=>aSbb|aSbbb|aabbbbb 这一步的差距真是巨大啊。

十一月五日    雪过天还是阴

完成了229德programming作业,这个和上一个作业的反差太大了,因为动态链接,静态链接不需要你去编什么代码,工作量很小,只是需要理解

十一月八日    灿烂的阳光并不让人高兴

we are not allowed to delete "head" because the prototype of function is passing "head" as pointer instead of "reference to pointer". 

229的作业要求太含糊了,我问了MIA只好改:动态库和静态库与main程序要一起链接。

十一月十一日  小雨

229的理论部分有标准答案,不过我还是用自己的话重写了一遍。把程序作了一点点的修正,并解释了怎样证明dynamic library不是必要的。(实际上所谓的“必要性“很是含糊,从什么意义上来说明必要呢?我的理解就是动态链接是动态的就是,需要才链接,没有用到,即便程序有错也发现不了,当然如果压根就没有程序也是可以的。可是这是直觉,真正的环境下还是不对的。简单说,就是链接时候,linker会做检查,骗过去以后,就把动态库拿走,偷梁换柱重命名一个假的来试验,可是,o.s.会在run程序的时候检查动态库是否在,并且很过分地检查文件类型,所以,用空文件骗不过去,可以找一个系统的动态库重命名。当然,你的动态库里不要有任何主程序一run就要用到的变量了。)

Can you show me something like this?

十一月十二日  阴天

How can I find threshold?    352的第四个作业要比我想象的麻烦,主要是题目的用意不是很清楚。我先把第一个版本放在这里。 好久没有写puzzle了,老张小李贡献的题目。

把《英雄无敌》的一个战役改编成小说,我吃饱了,不过,我很怀疑这个系列我会不会继续下去,毕竟没有多少人感兴趣这种幻想小说,更何况背景知识贫乏的话。

十一月十五日  晴天

348的作业做不出来,只好写写数据结构的排序程序派遣郁闷。我本来的想法是应用Radix Sorting的原理来对数据库的多个index来综合排序,结果写完了发现完全不对。

十一月十六日    云纵四海,心驰五洲

Can you justify the grammar for me?

十一月十七日    晴朗

最后的希望4。

十一月十九日  小雨绵绵

昨晚去参加微软.net的学生展示会,吃了一个免费的pizza,但是回来的时候,地铁还在罢工只好打的,连小费花了18块钱。.net的思想我觉得是可行的,的确,我们一定要在每一个平台上都实现一个虚拟机吗?sun公司这样做不是更大的垄断吗?看来所谓业界的反对垄断只是反对微软而已。因为,统一从来就是列强的末日,正如台湾岛上的一小撮一样,不统一还可以呼风唤雨,统一了就只好去卖扁食度日了,这也正是他妈给他起名叫阿扁的一个原因。与其统一平台不如统一语言,这个思想不先进吗?微软试图用xml,或者web service等方式让不同的程序可以交流,这有错吗?如果有错,那就错在它是微软,一个所有软件公司的威胁,正如当年秦国试图统一战国列强时候,秦国的一切错误一样。

自己总结了一下消除ambiguous grammar的简单思路,完全是基于作业的答案,仅供参考。

十一月二十一日   雨

下午,348的老师讲了一个简单的程序,我就把源码要来写了写。

十一月二十二日  晴朗

229的理论作业颇有些难度,经常我发现自己在不知所云地写着答案。这里是makefile。在echo后面千万记得加上引号,不然,问题很奇怪的。写了一个测试程序,如果各位明白其中的问题,我想我们可以交流交流。不过我很怀疑读者中有这样的人,但愿我是错的。

十一月二十三日  晴

229的程序部分是最简单的了,可是,不做你永远不知道怎样做makefile。我怀疑有多少中国的程序员自己写这种东西,很简单,但是,你不一定知道啊。

十一月二十四日  晴

352的程序部分,我极其得不满意。我甚至怀疑老师是否自己写过,因为,程序很简单,所以,他未必会完成它。

十一月二十五日  晴

Is there any binding between function name and library?

十一月二十六日   晴

352的程序用到了9个头文件,两个cpp文件。共有3个抽象类,4个子类,3个辅助类,不算太多。真正的问题很严重!虽然不能从根本上动摇我的信念,可是,从实际的角度出发,几乎是搜索无法解决的,至少从我的角度看来。

I am running, so I am.  335的作业太难了,证明题我很多都不会。

Can we prove like following?   Dr. Ford's explanation is clear and convincing! But can we prove like this?

十一月二十八日   阴天

李维提供的很有意思的程序,对于c++程序员来说,如果不知道这些运行内幕,就不会意识到随手一行代码有多么昂贵的运行代价!我并非一个完全对Java,VB又固执的个人成见的人,只是始终觉得那些东西可能不是真正的程序员应该做的事。正好像现在很多小孩子玩flash玩得很转,我们能认为这是一种真正意义上的编程吗?

北美需要程序员吗?

十一月二十九日   现在是小雪

The no.3 question is tricky! And I have no idea how to find out the cycle.

十一月三十日     小雪还继续在下

关于Dijkstra的一点解释,这是我夏天学离散的时候照着伪代码写的,现在学了数据结构后应该抽空改写一下,可惜我的进度总是落后,348的midterm还没有做完呢!

十二月一日    总算晴了

心情也好多了,因为昨晚总算做完了所有的作业,可以开始复习考试了。352的作业也很烦, 程序部分我又写了一个简单的版本

十二月二日   晴冷

今天感觉很冷,因为差不多零下20度,去china town理发,顺便买了一些羊肉和小朱涮羊肉。花了大约一天时间写数据结构的各种算法,算是一种练习了,有一道题目是老师提出的:给两个有序的List,输出另一个List要求只包括两个list里不同的的元素。我花了好几个小时才写出一个效率比较高的方法:类似mergesort里的merge过程,但是比merge要复杂的多,因为重复的元素会造成很多问题。

十二月四日   冷晴

去跑步的时候冷得受不了了,看来以后要戴手套,帽子跑步了。按照DFA的思路写一个最简单的scanner,他的特点是结构清晰简洁,我把一系列的transition function放到一个数组里,函数的返回值是他指向的state的index,所以,可以再作为调用下一个transition function的参数,scanner主函数负责检查要检查的字串是否结束,函数返回值是否表示被拒绝(-1)。当检查完字串后,检查是否落在final states的集合里。多么简洁,清晰!我的数据结构练习又加了几个小函数,为保持版本连续性,把他们放在2里

十二月五日     零下十几度

网络断了,要星期一才能重新安装。

十二月六日     大雪纷飞

写了一个Depend的简单的类,这是一个很普遍的问题,比如,计算机的课程都有顺序,一门课可能有很多其他的课程作为pre-requisite,如果要你列出每一门课程的所有的pre-requisite。再比如,写makefile的时候,我们设定了某一个文件是依赖于某些其他文件,那么怎样建立这样一个树。又比如汇编器里对forward reference的处理是建立一个类似的结构,即某个变量包含若干个forward reference以便在遇到声明的时候再回过头来完成instruction。归根结底都是一个图的edge list的表示法。

十二月七日   雪在飞

改进了Depend,现在可以用topological sort来显示工作流程,并且能够显示所有的pre-requisite好似编译器里没有non-terminal的意思。我困死了,链表的指针操作确实是一件痛苦的事情。

十二月九日  雪停了

348的paper贴上来,做个纪念,因为,我认为思想也不过是push-down-automaton里的一些stack-symbol,状态结束也许就要被新的思想替换,每个人在当事的时候都有自己很信服的理由,过后来看却也许是些不知所云的垃圾。但是,这些stack-symbol确确实实是思想的轨迹,没有他们一个人就不成为一个人了。正如同操作系统里用process-descriptor来描述一个进程一样,我觉得人也只能一系列的状态量来描述,过了某个时期,状态改变了,就算外表状态量的改变微乎其微,思想的改变足够大的时候,我们也可以说这个人已经是另一个人了。所以,记录下人的思想的轨迹也许是最好的,因为这些定义了这个人。

至于那篇critical review我想我的情绪在当时是偏激了一些吧?不过,我看网上说,在英国所谓的lecturor在一些新近的大学里不过是助教的同义词,这也许能解释我的愤怒与不满的原因吧?也许妒嫉也是一个成分,我需要决定是否发给作者,去刺激她一下,满足我的有点阴暗的心理。

十二月十三日    阳光灿烂,所以我们去跑步

冷的不得了。穷一日一夜之力写了一个memory management的模拟程序,这是数据结构的一个章节。不过代码我不满意,因为,既无扩展性,也不完美,纯粹是一种耗时耗力的冬冬。

十二月十五日   雪下了一天一夜,有一尺厚了

Dr. Ford实在是一个数学家And my stupid assumption!

十二月十六日   雪好像停了,路边的雪被堆得有半人高

今天考自动机,题目出得很简单,一高兴就给metro的音乐家一个dollar的硬币。不过,那个弹西班牙古典吉他的乐手弹得确实很不错,如果“胡一刀”在的话准会喜欢,因为,这正是他喜欢的“slow hand”的曲目。这个家伙现在也不知道在干什么?

十二月十八日  天是那么的蓝,阳光是那么的灿烂

我的AVL Tree成了又一个烂尾工程,我确实没有意识到这是一个繁琐的工作,难怪Shaffer没有提供代码,无论如何要完成,不过不是现在,我想大约是在冬季。。。。简单地玩玩数据结构。晚上要考试了,我却坐在窗前往着蓝天阳光听着王菲钢琴版的《堕落》堕落着,而且愈堕落愈快乐,这是歌词立唱的,不是我说的。不过我想我也差不多了。硬盘不够存王菲的歌了,只好拼命地删垃圾文件,看到了夏天里我拍的风景,真是令人向往啊!我喜欢热带强烈的阳光,我喜欢温带和煦的清风,我喜欢冻土带静谧的森林。。。但是我最喜欢的还是Montreal永远是阳光灿烂的夏天。

十二月二十六日   下了一夜的雪

这一阵子俗务缠身,我的AVL Tree始终被打断,我也一步步地改动,因为,我发现我的想法开始的时候是很不完善的。终于在今天临辰完工了!终于可以舒一口气了。首先,模板增加了代码的复杂性,因为正如Dr. Peter所说的“编译器并不理解模板”。其次,我出于效率的考虑希望维护平衡的代码尽量的有效率,否则平衡所带来的worst case logn的好处就不大了。值得自豪的是,我在inserthelp里的加了我的方法使得维护平衡与添加同时从树的叶子一步步向上,省掉了另外的遍历过程。但是,我们必须考虑转折点(就是自下而上第一个factor绝对值超过1的节点。)是根的特殊情况,又因为树是一个单向链表,我要做转动的时候必须找到转折点的父亲才行,如果转折点不是根的话。这里面的情况有些混乱,我到最后才理解,改了好几次,而且我发现所谓的double rotating如果转动的节点不一样的话,单用single rotating也可以个保持树的平衡。这个就留给第二版去解决吧,如果有的话。另一个问题是是否一定要用子树的绝对高度作私有数据?是否应该按照伪代码一样用balancing factor?这样也许也可以省略掉指示道路的另一个私有数据---inLeft。这个也留给下一版去解决吧?最后一个恼人的问题是子类继承父亲类的一个protected指针,是否这是两个指针?因为我被这个问题困扰了许久,等作个试验就知道了。我想没有人明白我自己。我现在就想接着睡觉,实在太困了。

哎,这个问题真是丢人,早在用delphi的时候就知道,当子类与父类共用一个动态数据的时候,最好是由所有者,或者说父类来负责消除内存,这样最安全,或者养成习惯,delete之后把指针赋值为空指针NULL。

十二月二十七日   阳光灿烂得让人心醉

长征考试的一个题目我试图把一个数组分为一个max-heap和一个min-heap来寻找中位数,因为题目的要求是算法的复杂度为O(n)。结果,我胡思乱想的去重新默写了一遍heap的创建,因为要先能随意地创建max-min-heap。我试图用改变模板参数中的比较类来实现随意创建min或者max,这个问题我以前问过老师,他懒得理我,我也觉得很无聊,毕竟所有排序算法程序中实现用户自定义“升降”序的办法不外乎就是传入函数指针,如同回调函数一样,自己去看看就是了,有什么好问的呢?所以,我现在也觉得我写的这些都是些废话。我几天前考问春明除了用传入函数指针来实现用户自定义的比较方法外还有什么办法,现在想这个问题本身除了炫耀式的“回字有几种写法”外好像没有什么其它的意思。毕竟大多数学EE的人一辈子都不一定要去写回调函数。其实,我也是看到了课本中Mr. Shaffer利用模板参数传入一个static class来让用户自定义排序中的比较方法,才领悟到其中的妙处。问题是,用这个方法,我只能在声明的时候来决定“升降序”,也许用一个bool的旗标更好吧?

就简单地写了一个第二版凑数吧。

春明同学的时间观念与我们大多数人不一样,他每次说到我这里需要多少时间实际上都是乘坐亚光速飞船上的时间,我不是说他来去如风,而是说根据相对论,他在亚光速飞船上时间比我们慢,他的十分钟相当于我们大多数人的半小时。

十二月二十九日   天好像是晴的

我为什么要这样折磨自己的头脑?我实在是想不出,因为这个Turing关于计算机又无法解决问题的证明实在是一种折磨。我始终觉得这种问题是一个逻辑问题,或者说反函数的例子,也就是说一个函数只有当它使one-to-one and on-to的时候才可能有反函数。那么对于逻辑的推论,也就是imply来说,是没有converse的,比如,如果输入是hello,world,那么输出就是yes。我们能够说“如果输出式yes,那么输入就是hello,world”呢?显然不行。可是,问题是证明里面我们又强迫输入等于输出----turing program的输入就是它本身。这里面的关系实在是有些理不清楚,不是怀疑证明的正确性,而是怀疑这个问题本身是否是一个问题。比如这句话“这个问题本身是否是一个问题”作为这句话里面的“问题”,会怎样呢?我现在头脑像一团浆糊了,睡觉吧。

我想到了什么,等一等再说。能这样解释吗? 我又用中文解释了一遍。

工欲善其事,必先利其器。花了两个版本来写工具,今天才开始做应用,也就是长征的一个题目:怎样用一个复杂度为O(n)的算法找出中位数。我本来还想写一些累加比较,移动次数的统计方法,以便用实例来证明我的算法是O(n)。不过,debug比预期的晚了些,我肚子太饿了。

十二月三十日   天下着小雨

早上一大早去Burger King进行“社会实践”体会到加拿大劳动人民确实是生活在水深火热之中。搬了一百多箱才挣了35块,夏天的机票钱是不容易了,不过对我这敲键盘的手是一种很好的锻炼,至少省掉了原定去健身房的钱了。回来头脑有些麻木,这时候听到王菲的歌曲特别的感动。为了进一步证明我的算法是线性的,简单地照作业的方法统计数据移动和比较的次数,再和数组长度比较发现,当数组长度加倍增加,这个比值近似为常数。当然,index的比较是忽略不计的。

简单地年终总结

二零零

一月四日   天有阴晴,月有圆缺

昨天,看了《我的野蛮女友》心情很郁闷。今天总算完成了让我太阳穴疼痛多日的scanner。不过,对于注释的输出处理得不好,所以,当注释很长的时候,会有些问题。但是原来的作业要求并不是那样。先这样吧,否则今天的心情就更加郁闷了,难道是因为参加老朱家的party?我想这不是真正的原因。但是,心却莫名的疼痛。。。改了好几次,总算完成了。我自己都觉得有些不可思议,我为什么要去实现"nested comment",实现并没有什么,问题是有什么意义呢?难道你要求程序员写注释的时候都要考虑括号匹配?我纯粹有些无聊。为了绕过feof,我不得不用ifstream,而这时我一向不喜欢的,为了能够把空格,回车换行符都读到,我不得不用一个低级函数get,结果换行符成了1310,我只能把这两个都当作是whitespace。这真是烦。我还突发奇想把程序的源码当作输入文件,知道这是自动机的那个鬼证明题在作怪吧?你不明白?当然了,不是computer science的有几个明白?当然了,那个源代码被改得七零八落的。

一月七日   雪霁

我还不敢开始我的parser,因为和scanner比起来难度是几何级数,这正如context-free-language的复杂度不是regular language所能比拟的。很多基本的算法我都还不懂。去找教授没找到,却看到一幅有趣的漫画,其中的寓意与孔圣人所谓的人需要鞭策异曲同工,我应该就是这么一个贱骨头,如果价格合适的话,我也许应该去买这样的东西。回来的路上,在地铁里倾听“地铁音乐家”的即兴创作,其中那位爱沉思创作的电子琴手的演奏让人流连忘返,仿佛引领你的想象力在无边无际的原野驰骋。我的parser也许应该是OO并非简单的object-oriented而是operator-oriented,因为所有的语言里都是operator为中心的。

玩了一会儿c++的宏命令,因为,我一看到Java就总觉得恶心,这种小孩子的玩意儿,我猜想肯定如同当初我学Delphi一样都是人家做出几个类包装好了你设定几个属性,对着回调函数写事件函数,那时候好有成就感啊!结果学了半天并不是在学习什么编程,只不过是学习其他程序员的编程习惯,包括变量函数的命名习惯,因为,你天天在用的就是别人命名的方法名字。想到这里我就来气,想起不知道在那里看到的一段议论,大意是业界使用开发工具来把程序员变成白痴,大学则是想方设法与之抗衡,但是随着越来越多的大学使用Java这种白痴工具,看来这种竞争中工业界占了上风。一气之下,我决定定义一行宏以后统统用sesame open door来代替using namespace std。

一月十日      酷冷

半夜醒来,想写一个“语法”阅读器,因为CFG本身也应该以文件的形式来读入,可是,问题没有想清楚,结果就如同“软件工程”这门课里介绍的一样,一个project半途而废。我不知道在我开始写parser之前还要准备多久。

一月十二日    冷酷

磨蹭了好几天才完成了一个如此简单的小程序:context-free-grammar reader。是否有人明白其中的用途?因为要写一个parser,而他会不断地需要检查语法,此外,假如我们可以由用户定义语法,势必要有这么一个语法阅读器,不用说去除left-recursion就更是需要了。写在还很不完备,仅仅是从文件读入了,对于一个数组来说添加删除是一件很头痛的事情,就把语法修改的任务放到下一步吧?因为我想吃饭了。

无聊之际跑到sinoquebec发现我一年前贴的帖子现在还在,不过把年份换成了2004。

一月十四日     零下31度,加上风力你会认为是零下43度(是摄氏不是华氏)

我不明白究竟零下30度和零下四十度有多大的区别,我也不明白在这样的清晨里在户外做苦力会给你留下多深的印象,我只知道当我坐在我的小屋里迎面看着从门窗射进来的刺眼的阳光时候,头脑中也如这惨白的阳光一样一片空白,人的记忆难道真的如沙滩上的脚印一样朝朝暮暮地被海浪洗刷的一干二净?我记得我的scanner所用的我自以为很独特的方法不过是table-driven的一种变形,而且不容否认的是table-driven比函数数组来的更有效率,更容易扩展,因为,在编译器的设计里,函数都是一种奢侈品。我记得我的梦想随着我的前进一步步地模糊,我记得我曾经以为自己是一条一天到晚不停地游泳的鱼,我记得我总是沉浸在深度搜索里几十层以下畅游的乐趣,我记得我总是幻想创造一种新的语言,我记得我时时刻刻意识到自己是一个凡夫俗子的痛苦。我记得什么?我只记得我今天冒着严寒干了一早上挣了20块钱。除此之外,没有什么了。

以后要记住‘0d*’代表八进制,‘0xd*’代表十六进制。要在c里面表示单引号:‘\'’。双引号同理,'\'单独用在macro里做换行符,feof有函数和macro两个版本,我也不知道编译器用哪一个,干脆以后直接用FILE里面的flag来判断好了。

一月十五日   阳光灿烂可是应该很冷很冷的

与jeppeter君商榷,你的mailbox退信,故改在这里了。

Is template a kind of macro in C++?

一月十六日    下雪了吗?

The several stupid mistakes I made when first using java.

一月十八日    天下着大雪

殚精竭虑,夙兴夜寐,终于完成了table-driven-scanner。我为了效率考虑,不惜去初始化一个138x72的巨大的表,同时还有别的表,用尽了我所能想得出的dirty trick。一般情况下我是不大喜欢把code写的这么tricky且无延展性的,可是效率,效率,效率。以至于我甚至把15个关键字也纳入了DFA的状态了,就不用说256个ASCII字符了。

一月二十三日    天晴了

scanner有一些小毛病,比如错误出现的行号会差一行,因为,换行符被读到的时候正好是token结束的时候,同时error-handling的机制要改进以便将来整个compiler都可以来调用。其他都是小问题,就不值一提了。在旧书摊买了一本关于二次大战中加密解密的故事,我觉得学计算机科学的学生都应该来读一读,因为信息科学乃至所有的科学文化都无非是一个加密解密的过程。在amazone订购的英文版<besieged fortress>过了半年才到。

下午想转到另一个section没有成功,心情很郁闷,我并不是100%认为Dr.Probst是一个不学无术的教授,可是,至少他的方法我认为是失败的:在学生还没有接触任何实际的一个操作系统的解决方案之前向学生灌输独立于操作系统的原则与思想是非常危险的,也是非常无用的。我不可能荒废一个学期时间来学习理解加拿大电视台里快嘴主持人的俏皮话。痛苦之余只好写一个奇怪的字典聊以自慰。这是一个奇怪的数据结构,也许受Huffman编码的启发吧,我一直觉得我没有能在数据结构的学习中尝试自己写Huffman编码是一个很大的遗憾,为什么在Concordia不讲讲这个有意思的东西呢?在效率与节省内存之间我总是捉摸不定,一开始我曾经想用一个快速字典来查询,也就是每一个字母下有26个字母,这样一个巨型的树需要多少字节呢?即便我用最精省的bool来表示,一个所有单词不超过8个字母的字典需要大约200G的内存,太夸张了!所以,我只能缩减为链表结构。当很多词有类似的拼写的时候,或者说有很多相同的子串的时候,我的结构比二叉搜索树有更好的效率,并极大地节省了内存。当然,我的字典非常难以删除一个词。

一月二十九日    晚上开始下小雪了

346的作业实在是bullshit!这不是我说的,这是“阿里”说的,不过也是我所想说的。

354的project需要一个简单的文字显示界面,我想把这种routine的layout的工作简单化,就写了一个Layout manager。原理很简单,说起来好笑就是把每一个可显示的对象定义为长方形,那么这个对象会有一个左上角和右下角的坐标,这个区域内的显示让对象自己去通过一个pure virtual的方法displayRow来实现,其他部分的default的显示就交给Layout Manager来做了。

一月三十一日      这是补记的日记,忘记天气了

The Daemon arises here.

二月一日      天气好象是不错的,忘了

If you cannot see Daemon, I can show you.   Anyway I shouldn't say about the minor issues.

Maybe we should neglect the minor one and concentrate on the Deamon.

二月二日  天阴沉沉的

Either my English is too poor or we are not talking about same question. I think I have to ask someone else.

What a wonderful explanation!!! And finally we caught the subtle daemon! Mokhov 可以说是我在Concordia里不多几个值得敬佩的研究生了。

这几天我被动态链接库所折磨,被多线程编程所折磨,理不出头绪,各位客官是否有那位能够在dll得编译上指点我一下?先谢过了。

二月三日      阳光明媚

既生瑜儿何生亮?

二月五日    下了一天一夜的大雪

这个语法阅读器真是累。熬了半个通宵才完成了一个功能:common-left-factor这是语法修正的两个内容之一,我的预想是这个功能完成之后,再remove-left-recursion的时候就不用担心有两个以上的left-recursion了。但是,同一个variable有三个或三个以上的语法有common-left-factor怎么解决?CLF不止一个token呢?这些都解决了,不过好累啊。

二月六日  又开始下雪了

殚精竭虑,夙兴夜寐,昨晚是连骗带哄的完成了语法阅读器中的remove-left-recursion的第一个小功能,也算是一个版本吧?

早晨不甘心我在dll编译上的挫折,又重新来过,终于不负苦心,明白了必须加extern "C"的编译指示,而且也可以从delphi里调用了,从此,可以重新考虑图形界面的选择了。昨天有人告诉我说昨天是元宵节,昨天又看到北京看灯会踩死很多人,中国真是一个遥不可及的世界了。

二月八日   天晴了,阳光灿烂了

我总是无法完成我的计划。今天早上起来把上一次的烂尾工程做完了---remove-left-recursion的第二个部分,remove-immediate-recursion,意外的收获是发现我原来的想法不对,我本来认为在RLR与CLF之间应该先做CLF这样就可以取掉一个以上的immediate-left-recursion。结果我发现这样做会产生redundant variable,所以我就先做RLR再作CLF至少这样不会有redundant variable了,看起来舒服多了,再说怎样去出redundant variable绝对不是我现在所能完成的,I am pretty sure about it!虽然First set刚开了个头,我想还是先保存这个版本吧?另外,我把前一个 版本里面难懂得代码改了改,尽可能写成小函数,比较好读一些。

My idea of project.

二月九日   晴天一个霹雳!

我的天!当我看到{...}这样的meta symbol对我的语法阅读器不亚于一个晴天一个霹雳!天哪!我怎么去表示这种语法呢:A -> L { , L }这里的{...}相当于Kaleen star这怎么来表示呢?还有对于我已经完成的RLC,CLF以及First set来说,这也是一个大大的问题!而且更严重的问题并不是在计算Follow set,因为那只是表示方法的问题,在parser的过程之后的sematical analyser 才是大大的问题!我简直不敢想下去了。不过还好老师给的语法好像不会有大问题,至少现在是这样。我现在已经没有太多的选择了,只好走一步,看一步了。不过令人欣慰的事,我的工作并非完全是无意义的,也就是说我花了一个星期写的工具并非一个傻瓜可以不用这个工具随随便便在十五分钟内用手工完成。(不过脑子灵便的应该可以吧?可是,我想单单用手key in这样繁琐的工作很难不出错吧?我相信电脑不相信人脑。有那位有不同意见不妨看看这样的语法。这里是电脑优化过的去除了left-recursion, common-left-factor的结果。)为保险起见,现存一个first的版本再去计算follow。

二月十日     天没有塌下来

其实都是庸人自扰!{}与|有什么本质的区别呢?我昨天就是脑子转不过弯来。今天拼了老命才把follow写完,虽然难度上和first一样,甚至代码都很相似,问题是其他相应的bug层出不穷,我先是为了{}的错误在付出代价,把它取出就是一个麻烦事情,后来又发现,即便是RLC与CLF依然会产生redundant variable。我没有办法了!虽然能够去除明显的redundant,但是多余的语法我实在不想再去除了。太累了,当这个类超过一千行代码时,我对他的作用开始产生怀疑了,而且,我单单磨刀就用掉了一个多星期,parser的影子还没有看到呢。我不敢再去优化他了。暂且这样,还不知道以后会发现多少bug呢?

二月十二日    天气很好

昨天心情一直不好。昨天夜里更遇到噩梦般的问题,几乎使得我一个星期的工作夭折。我的scanner是手写出来的,我没有去动态地产生token-type,这样即便我的parser是根据语法产生的,我怎么能够把scanner返回的token-type和我的语法里的token对应起来呢?另外,我的NT-Table建立的时候会检查语法是否符合LL(1),我还发现了我的程序没有办法替换非直接的common-left-factor。我只好硬生生地把那个捣蛋的语法放到出错的语法前面强迫先进行left-recursion的替换。此外,我发现我还有很多繁琐的工作忘记作了,比如去除一个token的代价是改变整个表,绝对不会比去除一条语法来得少。所以,干脆不去掉了。先暂时保存一个版本吧?

二月十三--十四日    今天天气好象还不错:小雪(我说的是昨天也就是十三日)

终于完成了我的parser:一个我可以少许为之骄傲的工程,一个自动读入以E-BNF形式写成的CFG语法;一个自动进行去除left-recursion,common-left-factor的语法优化器;一个自动计算所有non-terminal的First, Follow set的语法计算器;一个自动生成LL(1)语法的parsing table;一个以parser为核心的,由parser驱动的table-driven的scanner;一个table-driven的parser;一个相对独立的错误处理小模块;一个我呕心沥血费时近一个月(parser+scanner)写成,将近三千行代码的,也许marker只用十分钟就胡乱批改完的工程。(我真想痛骂他几句,并不是所有的学生都会像我这样傻傻地费这么大的力气来学编译器吧?即便是研究生也不一定会有几个会去写这种吃力不讨好的东西,对吧?那么我是否应该得到最起码的尊重?)而且,我一直有一个观点,这个也是从去年教我C++的那个老师那里得到的:没有写过超过两千行代码的单个程序的程序员是不会有面向对象的需求的。(当然,不要告诉我你写的是图形界面的程序,因为,那种程序别人替你做得太多了,你自己写的如果有两三千行的话整个程序应该非常的大了。

如果,我把它作为情人节的礼物,不知道有没有女孩子想要呢?哈哈。。。应该不会吧?

随便玩玩frontpage做做实验

二月十四日  好像要下雪了

和黄勇探讨离散数学获益不少,又把以前的问题再讨论了一遍。实际上对于特殊形式的Chinese Remainder Theorem的问题:

S = M (mod p)   (1)

S = M (mod q)   (2)

(1) +(2) + gcd(p,q)=1  ==>  S = M (mod p*q) 并不需要用到chinese remainder theorem按照黄勇的简单的obvious地证明法:(1)+(2) ==> (S-M)|p   and (S-M)|q 。根据P183Lemma1(S-M) | p*q因为:(1) ==> exists some k such that (S-M) = k*p;   (2) ==> k*p | q ;   and   gcd(p,q)=1 + Lemma1 ==> k | q ==> (S-M) | p*q

想知道Lemma1是什么? a*b |p  +  gcd(a,p)=1  ==> b | p

二月十五日   天又变冷了

早上把作业小小改动了一下,因为我实在是没有耐心去做那种机械重复的工作,只好用程序来做。下午睡了一下午,晚上和朱春明同学夜话数据结构与离散数学,回来意犹未尽就想玩玩多线程,结果成了四不像。我本意是dining-philosopher的问题,写的时候想到的是bounded-buffer,后来改成了reader-writer,实际上什么也不是,我不想仅仅把pseudo-code翻译成c++。那么改来改去就不知道在干什么了。

二月十七日   天气倒是很好

我们伟大的教授总是习惯于用他那种奢侈的方式来浪费宝贵的内存,目的仅仅为了方便他那不习惯于c形式的index。这样的程序用什么意义呢?对于parallel prefix sum来说,除非有多个cpu否则会有更好的效率吗?当然这是一个小孩子的玩意给初学多线程编程的学生做的。

二月十八日  寒流依然肆虐着大地。。。

透过双层玻璃窗注视着我的阳光是那么的炙烈,现在的白天依然短过黑夜,冬天会踯躅到五月,夏天短暂而热烈,那时候庆祝的人流里有美酒和音乐,而现在这里还是冰雪的世界,在24小时开着暖气的日子里,我的星辰大海般的征尘就是我的一切。。。

想去公共图书馆看书,结果没有开门,正好去区政府领取“回收箱”,一切手续都那么简单自然,不禁让人想到马恩列斯描述的“当社会财富极大丰富的时候,社会所要做的就是按需分配”,这不就是在某种程度上是国人的理想吗?可是,我耳闻目睹的却多的是抱怨,更多的是向往国内某种人压迫人,人剥削人的制度。一辈子抬轿子过苦日子的奴隶翻身解放之后,不是先尽情享受自由的幸福,而是首先想尝一尝当初所痛恨的坐轿子的生活。最想当奴隶主的其实是那些整天被压迫的奴隶,正如同所有的农民起义领袖最终都要做皇帝一样,而几乎所有的产业工人也都向往着做一个资本家。人剥削人,人压迫人的不是制度,可能只是人类的本性。

地铁的音乐家是我所敬仰的一群,从学校图书馆回来,又看到那个胖键盘手在即兴创作,我可以体会他沉浸在音符里的快乐,也许正如同我对BIT&BITE操作的乐趣。我以前除了汇编几乎没有去玩过BIT的操作,今天为了节省内存空间,不得不把SHIFT&REDUCE的信息放在一个代表STATE的整数的高位,因为,我的LR(0)语法表不想用结构来存储。碰到一个白发苍苍的老人家向我要零钱,我就把我仅有的几毛钱硬币给了他,心情觉得很愉快。我想只有穷人才会真正帮助穷人吧。monk地铁站的那个吉他手弹得很敬业,他的吉他都破的绑上胶布了,可是,他还是一如既往的弹着那时而激越,时而幽咽的古典吉他曲。

二月十九日    天气好热

按照老师的code练习了一下dining philosopher这样经典的线程同步的问题。我发现我只有具体写的时候才真正理解了每个philosopher需要三个状态的用意,才明白是每一个吃晚饭的philosopher的责任来唤醒他两旁的人来吃饭。但同步以外的一个显示的问题还是解决不了,就是每一个线程用cout来显示的时候会一团糟,我试图给显示部分统统加一个mutex,但是这个会影响到整个线程的运行。最后,我只好将结果全部存到一个数组里,等线程结束的时候才显示。这实在是一个笨办法,不知道各位看官有什么高招,我将不胜感激。

二月二十一日   昨天开始下雪了

这是昨天完成的sleeping barber的小程序,应该是一种简单的练习吧?

二月二十三日     晴

今天和朱春明同学区看大教堂,有一次感受到了中西方文化的冲击,我们再一次对中国文化里的繁文缛节不切实用的倾向作了最深刻的批判。吃完饭看到艺术广场上的“暖亭子”,就是大功率的红外加热管做的小亭子,人们可以在最冷的冬天里坐在露天喝咖啡,晒太阳,真好。简单的写了几个基类,是用在console里显示用的。

二月二十四日    大晴天

console里的类又改了很多,加了几个中间类。黄教授和小韦买了鱼和酒,我也喝了一杯,,基本上晚上就是放假了。不过红酒这东西总是让人心里有些怅惘与迷茫。听着王菲的歌曲,格外的有滋味:天晓得,既然说,你快乐就是我快乐。。。

二月二十五日   又是晴天

board加强了好几个功能

二月二十六日  天光光

加了一个rummy来验证同花,顺子,和group(就是炸弹了),并且加了一个接受用户输入的简单的类--CListener,并把以前写好的字典稍稍的改动了一下。

二月二十七日    又是一个大晴天

354的project暂时有了一个初步的样子,我想再回到我的被打断的LRParser来,这时候才体会到他的复杂性,我仿佛是一个奉命突击的战士,当我已到达冲锋的位置的时候我才发现我还不理解命令的实质,又好像一个初次登临讲坛的讲师自以为一切了然于胸而到了现场被一个简单的提问就蒙住了。正如Professor Grogono的email里说的,当你准备讲稿的时候才发现你其实并不了解你要讲的问题。我想编程序的最大的好处就是,除非你对这个问题十分的清楚一直到每一个细节,否则,you are stuck for sure,不管你看书的时候多么的自以为懂了,都没有用。我想今天似乎锐气已经挫尽了,暂时重新整顿一下再说吧。

胡乱逛来逛去,找到我以前在csdn.net上贴得AVLTree的源代码,有个家伙的评价是AVL比较难实现的是remove而我却没有实现,当时很不服气,我也记不清我以前是怎么做的,就回了个帖子说AVL从BST(Binery Search Tree)继承来的,remove的方法可以照样用的原因,使我把AVL内部remove的实现改过了,后来仔细看代码才发现,我好像当时并没有实现,因为,insert就已经很复杂了,我奋战了好几天,后来没有做remove,很惭愧,只好下午补课。真是好复杂,而且好像没有现成的算法,也就是说,造成不平衡的要移动的节点并不一定在被remove掉的节点的一侧,这样问题就复杂了。而且,应该转动的balance factor为+/-2的节点的两个子节点有可能factor都等于0.这样是和insert大不一样,我没有办法,只好看到一个情况改一个,天知道是否还会有别的情况,海,有谁知道算法?

二月二十八日    加拿大的天是晴朗的天

早上看了一个上午的Mr. bean就是不想做我的作业,我现在仿佛对programming以外的作业都提不起兴趣来了。朱春明同学提出一个很有意思的问题,使得我去查c++的源代码,看到了其中一个从未见过的操作符重载operator void*()。

二月二十九日   阴天

You almost convinced me.

三月二日    现在还是临辰,不知道什么天气

LR(0)也许是我第一次让我对自己的程序失去信心的一个吧?我写到后来简直不敢相信程序有可能运行。因为,创建一个DFA需要的东西太多了!我对这个东西前后思考了一个多星期,真可以使夙兴夜寐,殚精竭虑了。当我运行出来一对结果时候我已经不再奢望去进行检验了。能run就好了。

三月四日   我昨天刚刚把冬天的衣服收起来,现在好像又要下雪了

LR(0)完成了初步的修正,改掉了一些bug,主要是类似于left-recursion导致死循环创建DFA的状态,还有就是parsing table的mask里面int类型问题,这个困扰了我许久:一个32位的掩码在和我的状态值“与”操作后居然不能再与这个32位的掩码比较了,也许微软编译器把0优化为一个较短的数了,我是这么猜测的。当然也发现了我一个stupid bug。我居然用16进制的0xd01111111来做掩码,这是好笑。我不想做一个临时的LR(0),所以,想直接就建立LR(1)或者SLR(1)等等。不过,parser还没有写出来,虽然不会复杂,还是要多想想,因为,还有很多问题不明白,再次验证了,只有写程序来实现才真正明白要解决的问题。现保存一个版本吧。当一个类的实现部分超过两千行代码的时候,维护工作确实变的有些棘手。

三月五日   天下着小雨,中雨

去实验室完成了project的一两个新功能

三月六日   晚上居然开始下雪了

朱春明同学请客去了一家中国人的karaoke,门票5块钱,进去后看到的一群男女觉得好像又回到了福建乡下老家安海镇。保存一个版本吗?算了,明天再说吧,有点不好意思称之为版本了。

三月七日  阳光灿烂,哪里看得出来又下过雪?地上干干净净的

The professor is an idiot on programming。。。  

I don't bother to guess his word puzzle as long as my program works.

Is algorithms in PA2 more efficient than that in PA1?

改正了java多线程程序中的算法,现在是按照老师的意图了,对于多cpu来说应该有更高的效率,可是,我得到的解释却是五花八门的。

写了一个模板实现的hash-table。希望能够写的尽量通用,可是,用template传入用户自定义的方法这一点上我很为难,太多了使用不便,太少了又缺乏通用性,是否模板与继承总是一对矛盾的双方呢?

我觉得我没有办法再去攻克comp354的project里的DFA,这对我来说是一件痛苦的事。我以前总认为DFS是我的噩梦,可是在学了automata之后,我知道DFA<==>DFS,他们对我来说是同样痛苦的记忆。我看了一晚上的<pretty woman>发现我实际上几乎没有从头看到尾过,这也许仅仅是感觉,而不是事实。也许因为,我不相信那后半段的神话,因为没有人相信,连导演都觉得太过分了,故意在结尾强调:This is Hollywood, a land of dream. 我们对梦想的态度也许都是近似的,正如在Julia Roberts的另一部超现实主义的浪漫剧<Notting Hill>中男主人公的经典台词:It is surreal, but nice。

田震的歌声配着我下午花了30个dollar买的speaker自有别样的韵味。在孤寂的,干燥的,寒冷的春夜里,我还毫无倦意,也许一颗心总在迷茫中漂泊。

三月八日    早上好象下雪了

去上totorial又在实验室里和angel研究明白了程序里的很多问题。现在好像对整个程序算是明白了,这算是编程还是猜字谜?不好意思就在贴一个版本,表示我今天并非无所事事一整天。翻出来以前的东西,作为我自己的理由吧。完成了一个简单的CPlayer的控制类,连同上一次做的CBag类总算可以算一个版本了。

三月十二日  晴朗的天空下大雪,这就是蒙特利尔的特色

上午阳光灿烂,我还和老张跑步去Maxi买菜,下午天空依旧晴朗,只是突然飘起了鹅毛大雪。奋战了好几天总算把一个初步的symbol-table做出了。我要说这个步骤对于compiler-compiler-writer来说都是最头疼的,因为,你看,作为scanner,parser我们可以做到完全的自动化,可是,这个时候,我不得不开始研究语法了。离开语法特征我完全无法知道该在什么时候作变量声明。当然,以我的意见,这就是之所以几乎所有的compiler-compiler都是LR的一个原因,因为,再LR里面的“状态”是非常有用的,而且你不会把原来输入的语法改的面目全非。我决定明天再作进一步的测试,现在保存一个版本吧?

朱春明同学的一句话叫我至今耿耿于怀:写程序本没什么了不起,惟手熟尔。这本来是我的原话,可是却听起来不那么顺耳,如果这样一言以蔽之,世间的万事万物岂不都是惟手熟尔?可是,客观地说,问题的复杂度一般都是不一样的,此惟手熟尔非彼惟手熟尔,正好像算法之间的复杂度的表示法中的big Oh一样,还是应该有所区别的。我无意贬低或抬高什么,(真的吗?人都有好恶的吧?) 也许其他人并不像我一样执著的相信人类的未来全部寄托在一些诞生不超过50年的“语言”的创作加工者身上。因为,也许人类的最终的解放就是彻底的自动化,其中的核心就是Intelligence Automation(I.A.)。也许A.I.这个词被用的太滥了,为了表示敬意,我创造一个新词来反用。这一切的一切就从编译器的自动化来开始吧?我想我在这个充满期待的即将到来的夏天应该能够写出一个完美的LR parser compiler吧?加上一个lex-like-scanner。这是一个多么让人激动地计划。但愿我不负了自己的誓约!

晚上没心情做别的事情就玩了会多线程,还是老问题,就是同步里的小问题,太简单了以至于我不好意思提出来,不过,我想我还是有可能犯错误的。同时对于windows上的多个线程的运行顺序感到不可理解。另一个奇怪的事情是SwitchToThread这个API明明在头文件里定义了,MSDN里也有,可是就是链接不上,后来我把api函数的定义拷过来,等于是直接调dll里面的api还是连接不上,说明dll里面确实是没有,window2000也是如此。看来只有问微软才知道了,该去那里问呢?

三月十三日     天气真冷啊,而我已经把厚衣服收藏起来了

早上调试我的compiler真是累啊,按照老师的意思是要彻底的测试,我这个project已经有四千行的代码了,有不少我现在都快忘了为什么那么写了,而这种语法测试实在是麻烦,首先你自己要知道结果吧?不然测什么?太累了,就和小邹去saint Laurence河边上去看冰层花了没有,真冷啊。下午去游泳,好久没有锻炼了,可能叫我游上一千米都会有些问题吧?屏气也坚持不了两分钟了。回来发现了scanner的一个大bug。不过,我觉得这个问题责任不全在我,因为老师当初没有说end of file也是一个token。否则我就不会这样出错了。如果以后要修改scanner的话,一定要记得。

三月十四日    天气还算晴朗

今天是Saint Patrick Day早上先把数码相机的电池充好电准备去看热闹。早上又在debug我的compiler,真是一个痛苦的过程,我想如果我当初能够用LR来写就不会这么写的ackward。还是留一个版本吧?

三月十六日     阴天

晚上上课回来偶然聊到《大话西游》因为我没有看过,感到有些遗憾没有机会了解现代的大学生的心态,所以就借来看看满足一下好奇心。当然是不明白所以然,本来也没有所以然,因为这正如P.P.所写的多线程程序一般充满了chaoes,一切都是只言片语,也许每一个场景都是刻意的塑造成永恒,而整个线索的无序成为事实上的无聊。因为,这也许正和激动的年代的躁动的脚步合拍。

昨晚和今天早上奋战完成了一些初步架构,保存一个版本吧?code generation摆在我面前的困难逼迫我要彻底地解决parser的问题,下个星期这是头号的任务。把昨天的小改动合并一个版本吧?

三月二十一日   阴晴不定

这几天事情不少,喜忧参半,烦恼不少。是否都要一一记录呢?summer research project算是一幢好事吧,去欧洲的旅费至少有了着落,word rover大致完工也算是一件高兴的事吧?因为我原来定下的目标就是这个周末完成。令人烦恼的还是操作系统这门课,哎!还有一些privacy的问题,真不知从何说起,欲说还休,不提也罢。

前天跑完步之后对springland的朱春明同学的居室进行了一次短暂的工作访问,对双方所共同关心的话题广泛深入地交换了看法,会谈的气氛是友好诚挚,会谈的结果是令双方所满意的。会谈所涉及的话题有就人类的认识发展与生物进化的关系,马克思主义哲学与形而上学之间的异同,离散数学在编译原理中的具体运用,自动机原理与算法理论等等,在相互的切磋探讨中进一步加深了彼此对客观世界的观点看法地了解,取得了广泛的认同,这次交流是一次有历史意义的盛会,双方都表示今后要定期举行此种交流,不妨成立一个名为springland-monk的合作组织,定期举行交流会。

保存wordrover的版本。

三月二十五日   小雨

好几天没有动笔了,或者说动手吧,因为,现在这学期所有的课程的作业都要电子版,几乎没有动笔的了。这几天也没有干成什么,除了改动了游戏的小bug什么也没有做,code generation的部分我还是没有开始,我又一次地陷入了这么一种困境,就是已经到达指定出发阵地,也接到了冲锋的命令却还不知道要向哪里进攻,甚至觉得连武器也没有找到。早上读了一遍moon machine的文档才略略明白了一点,我现在要产生的是intermediate code,不是什么真正的assembly code,只是一种自定义的类似p-code的代码,目标机器是一种想象的虚拟机,不过说想象也不对,因为,基本就是229里面定义的机器,而moon就是Dr. Grogono写的一个模拟器,我对他的敬仰又加深了一层。早上粗粗看了moon的源代码,又把范例的汇编码拿来编译运行,现在才真正有些明白了。模拟器人人都可以写啊!想起来当初在York旁听的时候偷偷下载的模拟器,当时觉得真是不可想象的神秘,看到是MIT的教授写的,就对MIT肃然起敬,现在想想Concordia的教授不也是能够做的吗?

常常地想,一个人每天头脑中的思虑何止百条,其中不乏真知灼见,甚至是灵感的火花,可是凭借常人的记忆有多少留了下来?过后回想起来总觉得如《围城》里面描述的,如同一个竹篮子去捞月亮,定神凝思总觉得就在那里,可是动起手来抓却都是空空如也。从前总觉得思虑如电,无数的华章美句在脑海里纷至沓来,但觉得伸手一抓,抓到哪一条都是挂一漏万,总想象着如果有一个agent环仕左右随时记录该有多好,现如今有机会及时纪录了,又发现经常头脑空空了。

三月二十八日  春光明媚

所以我就出去晒晒太阳。我看到的“冰河时代”以及“Saint Patric Day"。

心血来潮玩了会汇编,我常常想,假如我是生在dos时代的程序员我也许可以成为一个写汇编的专家吧?哈哈,我有点自不量力了,不过我觉得我确实对他独有情钟,可惜时间精力不允许我。记住编译的一个小错误:extrn声明部分是放在.code部分的!先编译/c,后用link链接都没有什么特别的。

三月三十日     蒙特利尔的春天终于来了

346的作业

四月二日    阴雨绵绵

已经一个多星期了,我几乎昼思夜想穷尽心智以求一个解答,昨天再次去见Dr. Opatrny才算有一个方向了,我完全不必用stack去模仿function call。这实在是一个不能承受的工作量,不是说有多么复杂而是说我不可能又回到了“汇编”时代啊!实际上真像教授说得那样:“90%的工作量来自于code generation”。我又连续几天利用时间冥想准备,仿佛攻坚战之前的火力侦察,养精蓄锐终于决定今天早上发起进攻,初步决定准备付出一天的时间和牺牲100万脑细胞的代价扫清所有的外围阵地,包括必要的数据结构,状态控制方式,框架函数,并预留出最终代码产生所需的一些函数的calling位置。如果一切顺利明天发动总攻,后天写文档测试,星期一留半天机动作为总预备队,决心一定,依令执行!任务完成不了,各级指挥员剃头来见。(不过,前天我已经把头给剃了,哈哈,我发现男人的智商和头发的长度成反比,女人的柔情和头发的长度成正比,那位有意见不妨提出反例?)这一个星期没有写程序结果我全身上下都开始出问题了,首先是头疼,其次是脖子疼,晚上睡得少,下午睡的沉,天天头脑空空。。。 

我最近眼神不好,也忘记怎么数数了。*_*  ~_~ &_&  :)

四月三日     天阴沉沉

战斗进行的异常艰苦,我从来没有遇到这样顽强抵抗的敌人,我的意思是说我现在已经把程序改的面目全非,简直惨不忍睹,现在根本不考虑什么效率与coding的艺术了,完完全全是白刃战肉搏战,所有的代码交织在一起,难分彼此,遍地是stack,不停地增加enum和struct,经常回过来在struct里面添加新的field。局部变量随处可见,全局变量已经到了命名的极限。战斗进行到这个阶段完全是一种胶着状态,唯一可能战胜敌人的武器就是指战员的意志和信念:Dr.Opatrny说过,if-statement是最复杂的,解决了他,就解决了一半。

战斗进展的很不顺利,我一方面根本不知道可能遭遇的困难,另一方面,每前进一步都是那么的艰难。

累死我了,眼睛都快睁不开了。没有完成既定的任务,不过在负出了惨重代价的同时,成功的攻克了if-statement。我实在太累了。

四月四日      又下雨了

现在是早上10点,六个小时以前我留下的一个版本还没有办法实现function call,现在依然不行,因为,参数的传递与检查是一个不容易的问题。一个人究竟需要多少时间来睡觉呢?

四月五日     又下雪了

人间四月芳菲尽,蒙特利尔飘雪花。昨天提前庆祝我的code generation大功告成,其实本来也没有什么,只不过我想给自己一些奖励罢了。于是,在肖邦的钢琴曲的伴奏下,油爆了一小盘冻虾,炒了一盘白菜,煮了一锅红豆稀饭,倒了一小小杯的8。99一升的干红,这样的生活真好啊。这样的生活不知道还有什么不满足的?今天打扫战场又改了不少的bug,就保存一个版本吧?或者说合并上一个版本

四月七日    天晴但冷

改了很多的bug,并加了一个结束画面,现在可以把我的小成果给大家展示一下了。唯一可惜的是只能在win2000或win xp下运行。

四月八日     现在天还是黑的

昨天,Probst介绍了一个所谓的多线程算法---parallel-ranking-list,问题本身似乎没有什么实际意义只能作为多线程的练习,不过我还是想了半个晚上,因为,写c++习惯了总喜欢数数,不懂得应用已经获得的数据,也就是说,计算ranking的时候,你可以把你的后继的rank加到你自己rank里面,只要保证这同时,你的后继不再改动。其实这个同步问题还不如去计算一下pizza店里面多个server的队列的问题来的更有实际意义。

四月九日    晴天

花了一整天时间找我的wordrover的bug。现在这个版本算是完美版了吧?我把字典改成了可以增加的,也就是说每次运行前从dictionary.txt和readme.txt读入,运行完以后由存回dictionary.txt,这样我的字典可以越变越大,你不喜欢完整的字典吗?当然你不喜欢的话,你就把dictionary.txt删除或者改名,然后再readme.txt里面输入你喜欢的词。

四月十二日  大晴天

早上去跑步,中午去shopping算是负重急行军,回来后躺在场上让灿烂的阳光晒在肚皮上阵舒服,醒来后又去和小朱去跑步,这就是我的感恩节。应广大群众要求把comp346的所谓project贴出来,我实在觉得不好意思,如果被其他学校的人看到不定要怎样笑话Concordia呢。这也算是我一直藏拙的一个原因吧?这么一个简单的链表操作居然被冠以project的名目,真是让我等学计算机的人无地自容啊。教授不要脸面,学生还是要的。哈哈。。。复活节童言无忌了。

四月十三日   雨

应同志们的要求不敢藏拙,把我的346作业贴出来献丑了。另外这是课本的标准答案,使Laura发给我的,我想不能不与大家共享。还有probst在最后一堂课里讲到的考试范围,不过我的涂鸦可能连我自己都不一定看得懂,如果你不明白,再来问我吧?如果我也能看得懂的话。:)  1, 2, 3

四月十六日   好像夏天一样

一直盼望着夏天,可是当我们都能闻到夏天身上的气息的时候却又不知道要做什么了,只能到太阳下走走。编译器的战斗到了最后的阶段,不知道什么原因指战员有一点点厌战情绪,也许这个project远远超出了当初的预测,也许是前面两个阶段即symbol table和three-address-code做的非常不好使得我现在非常不容易进一步扩展,可能就像software engineering课程里软件扩展曲线变得非常陡峭,也就是说我现在没做一次扩展所要花费的时间精力正以几何级数增加。

四月十八日   又是阴晴不定

compiler这个project对一个人的编程的信心打击是最大的。我面对复杂的内存分配,终于开始后悔我当初想写一个完美的compiler乐。因为,人力有时有尽,对我来说记忆力下降到我对我的代码始终像是看天书,尤其对于在跟踪moon模拟器里的汇编码简直不知怎样入手,你看,我的compiler产生的汇编码我自己就看不明白对不对还要去内存里跟踪模拟器,到底谁对谁错我能清楚吗?现在我才真正体会到做一个现代的c++的程序员有多么幸福,因为在一二十年前编程是一件多么痛苦的工作啊,我对我自己在这么傻瓜化的vc下玩代码实在是要被人笑死了,当然,我去嘲笑玩VB,java的人的那种刻薄劲会一分不拉的被真正的高手还给我。世界之大真是超过我的想象力了,我现在觉得自己浅薄的如同台湾南部坐井观天的那帮农民了。数组对我是一个头疼的事,我初步想法试用类似于c面的指针一类的特殊变量来实现,这是一个复杂的问题,我不知道能不能行,在传参数里用真正的reference即地址和用stack传递value,最后在回写是各有利弊的,我不觉得我现在的传地址的方案有什么原则上的失误,当时对于数组我却始终没有想出好办法,229里面有专门的寄存器来记录index,而我却想不出怎样模拟。现保存一个版本吧?我对code generation部分非常得不满意,决定将其等级将为一颗星。 moon machine的模拟器在这里。

四月二十日    有雨

总算完成了绝大多数的功能,这一直都是我不敢相信的!我不敢相信这是真的,经过了这么多的磨难好像唐僧去西天取经经过了八十难,不知道那最后一个磨难会在什么时候出现,最好是越早发现越好。我的这个project充满了遗憾与不足,假如能让我从来过,我一定要把scanner与parser一同来写;我一定要用LR(1)来写;我一定要把code generation部分分离出来;我一定要临时变量重复使用stack里的地址;我也许要使用类似于passing by value的方式,因为,这给了module里面的数据的独立性,如果,要passing by reference就简单地pop回原来的地址,因为,绝对的passing by address是一个非常危险的方式。我也许要彻底引入指针变量,而不是像现在这样似是而非;我也许想要解决label的问题,因为,并非所有的汇编器都这样的支持label吧?总而言之,是否用3-address-code的中间代码是一个值得考虑的问题。我要重新设计我的中间代码指令集。明天,不,应该是今天要继续作大量的测试,同时争取把报告的结构理出来。教训就是:never underestimate the difficulty!这个问题再写我的word rover就已经遇到过了,我当时还希望加入华丽的图形界面,多种选项,甚至A.I.。结果全都是不切合实际的。现在我已经根本不奢望提前demo了,能够不出现问题就谢天谢地了,看着我的那个乱七八糟的parser+code gengerator部分,我经常不敢相信这是我写的,因为我经常看不懂,不过,后来当我穷经皓首地调试跟踪汇编码的时候,我开始羡慕调试c++程序了,毕竟那是比较接近人的思维的吧。保存一个版本

对了,前两天收到不知名的美国的一个大概是college的学生发的邮件央求我替他做project,大概是一个min-max-heap的数据结构的东西,虽然我很有兴趣,实在是没有时间,而他的due date比我的还早,只好婉言谢绝了,毕竟人家透过google找到我这里不容易啊。而且这家伙网页做的挺漂亮的。现在敝人在google上也是榜上有名的,不信把我的大名输进去查一下,哈哈。。。自我陶醉一下吧,在这个温暖的春夜里听梁咏琪的歌曲很有一些情调的。

四月二十一日   晴朗的天空好像蓝色果冻,白云好像棉花糖,我有点饿了

其实,现在天空是黑黑的,离天亮还有好几个小时呢,我奋战了一晚上才找到递归调用的问题,其实并不是我所担心的是栈的问题,恰恰是我从没有想到的条件转向语句的问题。if-then-else,loop-end都有小问题,等我发现这种错误,我已经跟踪那天书一般的汇编不知多少回了。随便几行代码,汇编就是上百行,我看的头昏脑胀,因为,并不知道问题是编译环节有好几层,我再不能确定问题出在那里的时候,找起来真是困难。现在总算解决了,至少看上去是这样,fibonacci,factorial 之类的经典递归功能都可以了。我也快累死了。就让我在梁咏琪的歌声中留一个版本吧?

明天就要交报告了,我在梁咏琪青春靓丽的歌声中回顾我的日记中关于编译器的部分,突然才意识到它是这么的漫长,我从严寒的冬天一直写到春暖花开的季节,断断续续的有四个月了,粗略统计可能有近六千行代码吧?实际上当然包括不少的注释,和comment掉的代码,不过这些部分表示实际的工作量要比这多得多,因为,一方面改错绝对是很辛苦的一件事,费的时间更多,另一方面我想有关语法的注释可能比代码部分更难懂吧?如果你没有学过parsing的话。回顾这中间的苦乐酸甜,真是一种令人难忘的经历,正如歌曲里唱得那样:突然之间翻到了小说结尾的那一章,我想我不但要给教授一个report,也要给自己打一个分数吧?如果要打分的话,那就给个75分吧?因为,这是从我付出的努力来着眼的,毕竟从最初写语法阅读器有很多intuitive的成分,从这一点出发,我对自己还是满意的,这之前我并不明白什么是compiler-compiler,只是从直觉出发,抛开所有的工作不提,我想我应该给自己这个分数。教授给我多少分,我倒是不太在乎了,只要我学到了我想要得,还计较什么?至少我想我会有一点可能比班上其他人写得多一点点,或者真实一点点,那就是报告的最后一部分,wish-list或者一个what-if或者一个if-only-list。我在这门课程上投下了这么多的心血,同样也得到太多的遗憾与不满。假如让我重头来过,我会。。。

人生也许就是这样,假如。。。我会。。。我会吗?

四月二十五日   晴间多云

O.S.实在是一件无聊的事。整理了一下我的编译器,现在包含了最后的一个版本,以及moon的所有文件,和我的报告。点击这里download

线程同步的问题非常难。有没有兴趣讨论一下,指点我一下

四月二十六日  有雨?

今天在学校呆了一天,晚上才回来看到同学们的妹儿,是关于以往probst346考试题目,赶紧贴出来,希望大家讨论一下。

You are really a genius!  And even great Mokhov might have made a mistake?

Probst的很多问题,你并不知道他想问你什么,这就是最大的问题。我看了几道他的问题,我决定放弃,因为,我非常怀疑他的很多问题是从哪里抄来的,所以有些名词和思想怪怪的。也许这门课真地像他说得那样不用看说,不如去看summary。我随便打了几道题,实在是有付诸位的期望。

四月二十七日   有雨

昨天真是一个黑暗的日子,concordia真是可耻的学校,教授连考题都懒得出,竟然沿用上学期的题目!我当初可以想象Probst是一个Phony Scholar因此,作业出的数年都一样,还真没想到它连考题也敢这样干!虽然,那些题目我看过和没有看过区别不大,不会的还是不会,但毕竟让我觉得好像作弊一样,写到最后一题,我实在是懒得检查了,也许多检查一遍就相当于多作弊一次吧?我说过,教授不要脸面,做学生的不能不要。不过,后来想一想,似乎也没有什么,因为学校毕竟没有禁止重复出考题,比如229据说题目就经常重复,对于所有concept多于计算的课程,这也许是通病。

早晨没事做,就翻了翻那本我一直想读的《Battle of Wits》,这是一本讲述二次大战密码战的书。这是我的心愿,因为我一直认为人类的一切文明活动都是一个加密与解密的过程,你读书,听人说话,也不过是将一系列的声音文字信号进行翻译,任何有意义的信号都可以想象成一种密码形式,也许从密码学里可以找到我所需要的灵感。没看两页,又想起要做一个monitor,找了半天,没有头绪,就先练习以下Event吧,我不明白auto-reset的event和semaphore究竟有什么区别?有那位高手可以告诉我,在这些众多的同步对象里,我究竟应该怎样正确使用?因为,有时候感觉可以有很多种办法来使用这些semaphore, event,mutex??

五月一日     晴有暴雨

下午去和朱春明踢球结果遇到暴雨,我就在雨中踢球跑步。晚上向小韦借来久已向往的DVD《master&commander》,确实是震撼般的真实,就如同我小时候看过的《达尔文》般的令人震撼,认识一种蓝色文明是要花费几代人的时间和代价的,就如同这种文明形成需要很多个世纪一样。大英帝国的辉煌是建立在blood&sweat上的,决不是中国今天这种blood&sweat工厂!中国这个民族不具有这种历史与这种禀赋,至少没有可能在一个世纪内形成。那种组织,纪律,信仰,热情,勇气,信心是我这个黄土文明所不具备的,至少我们看不到在中国的历史上各朝各代的贵族几乎没有已扩展疆土,征服自然,征服同类或者异类为己任的,把对自然规律的追求与战场上的勇气加以完美的结合,一手拿手术刀,一手拿长剑,医生间作屠夫,自然科学家和战场上的战士加以完美的结合----A fighting naturalist

五月二日  阴天

经“梧桐大虾”指教,我决定暂时停止《曹操传》的测试工作,重写一个简单版本的bid for 24的程序,这也就是我们小时候玩的凑24 的小游戏。我重写的原因和方法很简单:一日不练手生,写程序这玩意,越不写越手生。当然这个版本比以前要好懂多了,因为,我从前刚开始学c++脑子还转不过弯来,现在写这个就容易多了,同时,最主要是对问题清楚,不想第一次的时候要先把问题翻译成一个可以用计算机解决的问题,这个也许是最耗时的一个工作吧?程序的名字叫“24revisited”这是学习《matrix》的手法,明明已经解决了的问题,为了商业利益硬要编出一个狗尾续貂的续集,而且一编就是两个续集,真是无耻。

五月三日 又是阴天

看《battle of wits》里面的最基本的加密法----Vigenere Tableau,原理很简单,但是很有效,因为,二次大战以前大部分的加密可能都是固定公式替换,不管你的替换方法有多么复杂,哪怕你把次序也改变了,可是你不能改变的就是个个字母在语言里的出现频率,比如字母'e'在英语里面出现的几率大约是12%,'t'是9%等等,只要有大量的数据可以统计那么你的加密就算破了。因此,Vigenere Tableau解决的就是这样一个问题,方法也很简单也很古老,用一个任意的钥匙来分割字串,这样同样的字母就不会被替换成相同的字母了。这不能叫做程序,只是我学习的方法,当我不明白一个算法的时候,用写程序来理解,这是一个笨办法,别人学不来的。

五月十三日  夏天的每一分钟都像金子一样宝贵

我这段时间在干什么呢?我没法给自己一个满意的答复。看到二战中日本曾经用过的一种奇怪的加密方法:元音与辅音分开加密,比如六个元音用一个6x6的Vigenere Tableau,其余的20个辅音也用Vigenere Tableau加密,不过,我不敢确认我的理解是否正确,一个简单的示范程序写的头昏脑胀。为了简单起见,假定元音与辅音用同样的密匙。我觉得这种加密法很不怎么样,因为,至少别人可以从元音的特征就能推测出你的词汇。不知道是因为日本人比欧洲人笨很多还是因为我理解错了,总之,比起德国Enigma来实在是一个天上一个地下。

五月十九日  我傻傻地站在街角假装等人实际上在享受灿烂的阳光

Il y a du Nouveau (There is something new!). Just be patient for my Enigma.

五月二十一日    阳光,阳光,加拿大最廉价,也是最宝贵的物资

小韦拿来的DVD《PayCheck》,看了之后,你应该会明白这一定是DreamWork的作品,甚至我一直认定男主角是同一个人。因为思想和技法和《MinorityReport》是惊人的相似,简直是翻版,不过我不知道别人是否这么看,至少我的印象是一样的:中心思想是雷同的,未来如果可以被预测,将是一场灾难,未来如果被预测,人的命运将可以改变,也将不存在命运,也将从根本上否定未来是可以预测的,我想这是人所共知的逻辑paradox。从特技的角度可以看到DreamWork似乎很喜欢那种玄到刀尖般的新科技,并且一切都加上了超完美主义般的戏剧巧合,一个科学家可以比《MissionImpossible》中的超级特工更加专业,仅仅凭借对未来的一知半解一个人可以上天入地,无往不利。实际生活中很多人对自己的未来充满信心并不见得就可以成为一个超级特工,对吧?就算你十分清楚你将来要做什么,能做什么。不过,这还是一部不错的片子,好就好在它符合我一贯的理念,并且略微的超出我的想象力,这也是我最喜欢的游戏风格,简单并且有一点点难度。我的Enigma有些问题,加密之后如果不能正确的解密,那还有什么用途呢?

五月二十五日  阴天

很多天没有做什么有意义的事情了,除了测试《曹操传》,这真是我的大问题。感谢“柯云”大虾指出我以前作业里的重大错误,(那个marker基本上不改作业)在polynomial里面指数是相加的,我花了好两三个钟头想继续维持原来code的简洁与一致性,后来发现几乎不可能,索性重新定义一个小函数,花不了几行代码。我猜想,乘法与加法是处在不同的“阶”,在算法上可能不能统一吧?这当然是我胡思乱想了。

五月二十八日  阴晴不定

五月是一个堕落的月份,我几乎什么也没有做,除了偶尔写了几行的SQL,学习了两行PHP,而且这实在称不上编程,太多的计划,和太多的遗憾了!我原本以为学完了compiler design我在本科学习中不会再有programming的挑战了,可是,现在碰到的这些我认为soft coding似乎并非完全如我想象般的容易,因为,并不要求你做的有多么的好,多么专业,可是,你要做的杂,比如,在perl里面夹杂了一大堆“surface evolver”的定义,就让我看的不知所云,这也是我始终不想开始我的project的一个原因。database德project里面也是夹七夹八的,要再html里面嵌套php,然后连接到oracle查询。如果,我没有sql的经验,我觉得让我在一个半月里面做这些太不容易了。早上鼓起勇气,准备写一个关于dependency的东西,也就是数据库里会用到的function dependency。刚开了一个头,就偷懒不写,就实现了一个reader的功能。为保持版本的连续性,就记下来吧。见笑了。

五月二十九日   晴天,阳光灿烂但是很冷仿佛到了冬天

昨天和朱春明讨论的关于类的问题应该是这样的:对于composition的成员的constructor带参数的情况,即类的数据成员是另一个类的对象,并且它没有默认的constructor,或者说他的所有constructor都需要参数,且不是所有的参数都有默认值的情况下,只能在该类被包含的类的constructor加初始化语句,也就是“:”领头的在constructor之后的语句。之所以不可以在类的成员变量加上他所需要的参数的明显的原因是那是类的声明部分,而基本上所有的编译器对于声明部分只做类型检查。对于方法(method)来说或者函数来说,声明部分不是必需的,可是类的声明却是必需的,原因应该是成员变量地址分配的需要,因为这些不是在stack里面动态分配的,类本身就是从结构扩展而来的,所谓类的constructor仅仅是在内存分配完后才执行的第一个方法,自然结构体内的任何成员都是在此之前完成分配的。c++的编译器应该是在c的编译器上扩展而成的,自然对于声明部分采取与c的函数一致的策略,即只检查类型。顺便说一下,昨天写dependency的时候的一个一分钟的疑惑,我的rule类里面是一个模板类bitset,它需要一个特殊的类型参数(真的是类型吗?)也就是一个集合的size来initialize这个bitset。这不算是constructor的参数,因为,作为模板类,他的参数决定他的类型,所以,他在我的类rule里面还是作为成员对象的类型声明而已。

The symbol is beyond what you see with mortal eyes...

五月二十九日  大晴天可是很冷

今天花了差不多一天时间在重写我的集合类,这个题目是和DFS,DFA一起成为我最喜欢写的题目,虽然写来写去变化不大,我却乐此不疲。也许出了疯狂的操作符重载之外就只有遍历所有的子集的方法值得一提了,按照以往的习惯我总会希望写成函数指针做参数的哪一种回调函数的形式,或者是用模板参数传递方法指针,这一次我完全按照c的习惯类似于“strtok”方式多次call,这个更简洁。

六月一日   临辰从睡梦中惊醒感到无比羞愧,外面下着细雨

这个五月是无所事事的五月,我在梦中都感到无地自容。left-redundancy如果不清楚的话,我是否要继续我的程序呢?

为了减轻自己的内疚,我花了两三个小时完成了一个小小的功能:计算candidate key。

在实验室呆了一下午,练习那些无聊的php连接oracle。这种编程让我想起了刚开始学习delphi的情况,玩着别人做的玩具自以为很有成就感。我想这样的人大约有几百万吧?

六月二日  天色阴沉沉的,还很冷

LOGIC@#$%^&*SET ?????!!!!!!

六月三日  晴朗的天空飘着白云,突然一阵风吹来下雨了。

加拿大的小生意真是难以生存啊,看到每年这个时节monk的区政府就要想尽办法振兴商业,花了一大堆钱,步行街,小火车,露天集市,可是货品年年一样,那些小商店的货品连价钱都和去年一样,存留那些放了多年的皮衣已经慢慢变成一种类似博物馆的意义了,怎么和walmart这种巨人竞争呢?只有在中国商业还处在一种早期的阶段,小商业还有生存的意义与空间,但绝对不会永远。

我的dependency基本完成了,现在完成了canonical cover, candidate key,  decomposition, lossless checking,甚至还有dependency set的logical imply, equivalent的功能,还需要什么?

六月四日 晴朗的天空灿烂的阳光

写一个callback函数的小例子

好为人师的我为了说明回调函数可以用模板来类似的实现,折腾了一个下午,最后终于搞明白了是vc++的一个bug。这一点,我觉得我应该是可以负责地说了吧?因为,这个问题应该和我让我们伟大的朱春明同学向他所敬仰的Hanna老师请教的问题一样:VC++的编译器在识别模板函数的声明与实现部分有问题,搞得我一个下午都在怀疑这怀疑那。

六月五日  阳光还是灿烂,可是屋子里还是有些冷

伟大领袖毛主席教导我们,理论必须与实践相结合,并在实践中得到检验和发展。于是,我就以我的comp353的实际的project来检验,找出了很多的bugs,并且,我的程序经受住了考验,实在是太强大了!想想看,设计的时候不用去画什么E-R图,只要把用户可能用到的attributes写下了,再写出他们之间的关系,即dependency,然后,我的程序自动运行,自动计算candidate key, canonical cover, decomposition to BCNF and check lossless joining。你所要做的就是根据我的decomposition建立表,根据其中的dependency的lhs设定为key。这么简单,这么强大!

六月七日  阳光,绿树,清风

阳光,绿树,清风。绿油油的树叶被亮灿灿的阳光映射的发亮刺眼,茂密的枝叶被轻柔的无法触摸的清风抚摸着而发出快乐的沙沙笑声。我一只手拿着1.29元一大袋子的一个大面包,另一只手拿着4.99元一大箱子的一根小黄瓜,坐在后院里法国式的黑色螺旋扶梯台阶上,仰头看着头顶那灿烂度只有广岛原子弹爆炸时一千分之一亮度的太阳,耳边听着从我那心爱的笔记本那单薄的扬声器里播放的钢琴板的王菲的《爱与痛的边缘》,幻想着假如有一天当我的银行户头里的余额万一不幸地达到了天文数字,我是否还能如今天此时此刻这般的快乐?我问对面的大树,大树不停地摇头说不;我问头顶的太阳,太阳翻着白眼不屑于回答这等简单的问题;我问身边隐身人一般的清风,清风调皮地抓起凉衣绳上衬衣的两支长袖朝我一阵乱舞,回答说不;我低头扪心自问,肚皮听见了我的问题,听了听厨房里灶台上蒸煮的沸腾的一锅清水煮土豆的咕噜声,也情不自禁地学着咕噜了一声,算是回答。对,决不能让那种可怕的日子到来!我决定继续在加拿大坚持扶贫工作。

六月十一日   天晴

感谢Vincent发现的一个dependency的大bug! database的project实在是不好做,因为,双拳难敌四手,php操作数据我总觉得别扭的紧。

Dependency vs. 3NFTry with dependency!

我的dependency作了一个小小的改进,就是计算candidate key的时候,剔除掉所有只出现在右手边的元素,因为他们绝对不是key的一部分,正如同所有不出现在右手边的元素一定是key 的一部分一样,这可以大大加快搜索,我粗略估计了一下,集合大小为39,试验其中一个有19各元素的集合的所有子集是否为key的过程,通常会运行10分钟以上,我实在没有耐心等下去,经过这个小小的改进,只需要大约一秒钟了,这是几十上百倍的改进啊!

六月十三日  晴朗

把我做的小工具贴出来。这是一个数据产生程序

六月十四日    阴天

We don't allow employee to be deleted.

六月十六日  晴天

our assumption。这是昨晚我在眼皮睁不开前发出的mail,估计Jean应该不会在熬夜的时候check mail。

六月十七日  阴天但是很舒服的日子

羔羊的沉默。 下午睡醒了才头脑清醒地明白,我早上想的问题是:natural out join 和Cartesian product的关系问题,我始终想把两者统一起来,这种统一的想法并非如朱春明所说的那种统一场之类的不可能,世界上本没有什么不可能用理论来解释的现象,比较难的是这种理论本身是否可以被别的理论所揭示。因为,即便是随机数,在有限范围内我也可以用一个或一系列公式来产生,当然,超出这个范围并不适用,我需要更多的修正方程,正如脚痛医脚,头痛医头的经验公式的修补,只要你有新发现,旧的公式不适用,我就推翻重来,如此便是相对论。这种科学究竟是一个自圆其说的过程还是。。。

加入null的Cartesian product。

明天要考数据库了,趁机把project文件都备份以下,其实都是一些零零碎碎的东西,大概9个query里有三四个还值得看一下,因为有的query大概有超过两百行的sql吧?我写了10个triggers, 有一两个还值得以后浏览一下。其他大都是htm和php的垃圾,再就是在linux上玩sqlplus连接oracle你非要写一些小东西,不然累死你了,比如soft link这个东西我就发现很好用,ln -s /yourpath/ softlinkname,以后cd softlinkname就可以了,不用再打字了。

六月十八日   阴天,但是经常看到太阳

A simple example of initializing constant in class. This is from book, I mean, I rewrite them.

六月二十一日  晴间多云 

You usually need a default constructor for your base class, but not always unless...

关于赋值兼容的解释:你可以把子类对象赋给基类对象,编译器很愉快地接受了你的选择,为什么不能反其道而行之?也许你再做一个很大的项目,写了一个函数,参数是一个类,过了一年,功能要增加了,你从这个类继承了一个子类,增加了很多数据成员和方法,很无疑地,你也许还是怀念你一年前的代码,至少它对于原来的基类的操作是很可靠的,你现在也许也仅仅就需要这样的功能,你把子类的对象带入了这个函数,编译器很信任你的选择,因为,虽然参数传递过程中很多子类的新数据成员被“砍掉”了,可是,没什么,因为,你本来就没有指望他们在这个旧函数里有什么用,当初在写基类的时候你甚至没有意识到你的代码会流传千古,也不会为还未诞生的子类多操心。按照继承的顺序来做兼容就是这样的。

class Father {。。。};

class Son : public Father{。。。};

Father fatherArray[ArraySize]={Son("son1"), Son("son2"), Father("father1");

六月二十二日   阴雨绵绵

帮助同学复习数据结构真是一件快乐的事情。温故而知新,不亦乐乎?

六月二十六日   今天中午下了一场雨

终于有机会可以安安静静地看我买的《1984》了。我个人的意见是超现实主义往往比科幻电影更难以理解,至少对我来说是这样的,因为,科幻电影是努力让你明白一件难以相信的事,而超现实主义是努力让你不能相信一件你相信的故事;《第22条军规》(Catch22)就是这样一个例子,应该说这是和“兄弟连”完全无关的电影,但是两者的对立总是让我将其联系起来。影片一开始就让你相信美国空军是一个疯人院:任何正常的人必须完成飞行任务,只有疯子才可以停止飞行;任何人要停止飞行必须提出申请,但是提出申请的人就已经自己证明并不是疯子,所以,没有人可以停止飞行,这就是第22条军规---catch22。其中的风言风语所在皆是也。比如,美军查封意大利妓院时的理由也是第22条军规,因为,美国是世界警察与审判官,他是法律的执行者与制定者。当然,所有这一切都是:The most insane thing a sane man has done before he got insane。

六月二十八日     晴间多云

即将过去的六月是一个失败的月份。我的Enigma是一个未完成的烂尾工程,不时有多么复杂,而是当时时间不允许,事后又因种种理由,也许是google搜出了一大堆关于Enigma的程序,让我觉得有些兴味索然吧?原本这就是一个算法的实现,非常的straight-forward,没有多少实际意义,在计算机发明之前,破译的可能性确实是非常小。另一个令人沮丧的就是database的project做得有些失败,虽然我觉得自豪的是写了一个dependency化简的程序,并且几乎所有的问题我都基本上用一个query来实现,可是,从软件工程的角度讲是一个失败的典型,无论是组织,设计,调度等等无一不是失败的。summer research project也是一个不成功的例子,对于evolver的使用我还是茫茫然,再perl与c++语言之间反复徘徊,甚至连续犯了一些低级错误,至少有两三天时间让我对VC6.0浮点运算产生怀疑,真是好笑。当今天终于想兑现我的LR-Parser的承诺的时候,面对我的CFGReader得繁杂我又开始望而生畏了。可以想象仅仅一个几千行代码的小工程的改造就让我头痛不已,怎么可以想象将来的巨大的expert system呢?人真是一种渺小的动物,借用Matrix里面Agent嘲讽人类的口头语:Only Human!我还有多少愿望与梦想要在这短暂而宝贵的夏天来实现呢?秋天,冬天两个学期我给自己的计划也让我感到不安,我是否真的能够一学期上15,16各学分的课吗?即便扣除乱七八糟的英语数学化学,一个学期上三门comp字头的四学分课程实在是一种折磨,对于我来说这样的安排肯定是遗憾比收获来得多。今天,我翻找compiler design的笔记的时候看到comp348的讲义心头又是一阵得难受,这门课可以说是我在Concordia的一大遗憾,正向我在给Dr. Grogono的mail里说得那样,我在学完了compiler design之后才开始真正理解很多comp348所讨论的计算机语言上的概念,我真希望我能在自己有接触更多的计算机语言之后再去上这门课,可惜人的经历就是这样一个不可逆的过程,我在双脚踏进恒河之水的时候就已经注定要后悔了。这个秋天和冬天我是否又走在恒河河边上?

为了忘却的纪念,先把我的失败的Enigma贴上,这样一个简单的东西我还没有做好,真是一种耻辱!好让那句熟悉的话语经常回荡在我耳边:Your mission is a failure!

六月二十九日     早晨的太阳懒洋洋的

昨天在最后一分钟下定决心take engl207这样秋天的压力小一点,实在不想买原版书,就上sinoquebec去买二手书,一看大多数卖书都是comm经济书,想想也对,Concordia学经济的中国人早就如过江之鲫一般多了,这是理所当然的,但是卖书的这么多的原因也许不仅仅如此吧?抑或这经济之道原本就是过河之后要把桥拆了当劈柴来卖,抑或学经济的人原本就是把这个行当当作敲门砖,门敲过了还要砖干什么?当然门敲过了不代表门一定会开,也不代表敲门的人还会继续顽强地接着敲,敲门的砖倒是很有可能要丢掉了,一则砖是随地捡的,得来便宜(所谓的书大多是复印的,简称书云云),弃之自然如敝履,二则要敲别家的门也许还要别处去捡新砖头(听说蒙特利尔这个中国人的小圈子里面每隔一段时间就有一些所谓的热门专业)。抑或出国,读书都是所谓的敲门之砖,敲敲看,说不定门就开了,不然就再念一句咒语:Sesame! Open the door!世界上本无绝对正确的门,门开了人进去了,事后大可向别人证明自己捡的砖头平整,自己认门道来的精明,然则进了门廊是否还要登堂入室,进的外门是否还想要进内宅,敲得开大门,是否还有运气打得开二门。自然,门坎都未找到何必担忧其它?同样一群门外汉彼此之间又有什么本质的区别?只是偶尔地想象一下登堂入室的感觉罢了。也许人之一生本就是一块敲门之砖,不然怎么会有那么多人信奉所谓的天堂,对于他们来说,人生的尽头就是一扇天堂之门,能不能打开却要看今生所谓的积善积德,这一辈子就是一块砖,这也许并不是最可悲的地方,因为最可悲的是两敲门的人都不是自己,自己只是别人用来敲开他们的贪欲之门的一块砖,这些别人自然是那些宣称自己高高在上,端坐在神坛之上通天教主。人恒弃敲门之砖,砖亦恒弃弃砖之人。

经过昨天的深刻反省,广大指战员认识到斗争的严酷性,决心攻克Enigma的堡垒,经过一天一夜的鏖战终于完成了。教训就是不能像当然,比如密匙轮的转动问题,我一开始以为用两个数组来表达,加上平移就够了,其实不对,我需要另外26个数组来表达输入数组的每一个平移。再比如,我一开始以为密匙轮时不停地转动,其实不对,应该是每一个字母处理完了才转动,否则无法解密了。光这两个问题我就debug了一整天才明白。下午抽空又重看了一遍<kill bill>实在是精彩,相比之下张艺谋的所谓“英雄”简直就是一个玩笑。

六月三十日     阳光灿烂得如同那个什么一样。。。

早晨从睡梦中惊醒,有梦到在中国读大学考试的时候竟然不知道要考什么科目,头脑中不记得一学期学过什么课程,卷子发下来之前坐在考场里想来想去,最后竟让我猜到了:应该是考辩证唯物主义。醒过来才觉得可悲,那时候,我什么书也没有念,整个班级除了一心想出国的那几个天天坐在第一排的女生外大家都号称不读书,人人比赛看谁能在考试前的最后一天用最短的时间突击并能取得最高的分数来证明自己的聪明才智,有时候,不小心区教室自修回来的路上总像做贼一样,因为如果被人看到一定会被取笑低能弱智:这么简单的课程居然还要学,你如果考试成绩不高就更会被人看不起,如果你不幸考的还可以,同样会被人归结为死读书靠拼时间而不是靠聪明才智取得的成绩。那个时候生活得非常压抑,因为大家都不读书,只有畅谈怎样赚大钱才是时尚的话题,宿舍里大家整天在打麻将,下军棋,围棋,后来连桥牌这种东西都被认为太费脑筋不如80分来的简单刺激。那样的年代,那样的青年,你难以想象其中的很多人是那个时代的精英。我这么说也不是很过分,因为,其中的很多人现在也确实是在赚大钱的,可是,这些是中国的教育的成果呢,还是教育的失败?不管怎么说,我不属于那个团体,这个结论的得出花了十年的时间。我试图寻找另一个答案,也许要在花掉十年的时间。如果有了结论,我在想那个时候我是否还在乎答案;如果没有答案,我是否会再找一个解答,或者。。。

给我的Enigma加一颗星吧?我对自己不满意,为什么要对我心爱的程序不满呢?也许这颗星是所有星里面比较不值钱的,可是,出于对Enigma的敬仰我不能拒绝这个请求。满足了这个要求,我不能拒绝给CFGReader也加一颗星,这本来就有的,只是当时我过于苛刻才摘掉了,现在补回去。

七月二日    晴

折腾了一天一夜的唯一结果就是找到了一个sample能够从c的命令行来调用sql server。但是编译有问题,花了我一天的心思也没有找到解决makefile的办法,唯一的结论就是vc6.0得编译参数应该有一些是以非文本方式写在.ncb文件里的,因为,在.dsp里面我能够找到所有的makefile的参数,但是external dependencies file的信息不知道写在什么地方,难道是编译的时候自动生成的?这些真是我的痛苦的地方,找不到合适的资料,摸索的过程好像在破解密码,而且浪费了大量的精力。

七月三日   好天气

久有凌云志,重登皇家山快乐的一天

实际上,昨天的问题后来是解决了,解决的方法是我突然脑子开窍了,悟出了一个道理:我辈学武所为为何?不就是用计算机解决实际问题吗?这个出发点找对了,我那么关心很多细节为何?也许那个sample是用vc以前的版本做的,或许她的makefile有特殊的地方,可是这一切都不重要,重要的是我要用它干什么?我管他那些自定义的数据类型干什么?我管它是否能够和dos兼容干什么?我管它是用于什么windows版本干什么?只要我把它改道在我的notebook上运行就可以了,就这么简单,何必耗费我的宝贵精力去钻牛角尖?我有更重要的dependency-analysis的想法要去实现,为什么要去研究这一类如同“回”字有四种写法的职能作为炫耀的资本的问题呢?

Turing真是一代伟人!他有锐利的眼光能够透视出Enigma的真谛:在三个rotor的情况下,共有17576各不同的映射方程要去识别,可是,Enigma的齿轮传动是每26个字符之后,中轮才转动,也就是说,又一小段(25)字串是非常普通的单个轮子的26各映射方程,这就大大简化了识别的难度。(因为,可以把其他中轮(middle rotor),后轮(right rotor),反射轮(reflector),替换线(stecker)想象成一个单一的映射方程。)也许常人穷心竭力也能有万分之一的机会悟道这一层,再往下就不可逾越了,因为,后面的部分我就没有看懂,明天再看。:)

七月五日     阴天

把这两天我的微不足道的工作做一个备份,首先声明,这个连接类仅仅是为我个人的目的,并且我没有写什么程序,仅仅是把MSDN上的例子包装成一个简单的类以便我自己使用,我想这不算是侵犯版权,各位如果看到也不能耻笑我的coding能力,因为我压根没有些什么程序。我的真实目的仅仅是想从c/c++来连接SQL server,并且我的要求也很简单,连接,传送SQL statement,最简单的显示,好像SQLplus一样的基本功能。也许下一个版本加一个简单的script-file的功能。其中,我花了大部分时间在试图弄明白为什么采用windows验证时候连接不上,结果还是没办法,只能采用SQLServer的用户验证。不明白。

七月七日   小雨

今天无聊之机就写了个小工具,在UNIX下我们有grep去查找字串,可是没有替换工具,这就是我的replace,它可以接受命令行参数:usage: replace filename source target 现在只能选择替换第一个出线的字串。

七月八日    小雨

15puzzle的问题我以为我以前解决过了,偶然翻看从前的代码,首先是目不忍睹,其次是我根本没有解决。我本以为这又是一个简单的DFS得简单问题,结果发现我的想法是不对的,状态并不能用一个空白方块的位置来表示,(这一点我以前应该是明白的,但是现在忘记了,又作了一遍。)所以,当我发现程序运行十几小时无结果,我才意识到不限制loop不行,但是,我简单的用方块的位置的loop来限制又不会有结果。(这个东西我应该是在写走迷宫的程序利用的,对于一个方块在迷宫中的移动这是正确的,对于puzzle来说必须要考虑所有的方块的位置,这是不是vector space呢?)为了开始别的解决方案,现保存一个版本,毕竟失败的东西也是有意义的。

我一直印象中我写过一个更加通用的DFA标准类来做DFS。可是,我找了许久没有找到,最后还是在VC++德workspace里发现有源代码,才在我的网页里找到了html文件,但是很显然没有发布出来,我觉得这个程序是我所有DFS类里面写得比较好的一个,可是为什么没有发布呢?我想可能是那段网站初期没有highspeed连接的非常时期遗漏了,看来是把一个宝贝捡了回来,不是吗?这一次再一次充分证明了我的记忆力是有限的,(我想谁都是差不多的)三个月后,或者半年一年以后再回头看你原来写的代码,有意义的部分我想使不太多的,可是有趣的是,我后来在重写一边,解决问题的方法与思路,或者错误都是相似的。

Unix真是个混蛋!我花了差不多两个小时在debug我的replace小工具,最后才明白了两点:必须用\来表示双引号,比如replace filename \"source_str\" \"target_str_with_quotes\";另一个大问题又是换行符得老问题,我已经在这上面吃过苦头了可是又一次在了跟头!微软好像是\n只解决了10,13中的一个,另一个他就不管了?!!我还是不确定,总之,我干脆全都加入条件判断力就是了。晚上,为了在8个server上执行几行代码的小工作,我去专门写了一个replace的小工具,并且在写c程序去生成脚本文件去执行,本来一件工作是无聊的15分钟我把它变成了痛苦与困惑的3个小时,这就是tool-maker的标准工作方式。

恩格斯说过:制造工具与使用工具是把人和类人猿区分开了的一个最重要的标志。从这个意义上说,只用别人写好的开发工具作应用程序岂不是猴子的工作,难怪mcgill的那个老教授在他的数据结构的课堂上老是强调有些工作他可以训练猴子来做。我一定不能做猴子啊。

七月十日     昨晚的天空是淡淡的水墨画,今天是灰蒙蒙的一片,午后的小雨依然郁闷

心情也如天气。早晨,从google找到了15puzzle的算法,不可思议的简单,有效,虽然我也曾差不多想到了,但是,作者的话却让人有些灰心,他说这基本上没有AI的成分。这个结论才是真正让人苦恼的,究竟什么才叫AI,在什么程度上算是AI,AI 应该是不会在一夜之间实现,AI也不会有一个明确的界限,那么基于这些假设,前方的路似乎太遥远,模糊了。也许如歌词里说的:If the way ahead is not so clear, I need a guiding star...(这是我杜撰的,我搜索了一下,原来的歌词不是这样的。anyway, it doesn't matter。)我跑了三千米睡了一觉,睡梦中以为有了一些线索,我就开了一个头,这是一个类似贪吃蛇似的串,可以长大,可以游动,吃完午饭,等我在回过头来看,其实都没有意义。因为,这条蛇虽然可以写得很通用,但是操作起来远比单个节点复杂得多,对这个特定的问题来说没有什么实际意义,不如原来作者的简单实用。这样一个经典的搜索问题,我耗费整整三天,还不算以前的尝试,真是让人沮丧,打个不恰当的比喻,好比号称精锐的德国装甲师被苏联红军的一辆KV-1坦克阻挡了整整两天的无奈。不小心把整锅的排骨烧焦了;想打个电话又把pin number全刮掉了,又是白白损失4个dollar;想出门,雨又下个不停;想睡觉,对面IGA门口的法国人有欢天喜地地唱个不停,真想冲过去把他那些免费品尝的啤酒喝光,省得他唠叨个不停。郁闷的星期六!

七月十一日   阳光还算灿烂

我怎么也不能相信这个15puzzle到现在还没有被攻克!我已经连续奋战了一天一夜,牺牲了四百万的脑细胞,一包方便面,半小瓶红葡萄酒,半袋子虾皮,三块面包,一个橙子,一杯牛奶,4到5个失败的版本和不成熟的尝试,结果却是我迷失了方向,我一会儿尝试一种智能的寻路方式,一会儿试图一种简单有效的算法。最后,我自己则淹没在越来越模糊的code里。

经过几十个小时的折磨,我的头脑已经麻木,饿得受不了就去对面“龙之家”要了一盘炒河分,终于我承认失败了,因为,这个算法并不那么简单,我不是很理解它是怎样调整顺序的,我的方块会卡死。失败使我的头脑变得冷静,我这时才意识到昨天已开始我想用“贪吃蛇”来做的想法并非没有道理,再重新捡起“串”做法之前保存又一个失败的版本

七月十四日     阳光灿烂

虽然c++不让你创建纯虚函数的实例,但是,你却可以创建对象数组并初始化。

七月十六日      好像是不错的天气

尝试code contest对我来说只是一种令人沮丧的活动,我甚至不能在规定时间完成一个简单的题目,当然,我也看到不少参加者和我一样得到鸭蛋。这是一个非常简单的水资源分配的小问题,我却在数据初始化的时候反复遗漏。

面向对象的设计:这些结构的合理性我无权评价,但是,面向对象的思想是模仿生物进化的一些模式,比如,地球上曾经出现过长着长长牙齿的老虎,那种如大象一般的装饰性的所谓武器不是最后被证实没有什么效率了吗?面向对象从来没有真正定义过什么规则就是因为它更主要是一种思想,而不是什么protocal。应用的玄妙有时候存乎一心,很难用对措来形容。

七月十八日    天气很好

昨天打了一下午的网球,当然,主要在捡球了。晚上去看中国队的焰火表演,我觉得还可以,也许因为今年是第一次刊的关系没有参照物,对朱春明同学的所谓中国队的火力不如德国队的说法不以为然,虽然,我被同志们认定是铁杆汉奸与洋奴,但是,最起码还是很客观的。回来后又开始对血型的分布开始争辩,网上有一个所谓统计资料,说O型血的比例最高,这个非常出乎我的意料,因为从中学生物课之后我头脑中就有不可动摇的意识是O型血的遗传机会最小,我决定写一个小程序来验证。结果也还是有些出人意料,我的意思是O型血的遗传机会有这么小吗?我想如果有谁是这方面的权威可以告诉我。

I found out a small displaying mistake which is quite stupid and the result is all opposite. I mean I exchanged the result of O type and AB type. In order to save face and save space, I decide to modify it without creating a new version.

我用最笨的办法来计算概率,确定无疑地说:Double E专业的直觉往往不如computer science.

七月十九日   晴朗

有时候,我自己也会觉得我要么愚不可及,要么脑子进水,为什么要去花时间去证明一个不可能有结果的问题呢?我们中间没有这方面的专家权威,这个问题向某些人说得没有现实意义,我记不懂生物也不懂遗传,对生物进化的全部知识就是15岁以前学过的,对于一个智者来说不会把宝贵的时间浪费在没有结果的问题上,经济学家会说资源浪费,普通人会说无聊。我也同意。因为,我并非什么智者,I am a common man with a common wish to try to make myself look like uncommon. Is this not common?

不过,无聊的定义是因人而异的。每个人有自己的定义,One man's meat is another man's poison。对于福尔莫斯来说无聊就是没有任何犯罪案件的下午的一针吗啡,对于很多“正常人”来说就是体内某些不知名的化学成分太少。对于我来说,就是脑子空空如也。在蒙特利尔美丽的夏天我有权利消遣我的时间,今天的人类比十九世纪伊丽莎白时代已经大大的堕落了,那时候,最美好的莫过于在朝阳的洒满阳光的书房里,昏昏欲睡地读完<Alice in wonderland>的一两个章节。血型的分布简单地分析也是一个非常复杂的递推公式

And I am not in slightest mood to add any more sentence to my simple dialog between HAL9000 and Dave.

第二个实验是把血型因子纳入考虑,并假设AB型是一个衍生的血型组合。即人类的始祖是纯粹的A,B,O型,结果和第一个实验有重大的不同,A,B市增长最快的,AB其次,O最少。这和现在的统计情况差别更大。但是不管怎么说,那种认为血型因子的总体数量比例维持不变,血型分布比例也不便的天真幼稚的说法是完全错误的

七月二十一日  天气不错,心情不好

我想模仿printf()那样有不定数量的参数,可是,模板就有问题,我想也许模板类参数的传递和别的函数不一样吧?还是虚函数的?还是c++类成员函数?或者。。。

七月二十三日   天阴沉沉的,好像有什么心事

签证还是拿不到,中国护照除了回国几乎没有任何用途。我想了好几天才想明白一个最最基本的问题,在迷宫里如果你没有很好的记忆力,单单靠方向感,应该是没有任何保险的算法能够走到目的地的,除非你记住你走过的路,即坐标。想明白了这么一个基本的幼稚的问题,所有问题都迎刃而解,因为,我一直以为人类比计算机聪明,现在发现人也不过是因为对已经走过的路由印象,才能保证走出迷宫,从这个意义上看,计算机不比人笨,是我比计算机笨,那么我就放心了。所以,基于这一点,一个简单的深度搜索就可以了,我不再为内存大小而担心了,反正都要记住坐标,索性就把走过的坐标都记下来,这是一个必须要做的工作,不可能有更好的办法。我以前一直迷信靠墙贴边走的方法,对于中心空旷的迷宫或者由柱子的迷宫都不适用。既然走过的路要记住,与其记录路径,不如记录坐标。

七月二十五日    天晴多云

我再次尝试我的小蛇,它能够游动,长大,可是,问题是在狭窄的空间里经常无法腾挪,最重要的是对于15puzzle来说,它并不是一个什么好的算法。当蛇的长度比边长来的长的话我无法找到一个好的算法来让他游动长大,经常卡死,而且即使我能找到的话,当边长缩短到2的时候,蛇的概念变得毫无意义。我又一次从一个充满信心的起点走到了一个无底的深渊,到达了一个我没有预料的终点,当然,我所钟爱的小蛇也许可以作为类似贪吃蛇的小游戏的素材。

这两天一直在看老电影,一部1957年的美国歌舞剧《silk stocking》很是好看。其中的唱词风趣,幽默,充满韵律,舞蹈欢快多变,糅合了芭蕾,现代舞,有时候还能看到俄罗斯民间舞蹈的影子,爵士乐是其中的主调。美国人真是有创造性,那种认为美国没有历史,文化的很多国人的想法是肤浅可笑的,短暂的瞬间有时能迸发出更灿烂的辉煌。可惜今年的娱乐开支已经大大超过预算了,否则我很想从Amazon去买一张DVD来仔细欣赏。

七月二十六日  晴天

有朋自远方来,不亦乐乎?找到一个同好,非常高兴

It is my greatest honour to receive such encouragement from respectable professor Mr. Cliff Shaffer!

七月二十七日   阴天

我又用模板写一个集合类,这已经是我的执著了。不过,我还是很满意这种重复劳动的,我把一大堆的操作符作了重载,有两点很有意思,一个是建立全集,与空集,另一个是用类作模板参数来传入方法指针,这个也是旧话重提,不过都是我的爱好。我用一个static的计数器来控制constructor,与destructor不然,会陷入死循环。但是,这些都还是可以解决的问题,编译器似乎不能解决的问题是power set的问题,即一个集合的所有子集的集合,这时候,模板类型参数本身就是当前的模板类本身,这似乎不符合模板类型参数仅仅是placeholder的思想,我也像不清楚模板在什么时候instantiate,这样的问题要让人发疯的

七月二十九日  现在还是临辰

想破了头才想出了去除比较函数的方法,这是一个很巧妙的办法。因为,我的集合类函数都有重载==函数。只要最底层的成员数据有正确的"=="作比较符,那么就不用再专门输入新的“==”寒暑。不过对于成员数据像“char*”之类,“==”不是正确的比较符,那么你就要去specialize集合类。这里你要知道,char* 必须先用typedef来定义!我累死了!

compiler-talk.

想起昨天与春明踢球时候对中国的儒家哲学又作了第n次的批判,中国人在这样的思想窒酷下怎么可能产生现代的科学技术呢?

下午观看《长征》学习伟大领袖的坚忍不拔的精神,听到主席念咏《娄山关》的诗篇,不禁热血为之沸腾。

八月七日    天有小雨

又是一个浑浑噩噩的星期过去了,什么也没有做成!我忽而想完成我的编译器,忽而想继续完善我的自动证明,计划完成一个类似模板的可以做迪归的东西,计划学习MFC,计划尝试操作符相对优先级的表达式parser,计划预习网络和AI的课程,计划。。。结果什么也没有做,唯一的成果是练习打网球把胳膊练酸了,帮同学搬了几次家,发现了我的所谓的replace工具根本就没有用!我要么用临时文件存储,要么直接用win32API,当然后一种方法是无法在UNIX上用的了。

八月八日    你知道蒙特利尔的雨有多大吗?

这个日子我今天才知道居然是Fayer的生日。中午去爬皇家山,浇成了一个彻头彻尾的落汤鸡,整个衬衣脱下来可以不停地拧出水来,在大雨中光膀子和王林森比赛爬山实在是过瘾。其实我没什么可骄傲的,皇家山上到处都可以看到七八十岁的老头老太太在雨中攀登,相比之下我总觉得中华民族是一个彻头彻尾的孱弱的民族。并且这个习惯于在异族奴役下苟且偷生的民族又一次不小心忘记了几十年前这个日子里曾经应该值得纪念的用血与肉换来的胜利。

我觉得我的每个暑假都有相同的问题:生于忧患,死于安乐。(I only live in danger and difficulty and I always die in safety and slackness.)
孤单只会让我更加充满斗志,和凡人接触太多让我沉沦。看过《西游记》吗?孙猴子出生的时候目运金光,气冲斗牛,惊动上苍,后来食了人间烟火,便失去了灵性变得和普通猴子没有什么差别了。

八月九日    风轻云快

一点体会。

八月十日   又下雨了

我一直想写一下Huffman code。因为这是一个基本的算法,考虑到这么一个基本简单的东西,我一直没有触及,有一点不可忍受。事实上,我想很久以前我就想尝试,当时应该觉得有些困难吧?学过了数据结构之后,他的神秘少了许多,但是,压缩文件还是比较麻烦,我就放弃了,因为,bit的操作很麻烦,文件看来只能写byte,那么我要把Huffman code以bit的形式来写实不可能的,align成一个一个byte比较繁琐,我懒得动了。

八月十五日  天晴了,我的衣服终于经受住了风吹雨打的考验可以收了

我一直想找一种探测ambiguous grammar 的算法,学了编译原理我想用SLR(1)来尝试,当然我自己都不相信这是一种可靠或者可行的办法。

八月十六日  晴间多云

有一个小小的game供你自娱自乐。当然,我相信很多人根本体会不到其中的乐趣,也许还看不懂问题吧?

有多少人会犯我这样的低级错误?我有时候觉得我读到英文字和我的想法总是格格不入,因为,我总是以一种先入为主的想法对待客观世界,如果,他们不符合我的预想,我常常忽略他们; 如果,他们符合我的预想,我还要看书干什么?所以,我基本上不读书。

八月二十二日    阴天很冷

关于磁盘寻址的latency时间的问题,几乎每一个学过计算机结构的人都知道是平均1/3。问题是我不知道怎么算出来的,我用一个小程序去模拟的时候,才意识到应该有一个前提,就是平均等待时间的定义问题,这个和操作系统中进程的等待时间有一定的相似的地方,就是排队理论中要求队伍的长度相对固定,否则系统的平均等待时间是无意义的。比如,一个队伍不断在增长,你可以想象其平均等待时间也是在不断增长的。因此,这里的latency是在一个理想状态下,任务sparse and few,应该是一个简单的微积分或概率问题,只是我不知道要怎样解决。一个简单的问题居然号称写了两个版本,有时候,我觉得我自己写程序好像是找老板要工钱一样的巧立名目。实际上,我真正挣钱的时候,写的程序却很少,我指的是evolver脚本,我没有权力贴出来,因为大部分不是我写的,也很乱七八糟,不过,我只是想安慰自己一下,我这些天没有无所事事,天天忙着伺候那八个服务器上的东西,原来分配给我100M空间的时候我心里还在嘀咕,现在才知道根本不够,空间只够同时运行4-5个server。

其实磁头寻址这样一个问题是一个很简单的微积分的问题,不过因为我在大学里面不学无术,微积分和没有学过一样,现在开始补课了。

八月二十五日    阳光灿烂

花了一块钱看了一场电影《kill bill2》,比国内还便宜。不过2比1差很多,看来导演的灵感是枯竭了,从《four rooms》的毫无创意就可以看出这个喜欢标新立异的新导演由江郎才尽的味道了。

看《Battle of Wits》里面IBM的早期的排序机器被美国特工用来破译日本的密码,想到了这是一个radix sort的绝妙的应用。不过写完以后,向炫耀式的考问朱春明,没想到它很快地用95%以上的程序员都会用的普通方法来解决这个简单的问题:怎样在一个长长的字串中寻找一定长度的重复字串?c/c++程序员一定会用两个指针从头搜索到尾,这是一个O(n^2)的算法,虽然比radix sort德O(nlogn)要慢,但是,他简单的多,并且,radix sort德O(nlogn)是一个系数很大的nlogn,因为要拷贝很多次。我真是糊涂。

八月二十六日  灿烂阳光

整个暑假我都在看各种各样的电影,大多数是电影频道的老片子,很多非常的好,比如《red sun》,一部西部牛仔与日本武士结合的西部片,非常的精彩,日本武士好像是高仓健,我不确认,但是牛仔第二号人物却是阿兰德龙,是真正的剽悍的西部片。《taxi driver》则是一类我们很难理解的片子,但是也同样是一部经典。《I married a monster from outspace》实在是一部真正反映美国人冷战思维的经典:外星人寄居人形好像KGB的间谍,秘密占领整个小镇,掌握了警察通信交通,渗透到社会的各个角落。同时具有星际旅行这样先进的文明生物,却在精神生活中极度贫乏,需要美国这样一个地球人的领袖族类来教导外星人怎样去爱或者体验所谓的感情,这样先进的外星文明貌似强大,但是,却无法抵御人类的宠物--猎犬的进攻,所以,美国人是人类的保护者,美国文明是地球文明的代表,以至于整个星系的领袖,美国的生活方式是人类的模板。我不知道哪一个更幼稚:是相信全世界三分之二的人处于水深火热中需要解放,还是相信美国人的文化科技是整个银河系中领先的。

八月二十九日   下午突然下起了大雨,电闪雷鸣非常好看

为了尝试写一个简单的graphic demo,我决定先把我的简单得不能再简单的运动轨迹小程序先备份一下,对VSS我还是抱持一种不信任的态度。下午,又尝试dll的调用,又第n次的犯了calling convention的错误:我几乎没有在一个work space里面做两个以上的project,因为,delphi编译目录的噩梦总让我避免这样做,(实际上很安全的,现在想不起来为什么Delphi要那样弱智的要设定一个default的obj文件目录,像VC++这样傻瓜的解决方法不是很好吗?)几乎和我想象的一样,VC6.0可以让你trace进dll的code里面,尽管你是用loadlibrary来调用你得dll,我无法想象这给程序员造成的错觉有多大,至少我是坚信dll的代码可以trace并不代表你可以真正看到运行的数据,毕竟dll生活在另一个我们无法接近的程序空间---操作系统动态分配的地址编译器怎么能够追踪得到?事实正是我的想法那样,VC6只不过运行了一下你的dll,并且非常乖巧地同步了你的tracing。我想在这里提醒自己的是:不要再犯同样愚蠢的错误了!如果你再dll里面声明为extern "C",你就已经明确地声明了你的调用约定(calling convention)为__cdecl,那么相应的,在声明函数指针以便调用dll里面的函数的时候,这个函数指针就要用__cdecl的调用约定,同时非常handy的做法是用typedef把你的函数类型声明成一个新的类型,以便在GetProcAddress()的时候强制转换类型的时候少写几个字。同时,我发现我非常难以接受VC6得很多wizard,因为,我不会用,是用wizard几乎和接受别人的思维习惯是同义词,碰巧我在这方面狠迟钝,除非我明白了为什么。

早上又费了不少时间明白了一个简单的道理:如果你因为你要写的函数太简单而感到内疚以至于要把他写成带参数的macro的话,请记住其中的参数不能使表达式,因为,macro是由preprocessor直接替换的,那时候parser还没有开始工作呢,自然对于operator的precedence无法正确地解释,因而这种替换是危险和不可预测的,比如#define ABS(x) (x>=0?x:-x),如果你这样做ABS(--x)十有八九会有问题,--x>=0究竟是true还是false呢?我不知道,也不想知道。如果,你觉得macro太危险,函数太奢侈,那么不妨试一下inline的函数。

我想说我喜欢vc++的一个原因就是tracing的强大功能,相比之下,那些用YACC,Bison等等compiler-compiler编出的一些所谓脚本语言实在是一种垃圾,因为,那些parser经常连语法错误都无法爆出,至少在我适用的范围内,perl是这样的弱智。

八月三十日   又下了(降水超过5毫米?中雨:小雨)

今天开始学习LISP,我的感觉好像和Haskell差不多,但愿这一次能够好好学一学。朱春明说他们的考题有:在函数内部定义的namespace中的identifier是global还是local?我觉得教授出这样的考题真的是有些纯粹为了考倒学生了,这个如同很久以前我听到的问题:再vc里面类型如何自动转换,或者说那些是兼容的能够自动转换的类型。这如同考问一个以英语为第二语言的人是否能够辨别出德克萨斯口音与美国中西部口音的区别的一类问题了,这是面向对象语言的本质问题还是vc6.0的tips?把五月的日记移走吧。

八月三十一日  天还是黑的

有大虾寄来的小puzzle,其中第二题和原来的第20题是一样的。

九月二日   晴冷

要记住:scheme里面的( let ((source  target))  (here you can write your expression)),这里,中间的()是必需的,否则,解释器不认为你的定义结束了,scheme的语法真是无理性。还有,let地执行顺序好像是从内到外,并且,最外面的let影响最里面的,好像和我们c语言里面的scope正好相反,不知道怎么实现的?要注意:define才是我所认可的macro: (define (fun par) expression),let到像是declaration,但是算是global还是local?

夏天最后的余晖我眼中的余晖我心里的余晖

九月三日   阳光这么灿烂

AI注册不上怎么办?真是人算不如天算,世事总是在你最意想不到的地方抓住你,为了这门课,我书都买了还专门调整了一门课程到冬天去,结果不知道怎么搞得误操作了一次,弄到现在选不上了。

我就是驴子我怕谁?

九月八日  早上起来精神饱满,阳光也灿烂

我记得data-structure的tutor写过这样的简单的demo,我当时还和她说过离散数学书本上的算法和这个不一样。其实这么简单的迪归算法,我却折腾了半个晚上,当然,这种绞尽脑汁的磨洋工是有好处的,我明白了一个道理:算法有时候是可以“设计”的,或者至少可以“猜”出来。

昨天是开学第一天有些混乱,我犯下了一个致命的stupid mistake,也许我在毕业以前都无法修习AI了,这简直是一个大笑话,因为这也许解释的人性的可笑的本质,你所谓最care的东西是你所得不到的东西。或者,“汝果欲学诗,则功夫在诗外”,因为,我已经逐渐认识到AI是一个最综合的大筐子,什么都可以包括,反而没有什么东西了,不如我先去学习些实用的工具再回头?不过。。。

九月十四日   今天是什么天气呢?好像是阳光灿烂

Angel从国内回来帮我买了一个MP3Player,现在国内的电子产品实在是发展太快了,我早已落伍的不知道多少了。今天,调试网络文件传输的程序实在是有一点辛苦,一会儿是server运行,跟踪client,一会儿又要反过来,总算是完成了一个界面及其丑陋的小程序,我最主要的工作是想要重现delphi对于socket的封装的样子,不过是重新把代码组织了一下。贴出来供大家参考,但是,希望不要照抄,不然大家都惨了。

九月十五日  天晴

scheme里面可用(load "filename")输入文件,同时,(define fun_name (lambda (param) (fun new_param)))来定义递归。我对于向量的一些基本操作总是记不住,就写了一个超级简单的小小程序来帮助记忆,其中唯一值得一提的是“。。。”这样的参数,哈哈,我不知道在座的是否知道这样的不定数量的参数。

九月十八日   天晴有云

早上和王林森去皇家山跑步,经测算花了45分钟跑到山顶,(包括绕道“十字架”在跑回Charlet)。争取以后能更快一些,因为现在我们还赶不上训练有素的洋妞呢。

下午,接着学习数学分析,总算明白了1+1=\=0的道理,不过,假如我们假定0的唯一性,不知道是否能够用9个基本定律来证明1+1=\=0。大多数的所谓证明大都是书本上的,我只不过在简单的推到一遍,实在是简单得可笑,你能相信我证明的问题都是我从来没有任何疑问的小学时候学过的,比如,任何数字乘以零还是零,任何不为零的数的倒数的倒数是它本身等等,很简单吧?

想了想还是把我的程序贴出来吧。

九月二十一日      天阴

Sometimes, I just wish I have the chance to study more about mathematics.

I am hesitating on if I should post my ultimate version.

九月二十二日      天晴了,该收衣服了

这三天的过程象极了数学归纳法。

我无意中听到了黑客的脚步声

九月二十三日   天晴,我把衣服收了

昨天晚上的课堂上那个伶牙俐齿的法国小妞当众对着我讲了一大堆的merge-sort的第二阶段sublist的数目不能过少,否则i/o就会太多,我听得一头雾水,早上看书才明白了内存大小确实的有一定的限制,因为,disk的最小存取单位是block,而第一阶段内存大小与i/o次数是无关的,但是,merge的阶段,我们是把所有的sublist一起merge,因此,内存大小要足够容纳所有的sublist,也就是内存的block数目的平方要大于整个文件的block数目。

一个扩展命题。

九月二十四日    晴天,该洗被套了,不然冬天到了就没地方晒衣服了,

I proved a trivial lemma...

I began to suspect my theory.

九月二十七日  天晴,被套要记得收啊。

早上看了两部关于“梵高”的电影,都是片断,心里不禁有些感动,梵高的作品生前无人问津,死后却被所谓的收藏家推上了拍卖行的巅峰,实在是一种莫大的讽刺。我个人对其作品几乎一无所知,也并不相欣赏,因为画家作画本是传达一种激情,和传教士传递信仰,并无本质上的区别,都是一种信者恒信,不信者恒不信的类型,不象数学家传播逻辑,科学家交流思想那样完全可以,也非常有必要进行验证的类型。“艺术品并无验证的方法”,不过,作为创作者的人格却是完全可以加以分析与检验。“梵高”是一个典型的艺术家,充满激情,不断发掘周围的美,并想方设法要表达自己内心地感受,在这一点上和普通人并无两样,我完全可以体验他画金灿灿的麦浪时候的喜悦和我在100层深度搜索的快乐十项类似的。这样的情感不一定可以,也不一定必要能让芸芸众生来体验,子非鱼,焉知鱼之乐?

昨天吃饱了撑得了

九月三十日  天晴,可是谁收了我的被套?

人生就是一个过程,每个人都知道自己的结果,因为不管你是怎样的该市英雄,最终都不过是一抔黄土。如果不是人生过程的靓丽,我很难想象一个人还有什么必要活着。
成功固然诱人,可是失败何尝不是一种人生的体验。你并非生来成功,你也不必在死后为失败而发愁。所以,成功与失败又有什么看不开的?

我忙死了,我想把数据库中用到的一些算法和结构写成小程序来练习,我想尝试进一步丰富向量空间,我还想尝试追踪网络中神秘的噪音。可是,作业太多了,单单算法语言这一门课就让我手足无措了。结果,和去年秋天一样,充满了遗憾与穷于应付。

十月三日  昨天下了大雨,今天天晴了

昨天,花了一块钱看了两部大片《King Arthur》, 《I, robot》。其中的代价是去电影的路上被淋成了落汤鸡,只好坐在电影院里晾衣服了。“亚瑟王”的故事在西方家喻户晓的程度不亚于三国演义在中国的地位,国人对这些历史的无知,正如西方人对中国历史的无知,又何必要强求外国人对中国诸葛亮的了解。其中的战争场面还是非常值得一看的,罗马帝国重骑兵的铠甲,英国的长弓,投石车等等,如果你玩过“帝国时代”会有更深的体会。“I,robot”特技还可以,情节稍微的老套一些,总的来说,也还可以,至少比“minority report”要好很多吧?

据说winzip用的就是Lempel-Ziv的压缩算法,昨天看电影前匆匆写了一个压缩的算法,解压缩的算法稍稍的复杂一点,留在下一个版本。

十月五日  天阴,很冷,我只穿了衬衣去上学好像特别的醒目

上线性代数课,老师问有没有计算机系的,好像就我一个人举手,当时很惊讶也很惭愧,好像觉得计算机系的人数学都是学得不错的可以免掉这门课。我不知道为什么我却觉得有太多的东西等着我“发现”。也许是我现在变得越来越笨了,开始认识别人早已习以为常司空见惯的问题,也许我现在有时间去重新看待我以前想当然的问题

这其间的差别岂止十几公里?

十月九日   晴,头发长了,见识短了,我把头剃了

晚上看CBC转播的美国总统电视辩论,很受触动,且不说美国的所谓民主制度等等,我只想提一点,两位总头候选人唇枪舌战,口才便利,思路敏捷,不是地列举大量数字,我只想说我的年龄也许就只有他们的一半多一点,可是我的记忆里好像已经不如他们了。郭亮在我们国家的最高行政机构里面工作过,说过我们的前总理朱镕基仅仅会在每个月要各个部长汇报工作的时候列举数字,那些部长们就已经绘几天睡不好觉,我可以感受到中国永远赶不上美国不是因为别的原因,只是因为领导体制的不同,美国的总统实在是不好当,相反,在中国我向往着做人民公仆的工作,而且,这个公仆的职责越重大,我想我会越轻松。

十月十二日   天晴了

昨天花了一天时间再写我的UDP程序,还不算前天,我原本根本没有预料要花这么多时间,不知道是什么原因要这么久,想想可能是因为我对要做的stop-and-wait的protocol还没有十分得清楚,而且这种通过模拟router实时传送无法跟踪,因为,而我原本没打算怎么debug的。真是累啊,为了一个stupid的手误,花了好几个小时,最后在最不可能的地方找到一个不等号写成了=!我简直气晕了。另一个头疼的问题还是原自于bit的操作,char居然也是有sign的,最高一位不能用,如果#define  Some_Char  0xF0这样居然会被编译器认为是int,真是麻烦,这种细节问题着实的多。还有一个小问题,我以前有错误的认识,extern的变量写在头文件,实际上是声明在其他的include他的cpp文件里面,这和声明成static还是有本质区别的,我不知道我以前怎么就不明白,到底我是越来越不笨了还是相反?最后一个重大问题是确认的问题,我觉得无解,老张也说这是有定论的:在网络连接无保障的情况下,发送方要接受方确认收到文件结尾,接受方要确保回复,那么这个循环是无止境的。所以,只能是接受方直接受到就断开,发送方看运气了,错误次数超过限度报错就是了。我为这个也花了不少功夫。还有,到底文件传送前是否应该同步一次,这一点我原本没有意识到,最后才发现,不管是server,client方,发送方负责同步还是比较合理的,当然我本来用接受方来负责同步是等效的,可是,问题是别人看起来别扭甚至是误解了。相反,用client,server来划分同步的责任,反而使更复杂吧?(我想不清楚了)再有就是错误处理机制,搞得不好就是一团乱麻,我现在才比较清楚一点,就是错误处理和exception-handle是不同的意义,我当初这样写确实是有一点by intuition,但是还是不错的,只是抛出了exception再把错误号码传递到另一方,再导致另一方的exception被抛出,就千万不要再把错误传回来了,不然又是一个无线循环。还有就是,select并不代表已经recv了,你还是要recv把data从buffer里面读出来,这是一个基本常识,我也犯了错。还有什么错误?啊,ReadFile返回至并不是false代表文件结尾,只有当返回至为非零,而读到的字节为零的时候才使文件结尾。

十月十五日   小雨

看线性代数看到一大堆问题。我总觉得这门课很深奥,可是几乎所有的人都不以为然,真让人苦恼。

昨天听了sliding-window德protocol后,我觉得我后来的想法是对的。为了能够确保eof的信息传递给receiver,我们可以多加一个end of transmission的包,当这个包确认的时候,也就保障了之前的eof的包的确认,从这一刻起,即便有什么传输的错误,都不再会影响到之前的eof,也就是说,文件传输是彻底完成了,传输双方不论有无丢包都可以退出了。

十月十七日  小雨

算法的题目真是头疼,寻找maximum matching的题目还算有头绪,我懒得数数,就写一个最最简单的DFS来找结果。但是,distinct representative的问题我单单去理解问题,就花了半个下午,还不知道要干些什么,后来只好用google搜索才大概明白一些相关的东西,其中的一个“结婚定理”,相信大多数的女孩子会很有兴趣的:对于n个男孩,假如任意k个男孩子中所认识的女孩数目至少是k,那么一定可以让每个男孩子和一个他认识的女孩子结婚。证明可不是我等所能够理解的,而且作业业和这个不是太相关,因为也是matching的问题。昨天我也花了大半天时间痴心妄想试图找出另一个Strassen's algorithms的改进法,真是自不量力,让矩阵相乘减少一个乘法的算法是很高深莫测的,怎可能轻易想出来?我只是似乎看到这是一种线性变换的思想就想去尝试,实在是不明智,唯一有可能的是搜索16个小矩阵乘法的线性组合,然后,尝试从8维的向量空间变换到小于7维的向量空间。(我也不知道这种说法对不对。)

晚上看线性代数真是头疼,其中的证明题很是费脑筋。我的这位老师是号称Erdos number=2教授,这等人物可能在中国是很难碰到的吧?没有学过离散数学的大概很少听说过Erdos吧?那么我也就不解释了。

十月十八日  阴天

Guess what I look like...

学了线性变换才明白了这么个简单的道理。

Are we proving they are linearly independent or not?

Yes, I am wrong.

十月十九日  晴天

我不明白三个字串的相同子串为什么会不一样?

十月二十日   晴天

累死了,晚上的database的实验课真累啊,下午睡过头了没吃饭就去上课,结果课程取消了,真是气人!结果实验课给oracle设定cluster, 和各种各样的index,折腾了一晚上,这还是挺有意思的,因为,以前从来不知道怎样fine tune database,学了数据库设计才知道一次查询有多么的昂贵,才知道可以自己重新组织数据的存储。不过早上的作业的疑问还是没有被解答:My puzzle in assignment...

十一月二日  雨天

时间就是这样的度过,在你不知不觉中你又度过了你生命中了无痕迹的两个星期,当你回头看看你这一小段生命的意义时候,你是否觉得懊悔。至少我有一点是:数据库我考得一塌糊涂,我曾经试图写一些程序,但是每一个idea都是开了个头就无疾而终了,B-tree,dynamic-hash,external-sorting,scanning-port-by-socket,min-cut-max-flow,topological-sort-for-connected-component。。。我好像无法集中精力做完一件事,当然我也承认很多的algorithm实现起来麻烦,而且其中的细节我想不清楚,很多的东西单单建立起那个环境就很麻烦。不过,这些理由也许并不是真正的理由吧?既然我现在没有mood去做,就让我记住我有什么没有做吧,就像夏天的从来没有开始过的compiler project,但愿我有一天能够完成这些计划。(像那个揪心的“斑马问题”困扰了我一年,对于DFS我竟然需要将近一年时间去体会)

那位erdos number等于2的教授确实让人耳目一新,当我从教室里面走出来的时候,我看到的加拿大蔚蓝的天空变得更加得蓝了,一些久久困扰的问题有了一些线索,但是最大的收获实际上是一种心灵的安慰,我至少知道了我并非庸人自扰,我所有的concern都有人考虑过,而且应该都是由答案的。number system和vector system不管是否是两个独立的系统,他们回答了为什么我们小学中学甚至大学的时候take for granted的东西:线性变换和提取公因式似的因式分解似的numb-minded mechanical operation有着深邃的联系,vector space仿佛是一个线索,把我所有的学过的数学知识全部的串联起来了,这也许是中文对于数学上ring的解释吧?

我很喜欢networking教科书上的一些引言:

Data is not information; Information is not knowledge; Knowledge is not understanding; Understanding is not wisdom;

也许我可以这么理解人的一生,在幼儿园时候,我们的所见所闻都是无意义的原始数据,我们懵懵懂懂:数据从来不会自动转化为信息;在小学时候,老师在启蒙我们的时候,我们馄饨初开,对这个世界开始有了认识,但是认识从来不是真正的知识;到了中学的时候,我们开始变得主动学习思考,但是知其然并不一定就知道所以然,知识并不代表理解,我记得那个时候所谓的“知识竞赛”很热门流行,但是就好象今天我们在比较两个数据库能够存储的数据总量一样,有时候查询速度比总存储量来得更重要;到了大学时候,开始理解一些道理,但是只见树木却不见森林,有时候知其然,也知其所以然,却不一定知道怎样才能正确地探索并得出正确的所以然。好比学了数据结构知道了很多算法,却不一定知道怎样才能设计并找出正确的算法,就比如知道了所有的排序算法都不可能超过nlgn,那么是否可以从这个lgn猜测出来几乎所有的算法都使用divide-conquer去把list分成若干个小的list?因为,这种binary式的划分需要的次数都是lgn,可是为什么我们不能划分为两个以上的list呢?也许是因为sequence本身就是一个二维的向量空间,其中的元素间只有两两间关系(relation)我们没有必要划分更多,也不可能划分更多。但是strasseng的矩阵快速乘法的给人耳目一新的震撼难道不能在这里重现吗?除非我们能有一些特殊的排序要求,以至于一个sequence里面有多个排序的标志量,或者这个sequence是有多于2的维数?所以,也许我们可以说理解从来不会自然的生出智慧。圣贤之书就算读了千百遍如果没有思考实践,也许还是原封不动别人的思想。如果不嫌弃我狗尾续貂的话,我想再加上一句我自己的理解:wisdom is not originality;

今天学到了两个简单的know-how,当你需要链接某一个lib文件时候,通常是让程序员在vc6++的project/settings/link里面自己加入.lib文件,与之相当的办法是写一个编译器指示字:

# pragma comment (lib, "libfileName.lib")

另一个非常simple的问题是我以前一直没有找到调试运行时候怎样加上命令行参数,这个问题是够愚蠢的,我不知道我为什么以前一直没有找到,project/settings/debug的program argument。

我还是搞错了,dll是不能静态链接的,只有implicit or explicit call,前者就是靠操作系统帮你自动load,后者是要自己用loadLibrary去主动load library。另一个会混淆的地方就是静态库文件和动态库文件的“接口文件”,这是一个非常迷惑人的东西,我被骗了很久!你要implicit链接动态库,你需要link 一个动态库的接口文件---.lib文件。可是如果你要编译一个静态库,他的文件扩展名也是.lib。但是这两个东西完全不是一回事,前者没有代码,仅仅是一个类似于头文件的函数原型,后一个确是一个类似于obj的文件。微软这么做实有原因的,也许linker始终都回去链接这么一个.lib文件来resolve你的程序里面用到的所有函数。记住,静态库你还是要自己把.lib文件加入链接的文件列表中。(见上)

十一月八日   天气不错

早上作了一个小试验,试图找出一些idea来寻找多个strings的LCS。我试验了所有的排列,结果看不出什么,这当然是意料中的事了。我还异想天开试验他们的10进制的数字的关系,还是看不出所以然。

十一月十日  天阴沉沉的

comp465的作业实在是让人绝望,我已经没有信心在努力了。一个算法想了很久,而且这个是被公认为认为最容易的一个,因为,教授出这道题适应他的老朋友的要求,不得已出的玩的,我原来想错了,后来又不敢确定,只好用c++验证。

十一月十一日  天突然下了小雪,不过很快就停了

真是累啊。一道题的证明我就费了5页纸,monotone的算法,我早上想了一上午,结果连上课都忘了,在地铁里才想到可以直接用binary search搜索对角线,寻找第一个菲负的entry,然后分割矩阵为四个小矩阵,递归搜索左下角,右上角的两个,我用master theorem证明是O(n),比我想象的还要好。等上课回来,再改吧?我累死了,晚上还有一节课呢。

十一月十二日  天突然晴了,又出太阳了

费了一晚上才把一个简单的binary search加了进去,真是让人笑掉大牙,我本来以为我可以边看电影便把一个binarysearch加进去,谁知道竟然让我调试了这么久:一开始从正的方向逼近这一点我就没有注意,浪费了很多精神去怀疑边界到底是对不对,后来又发现我要和linearsearch比较,我必须修改一点点越界的情况,边改遍又看了一遍《heat》,这部西方人的侠义片非常的片面,一伙异常凶残的杀人抢劫的惯匪被导演表现的感情丰富,忠于并热爱家庭,对同伙有情有义,对仇人决不放过,聪明才智不亚于警察。不过想想看在抢银行的时候,这帮匪徒用强大火力的自动武器不知道杀了多少个警察,大街上的行人就更不计其数了。这合情理吗?

这个程序是简单,不过用master theorem进行分析还是很有意义,至少我终于有机会发现本以为无用的理论的实际价值。

晚上把gobackN的代码写完了,当然,仅仅是写了一个框架,我原来费了不少心思的一个queue形式的supplier类被无情的抛弃了,因为,窗口本身有很多的要求用queue实现起来很罗索。同时,我还是对于同时能够运行gobackN和stop-and-wait的结构心里没有底,我实在不想把代码写得那么乱七八糟,我这个第三版的作业已经太多垃圾了,当初对于通讯协议一无所知的时候所设想的都没有什么用。而且,作业的要求也改了很多,前后不一致,当然tutor是想降低难度,真让人扫兴。

十一月十四日   晴天?阴天?

花了两天左右的时间才完成了go-back-N的作业,主要的问题是protocal的问题,究竟要有多少timer,是否需要逐个确认,还是逐个否认,怎样能够让go-back-N能够兼容stop-and-wait,也就是说,能否让代码最大限度符合stop-and-wait?这最后一个问题,我到了最后一分钟才明白,当window size=1时候,并且,delay在router程序被禁止的时候才行,缺一不可。我最后还是采用了tutor的一个建议,不用NAK的否认,因为,确认上一个就是了,为什么要去否认当前呢?当sender发过来一组的packet,其中第一个packet乱了次序,你需要一个个的否认吗?如果,你得NAK也被延迟了,当sender好不容易在下一个时间段发过来了正确的,(或者说router忘记捣乱了),又受到了你这个迟来的否认,sender是否会有重复一遍?所以,干脆默不作声,只有当timeout确认上一个就是了。receiver应当每次受到正确的packet都确认,但是这个ACK不一定保证按时收到,所以,sender也并不是每次收到一个ACK就从这里开始重新发,只有当timeout才重发,如果timeout之前收到窗口的最后一个就移动窗口,这样也节省了大量的重发的通讯。最后一个packet最是tricky,我一开始没有想到这个问题,就把eof夹杂在最后一组packets里面一起发送,结果问题一大堆,因为最后的packets个数不一定等于窗口的大小,只能靠eof来识别,可是,假如其中顺序颠倒了怎么办?所以,你一定要等到sender确定全部发完了再来发送单独的一个eof,但是,最后一个packet是没有任何算法来保证解决的。我的想法,应该说是综合了两个tutor的建议,第一,我另外设定了一个end德packet在eof之后,在sender确定receivers受到了eof得前提下,我要让sender继续发送end,假如,receiver受到了end,他简单的回复end就直接退出,因为,这个时候,1。sender知道文件发送成功了,receiver知道sender直到文件发送成功了,即使后面的通讯失败也无妨了。2。sender尝试发送end一定次数,并等待回复一定次数,即便失败了也无妨,因为他知道文件传送成功了。这个时间点是一个安全的退出点,双方都可以在log里面负责任地写道:文件传输成功。Tutor千方百计想把作业简化,他们允许用一个大序列数字来避免modulo,我承认这的确省掉了很多弯弯绕的麻烦,可是文件的大小也受到了限制,packet头也增加了存储数字的浪费。我顽强的抵御这种诱惑,另外,我发现无论是现成的模板的queue还是自己去写的queue都不如最朴素的一个数组,反正queue也是一个circular array,何必浪费?

十一月十五日   晴天

去实验室测试,改了一两个非常subtle的小错误,比如,sender收到receiver的ACK时候,是否应该更新他的current,答案是只有新的sequence才应该更新。另外,receiver记错误是以timeout的次数来计算而不是已收到out of order的packet的个数。。。等等。

十一月十六日  晴天

我对老师的proof不太满意,也许我的理解不很对,虽然结果正确,可是,证明本身还是我的比较convincing。

十一月十七日  阴天?

什么叫真正的dynamic programming?教授对于dynamic programming非常的嗤之以鼻,认为在思想上没有什么深度,的确这是一个很有用但是看起来也很简单的东西。不过,想想看,当你机械地把所有可能的sub-problem全部计算完毕发现其实这个问题根本用不到这么多的,你会不会觉得很傻?你是否想过应该“dynamically programming”而不是“机械地programming”。也许这个会给你一点点启发,的确,思想很简单,窗户纸薄薄的一层,一捅就破了,无非就是在原来迪归方程的基础上加上一个判断,如果,原来这个case计算过了,直接把结果抓过来用就是了不用再迪归调用了。也许这正是dynamic-programming的本意,只是我们理解得不全面吧?

Dynamic Programming is not powerful as you expect. And it is not as less powerful as you underestimated.

十一月二十日   阴天

花了大半天改写go-backN,因为,我选择的modulo太小和windows size太相近,再由delay的网络条件下被delay的packet会mixup。原因和stop-and-wait不能delay一样,其实,stop-and-wait可以看作是go-backN的一个windowsize=1的特例,我当初虽然有些担心,却没有想的很明白,结果在demo的时候才真正发现了modulo sequence让sender, receiver陷入了一个deadlock.我不想用真正的large sequence number,因为这个太baby了。实际的protocol我想应该和我做的一样,是选择一个很大的modulo来让sequence number看上去针对较小的window size来说是一个大的sequence。这样一来传输文件没有大小的上限,二则sequence不会占用太多的空间,在我的例子里,我把一个byte的后面5个bit拿出来做sequence number。结果,这里我因为节省居然翻了一个很傻的错误:我本来想用4个bits,而要modulo=32这怎么可以?真是昏头了。我一直想为这件事写email给几个tutor去complain他们为什么不在requirement里面警告我要选择较大的modulo?因为,从课本里面我照猫画虎地看到modulo和window size大一,我就自然的认为可以了,那是在网络情况为没有delay,只有丢失的情况下。

十一月二十一日  小雨

今年的气候反常好像全球温室效应提前到达了。早上跑步去future shop买了一条内存256M,装上后电脑好像是快了不少。好不容易看了一会儿那本计算机学生的bible,明白了一点关于NPC,NP,P的问题,但是还是很难理解,至少这类问题的证明和自动机的证明一样难。其中说道问题的表达和问题的解决所需要的时间有很大的关系,可是在我看来,几乎是直接的关系,比如从前的那个数字表达的老笑话,财主的儿子上学学写字,第一天学了一个一,就是一画,第二天学了二,就是二画,第三天学了三,结果傻小子就不学了回家了对他老爹说都懂了,老爹一高兴叫他写个请帖让邻村万财主来家庆贺,结果傻小子就画啊画,画不完了。很简单的故事,道理其实不简单,从computer science的角度来看,encoding的不同问题本身的表达就天差地别,如果我们的数字不是十进制二是一进制,那个傻小子无疑是正确的,这样任何的加减乘除等等算术运算要花的时间都是和数字大小成线性关系,然而用二进制表达之后,数字的表达变成了lgn,(我这里暂时不考虑计算本身),假如从另一个角度看十进制,可以看作是一个十维向量空间,有十个独立的向量也就是阿拉伯数字组成了空间的base,所有数字都是这是个基本向量的线性组合,我总在想有没有可能证明数字本身和用“多少”进制表达无关,比如,质数如果是数字的本身特性,它应该和用什么进制无关,也就是说在不同进制转换中保持独立性?

十一月二十二日   小雨?

给我顶住!今天去买了一台打印机,我那台旧的懒得再去买兼容墨盒了。效果就是不错。算法这门课实在是让我头疼欲裂,subset sum化简问题我看了n多遍还是不知所云,一个看似算数的问题却可以用逻辑的3-cnf-sat问题来表示。NPC实在是超过人的想象了。

十一月二十四日  天阴

怎么形容自己做的蠢事,问的愚蠢的问题呢?(8,4)=70这么简单的东西我都会当成排列数!烦闷,郁闷,数学分析的作业也不想做了。看电视看得更是心情不好,突然会从理查德,基尔的一部警匪片想到了上个世纪末的往事,也许可以用另一部电影名字来形容《激动的昭和十年》,中文译作《军阀》。

十一月二十六日   晴天,昨天好像还下了几片雪花

随便练习一下dynamic programming。这是另外一个简单的小问题,pocket ruler。我从数据库这门课学到的一点东西

十一月二十八日  阴天

学习NP-complete记下的一些模糊认识。这个东西非常非常的难。我常常想,也许他们都是算法问题的核心和本质。因为,我好像没有看到对于算法本身定义,大多数naive的定义,就是procedure description的普通代过。我不满意这种说法,正好像古希腊人会相信火和风都是宇宙中的基本元素一样,其实,他们是现象,是物质运动的表象,这么推理算法应该也是一种现象,反映了一些“关系”中最本质的东西,究竟是什么?

十一月二十九日    晴天?

为什么每次我洗衣服的时候天就要下雨?我现在越来越懒得做那种机械重复工作,就写了一个小程序来做networking里面的Bellman-Ford Algorithm。这是一个非常简单得routing algorithm,非常地intuitive。我懒得在写matrix的输入函数,就借用了我以前写得matrix的简化版。

十二月一日      雪

昨天晚上我及时地把衣服收了回来避免了以一个“洗礼”。今天,布什总统访问加拿大,在Halifax发表讲话,我觉得我听了他的演说之后,对他的负面印象要少很多了,这也许就是领袖的人格魅力,有时候,正如我听来的一句话:"Sometimes what is right doesn't work; Sometimes what works isn't right;"就算我对于这个人从理性上看不同意,但是感性上不得不同意他的实际。当然,我们都知道演说稿不大可能是他自己写的,可是,西方领袖演讲时候不可能照本宣科,开场白一般还要一些小幽默活跃气氛,这些对于共产党体制下的领导来说要求就太高了,何况念讲稿还要有起伏顿挫,好像自己写的一样,至少要熟悉好几遍,这样的领导当起来可比咱们的书记在酒桌上拚酒讲荤笑话累得多了。从这一点看,大陆的体制和人治还比西方落后一两个世纪呢。如果,你能读一读布什总统的讲稿,我想你可以体会更多西方人的讲话技巧,远胜于“东方文明”国家中国日本间的“对话”。

十二月二日   雪

我想写一个模拟scheduler的程序,这是数据库中管理transaction的一个东西,我想先实现用timestamp来控制的,如果可能再写locking的,不过好像时间尚不太可能,这学期我有太多的烂尾工程了,一个重要原因是时间不允许,第一,我没有时间,第二,很多东西单单建立一个环境就要花去大量的精力,以至于到后来我队要干什么都模糊了。比如,scheduler里面要管理的是一系列transaction,transaction 里面是一系列task,task针对的是某一个数据库对象element的某一项动作,如read,write。scheduler里面还要有一个task存放的结构,我决定scheduler用最简单的round-robin,因为,主要的目的是模拟timestamp的transaction管理。先写这个开头的小东西吧。太饿了,晚上还要上课。

对Bellman-Ford改进了一点点。

十二月四日   晴天吧?

又有一点殚精竭虑的感觉,奋斗了一整天完成了这个scheduler。我对他还是比较满意的,这个模拟程序自动产生一系列的任务,然后,scheduler按照round-robin的法则执行任务,每个任务都是针对一个数据库对象进行写和读的操作,每个任务有一个timestamp,scheduler 根据timestamp的同步法则决定是否读写操作可以进行,或者abort,transaction执行结束进行commit动作。其中最大的收获是我认为我发现了书本里面的一个大的漏洞,在读的法则中,书本要求一定要检查对象的committed状态,这是不对的,只有true才能进行,这是不对的,因为,如果读写来自同一个transaction,当然不需要考虑committed状态了,否则就会造成死锁。代码写得比较难懂,不过呢这个问题本来就不是那么简单,恐怕也难以简化了吧?我常常想很多人号称学c++多少多少年了,可是真正写代码的时间恐怕并不多,这样我只能理解他说的是多少多少年前他学过c++,现在不怎么用就又忘了,哈哈。真正的飞行员之间只会用一个标准来衡量:每年飞行的小时数,如果按照这个标准,我想我大概在五六百以上吧?

这雪下得正紧!我踏着白雪,顶着雪花出发准备去探望朱春明的新家。一路上到处可以看到五彩缤纷的圣诞灯,天空和地面的积雪一样白花花的一片,仿佛北极圈里的白夜一样。来到朱春明的新家,一看还真不错,新买的家具给人一种新潮的感觉。(太夸张了吧?)我又滔滔不绝地向他介绍我最近的心得,比如在struct里面写成员函数,模板比继承的效率来的高,concurrency的本质就是遵循一定的顺序,至于说怎样的顺序,以及怎样来维护确有两种截然不同的出发点:悲观主义认为顺序总是会被破坏,所以时时刻刻用lock, semaphore, exclusive来限制;而乐观主义则相反,认为大多数时候,秩序可以自动得到维护,我们所要做的只是事后来检查。这正像东方人认为人之初性本恶,default状态要下地狱,因此处处防范堵截;而西方人认为人之初性本善,只要不是死不改悔都会上天堂,只要没证据证明每个人都是innocent;所以,数据库里面的concurrency-control有lock,与timestamp两大类。针对朱春明同学对我的不读书的第n次惊讶,我给他讲了一个小故事,这是从电影里看来的:讲的是英国一个私立学校里面拉丁语课的一个老师为人正直敬业,对教学一丝不苟,班上有一个学生很好学每天到他那里额外学习拉丁语,结果遭到班上其他不学习的同学的嫉恨,有一天,老师用拉丁语说了一句谚语,英语就是:“The art of learning is to conceal learning.”班上的其他同学水平有限都如同听天书,唯有这个小同学发出了会心的微笑,老师心里很高兴就让他翻译给其他同学,这个小同学犹豫了一下,说了一句话,老师心里更高兴了,这句话是什么呢?我先不说,我想说释迦牟尼说法的时候捻花而笑,其中唯有一个弟子也作捻花的动作相视而笑的典故和这有异曲同工之妙。如果,那个小同学真地听懂了谚语,他的回答自然就是:我没有听懂。如果你听懂了就应该明白我平常不读书自有我的道理,conceal应该有很多种形式吧?当然,也许我是真的不爱读书呢?

十二月七日   时有雪

Concordia真是一个藏龙卧虎的地方,至少我是这么认为的。上一次,我说过有人的才智胜过我十几公里还不止,这一次,我有从时间上对比了一下,差距至少是半个月。对于reduce问题的理解我脑子一直没有转过弯来,经同学的解释之后才明白了一点。

十二月十三日  雪停了

一大队不顺心的事情,眼看考试就要到了,还是没辙。郁闷的写了一个比较失败的东西,希望以后能够改进了

十二月二十五日 临辰

今天是圣诞节了,楼上的室友要赶早班飞机回国,结果在她出发之前,我已经被迫醒来算是欢送吧?我没有一丝一毫的抱怨,因为,也许我还是这么早醒来的,并且你还有机会看一部很有意思的电影《woman in red》,我以前看《matrix》并不知道mouse画得woman in red是有典故,我上一次看到了他的结尾:一个已近不惑之年的老人要去体会他偶然发现的浪漫,比如说“上帝带给他的最后的礼物。。。”之类,这有一点点阴损,不过这不是我说的,我只是引用而已,是钱钟书在《围城》里说的,“如同老房子失火”。当然大家应该不会误会我在讥讽现实的风云人物吧?可是,即便的了诺贝尔的什么奖什么的,也会和他的从前合作十几年,几十年的伙伴有着那么多耐人寻味的争执,即便是得了诺贝尔什么奖的,也会经常以为自己是无所不能的政治风云人物,从这里我们仿佛知道这些都是凡人所共同拥有的品德而已,并不一定是他们头顶上的光环所能掩盖的,不过那个光环却能给与他们一些常人不能超越的通行证而已。当然,我觉得我无权评论某些名人私生活,但是,谁让他们是名人呢?最后,电影的女主角我发现原来是《魔戒》里面的那个女精灵,她在停车场里的地面通风口上的一小段独舞真是绝妙,可能是从玛丽莲梦露那里学来的吧?

十二月二十七日  雪停了

 昨天是所谓boxing day,也就是加拿大劳动人民被商业资本家欺骗的一天,哈哈。严重了。我纯粹凑热闹去看了看,回来的时候一不小心在地铁上睡过头了,就只好去wal-mart,一不小心买了一双鞋子,终于把我那双去年穿了一年的鞋子更新了。这两天头脑不是很清楚,一个简单的动态hash花了两天才完成。

                            二零零

一月二日    阴天

感谢女侠给我指出的错误,看来我有一次把两个演员弄混了,的确我辨认人的眼光有些问题,不论男女。《woman in red》里面的女主角和《魔戒》里面的精灵毫无关系,根本是不同时代的,不同类型的演员,我的pattern-recognition系统看来有问题,不过关于红裙子和玛丽莲梦露我是对的,这一点已经得到了权威的确认,这个当然是因为我再metro的招贴广告上看到后听人说的,所以比较有印象,为防止贻笑大方特此更正。顺祝所有的朋友新年快乐。

一月四日  晴间小雪

迟到的总结。

experience is priceless...

一月五日  回来的时候突然开始下雪了

Who can flip mode bit?

一月七日 阳光明媚,照得人心里暖洋洋的

今天去Loyola上统计课,自从学了离散数学之后,对于所有其他数学犹如一种了然于胸的感觉,好像练武之人练好了基本的内家功底之后,学习别门别派的武功有触类旁通的感觉。上完课后,在图书馆花了45分钟时间认真阅读英文版《毛泽东选集》第一卷,觉得有豁然开朗的体会,仔细捉摸主席的十大军事原则,与当前伊拉克前线的斗争加以对比,感觉冲突很多,看来这种恐怖主义成不了大气候。然则,十大原则与分析问题的方法对于当前执导《英雄无敌4》的斗争策略却有着非常现实的意义,应当继续在战争实践中学习战争规律。

今天终于决定放弃对于clique问题的继续摸索,这种注定失败的尝试是每一个computer science学生所必须经历的,否则,它应该没有资格拥有这个头衔。比如,全世界每一个学计算机的人都知道travel salesman's problem是没有polynomial的算法的,可是,我敢说几乎每一个真正学计算机的人都会尝试着画上几个小时,或者几天甚至更长时间来捉摸,否则,你永远不明白为什么这一类问题会有这样的难度,至少你会有一点点体会。有头脑的人并不会去尝试解决不可能解决的问题,但是这样的尝试会让你了解你不一定知道的问题。至少我的这个bitmatrix作为一个简单的工具达到了我当初的目标。在我没有明白matrix的本质的时候,我以为它是从数学家那里借来的宠物,因此,我把每个entry用long int来表达,当我真正明白了matrix是二元关系的表达之后,我开始抗议数学家把matrix改造的面目全非,因此,为还原其本来面目,我用bit来表达。当然,代码本身没有多少东西,无非是用stl里面的我心爱bitset加上一个整数模板参数来实现一个matrix。但从此以后我会有一个趁手的工具来表达图论等等的问题了。因此,虽然简单得不能再简单,委员会最终决定不再等新的内容就将其存档吧。

统计学一向是我所鄙视的一门经验主义为主,系统理论框架为辅的实用主义气息最浓的所谓科学,是仅次于我所深恶痛绝的最缺乏创造力的所谓科学的化学,生物学,医学。 stat250 开篇讲的就是statistical inference,说了一大通就只有一句话就可以概括,用我们所能够研究的模式来套现实的pattern意图有一个所谓的科学地解释,如同国内骗钱的金融分析家用一大队似是而非的图表骗一些无知的愚夫愚妇的钱的伎俩。说得更难听的就是主席所说的“削足适履”似的教条主义本本主义。碰巧这学期我要学习这两样比较愚昧的科学。

对于人类所能研究的问题,我常常想起中学物理课本对伽率略对匀加速运动的思考过程,首先,他想做的是研究最简单的变速运动--匀加速运动。但是这个“匀”字是相对于时间还是相对于距离要做第一部的取舍,他很快地否定了距离,因为,当时的数学工具部允许他做这样的研究,现在假如我们重新来做一次基本的观察,靠着一点点高等数学我们就知道这是一个比较容易的微分方程问题:suppose s=f(t):, distance s is some function of time t; v=g(s): velocity v is some function of distance s; a=h(v): acceleration a is some function of velocity v.

Since we assume the simplest model, then "a" is a constant, i.e. h(v) = k for some constant k. Then a=h(v)=v'(t)= g'(s)= g'(f(t))*f'(t)=k means derivative for t by chain rule. I haven't studied differential function, but the common knowledge tells me the simplest solution by guessing f(t) = e^t, plug in this e to the power to t  and we get: 

g'(e^t) = 1/e^t    changing variable of e^t to s, we get g'(s)=1/s which implies that if we assume the changing of velocity is constant with respect to its distance, then the acceleration with respect to time would be a function of distance s of reciprocal of s. Is it beautiful? But I highly suspect Galileo can solve this question at his times. The acceleration with respect to time would be much easier one. Does that remind you change of basis in linear algebra if we want to translate between different measuring system. (It is nonsense.)

 文学城上有个别人对于毛泽东在解放战争期间的战略决策有三大失策,我对此进行了驳斥,指出正如围棋中的大局与官子关系一样,很多人永远不可能成为战略家因为他们永远在局部计较一分一毫的得失,却看不到全局的胜负手。

今天重看《The Matrix》顺便查了一下字典,原来英语里面是有这个字的,deja vu,大约学英语的人可以用这个词来检验自己英语学到了什么水平,我觉得我学了这个词英语水平又进了一大步,哈哈,大言不惭,大耻不羞。顺便说一下,这个词意思是“似曾相识”,这样使用英语大约相当于汉语中的成语典故一类的妙用。

一月九日    天晴

昨晚看了一部Jane Fonda的老片子<Klute>这应该是男主人公的名字,一个私家侦探。这部片子比较有意思的是风格上很有希屈柯克的悬念片的意思,我直到结尾才明白这是一部侦探篇,因为从一开始的一个与纽约相隔遥远的美国内陆的一个生活刻板的研究员的神秘失踪为引子,揭示了大都市夜晚的另一面(The other side of night)---call girl的生活,Jane Fonda在影片里面更像一个线索,侦探Klute循着他的生活轨迹向人们展示了平常你不一定能看到的生活层面,人性中的弱点,黑暗,变异,其中的大量的反复的Jane Fonda的录音的重放,既是影片中影子人的内心阴暗面的揭示,又是call girl工作的如同示范手册般的文雅的表现。另一个比较有意思的的是气氛营造,相比起来悬念偏不等同于恐怖片,你不能刻意得让观众产生恐怖心理,但是你又要让观众有好奇心与不安定的感觉,夜半歌声通常产生恐怖与惊悸,但是电影处理的效果却让人产生的是好奇甚至美的感受,的确这种感受很难体会除非你看过电影。总的来说,我对Jane Fonda得好感多了一点点,因为,我以前只随便看过一部她扮演一个职业杀手的片子,非常的拙劣以至于让我认为她只是靠身体演戏的,并经这部片子里面还是有一点点演技的成分,尤其最后那个影子人给他放另一个call girl被虐待的录音时候她眼泪鼻涕具下场竟还是有一定感染力的,可以想象她应该回忆起同行的悲惨命运就是自己的未来,同时眼前这个貌似温文尔雅的上等人下一步要做的就是这样。

VC里面为了和unix兼容作了很多令人费解的东西,stat既是函数,又是结构,让我很困惑。

一月十日   阳光灿烂

今天偶然知道我其实很浅薄的

昨天去听一个化学系的入门讲座,实际上是教育本科生不要抄袭作弊的道德课。国外的大学对这方面非常的重视,plagiarism(就是抄袭)实际上是一个学术界的大问题,任何社会,任何时代都是阻碍科学文化进步的大问题,这种道德教育的预防针在刚进大学的时候就注射是最合时宜,这里的确是这样。我对这个问题不想多说,对于演讲所用得很多警句很有兴趣,(其实这个本身就由plagiarism的难以解决的矛盾,即怎样划定的问题,和是否能够自觉遵守的问题,和怎样监督的问题。)比如,

“抄袭一个人的东西叫抄袭,抄袭很多人的东西就叫做研究了。”

又比如,“亚当的优势就在于他所想到的好的句子一定都不用担心是别人先想到的了。”

“你的东西里面原创的部分不好,好的部分不是原创的”。(英语里面original既是原创的意思又是有创造的意思,因此,其中的双关语非常的奥妙。)

其实,这些有意思的警句我应该去引用英文原文才能让人体会其中的奥妙,但如果能够让不懂英文的人也能体会西方人思想的精妙也许是一个更有意义的事情。正如另一句,大意是糟糕的记忆力让一个人让一个人成为了思想家,因为,一个人有超强的记忆力自然能够完整地记住他所读过的东西,自然不会认为他错误地认为他所用的东西是自己在那里读过的,至少他可以加上注释,因此他是不用担心plagiarism的问题的;而一个人有着非常糟糕的记忆力也不用担心plagiarism,因为他从来都记不住自己读过得别人的东西自然也不用担心他所想到的是别人的成果了;只有记忆力不好也不坏的凡人才要处处小心翼翼担心会掉入plagiarism的泥坑,因为,凡人能够靠自己的头脑想出来的问题应该不多,大多数是看过别人的成果头脑中剩余的一点印象。

一月十三日  临辰爬起来下载Norton

我的Norton antivirus到期了,不小心删除了,又要重新下载,阴差阳错地下载的时候被恶意地3721这个混账王八蛋钻到了我的浏览器里面。没办法卸载,我一怒之下把ie也卸载了,但还是无法删除3721的一大堆dll,在process manager里面也找不到无法关闭,搏斗了近一个小时才在注册表里把所有的3721的项目删除才最后重启删除。

一月十五日   今天是什么天气?(昨天?)晴朗的天空下着雪。。。

其实我实在想昨天是什么天气,因为已经过了12点了。练习unix下的编程。

computer architecture《计算机结构》里面有一个经典的论断:平均起来说一个程序中只有20%部分的代码在80%的时间里在运行。这个论断对于人类也同样适用:对社会中80%的人来说,他们的头脑只在20%的时间里运行他们全部知识与能力的20%。我时时刻刻都害怕自己沦为那80%中的一员。

有多少人能自觉地意识到操作系统里面根本没有copy这么一个系统函数?这是一个非常令人难以相信的论断,以至于我当初自己也在反复之间当我被别人反驳的时候,但是现在我在unix系统命令(准确地说是system call,决不是什么命令行的小孩子玩意。)里面就是找不到,只好自己写一个,因为很简单的,我的实现唯一不同的是我不允许目标函数存在,这当然不是很妥当当我完成之后才意识到,不过,这不过就是open里面的一个flag的差别,很容易改变的。

晴朗的天空下着雪。。。这好像是一首很古老的歌,恰好这就是蒙特利尔。

一月十七日   天空飘着似有似无的小雪花

今天买了5月1日经上海回厦门的机票,预计将在5月2日当地时间下午到达上海,如果各界同胞希望劫机或者宴请的请提前预约,不过鄙人不打算在机场发表任何书面讲话。此次访问中国的目的有以下几点:1。进一步加深中加两国人民的友谊。2。访问时间正值来加拿大整整三年,准备在申请入籍前最后看一下中国。3。学了两年多感觉比较累准备回国调整身心。4。现在中国经济技术发展很快,希望回国感受一下发展的潮流,为今后的学习提供一些实践的指导方向。5。经过两年的学习感觉内功有小成,希望闯荡一下江湖以武会友切磋一下武功。6。想有一个良好的环境尝试一个project,当然现在还不成熟,不便透露。 7。希望游历一下中国的名山大川,读万卷书不成希望能走万里路。8。去年Quebec政策改变了,夏天读书太少领不到钱,为了不给加拿大政府太难过,决定回国四个月节约费用。

今天感觉像刘玄德一样脾肉复生,因此马上去学校健身房登记了一个25块钱的锻炼计划,再回来的地铁里给了一个一只胳膊的自由职业者一块钱的硬币。

一月十八日   可能是今年最冷的一天了

早上七点半去上课,晚上十点半回来,因为Albert大虾肯上传Diablo2,因此特别给他的小题目安排在puzzle里面,好久没有出题目了,这个题目的水平是友情赞助。

写了一个简单的二进制表示法,结果在unsigned int这里被unix困扰了半天,才想明白atoi本身返回的signed int,因此,我无论如何没有办法从命令行参数传入最大的unsigned int,即0xffffffff。

一月二十一日   晴朗

I cannot observe the strange behaviour of "readlink" again.

一月二十三日   阳光普照

很久没有接受过这样的编程挑战了,comp444的第一个作业出来了,据说还是比较简单的,因为每一个小的功能都是简单的系统命令的应用,但是把他们集合起来就是一个小工程了,我为了系统地解决问题,尝试着模拟实现c-library里面高级的带buffer的文件读写函数,否则,全部在系统命令上执行代码太长乐,对于搜索关键字,我又想像写scanner那样定义一个DFA。不过昨天起床起得太早了,最后再debug的时候经常睡着了。没办法只好去理发,下午去健身房,晚上炖了一锅牛肉汤,本来买的是做酱牛肉的牛肉,结果又不自觉地改成了炖牛肉,实际上我还是不知道怎么做酱牛肉。

一月二十四日   老天爷不经意间就又开始下雪了

在Linux下调试指针错误实在是一种痛苦的经历。我不知道是否会有人像我这样为了五分钟的减少去另外划一个小时的工作。当然,这种五分钟的提高时以后每一次都会减少的,这就是系统程序员的习惯吧?我居然已经自封为系统程序员了,不过本人专业的方向就是系统软件。(还是软件系统?这个问题我两年也没有搞清楚。)花了一个多上午写了一个简单的动态数组,这种东西我已经写了不下三四次了,没有什么难度的东西了。

一月三十日  赶快做个备份,我差一点把自己的源文件给改掉了

comp444的作业还是有一点的难度了。还有一个有趣的化简DFA的算法

二月三日  晴朗

这两天太忙了,好几个作业要赶着交,同时有两个期中考试。不破不立难道不对吗?

我在concordia的悲惨生活。

二月七日  阴天

学习不忙的结果就是看了不少的电影。《亚历山大大帝》看完后再回过头来看《discovery》的版本,你会觉得这个电影导演实在是不怎么样,基本就是以纪录片左脚本来拍摄的,剧情散乱主体模糊,似乎为一想告诉你的就是亚历山大之所以建立了不世的功勋完全是因为他的杀父嫌疑让他不敢返回马其顿,因此成就了他闯荡天涯的成就,和《Troy》一样又是一个双性恋英雄的征服历史,这似乎是当前北美社会的有一种思想潮流,就是同性恋被社会的正式承认,打开电视,翻开报纸,铺天盖地的是关于同性恋结婚的争论,这一点有一点点甚嚣尘上,的确,我们这个社会发展到这个阶段自然繁殖已经不再是家庭的主要职能,这一点当然应该在社会结构上得到反映,这不奇怪。另外几部老片子可以说是比中国电影还要幼稚一些,比如通灵术披上计算机的科学外衣,让我觉得这是对机器的亵渎。温室效应被归咎于外星人的阴谋,让我想起了《Dr.Strangle Love》里面那个臆想狂将军的经典自述:How can I sit back and allow communist's subversion, communist's conversion and international communism conspiracy to contaminate our precious bodily fluid?  So, 这位将军决定反击,派出了他麾下的整个北约组织的所有战略轰炸机去消灭commies,结果当然就是突然间,“这个世界清静了”,借用一下我一向认为很naive的中国新生代所崇拜的经典语句。这种冷战情节在众多的科幻电影里或多或少的有所反映,在《I married an alien monster》里面我已经说过,地球成为外星人与其土著居民,就是我们地球人了,争夺的目标,通过地球人的领袖种族,即美丽坚,得卓越斗争我们地球人获得了又一次的解放,这正是布什在他的战争檄文中的思想一样:让民主自由与基督之光传遍异教徒的世界。外星人入侵的方式有一点大同小异,不外是披上我们人类的画皮混杂在我们中间并且窃取重要的职位,比如想象力丰富的可能会怀疑全球首富是不是外星人?“它”们左右我们社会的发展,垄断我们的资源等等。另一类科幻片似乎总是在担忧我们的未来,比如我们这个如蝗虫般贪婪的种族在短短的一两个世纪内就用尽了地球几千万年积攒的化石能源,有一部电影用类似于George Orwell的《1984》似的阴暗色调描绘了人类在未来与饥饿作斗争的悲惨生活,那时候,我们连代用食品都耗尽了只好开始使用直接从尸体进行简单转化的食品,虽然我觉得我们每天吃的动物尸体和我们自身的尸体在组织细胞这一层没有本质的区别,可是,电影中的主人公和大多数的观众一样认为这是一场悲剧,至少难以下咽。我想列举的这些的目的是,大多数国人只看到少数好莱坞创造了票房纪录的电影,然后对比国产电影从而得出国产电影一无是处的结论,实际上好莱坞每年拍的片子不计其数(对我来说就是看不过来,当然我看的都是几十年前的老片子,我没有钱去装新电影的cable),不乏刚从电影学院毕业的小儿科。

关于miss sunny的问题,我想了很久还是只开了个头,昨天承蒙胡大虾盛情邀请我去YMCA去健身,去的路上想到了一个dynamic context的问题,就是我们在讨论的集合是一个动态增长的过程,比如我们不断发现原有状态的组合成的新的状态,这样我们原有的状态的集合运算可能就要修正,比如,union, intersection, minus。可是怎么解决呢,用类似动态数组的方式更新context必须有一个参数就是当前的context的范围,这仅仅是一个编程的想法还是一个更general的思想?YMCA的设备实在是太好了,相比之下Concordia得可怜的gym好像caveman活动身体的石头墩子。

二月八日  今天据说是农历新年

过不过年对我们加拿大的劳动人民来说有什么区别呢?在地铁上,汽车上想啊想,突然明白我昨天想得不对,根本不用什么动态的context。实际上,用一个bitset来表达组合就可以了,这个可以看作是每个状态的ID,并不一定要把bitset和它恰好能够表达的二进制数字联系起来。不过,我还是不太愿意动手去写,一则越来越懒,二则还是有些问题觉得不妥,是什么也说不清。

How to convince myself that the parent and child process are sharing the same file status table?

二月九日  今天已经是新年了?

总参作训处机要科《绝密:台海作战的方向在东方》

二月十日    又下大雪了

有一部老片子我推荐你看,英文名字《Ben-hur》我不知道中文怎么翻译,这也是主人公的名字,它是公元一世纪,(应该是公元前一世纪吧?因为其中也穿插着基督受难,总之是和基督同时代的故事。)以色列的一个贵族,因为布满罗马帝国的统治,和与自己从小亲如手足的罗马执政官发生了种种恩恩怨怨,类似于《基督山伯爵》的风格,颇有传奇的色彩,其中罗马帝国的辉煌表现得淋漓尽致,虽然是五十年代拍的老片子不可能如今天的好莱坞用电脑作出宏伟的战争场景,可是对于人物性格的刻画,尤其是种种细微的细节描写可以说是登峰造极。这是一个信念与信仰的故事,同时也是一个仇恨与宽恕的史诗,是一个奇迹与传奇的画卷,也是一个描绘着希望与绝望的走马灯。我觉得比我最近看的《troy》与《亚历山大》强多了,不愧是11项奥斯卡奖的获奖者。

二月十二日  雪停了窗外一片银白,今天计划包饺子

关于Linux里面的signal,老师在上课演示的时候出现了一个奇怪的现象,当我再次重新做的时候怎么也没有了,不知道是不是因为solaris和Linux不同的原因,实际上我也不知道orchid到底是什么系统,也许是solaris吧?反正sunset.cs大家都知道是unix,alamanni.encs 是linux同样的代码编译运行都不一样,甚至不能编译,这就是unix及其变种的最大优点和缺点,优点是各自不兼容软硬件厂商可以多赚一份钱,市场互不干涉。缺点就是各自不兼容软硬件厂商可以多赚一份钱,市场互不干涉!我没有打错字,现在也没有睡觉,我说的意思就是一件事对某些人是优点,对另一些人就是缺点,比如消费者和生产者。在声明函数指针的时候,要特别小心,尤其是他的返回值也是一个函数的话。又花了两个多小时才成功声明了一个函数指针类型,这个函数指针的返回类型是一个函数,同时他的参数里面也有一个函数指针。我承认我对C的语法,(就是编译器用的语法)感到很困惑,当你声明的函数指针类型的返回类型是一个函数的时候,这个返回类型你要写在哪里?比如能够这样写吗?typedef void(*)(int) (*MyType)();当然不行,因为写高级语言的时候习惯了类型在前,可是遇到函数就不行了,他只认得嵌套的格式,可是即使是你写了嵌套的格式,在类型声明的时候,编译器认为你在声明函数指针变量而不是类型声明:typedef void((*MyType)(int))(int); 编译器总是报错说 error: `MyType' declared as function returning a function,我对于此百思不得其解,也许这是编译器的一个极限,最后我只能分步骤进行typedef,结果就是typedef void (*HandleType)(int);

typedef HandleType (*FuncPtr1)(int, HandleType);这个问题实在是难以理解,或许我哪里错了?有那位大虾可以指教我一下?另一个很有意思的小的结果就是,我这个简单的对于signal函数的想象试验让我看到了数组插入的另一种代码的表示,这个实在是小冬冬了。

哈哈,我终于算是明白了一点,看,typedef void (*((*MyType)(int, void(*)(int)) ) )(int);
这样就可以了,因为再C里面括号不像在C++里面那么随意,也就是说C里面的类型检查也许非常的强,从另一个角度讲就是不那么灵活,对于程序员来说要困难一些,我想应该是这样的首先,你要告诉编译器返回类型void(*)(int),注意(*)对编译器来说就是函数指针的意思,然后你要把你的整个定义用括号包起来,同时里面也是有函数指针的,第一个就是你的类型MyType,所以,你也要用挂号(*MyType)让编译器知道这是一个函数指针类型,其次是参数这个就比较简单了,在C里面括号的应用一定要小心小心再小心!!!我想这两个是完全不同的东西:typedef void*(MyType)(int);   typedef void (*MyType)(int);

看下面的例子:typedef void* (myType1)(int);       typedef void (*myType2)(int);

请注意,这两个声明紧紧差别在括号的位置,意义是天差地别。一个是声明了一个函数(注意不是函数指针类型)返回类型是void*,另一个是声明了函数指针没有返回值。

怎么用呢?比如我们在声明两个函数:void handler3(int num);    void* test(int num);
myType1* p1;
myType2 p2;

p2=handler3;
p2(4);
p1=&test;
*p1(5);

这里是两个函数的实现和运行结果:

void* test(int num)
{
printf("test return void* and num=%d\n", num);
return NULL;
}
void handler3(int num)
{
printf("This is handler 3 and handling %d\n", num);
}
 

[qingz_hu@alamanni ~/mywork] % ./funcptr.exe
This is handler 3 and handling 4
test return void* and num=5
这个例子说明了括号的重要,我要牢记在心。

二月十四日  无雪

我把comp444的问题简单整理了一下,这门课非常的好。关于library的地址空间我和老师有不同的意见。

二月十五日   阴晴?

今天我累死了,从早上七点半上学回到家都十点半多了,最后Hina给我单独辅导了将近两个小时,我都快饿晕了,两眼看着汇编都在冒金星。非常感谢这个曾经教过我的老师,我对他的看法也彻底改变了,他确实是一个不错的老师,他就像他自己说得他痛恨让学生fail,或者drop。如果不是他这样一步一步把一个高级语言的loop拆解成汇编然后再重组,我是不可能理解并行处理是这样依靠loop unrolling来实现的,其中的data dependence依靠冲命名寄存器被去除了,依靠重组指令,我们把相互依赖的指令分到不同的组里面,依靠加长循环体我们减少了跳转的指令个数,最后我终于学到了一点基本的依靠软件实现pipelining的概念。下午在实验室泡了一个下午,明白了几个问题,sigsuspense实际上是把block和sleep结合成一个atomic的syscall。SIGKILL,SIGSTOP是两个不可以BLOCK也不可以重新设定signal handler的信号。passwd是一个程序可以访问passwd文件和shadow文件去改变和查询密码,正因为如此,他的setuid bit必须设定否则别的用户没有办法执行它,因为passwd,shadow文件时root用户创建的,游人可以在一个root级别的shell script执行的时候把她中断,从而取得root的用户权限。login是直接从init process fork出来的子进程,用户登陆成功以后,由login process用fork, exec创建一个用户默认的shell,这个信息当然是从passwd文件独到的。

二月十八日   风雪交加

今天是春假前的最后一天,下午做完化学实验和同组的欧亚同学去吃越南河粉。回来后玩了一会儿Grogono教授的3D动画库demo。真是好神奇啊,夏天我一定要好好玩一玩动画。闲下来就看看《Noting Hill》,我想一个人的思想实在是难以捉摸的一个东西,我现在很难想象我当时为什么会去买这部电影,当然,这种浪漫轻松的东西始终是让人快乐的。早上玩了一下signal,我认为在signal的handler里面如果睡着了的话,i.e. pause(),你永远不会再醒过来。不熟悉linux/unix的读者一定会以为我有再打什么诳语,其实,很简单的。看DVD时候想起了我在TAV里面从那对夫妇身上学到的一点点东西,丈夫教了我一句法语:C'est la vie,妻子教了我一句英语:everyone can contribute one word。

二月二十三日   挺冷的,有零下二十几度吧?

据说今天是元宵节,晚上去春明家吃火锅,吃到了黑芝麻馅的元宵,真好吃。席间发现春明同学理论水平就是比我高,比如听到他说要批判妄自菲薄自我的“历史虚无主义”倾向,以及所谓成王败寇的“社会达尔文主义”,这些名词我都是第一次听说,很有意思,看来读书与不读书还是有区别的。今天,在去吃饭的路上想明白了一个简单的道理:Linux的信号最好适用于两两之间的简单通讯,而且最好是用于单向,想明白这么个简单的道理,就知道我当初的设想有些是不妥的,我打算明天再改。signal里面的问题其实挺多的,这个程序远比我想得复杂,虽然我在第一天就写完了框架,实际上能做到完全的bullet-proof时的安全的同步并不容易。比如这个简单的小问题我就没有完全明白。
whatevergoes.htm#signalCount

二月二十六日 应该不算冷吧?只有零下十几度不到

临辰起来把我的signal程序简单整理总结了一下,这种程序一点也来不得马虎,因为单进程的程序里面如果不准确有时候至多不过是效率低一些,对于初学者来说算不得大错,可是这种多进程,夹杂着信号处理的程序就很不一样了。比如这就是典型的错误:

while (!gameOver)
	   pause();

这种随手写出来的code经不起一两百个进程的检验,很快你就会发现程序跑起来有时候队,有时候不对。computer science最大的好处与最大的坏处就是没有多少偶然性可言,这里的偶然性指的是侥幸,比如远古时代巫师祈雨,有时候祈祷了很多天还不下雨,作为巫师你可以蒙骗渔夫渔妇说龙王不在家,这在英语里面叫做bullshit。你应该明白我所说得好处与坏处是应人而异的。Computer science另一个好处与坏处在于编译器面前人人平等,不论你是多高的权威,多年的经验,你还是要接受编译器的检验,而编译器从某种意义上来说是一个大家公认的标准,你如果实在不愿意遵循,那么你可以选择别的编译器(或者解释器)或者干脆自己写一个,否则你就必须要遵循这种游戏规则。在计算机的世界里很少有所谓的权威经济学家的预言之类天大的笑话,0就是0,1就是1,来不得侥幸。而软件领域里又更是平民化的一个天地,因为,玩硬件的人还可以借助大型设备的堡垒躲过大众的雪亮的眼光而高高在上,软件的威力就在于没有什么真正意义上的垄断,只要你有能力,linux的源代码都在那里,你可以去读啊,当然有多少人去看,我实在不敢说,至少我是懒得看,一则是还没有逼到那个份上,二则功力未到读起来事倍功半。这些应该是我当初尝试看delphi source code得到的唯一的收获,在没有对windows编程甚至于对计算机的基本常识有基本的了解的时候,一个人的信心是最强的,这一点在众多的BBS上你随手就可以看得到。人类对于一无所知的领域要么不屑一顾,要么奉若神明。我也是一样。

二月二十八日   晴天

 
自朱镕基下台之后,中共在经济上再无任何作为,温家宝真是一个家宝,十足的守业奴,作为总理大臣不思进取,不去考虑国计民生的三年乃至十年二十年的大事,整天抓那些鸡毛蒜皮的小事,还表现的一幅忙忙碌碌的样子,国家让这些人治理迟早是要亡掉的。弊政不除,难道还要等到下一任?从来改革的震荡都是难免的,不再经济上有积蓄的时候做,难道要等到上穷水尽的时候?那样往往都是民怨沸腾导致分崩离析的时刻,好的主张,理性的决策也不被渔民百姓所接受的。
李鹏是这样的一个老官吏,今天温家宝又是一个守业奴,毫无主张,毫无远虑,只配在三国游戏里面去治水,除此之外一无所长。一个总理不是一个事务处理的总管理员,(这句话我是从周恩来说的一句话翻译而来的,其实我对这个人并无好感,整天唯唯诺诺,除了处理人事关系上老于世故,圆滑五比以外,不是一个治国的栋梁,当时76年的天安门事件实在是老百姓找不到一个比他更好的寄托希望的对象了,这真是民族的大不幸,可悲。共产党自马上的天下以后,治国之道从来没有入门,任用的人马也只能是从从前的马上将军里面挑选,这也许是毛泽东所忧虑的一件事,从这个意义上讲,文革革掉一批老军头是完全必要的,但是这其中的原委岂能和黎民百姓明说?)不然的话,总理这个位置岂不是人人可以当得了?不一定要自己对所有的政策都有远见,当应该自己对问题要有远见,对问题的解决方案的可行性有远见,像今天中国这样的发展模式和现状,我记得我在80年代看《参考消息》时候就在日本的经济学家的预测里面找到了,难道今天中国的总理不应当为十年后,二十年后的中国做准备?要么就是不知道怎么办,要么就是人为十年后,二十年后的中国是不可预测的,后一种情况是极其可怕的,因为,不可预测的种种情况里面有一种是这个主体已经不复存在了。
今天是交作业的最后一天,实在没有办法只好开始读书,讲老实话我对硬件实现部分从来就不是很热心,一则非常的繁琐,往往熟知细节的碌碌之辈可以号称专家,真是聪明人被傻瓜骗,我不是说我是聪明人,可是我也能明白一个傻瓜出的谜语可以骗到一箩筐的聪明人的道理;二则干这种工作的人都是铮银子的人,我犯不着学这些,不过呢,看着看这也明白了不少东西,当然我能看明白的书大部分都是我原来就大概明白的,我基本上看不明白我原本就一点不懂得书,这一点我早就知道,可是就是不明白为什么?这就是我不喜欢读书的原因:先入为主。既然我都大概明白了,我还看书干什么?既然我不明白的看书也还是不明白,那又何必看书?真是一个逻辑的悖论。

三月三日    阳光无比灿烂以至于有吹面不寒杨柳风的感觉

Some discoveries about pipe.

有时候知觉最不可靠,有时候知觉比感觉来的正确。英文里面的intuition我不知道是否能够对应成中文的直觉,但是,总的来说贬义的成分多些吧,今天上可笑的化学课,我突然明白了以前中学读的课外书里面的关于相对论的解释,的确“尺缩钟慢”这些世俗的对于相对论的理解并不能说明大多数人真正能够认识到其中的本质,我想我是明白了其中的本来意义,当时看书所有的道理都似乎看明白了,可是最后还是不理解,不过当时的记忆力很好,我现在还能记得大概。其实说白了很简单,其中的道理甚至和三棱透镜能够析出彩虹一样的简单,只不过我并没有再多想一层。在回答光为什么会弯曲之前如果你能够像明白什么是直线,人是怎样认定直线的,你也许就明白了多半。在回答时间是否会真的变慢之前,现自己问自己我们怎么知道时间的,也许你又可以明白大半了,我现在非常深的体会到人是多么的先入为主,多么的想当然,而这种能力既是人在大脑运算速度远不及计算机的情况下显得比电脑聪明的主要原因,又是丧失大量发现与认识世界本来面目的机会的最大祸根。客观世界从来不懂什么叫直线,人看到根据经验自己认定的最短路径便成了直线。客观世界本无时间,人认定看到的就是即时发生的,便以此认定了什么叫同时。还要在解释吗?

三月四日 天还没亮

昨天关于相对论的胡言乱语你可以忽略不计,我想这就是科学,不管你头脑中的信念有多么令人信服,一旦落到纸上,经不起一步步的推导就只能是错的。我并不是说我想得全都是错的,只是有些细节不让我相信,好像我的直觉是多普勒效应吧。其实我更想说的是中国文化的糟粕就在于不求甚解,或者说无法求甚解,翻开中国古书从来讲的都是空泛的理论概念,个人想法,最好的贴近实际的也不过是记录宗师言行,或者游记,至少我接触的就是这些,在中国纸上的符号推理一直没有诞生过,这或许和中国使用象形文字有关,如果是真的,中华文化的糟粕看来就是象形文字了,过于费事费时的文字书写抑制了人们符号计算(symbol computation)的欲望,以至于中国人思维从来做不到严密与精细。关于象形文字与拼音文字的优劣的讨论,我想应该是由一个定论的,从语言发展史上看,拼音文字是发展的较高阶段,因为他更抽象,象形文字时期发展的一个早期阶段,根据这一点,中华文化始终没有走出进一步抽象的文字发展阶段,同时由于周围都是发展更为落后的文化,以至于无从引进更先进的文字,结果导致近代科学的萌芽至今都很难在中国落叶生根。

SIGPIPE is necessary.

三月五日  阳光很好的

SIGPIPE is only available for good-habited programmer.

GDB is magic!

Dr. Probst确实可以是一个很好的哲学家,我读了他的一点讲义,觉得他看问题很有高屋建瓴的味道,我以前对他抬不尊敬了,好的教授一般是不屑于编程的,我真是很后悔,在毕业前我一定要写信去向他道歉。实际上当我重新读我当时写得email问的问题,当阅读速度是60words/min的正常浏览速度下,我根本不可能明白我自己的问题,而我现在一点也不对教授当时的一般性概念性的解释有什么不满的:人不可能如编译器那样的速度理解这种多进程的问题,这太难了!更何况假如我初在他的位置每天不知道有多少学生写来错误百出的愚蠢问题,我会非常仔细地理解每一个错误吗?我当时太肤浅了。因此,我花了一些时间把字里行间不尊敬的字眼删去了。

三月六日   阴天

昨天晚上去看了一场电影《blade--trinity》花了一个dollar。总的来说还算值得吧?不过,marvel这个公司拍的电影过于追求所谓的cool以便迎合年龄层在10-30岁的观众,这个阶层的观众主要看你的画面是否绚丽,动作服饰是否流行个性,杀人是否动作优美并且有所谓的语言幽默的特点,当然对他们来说的幽默我常常不知所云,这个年龄的语言哪怕是中文我都会费解别说是英文了,我相信他们也不大喜欢我所欣赏的幽默吧?在去的路上,我和小温侯讨论了gdb的问题,其中一个想法就是gdb能够跟踪是因为源代码放在可知性文件里面了,试验了一下果然是的,这样无论原码是汇编码还是c代码,理论上gdb都可以去跟踪,即便你不使用gdb编译的,这就解释了为什么DDD是汇编器也是调用gdb来跟踪的原因。

昨晚和早上一直在学习怎样使用cvs,第一,在.cshrc文件里面加入路径参数setenv CVSROOT yourcvsrootdir。第二,转到你要import的代码目录cvs import  dir-in-cvs myname releasename。第三,使用的时候cvs checkout myname。目前就学到这里。

三月七日   纷纷扬扬的下起了雪

今天看了一段老江当初在香港答记者问的录像,我简直无地自容,一个飞扬跋扈的小人,一个窜上跳下的小丑,真是难以想象一个大国之君竟如此的没有气度修养,不知不觉我们大家也都学会了他的口头禅,“你们太young了,too simple,sometimes naive。”让我总是想起来围城里面的张买办说的夹杂着英语的汉语,这每句话里面的英文字仿佛牙缝里面的肉屑,并非必要只是说明吃过肉向人们展示而已。春秋战国时期赵国国君在于强秦会面的时候受不了秦王的淫威被迫给秦王弹琴(就是鼓瑟了),蔺相如都会认为是奇耻大辱不惜血溅三尺逼秦王为赵王击缶以给赵国找回尊严,可是,当今我们这位皇上居然在出访的时候主动又唱又跳,为人弹钢琴,搔首弄姿,让十几亿人民羞愧难当。就冲着一点,我决定在回国前申请放弃中国国籍加入加拿大公民,当然我知道这是个借口了。哈哈。。。

晚上又重新看了一遍在国内的禁片《活着》,原来我一向不喜欢巩俐,但这部片子冲这葛优的面子,就对她肯定一次吧。我很难想象这样的片子居然会被禁止发行,共产党看来是有亡国之兆了,从头到尾我没有看到一个坏人,也没有听到一句主人公抱怨社会,诅咒共产党的话,我甚至可以深深感受到主人公发自内心深处感谢新社会的深沉的声音:“一个普通小老百姓唯一的要求仅仅是要活着。”也许审查的官员认为这种要求对于普通老百姓来说在解放三十年间是一种过于奢侈的要求?

三月八日 阴天

在命令行里可以调用bash shell:sh -c "ls -l"。不过我想不出来有什么好处。

我总是犯同样的错误!经过dup2使得pipe的一个write端指向STDOUT_FILENO之后理论上说不论我调用write或者使file library德fputs之类应该得到同样的结果,对吧?可是我总是看不到预期的书橱,因此我开始怀疑这怀疑那,还写帖子去问老师,结果最后发现又是老毛病:忘了fflush(stdout)。这个问题我在看书上的例子的时候就注意到了,可是结果还是又让我花了大半天跟踪怀疑!!!要记住了!!!

今天终于大致明白怎样用cvs了,总之我总是出错的原因很有可能是程序本身的问题,我应当另换一个目录否则会有冲突。1。CVSROOT下的每一个目录都被当作使MODULE, 2。export主要是为了取得一个干净的版本,否则应该要用update。3。commit和diff都可以带一个文件名参数,其中版本号参数是-r1.2,4。如果要取得某一个版本用update -r1.2。这就够用了吧?加一个文件的时候仅要add还要commit。困死了要察看的话就用log命令。

三月九日  天晴

Concordia的学生会打算相应其他大学的行动来罢课,有那么几十个学生聚集在教学楼每口示威,大街的两头部署了警察和救护车,真是好笑。我买了不到三个月的皮鞋就被大街上的盐水腐蚀的鞋底破了,Wal-mart的中国造的鞋以后是坚决不买了,一定要想办法支撑到五月回国。

关于学英语的一点体会。

三月十三日   雪又停了

昨天我们又一次包了水饺,我们大家深深地感受到包饺子是一项费时费力的重体力活,包饺子累,吃的时候也累,最后大家都吃得累趴下了。虽然回国没有多少可以期待的,可是就如同一个人的期望一样,本来无所谓有,无所谓无,想得多了一些,慢慢地自己就认为这是一种期望了。常常地想我来加拿大究竟有什么收获,呆在这个北方的冰雪之地有三年了,究竟意义是什么?思想上的变化也许是最大的,生活上的改变何尝不是很大,人生的价值取向应该也是有所改变吧?现在在经济上可以说是一贫如洗,不过,心灵的深处也需得到了从未有过的安宁。明白了很多很多,这个收获应该是远远大于任何的金钱所能代表的。语言是思想的外壳,我想我现在也和从前的我使用两种不同的语言了吧?那么,我从前所交往的人群应该是使用和我当时一样的或者兼容的语言,那么我现在使用另一种语言的话,和从前的人群是否会有交流的困难?应该吧?有时候想到《围城》里的方鸿渐 ,他号称游学数年,“兴趣颇广,全无心得”,我虽然至今连一个最低的穴位也还没有完成,但自认为自己“兴趣颇广,小有心得”,算是对得起自己的了。唯一美中不足的是,方鸿渐回国的路上有鲍小姐和苏小姐的艳遇,我想我唯一可以预见到的就是在十二个小时的飞行里的一本《编译器设计》的陪伴。

Michael看人入木三分,我还不如他了解我自己。我是否应该患不己知?

三月十六日 阳光灿烂,大雪纷飞,别以为我生病了说胡话,这就是蒙特利尔

对于艺术确实是一个仁者见仁,智者见智的主题,我想起了我的favourite TV
show<Red Green Show>里面主人公Uncle Red的名言,大意就是如果艺术作品是连uncle
Red自己都可以做得出来的话,那绝对不是什么艺术。同样,这一领域之所以能有大师
的作品就在于你能作出不是任何人都能做出来的冬冬。
我没有看过那部片子,并且对那一类题材不是很有兴趣。你上一次问我读些什么东西,
我只能记得当时读得比较多的是<times><news week>,对于当时教学专用的外语片里
面,我只喜欢动作片,台词太多了我就要睡觉,比如《out of Africa》,《thorn
bird》我觉得索然无味的只想睡觉,而系里面的那帮女生看的都是津津有味。其实,读
什么都是增加修养,但是如果要速成提高口语听说能力的话,有一个捷径就是读电影脚
本,然后在观摩,再读,一些经典片子可以这样反复。不过,最主要的是要有兴趣。

三月十七日   有小雪

今天被同学逼着学了六个小时的统计因为明天要考试了,晚饭就吃了《围城》里所说的“本位文化三明治”,即面包夹酱牛肉。晚上借了一篇《天下无贼》来看,感觉是冯小刚在艺术的领域越走越低,在娱乐的道路上越走越宽。早上在地铁里面一直在捉摸3CNF的一个intuitive的算法,我现在经常幻想一些明知不可能的事情,不过正如Dr.Optrany说的,NP-Complete的问题虽然不可能有polynomial的解法,却可以有近似的算法。听化学科将原子结构非常得无聊因为我总是觉得化学家再desperately试图用初等数学解释一个概率论的问题,比如我总是认为电子云是不同的distribution的体现,而不是什么能量轨道的概念,用这个方法来叫中学生当然可以,不过实在是一种错误。系统软件老师讲到的一个conditional variable来实现的同步问题,我认为错了,一直想做试验,只好明天了。

三月十八日  阳光灿烂

I really don't want to treat this synchronization-revisit as some new work for me.

三月二十三日    阳光躲在薄薄的白云后面好像隔着毛玻璃

朱春明同学号称又要搬家了,这样他可以创造在半年内搬家三次的纪录,正好成为现代版的孟母三迁,原因也是很类似的,因为学习的环境不好,看来该同学很有好古之风,希望他在加拿大这里继续发扬古人好学的“凿壁映雪”刻苦学习精神,这里冬天雪都化不了,因此不用专门等到大雪纷飞的夜晚才读书,每天晚上都可以搬一张小板凳到院子里去“应学”,同时加拿大电费便宜,邻居家的灯大都彻夜开着,如果没有随便去街上那家商店去凿个懂就可以“凿壁偷光”了。哈哈这当然都是开玩笑了,实际上我发现我其实是在模仿一个人,这个人就是《围城》里的方鸿渐的老爹,此人写日记纯粹是文字狂,总是借现实的事件来映衬想象中的自我。

三月二十四日  阳光挺好

昨天,我和朱春明同学去足球场边上跑步,这是整个冬天里来我第一次在户外跑步,制钱只能在健身房的跑步机或者自行车上偶尔锻炼一下,春明同学还像以往一样跑了没有多远就停下来说,“你先撤,我殿后掩护。”我只好说,“你要挺住,我带着党的重要文件去找党组织,回头再来营救你。”

看了一部反映美国二战中在德军战俘营里的斗争故事,这和国内的类似题材有着强烈的反差。首先,德军的战俘营比当时中国的普通军营的生活也许都要好一些,其中战俘得到的人道主义待遇远远好过国民党军队或共产党军队,至于说日本人简直就是野蛮人都不如了。在德军的战俘营里面,美军飞行员建立了形形色色的娱乐设施,如酒吧(食用土豆皮酿造蒸馏而来。),赛马会(用捉到的老鼠替代),风光浏览设施(自制的望远镜观看邻近的俄军女战俘排队洗澡,每人赐20秒钟,门票为一根香烟),战俘们可以收到来自美国家里的邮件,可以了解到家里人的各种信息,比如,有的人的母亲写信来说在纪录电影里面看到德军的战俘营里面有网球场,冬天的时候结冰了可以滑冰。还有的人的妻子写信来说她在家门口发现了一个漂亮的弃婴很是喜欢就把她收养了,并且说她认为他肯定不相信这个漂亮的弃婴长着和她很像的鼻子和眼睛,当然还有很多人受到银行按揭催款的通知书,主要是告诉飞行员每个月他的没有按时付按揭款的房子有多少百分比已经归银行所有了。战俘营里面的德国看守非常和蔼可亲,总是面带笑容,不停地和战俘开玩笑,苦口婆心的劝告战俘不要冒险逃走,因为这样自己会受上级的处分,有两个战俘不相信试图偷跑,警卫没有办法只好按规定用机枪打死了他们,尸体放在泥地上让其他战俘接受教育,就这样德国警卫官丝毫没有生气的意思,并且还答应给每一个牢房一棵圣诞树,就算有人出于淘气,偷偷扔了一棵小石子溅了他一身泥,他也是非常耐心地说服那个人主动站出来承担责任免得大家都站着,丝毫没有打骂或者惩罚的意思。我记得在小时候看的电影里,这种事情的代价可能是好几条人命,日本人则根本不会有这种事情发生,因为,他们从来不打算抓战俘,直接打死了还节省了很多粮食。这期间,战俘们过圣诞节,有留声机,开化妆舞会,装点圣诞树,还不时地有日内瓦的国际观察员来视察并且检查卫生,住宿,还带来很多的牙刷,乒乓球以便美国人玩排球,保龄球之余换换口味,让我感到1944年德国在那么困难的时刻还这样的关心战俘的生活,(要知道当时巴顿的部队都快打到德国了。)甚至超过了今天我们伟大的温总理及各级政府官员关心煤矿工人的生死安危。中西方的差距绝对不是几十年内可以造的起来的高楼大厦的差别。顺便说一下,电影的名字叫《stalag 17》,这里stalag是德语里监狱的意思,很温馨的一部电影。

黄勇给我发了一个关于中国山东大学的几个女人破解了“MD5,SH-1”的报道,我说老实话对于所有中国的科技方面的“突破性”报道从来都是持怀疑态度,至少是姑妄听之而已,实际上我老早就看到过这篇报道,当时只当是清风拂耳,并没有放在心上。承蒙黄勇同学热心推荐,就把我学network时候的老师的讲义又翻了一下,当时老师仅仅是一笔呆过而已,大意是这一类的电子签名属于一种“安全的hash function”,或者叫一次性的hash function,用过linux的人应该也知道其中的密码就是一种一次性加密,即指需要单向加密,不需要解密。具体算法我是看不动,也没有很大的兴趣,因为,基本上电子密码从来都没有理论上不可破解的说法,从来都是和当时的计算机计算能力相比较尔认为不可能计算的。我用google艘了一下,看到了一两篇报道,我的理解是这些中国人也只是把原本2^80的穷举减小到2^69而已,虽然仅仅提高了2000多倍,但是据说已经达到了可以计算的边缘了,如果情况属实这当然是很了不起,不过,这应该也是预料之中的吧?这种电子密码迟早有人会找到捷径不是今天,就是明天,实在不行等着计算机的计算能力提高2000倍,密码自然破解了。

今天抽空把线程作业整理了一下,这个作业在班级某些同学的反复要求下被简化了不少,不过我想对于很少写同步程序的人来说不会非常容易,我感到困难的倒是文件读写的block和non-block问题。总的来说还是比较容易的,哎,作业时越做越容易了。不过关于线程的“睡眠”问题我折腾了半个早上也不知其所以然。

下午又和小朱去跑步,顺便借了《我的野蛮女友》由边看边写编程作业的readme。 相反《手机》这部片子我怎么也不想看下去,看来我是不喜欢太现实的东西了,这部电影可能有一点点太过于赤裸裸了。

三月二十七日  阳光灿烂,我是否应该去和他们爬山?

什么是不可能的任务?尝试3-CNF的问题应该是一种,或者按照那个老教授的说法,除非你因为什么原因被关在加拿大的监狱里面了,实在是无聊透顶了,你可以去尝试这一类问题来了却残生。我应该是属于吃饱了撑的。上个星期想了好几次,一直要完成,总是忘记,作了一半,现在捡起来都快忘了怎么回事了。我也懒得解释,反正没有人明白,包括我自己。

三月二十八日   早上起来天下雨了

把我得无聊的工作稍微的改进了一点。

把我的收藏列了一张表,我自己也有点不相信我在加拿大买了这么多的正版DVD,当然,对很多人来说这点钱不算什么,不过对于一个一日三餐要精打细算的穷人来说,这就不是一个小数目了,至少我觉得很多人不会向我这么傻去买什么正版。这是一种精神上的满足,使我目前仅次于计算机课本的我的最大的财富了。

你知道我最喜欢什么电视节目吗?

三月三十日   温度居然有12度

Why should I specify "O_RDWR" instead of "O_WRONLY"?

写了一个minishell玩一玩

四月二日  阴天

Wild,wild,test.

四月三日  阴有小雨

今天,wawa借给我三部电影DVD,其中一部还不错《Flight of Phoenix》,讲的是一个极端的环境下的人的精神,一群石油工人乘坐飞机飞越沙漠因为找不到石油要面临被裁员的境地,更糟糕的是飞机超载遇到沙尘暴迫降在中国戈壁沙漠上,(知道北京的沙漠化有多么严重了吗?)飞机的无线电坏了,走出沙漠的机会甚至比死等万一有飞机飞过上空的机会还要小,究竟要选择怎样的死法呢?It is too early to give up, and too late to do anything else。因此他们决定听从一个模型飞机设计师的计划用残骸飞机制造一架新飞机,(你会有这种决心和信心吗?当然这个设计师一开始并没有告诉他们。)这部电影当然是有一些特色的了,戈壁滩上杀人的红日是那么的美丽,让大多数没有去过中国的西方人更加坚信中国是一个蛮荒之地,即便在荒无人烟的沙漠也有大群的凶残的强盗。我承认这部电影仅仅比很多初出茅庐的电影学院学艺术的所谓学生导演强一点点而已,这帮只懂得用婴儿象征生命,用鲜血代表暴力的学“艺术”的学生其实是完全没有一点自己的想象力。另一部电影其实也很有意义,因为从一开始你并不知道为什么,这才是有意思的地方,更有意思的是电影的名字和国内那部臭名昭著的电影同名《手机》,因为我一向不喜欢这部电影始终没有耐性把他看完。有意思的事情就是该警察管的事情全都交给了平民,和即将退休的警察,而L.A.其他所有的警察都是杀人绑架的劫匪。而一个毫不相干的青年之所以卷入一场惊心动魄的追杀抢劫飚车行动中仅仅因为他有手机而已,而这个念头似乎人人都有手机,(当然我除外了)而最后坏警察被好警察杀掉也仅仅因为他执行任务没有把手机关掉。(当警察的执勤中一定不要开手机。) 早上有一部好的老电影我因为要去学校和同学做作业错过了,我觉得很好,一个在美国西部蛮荒时代的牙医,一个边看操作手册边拔牙的庸医,一个在一个小镇上呆不过几天就拔错牙被迫搬家的好人,被一个连去公共澡堂洗澡都随身带两把手枪的女杀手看重成为她逃跑的掩护,有意思吧?可惜没看完。(查到这部电影的名字了《The Paleface》)

我常常想我沦落到今天读concordia这样一个臭名昭著的大学真是对我当初不好好读书和现在继续浪费生命的最好的惩罚,不过,想想我当初还在TAV这样的地方呆过三个月,我今天应该珍惜,当然,我再TAV的时候我又用读过的一篇文章安慰我自己,这也是TAV入学考试的英语阅读文章,说的是一个文盲在监狱里面自学成材的故事,这应该是由所用意的,就是一个人在监狱里面值要勤奋都可以学习,何况在TAV,更何况在concordia?我不知道有多少人看到这里会把我臭骂一顿?

四月五日    小雨继续在下

Don't you think Chinese students are actually cheating by assuming they are qualified for studying in English-speaking universities?

四月六日   晴天

The major lesson I learned from this lab4.

四月七日  大晴天

早晨起来非常得无聊,浏览了几片数学方面的名人轶事,看得很有趣,摘抄了给同学,骚扰他们一下。其中一篇是介绍“线性规划”的创始人Dentzig的小故事,让我想起我当时学《算法分析与研究》的教授对“先行规划”非常的嗤之以鼻,认为intellectually shallow,我在日记里面这么写下了,后来peter grogono教授浏览了我的日记,随便问起来,认为不对,他认为dynamic programming其实非常的深奥,我不知道应该怎样评价他,只好说,I am not at liberty for comment. 看到组合学家Conway的生命游戏让我回想起了从前228里面的汇编作业,那真是一段值得回忆的好时光,我总是为自己没有机会写更多的汇编作业感到遗憾,在心底里我也许是想去学工程作一些实用好玩的东西,比如昨天看到engineering的同学做的490的project是一个会弹吉他的电子机械装置,感觉很羡慕,应该是用芯片控制机械弹吉他。可惜我一想到engineering要学一大堆的课程就头晕。读到另一片据说是英国影响最大的数学家的一篇讲演,感到大师和普通大学讲师的天壤之别:大师和讲师的区别在很多中国学生里始终是一个模糊的概念,我总是听到很多人评价一个老师的好坏在于它把一个定理或者问题解释的有多么清晰完整,这固然是对一个大学讲师的基本要求,但是对教授着足够吗?这也是当时我对于我的“操作系统”的老师非常不满的原因,因为,我总觉得他讲的东西有一些子虚乌有的成分,我再windows里面从来没有感受到他说的东西,可是,当我在一步步开始学习linux操作系统的实现机制的过程中,当我再从很大的architecture的角度来看待问题的时候,我开始体会到他的思想。我昨天和我的一个非常自负的朋友聊了两句,发现他的对于unix/linux 与windows操作系统想法,说法,还是和俩仨年前一样,而我已经有很大的改变了,这也许就是学习的过程:当我还没有被暴露很多的问题的时候,我根本不可能理解到一个层次,因为我的认识总是和我接触的客观环境相关的,我从来不太相信有先知先觉的人,至少这样的大师我是没有运气碰到的。

说了一大通还没有说到正题:在文章很多振聋发聩的观点中,有一点我觉得给我收获最多:几何是对世界状态的描述,代数是对事物运动的描述。当然我的陈述不是文章的原话,我想思想是类似的。

无聊了一个早上,只学到了一个东西:make文件里面,如果你不想让你得label与文件重名的话,有一个.PHONEY: possible_file_name,不过据说不是所有的make都支持,我也没有去试过。

四月九日  又是一个好天,不过稍稍冷了一点

google-desktop搜索实在是太可怕了,我随手一查结果找到找到了n多年的尘封的回忆,其中很多也许永远不会被我再发现,如果没有google-desktop的话。谢谢你的推荐,我现在唯一担心的是这么强大的工具,如果被黑客利用的话简直就是灾难,我始终觉得我得电脑被人入侵过,因为不少设置被搞得莫名其妙,同时我也慨叹google技术的可怕,我还是不太明白,这些index存在什么地方,这个文件应该是很大才对?

下午不务正业写了一个模拟弹性碰撞的小程序,主要是为了证明弹性碰撞是可以根据动能和动量守恒定律推算出碰撞后的轨迹的。让我有点吃惊的是好像只有一种交换速度的可能,也就是说两个小球纯粹弹性碰撞之后彼此交换了速度,假定小球质量一样。

四月十日   天气应该不错

早晨起来反思了一下,觉得最近使用人类的语言记录思想大大超过了使用计算机的语言,这个趋势很不好,应当纠正。

重睹历史,究竟是倭寇骚扰中国还是明王朝逆历史潮流而动禁止海上贸易?十六十七世纪是世界航海大发现的时代,也是航海贸易的大发展年代,资本主义的萌芽就是因为航海贸易的发展而催生的,在这样的大历史背景下,腐败无能的明王朝实行禁海政策阻止资本的流动招致资本的报复不是自然而然的吗?资本的代言人就是一些被雇佣的日本浪人,我们现在回过头来看,日本要与中国通商,如果没有中国本国的商人可能吗?就好像走私都有内家,外家一样,能一味地归罪日本吗?假如当时日本与中国的贸易没有被禁止,中国很有可能发展成一个强盛的资本主义国家,我们现在连改革开放都免了,不是更好吗?因此,有必要为倭寇平反,这正如今天走私强迫国营经济加入国际竞争一样的道理。
联系当前国内反日浪潮,我总觉得有些不对,比如,指责日本教科书编的不对,可是我们自己扪心自问,有多少人对中国的历史真正了解?历史并不只是历史学家的宠物,古人研究历史为了“以史为鉴知兴替”,请问我们究竟知道什么兴替了?中国人不知道中国的历史反倒一味的指责日本篡改历史?诚然日本杀中国人多了一些,不过两国交兵并非体育比赛,更何况在当时已经步入世界强国的日本人眼里,中国人和欧洲人当初发现非洲,美洲殖民地时候的土著没有两样,现在有多少人为当初殖民者残杀土著感到内疚?我们现在自然是认为我们给土著带来了现代文明,他们感激涕零还来不及呢。
我并非一门心思只想当汉奸,但是假如当汉奸能够改造这个民族,那么汉奸多一些也是好的。汉奸并不可悲,可悲的是当年在没落清王朝苟延残喘的日子里整天在“天桥”茶馆里坐着天朝大国清秋大梦的八旗遗老遗少,这些人整天开口“爱国”闭口“皇上”,好像很忠心,实际对国家民族一点用都没有,整天就知道吃皇粮,提笼架鸟享用太平,从无忧患意识,只配粉饰太平。

因此,给皇军带路的不一定都是汉奸。

四月十二日   晴天

signal is essentially bitmap and counting won't guarantee for all children's SIGCHLD signal

四月十四日 又是一个大晴天

早上起来读“Computer Architecture”忽然有了一个新发现,那就是阅读pipeline的部分比听差科夫斯基的交响乐有更好的催眠效果,我几乎是看一页书就睡一会儿,半个小时下来也没有看完十页书,过几天要考试了还有几百页艰深难懂的ILP (Instruction Level Parallelism) 要去领会,幸好那个混蛋老师自己也不懂,当然它不懂并不代表他不会出考卷,学习总是有用的。

四月十五日  还是一个大晴天

今天下午考统计,我决定用一早上的时间阅读pipeline,其中包括我每天最宝贵的早晨蹲厕所的十五分钟,这是我读书最专心的时段。应当承认pipeline绝非常人的直觉可以轻易得明白其中的道理,这就不奇怪很多自诩为学过计算机的人(至少是我在这里碰到的)居然对于现代的cpu都是指令级并行处理毫无概念,我读了一会儿才明白data dependence造成的stall可以用forwarding的办法部分解决,核心就是data真正需要仅仅是在alu输入的那一刻,因此,再pipeline的不同stage之间依靠硬件forward data是可以让两个consecutive的有data dependence的指令正常执行,当然,这两个指令是由限制,前提就是第一个不是load/store,因为在MISP架构下,l/s是在第四个stage。其他类型的指令我们再execute结束的时候就可以forward结果到下一个并行的pipelined的指令的ALU的输入里了。((我以前一直没有读过,一直以为并行处理对于data dependency的指令必须要重新schedule,不管是动态还是静态),挂号里面的是原来我写下的,当我慢跑完1公里,吃了一个苹果,冲了一个澡,我才明白我又在痴人说梦,data dependency的指令是不能再schedule的,这是一个ILP想要克服的障碍,到这里我有一点点明白了ILP级的并行和pipeline是完全两个不同层面的东西,好像平面和立体的差别。不由得感叹写学习笔记的好处,据说当年林副主席学习毛主席著作就经常写学习笔记的,我胡说逗你玩。)现在也明白了一般对于branch指令总归要一个clockcycle的stall,在硬件这一层就可以predict,甚至更聪明的办法是加一个branch delay slot,也就是利用这一个stalled clock cycle让他计算一下如果branch不take的话的顺序执行得下一条指令,因为,总归要执行索性先执行,预测错了这一条指令就算白做了没损失,猜对了就好像没有stall一样。不过,对于branch里面有一个细节我想不通,就是用一个npc register来存储pc+4即下一个指令的地址,当branch发生的时候,指令跳转的偏移(offset)是从指令里面decode出来的,为什么要leftshift2,书上说是要变成word,难道是因为immediate只有14bits?另外,target address应该是pc+offset<<2为什么是npc+offset<<2?npc不是已经加过4了吗?这些地方才是让人深切感受到一个教授的重要性,如果这门课是一个好老师来教的话我不至于这么辛苦,以至于要自己体会了二十分钟才理解了datapath和pipeline stage的异同:一个是从数据流的角度看待过程,一个是从时间的角度来分解过程,其实,都是状态机的不同状态,因为state是和时间与空间紧密相联系的。朱春明同学是从学硬件的角度看待这个问题的,“用时钟或者说脉冲来‘推动’状态的更替”,这种理解非常的生动形象,这自然说明了pipeline的不同stage间数据的流转路径的本质--datapath,多么贴切的英文名字。也正因为有了data在不同stage间的流转,才使得并行处理有了可能,这好像是common sense,不过当有人问你历史上曾经出现过一种架构后来为什么消失的原因是什么的时候,你是否能够想到呢?这个架构是采用超长clockcycle,即一个指令周期就是一个clockcycle,他的缺点似乎是显而易见的,1,本来不同的指令执行的时间不会完全一样长,这样很难同步,2,本来很多操作在不同的stage是互不干涉的,硬件可以合并节省开支,比如在IF stage,pc+4需要ALU,再EXE stage也会有可能用到ALU,你就不会专门做两个ALU了,这就是状态区隔导致“硬件”重用。

洗澡的时候幻想有朝一日如果能够有动态的编译器该多好啊?Grammar is just a pattern,compilers in most cases are "predictable-pattern-processor". What if the pattern is unpredictable and we need to add newly-discovered pattern  dynamically into old compiler?

四月十六日  艳阳天

早上继续学习pipeline,没有看几页,就准备为小温同学送行,然后和老张同学去跑步,回来小睡一觉然后去打篮球,晚上练习“溜肝尖”,再次重温《长征》接受革命传统教育,计划明后两天读完pipeline的两个章节。

四月十七日  好天气啊

即便是浮光掠影似的读50页Architecture的书也是累得很。我虽然已经跳过Tamasulos Algorithm地实现细节,忽略branch prediction超过两个bit以上的部分,还是觉得东西太多了,不过收获也是有的:明白了structure hazard的原因,因为,data hazard与data dependency,control hazard与control dependency对应,我以前一直不清楚孤零零的structure hazard与name dependency有什么关系,当然是毫无关系了。structure hazard是硬件资源的冲突引起的,name dependency都不是true data dependency,而reservation station好似renaming register一样自然消除了anti-dependency和output dependency,interlock和exception好似一个data hazard的硬件监控机制用来detect data hazard的。superscalar和VLIW是两个不同方向的解决方案,一个是每次issue不定个数的instruction,另一个是issue固定个数的instruction,节省了检查data hazard的过程,当然这个工作时交给了编译器了。用硬件来schedule往往就是out of order的execution,奔腾III,IV系列都是superscalar(dynamic+speculation)。 这就是一个上午的收获,脑子里棉一团团支离破碎的名次概念外加一个酸痛的脖子和眼睛。

四月十九日   阳光明媚

以前的英语老师是一个中国通,同时也非常的关注中国和亚洲,他对于当前亚洲的政治上的潜在的动荡表达了他自己的观点:一个犹太人的后裔如何看待德国。我也表达了从一个理智的中国人的不同寻常的看法,我这里说的不同寻常是想说我希望能像鲁迅一样解剥中国人的灵魂深处,当然我从来不惧怕被国人辱骂为汉奸,因为我知道我没有能力当汉奸,想卖国你必须得在一个可以决定国家前途的位置上,从这个意义上讲,能有资格叫做汉奸的只有政治局的几个人而已。

四月二十二日  灿烂阳光

花了一早上和半个下午的时间才完成了这么一个小玩意,我开始为自己的头脑担心了,这样一个东西真的复杂到要我连续奋战7个小时吗?我在开始感觉俄的时候,更多的不是欣慰而是一些忧愁。不过还是有一点点收获的,至少我现在认为没有什么更好的办法来解决这种近似chaoes的运动,想想看仅仅10个quantum在一间斗室里面运动,相互之间会碰撞,也会碰墙壁,这类的小程序好像在DOS时代就看到了很多,不知道他们是怎么做的。我现在就等着我在夏天学一些graphic之后再来把结果更好的输出。不写了,稀饭已经煮成了干饭了。

四月二十三日    早上突然下雨了,本来要爬山只好取消了

一个人究竟要多少睡眠时间呢?我现在处于一种低效率的亢奋状态,不感到疲倦但是短期记忆力很低。摸索namespace,比较windows,Linux,比较ansi c++,vc++这的确有些枯燥和无头绪。alamanni上面是用很多的softlink来解决library的版本兼容问题,这样对于程序员来说掩盖了很多幕后的真相,你只知道你在这台服务器上面用gcc,g++变异可以,实际上也许你根本没有用gnu的编译器也不一定。namespace是不是也应该把所有的声明部分都包括进去呢?看起来namespace好像就是一structure或者class一样???你不用extern别人就看不见,这好像更像汇编用得module。今天明白了一个简单的道理,不要用.h的头文件形式,如stream.h,而应该要用<iostream>这样的包装,我虽然刚开始学习c++语言的时候就有人叫我这样,可使用了一年半载之后我慢慢倾向于c的程序员那样关心效率问题,总觉得namespace增加了很多不必要的东西,一加一大堆,现在想一想其实不对,因为那仅仅是编译时候的效率,不一定和运行效率有关,而是用namespace会减少代码的无序问题,就是名字的冲突。没有在不同平台之间编程的经验就不会体会跨平台的优势,我现在对linux的看法和刚开始学习计算机的时候不一样了,会不会以后对Java的看法也会改变呢?但愿不要。

在网上找到了一张表是关于C和C++的头文件的区别的。我有时候开始怀疑离开了google怎样生存,因为现在太多的东西你不用去记忆,不用去存储,甚至我这样保存这张表的必要性都不一定存在,因为你只要google一下就找到了。人还要记忆什么呢?

四月二十五日   也不能寐因为睡得太早了

昨天花了一个早上时间最后成功载Linux下编译了cugl,这是一个Grogono教授自己写得graphic的library。其中,linux下有很多与windows不同的东西,或者说g++与vc++有不少不同的东西。Linux里面引用<dlfcn.h>可以动态加载library,searching strategy是1。A colon-seperated set of directories specified in the environment variable LD_ELF_LIBRARY_PATH。2。The library specified in the file /etc/ld.so..cache. This file is generated by "ldconfig" which lists every library it finds in a directory listed in /etc/ld.so.conf at the time that it is run。3。/usr/lib 4。/lib

我的藏书。 这里我想声明一下鄙人对教科书的态度,我一般拒绝买复印的所谓“书”,我认为你对书的态度直接会反映在你对学习的态度,如果你不对其中的内容在意,书里面的只是一般也会对你不在意,我想大多数人明白我再说什么。因此,基本上只要我能维持吃饭穿衣住宿,我基本上买正版书,当然我也对一本书一百块加币的价钱很心疼,但是,这是一种commitment。因此,我不主张买复印的书,也不主张借书。

Is it semantically reasonable?

四月二十八日 阴天有点冷

我有一些事情总是不明白,比如,我难得洗一次衣服,几乎每次晾衣服天就要下雨而且一下就是好几天,也许老天爷知道我衣服洗得不干净要替我再洗一遍?还有就是我一去图书馆读书就会在那里睡着而且睡得特别香,尤其是Loyala的图书馆睡觉尤其好以至于我一直想搬到那附近去住。今天是在是忍受不了头发的折磨不顾马上就可以回国还是去理发了。一个理发师傅的手艺好坏取决于你能否在理发过程中睡着,每次这样迷糊一会儿都是特别的香,为此我就多给了他一块钱小费。胡大虾昨天批评我最近思想右倾,我完全承认并且告诉他,我这么做就是要给某些人泼泼冷水,为此挨万人骂也是值得的。我的政治感觉是国内的思潮越来越浮躁,越来越左倾,按照主席矫枉必须过正的原则,适当的有一些人右倾是可以抵消一部分左倾思潮的。

五月四日  天阴沉沉的

回到厦门的第二天就花了半个通宵为了证明郑署昭的直觉是错误的,我把我的碰撞小程序小小的改动了一下,并且加注了比较详细地说明

我犯了一个低级错误,李向东关于勾股定理的证明是对的,即一个球静止,碰撞后的夹角必定为90度。但是我其他的结论保持不变,即其他情况不一定是直角。

五月五日   天还是阴的

奋战一碗上写了一个简单的模拟测试程序,这主要是一个模糊查找的简单试验,通过这个小东西,我发现了一个查找定义或者叫做语法上的ambiguity。比如我们字典里面有一个词"shang  hai  shi",那么我们输入模糊淄川"shs"到底应不应该被查找到呢?一种解释是模糊字串是字典里面的每个词的首字母应该被匹配,另一种解释是“sh”被第一个词"shang"部分匹配后剩下的"s"就变成非法的了,因此不能匹配。我想这种ambiguity只能用强制的优先查找来解决,我倾向于后一种因为很好实现。

五月六日   阴晴不定

回来好几天了,俗务不断,国人的传统还是一样:非吃吃喝喝无以交往,所不同的是好像一夜之间人人都有车了。昨天和netwalker聊了聊才明白“shs”这个匹配的例子原本在全拼里面就是一个很好地解决例子,因为汉语拼音里面声母的个数是很有限的,用这个办法可以符合中国用户的习惯,这是一个相当不错的解决方案,但是就语法规则的角度来看,ambiguity并非从定义之初就能够发现或消除,至少说明这类模糊查找的问题定义的语言不是regular的,起码也不是context-free的?下午去买了一身运动装,挑了一款最便宜的耐克鞋,和一身李宁运动衣裤,商店送了一张健身卡,可以去一个月,正好来看一看中国的健身房的设备,但愿不要让我太失望。路上在公交车上听梁咏琪的几首歌让我回想起无数个冰天雪地的夜晚,有人会说那种孤独寂寞是种折磨,可是对我来说熬夜写程序的日子是一个人最幸福的时光:你有一个想法想要和一个智慧个体分享,大多数的同类却不屑于听你絮叨,第一不能理解,第二不感兴趣,唯有电脑是你唯一可以倾诉的对象,不过使用的语言一般是C/C++。回想起我对自己的承诺,我想分部实现我得想法,但是一个dynamic scanner和一个dynamic parser是否是一回事呢?夏天我曾经对德国的miss sunny许愿一定要做一个DFA的化简程序,她不会当真的,我却不能不对自己的承诺当真,究竟应该从哪里入手呢?明天新买的电脑就要送来了,我是否应该首先完成夏天的project?这么多的计划是否能够在厦门这个喧噪的城市里淹没?也许一个人只有在三万英尺的波音767上才能静静地读一读LR(1)的算法?选择SLR(1)还是一部到达LALR?

五月十日  阴风阵阵,挺冷的

折腾了一两个小时就为了能够再Linux下使用USB闪存,步骤是从google上搜索来的。1。在/etc/fstab文件里面加一个栏目:/dev/sdn____mount-directory____auto____noauto,user____0 0

这里"n"代表a,b,c...看你有几个scsi的设备,一般是a,“——”代表“tab”空格,其中auto代表让Linux自动搜索文件系统,noauto代表不要启动的时候就去mount,大概是这样吧?2。然后再命令行mount -v /dev/sda1 /mnt/usb,这个时候你可以用如下命令察看df -h /mnt/usb,请注意sda后面这个1,我为了这个1浪费了快一个小时。

前天想把不合脚的NIKE鞋退掉,结果被借口我穿过不能退,这在加拿大简直是奇怪的事情,我不试一下怎么能知道是否真的喜欢,看来一定要把想法调整回国内的现实,正好想姚波同学说的那样在加拿大住久了人就变傻掉了,由此可以证明他的另一个论断:时下回国的很多人要么是骗子,即能够把善于欺骗的中国人都骗倒的骗子,要么就是原本在国内就是呼风唤雨的人物,其他类型回国按照达尔文的进化论只能被淘汰,因为,中国这个环境还是属于逼迫你进化的环境。

费了半天时间才找到解决glut.h的办法,只有download一个,不知道为什么我得Linux没有自动安装glut.h,libglut.so,我记得我是完全安装的。另外就是学校服务器上没有这样的文件可是照样可以运行编译,真是奇怪!以下是我从google上搜得的安装办法,其实和我想得一样,只是我一直在捉摸学校alamanni上怎么配置的。

1。从这里download http://fidelio.cacs.louisiana.edu/resources/linux/glut.zip

2。揭开zip用unzip,然后用rpm安装package,选项时-i,之后libglut.so.3.7就安装在了/usr/lib下,如果要让g++知道运行,你要么该文件名位libglut.so,要么建立一个软链接。

3。把glut.h拷贝到/usr/include/GL下。

4。编译的时候记得用linking option: -lglut,这比直接用libglut.so.3.7要好,把版本的问题留给系统管理员更好。

一个人的记忆是一件令人苦恼的事情。在我年轻的时候,我常常为失去重温一本小说和重看一部电影而带来的意外的惊喜而苦恼,什么事情都记得一清二楚是一件痛苦的事,因为你失去了选择忘却的权利。现在我经常获得意外发现的乐趣,一部电影我可以反复看而能不断地获得重复发现乐趣,当然这是在我失去了选择记忆的能力以后。我曾经常常说人的记忆是由选择的,现在我只能说人的选择是由记忆来决定的。比如你认为你做了一个你认为正确的选择,实际上很有可能这是你头脑中的记忆在暗地里决定的,你以前就经历过类似的场景,你曾经作出的选择被你下意识的又重复了一遍。对大多数人来说,温故而知新很有可能是你忘记了曾经知道的东西,这个新未必是什么新,对于忘却的记忆来说,什么都是新。

我前两天又在我的手提电脑里留下了一个新的烂尾工程,你是否曾经想过模板和继承是一对的矛盾体,好像武侠小说里面两种不可调和的武功,我却试图将两者融合起来,这实在是一个折磨头脑的工作:模板表达了不同事物之间有着某种共通之处,不管什么类型,你要做的步骤都是一致的;继承却表达了相似的事物之间的个性,相通的事物之间在做同一个步骤时候内部的细微的不同。这两者之间看来是矛盾的对立统一,你能够同时使用他们去描述一系列事物的某一个相同而又不同的动作步骤吗?这真是矛盾啊。所以,当我吃饱了没事干的时候做这样的无聊的事,真好像要调和阴阳武功一样,不比登天还难吗?

五月十二日   阴有小雨

我不知道我以前是否已经重复犯过这个错误:realloc输入一个动态分配的地址,返回一个地址,你是不需要自己再次作内存拷贝的,也不保证输入与返回的地址一样。反反复复安装Linux十几次终于明白了一个简单的道理,我如果在安装选项里面选得太多,我的鼠标就会和其它硬件冲突,(很有可能是声卡),因此,我应该选择比较少的选项来安装,但是这样你要自己去/usr/include下建立GL目录,并且拷贝所有的glu.h,gl.h, glx.h...etc。其中Linux是需要一些glux之类的平台特定的头文件,当然你要自己在/usr/lib下建立一些symbolic link区指向真正的动态库,比如libgl.so.3.x,libglu.so.3.x等等。好像很简单,但是很费了不少时间才弄明白,这一个星期我都在干这种简单的勾当。

这几天一直在看日本的《古钿任三郎》,中文大概翻译成《绅士刑警》,觉得作为一个了解日本现代社会的小窗口还是不错的,主人公也是非常的出色,犯罪人基本上都是文化艺术届的精英,也都很有风度,愿赌服输,甚至有些在犯罪的时候都是彬彬有礼,因此这位绅士刑警也很有绅士风度,这样的社会远比中国目前的社会好得多了。(肯定又有很多人朝我吐唾沫了。)

五月十三日  临辰有小雨

虽然不是我所学过的简单的自动机,但是一定是状态机,世界上的事物如果能够用状态机来表示,就可以用计算机来“计算”,因为计算机就是状态机。临辰的时候,我已经大致上明白了这个状态机的表示,我可以安心得吃早饭了,中午回来以后再加上几行代码就可以了。从另一个角度看,这是一个极其简单的“深度优先搜索”的问题,每一个节点只有两个选择而已,很trivial的。

五月十四日  时有小雨

赶在今天的最后一分钟记下心中的怅惘。记得大学的时候曾经看过一本书的书名叫做《理智之年》,莫非我也进入了这个阶段?应该是吧?仿佛还有另一本书的名字叫做《兔子快跑》,我从来没有耐心,也不屑于去读那些写给比我当时年龄大一倍的人看的书,不知不觉中自己已经成为书中的主人公。检讨往事,增添了不少的空空如也的感觉,一颗心常常漂浮在厦门浮躁的空气中。只能套用一句陈词滥调,少年不是愁滋味,为赋新诗强说愁;而今还不到秋高气爽的日子,不能直接说天凉好个秋,心底里常想呐喊一句:让暴风雨快点来吧。

五月十七日    下午天转阴了

俗务缠身这种褒义的说法对我这样一个闲散之人实在是一种莫大的恭维。离开厦门不过短短三年,其实很多地方已经有些陌生了。仿照从前写《一个中国人眼中的加拿大》曾有一种冲动写一两篇《一个加拿大人眼中的中国》,当然我现在还刚刚申请入籍离拿到加籍护照的日子还远着呢,题目好像信用卡里的透支,不过既然要入籍,完全可以先心理上把自己当作外国人来看看中国,诚所谓预支。

回来后第一个耀眼的景观就是女孩子的头发颜色的含金量越来越高了,莫非女人的外貌也是这个商品社会的一个产品,随着物价的攀升成了男人口袋里钞票多寡的指针?我这么刻薄必定会被大多数的女性多者抗议,不过,单单比较一下中国社会和西方大多数社会女权主义的概况就知道,在中国女性是更加赤裸裸的商品化了,她们在和男人一样是社会劳动力的基础上额外添加了社会橱窗的功能。当然,这样做未必有什么坏处,一个人出卖头脑的劳动时间和出卖身体的劳动时间在本质上都符合恩格斯的剩余价值规律。

昨天晚上偶然逛逛外文书店,第一印象是国内图书市场繁荣了,并顺手买了一本“numeric”方面的书,这个方向是我一直感兴趣却没有机会尝试的,学统计的时候老是想自己去实现以下gamma函数,正态分布,这些绝对实在C还未出现以前Fortran就可以做的工作,不过呢没有亲手做一做真是一种终身的遗憾。第二天在此光临,详细一看颇感失望,国内的图书还是这样的散乱,我在汇编语言的柜台找到了全场唯一的一本编译器方面的书,是翻译的,总的还可以,本想买回来,仔细看看就头疼,因为,国内技术书籍的最大问题就是terminology的问题,一个术语的翻译有太多的随意性。我没有在国内读过计算机这么指责有些不负责任,不过像closure翻译成“闭包”是否是由权威性呢?为何不给出英文对照呢?至少国外的任何一本书都有index,凡是出现过的学术专有名词都有索引便于查找对照,中国这方面似乎不太注意,图书是思想的交流,如果我们交流不进行概念的约定,真不知道要交流些什么?难道读者对此没有抗议吗?

五月二十四日    阴

云游一个星期回到厦门,觉得就居住而言,厦门也许稍微好一些,广州深圳的房价太高了,广州应该是类似于上海,目前的高价格主要是为了原来非广州的人口准备的,深圳稍微好一些,平均收入高一些,房价也低了一些,环境也好了不少,但是这是在你有私家车的前提下,相比较而言,深圳的快速车道乘车上下班更像北美的生活方式吧?至少和电视上的画面来比较像是这样。广州的地铁给的印象如果用一个字来形容那就是“冷”。首先,车厢内的色调都是冷色调,主要是采用了太多现代材料的关系,大量的不锈钢和玻璃,给人以冷冰冰的感觉,当然这和当地的气候相适应,毕竟蒙特利尔是一个冰天雪地的世界,暖色调给人的温馨感觉换到了广州那样烈日炎炎的日子里给人的是一身臭汗以外的无奈。其次,冷气开得太足了,我本想地铁在地下属于冬暖夏凉就不用开冷气了,想不到广州的地铁依旧是冷气十足,让我冷得哆嗦。在有就是地铁技术先进,比蒙特利尔几十年前建造的要好得多吧?至少从噪音和平稳的角度来看,由静生冷,在死寂的车厢里上班族一张张毫无表情的面孔上你会感到大都市里人与人之间的冷冰冰的金钱关系,这让我这个过客多少感到有些冷。

花了差不多一天时间才搞定了windows下的编译,原来在Linux可以的现在再windows下有了问题,问题很奇怪,我不能再cugl.h里面加“using namespace std“,必须在主应用程序里面加。真是不可思议。

Half-finished, trivial trial.

五月三十日  大晴天

回国整整一个月,几乎所有的计划都已经落空。1。编译原理只有在三万英尺的高空看了一点;2。openGL只有在刚刚回来的一个星期里在每天最宝贵的上厕所的十五分钟里看了以下;3。MFC下的windows编程刚刚才拿起来看了两个开始的章节;4。自动机的想法还是停留在去广州的火车里时的想法,也许很幼稚所以迟迟懒得动手;5。numeric看来看去不明白,连最简单得newton-raphson求导数的公式也搞不懂;怎么办呢?看来中国实在不是一个静下心来学习的地方,当然身体状况是有些好转吧?心肺的锻炼停留在较短距离的游泳上,上肢力量有所增强,不过,回来后我发现我皮肤对紫外线的抵御明显下降,也许可以看作是barbarian的“四防”能力下降了吧?(没有玩过diablo2的不会明白的。)summer project缓慢稳定地爬行,因为我认为最主要的工作在回国前的一个星期里面已经完成了,至少这是我认为的。教授知道学生在vacation里面干不了多少,尤其我这种想得比做得多的人。

我认为我在加拿大最大的收获仅仅是慢慢地自觉地培养一种科学的思考方法,或者说怀疑主义的思考方法,即开始的时候对无知的领域采取最大限度的抵制与怀疑,这是否能称为“科学的方法”我不知道。对于usb disk的识别上我当时认为朱春明从他同学那里听来的关于电压不足的说法不足为信,因为我的HP毫无这样的问题,自然仅仅是他的compaq的硬件问题。刚回来的时候,我为了连接方便在机箱背后加了一条USB延长线,结果USB闪存可以被Linux安装,USB disk则不行,我不知其所以然,猜想也许mass storage不是SCSI设备吧?现在这些都被部分的否认了,我唯一可以得出的合理的解释就是USB延长线损失了部分电压导致磁盘无法工作。我特地去买了一个带电源的USB Hub来检验发现再windows xp下看起来是这样的,尽管我无法同时接驳两个USB disk.但是在Linux下我的解释不太完美,当然usb disk毫无疑问的是scsi设备,不过,usb hub看样子就不是了,我还不知道怎样mount。去电子城买了一条256M的DDR400内存条,因为原来的是333的内存,只能降频为333,DDR的原理我还不太明白。一条2米长的网线卖3块钱,我想在加拿大就是3块加币了。一个switch卖65块好像和圣诞节时候9块加币的价钱差不多。

六月五日   大晴天

在北京的时候参加了一个面试,使c++的考试题目,其中有一道题目我想错了一点,这个问题以前就已经试验过了:类的destructor为什么要声明位virtual的,问题本身很简单,任何一本面向对象的书里面都有长篇泪读的论述,问题是我当时想到了另一个问题,就是c++里面是靠函数名字来实现成员函数继承与多态的,那么每个类的destructor是没有办法同名的,当时我记得这是我的一个猜想或者在那里读到的,destructor前面那特有的~就是一个不得已的标识符,这样在基类里面将destructor声明为virtual编译器才能自动将所有子类的destructor也当作virtual的。我当时糊涂得把这个不相关的东西也写上去了。总之,想在国内当个程序员看来是没希望了。

北京很热,一是指气候34度,二是指经济,参加的那个所谓“楼宇自动化”技术研讨会上作报告的北京的系统集成商的项目动辄几十万的建筑面积,真是全国都在支援北京的建设啊。奥运会在某种程度上和1936年希特勒上台后在柏林举办的奥运会相似,也是一种政治上的橱窗,国家不惜工本为了提高所谓的国际知名度来换取某种政治上的利益,这些并非普通老百姓所能受益的,假如现在在问一问蒙特利尔的老百姓是否愿意再办一次奥运会我想答案肯定与几十年前不一样,毕竟奥运建设的债务偿还了几十年,轰轰烈烈只有十几天,假如这些场馆交通建设让北京市政府独立承担北京市民会愿意举办这种劳民伤财的奥运工程吗?

六月六日   风和日丽

昨天和刘伟夫妇及其朋友去打羽毛球,流了大约一斤的汗,最后跑步都跑不动了,休息的时候居然碰到彭文学在跑步,这个家伙简直不可想象能够参加马拉松,平常能够跑一二十公里!看来人的潜力总是超过人的想象。后来和李向东一起吃饭感觉我现在对于未来的目标很模糊,晚上和Anthony聊了一会儿天,老朱现在全部改招老外房客了。读nino的文学评论是一种享受,也许女性天生就是一种感性动物,记得以前玩过一个养成的游戏《明星志愿》里面要把一个漂亮可爱的女孩子培养成明星,女孩子有很多的属性值,比如智力,体力,感性等等,通过学习钢琴,打扫卫生,去餐馆或者农场打工都可以提高某一些属性,但是有时候会降低某种属性,我总是玩不好,经常把小女孩逼得读书压力太大而离家出走,或者就是一味为了赚钱而打工最后成为一个体力充沛劳动妇女。人的性情的养成实际上是很难的,在一定的环境下就是有一定的属性值的组合,微调平衡各种属性实在是一种艺术。

早晨看了"algebra"的第一页就看到那个Russell的著名的集合悖论,定义:Godel的集合是由class定义而来的,class有着更加一般化的地位,它是靠二元的逻辑判断来定义的(first-order predicate calculus,二元是我自己加上的因为我认为逻辑之所以为二元就是因为他只有两种情况,是和不是。),所谓class A就是这样一个collection of objects such that everything can be determined if it belongs to this collection. In other words, P(x)=true means x is an element of class A.(我在很多地方看到说这种定义是一种intuitive或者naive的定义,我始终不明白为什么。)c从这个定义来看世界上的万事万物都可以是一个class。集合的定义是这样的,class A is a set if and only if there exists a class B such that A in B.在没有读到这里之前我本来以为集合是最广泛的定义一切的形式,结果发现集合(set)必须要依存于class的定义而存在,并且这个定义中有一个潜在的问题就是它定义了什么是set,却没有定义什么不是set,因此这就为后面的悖论埋下了伏笔。请看russell的悖论:class M={X|X is a set and X not in X} where X not in X代表说X不是X的元素,这个让我想了好一会儿才明白,in或者not in是元素和集合的关系,一个集合一般并不是他自己的一个元素,比如集合“所有的书”的元素是一本本的书,而“所有的书”绝对不和“某一本书”相等,因此,集合“所有的书”并不是他自己的一个元素,理所当然的X not in X是一个很普遍的情况。请注意下面:M不可能是一个集合!反证法:如果M是一个集合,那么M或者属于M或者不属于M。如果M属于M,根据M的定义M就不属于M了;如果M不属于M,同样根据定义M就属于M了。因此,唯一的办法就是M不是一个集合。不是集合的class定义为proper class。刚才的这个逻辑推理真的是让人头脑转了好几个弯啊。先到这里,去吃早饭了。

六月八日    据气象预报是一个大晴天,最高温度29度

浮躁得一塌糊涂!看来不是国内的人浮躁而是大环境的问题,想起了参观“毛主席纪念堂”看到的毛主席的词里面最著名的一句话:“一万年太久,只争朝夕!”当时作为一种豪迈感情的抒发再恰当不过,今天作为国内发展的雄心壮志也很恰当。问题是历史的发展阶段能否跨越?我非常的怀疑。nino常常鼓励我写下各地游历的感想,可是很惭愧,时常觉得如同竹篮打水好似捞过很多剩下的却只是一星半点,如果这一点两点不记录下来,以我得目前的存储空间不消一个月就忘得一干二净。

在宾馆里面看到凤凰卫视里面介绍美国二十世纪初的煤炭工业发展历史,其中有很多家喻户晓的名字,摩根,洛克菲勒,贝尔,不要以为这些都是什么现代工业巨头,当初他们和今天在山西挖煤的私企业主没有什么大的区别,不同的是他们更有钱,更心狠,连当时的美国总统都要让三分。那个时候矿工的生活很苦,一年的工资也不过三百多美金,而且工作时间很长,生命健康没有保障,为了能够增加一点点工资举行罢工,结果这些工业巨头就雇用保镖扛着机关枪向工人的帐篷扫射,这听起来骇人听闻,似乎比今天的中国还要黑暗,不过却都是千真万确的,在不到一个世纪以前的美国所谓的人权也不过是当时的罗斯福总统害怕引起更大的冲突而不得不派联邦军队进驻矿山制止冲突要求劳资双方谈判解决。不过到了二次大战之后,石油成了能源的主角,这些大亨们开始把主要精力放在石油上了,并且对于工人们的不断的增加工资的罢工感到头疼干脆用高度的机械化来代替工人。当时老洛克菲勒对工人的要求非常强硬,他有一个信条就是他是受命于上帝来安排工人们的福祉的,工人们的衣食住行都是由他这样的资本家来提供的,由他来决定矿工的命运是理所当然的。社会是一个社会成员进行物质交换的平台,马克思过分强调了劳动者的付出,今天的中国引进外资又过分地强调了资本的力量,也许找到某种平衡是欧美很多国家尝试了很多年的一个主题思想。

在北京坐了一回公共汽车和地铁,发现北京拥有可能是世界上绝少这样落后的一个地铁设施了,完全用人来卖票,用人来收票,公共汽车上也是如此,基本上和几十年前的中国没有两样。问题就是这样的劳动生产率能够维持一个企业的运行唯一的解释就是北京市政府的扶持,唯一的原因就是这个城市与众不同,不可能有破产与下岗的威胁,经济规律在北京不适用。这是中国的悲哀,是作为十三亿人口的绝大多数的不幸,蒙特利尔的地铁基本上是一个福利事业,不过那是蒙特利尔人用自己的财政举办奥运会的遗产,他们为此还了三十多年的债,加拿大其他城市并不因为蒙特利尔为加拿大举办了奥运会就会对蒙特利尔捐出自己的税金,这完全是每个城市主体的决定,就比如一个村子里面的某户人家摆排场请镇长吃饭,事后这户人家找村里所有人家摊派饭费一样让人气愤,这就是中国的现实,对比加拿大十个省长为了本省从联邦税金的返回比例炒得不可开交甚至要威胁独立(夸张了),中国还是一个封建君主制的国家,大约相当于欧洲国家十五,十六世纪的状况吧?

历史的阶段可以跨越吗?一万年太久?制度的沿革可以朝发夕至吗?制度下的人的演变会吗?我常常想欧洲殖民者的后代经过了多长时间忘记了王权的至高无上?这个问题在中国更加得难以类比,我曾经按照好莱坞老电影里面的景象来对比欧洲北美洲中世纪农民的生活状况,得出的结论是今天中国的农民生活还远远不及当时,这个历史的对比仅仅作为一个参照,能够说明的是中国的现实和欧美还差大约一两个世纪。我知道我的断言有耸人听闻的目的,也有招砖头唾沫的功能,不过见仁见智,姑妄言之,姑妄听之,日后如果有验证自然有人信服。

六月十一日  晴空万里

这两天一直去“都市风”健身中心累得半死,因为第一天流了至少6斤汗水(因为临走前我秤体重少了两公斤,同时我喝了至少1公斤的水,因此,我流汗至少在3公斤。),第二天知道30分钟的“动感单车”我是没有办法完全跟上的,因此,速度自己掌握,最后只流了5斤汗水。我总结了一下我为什么要花七百多块买健身季卡:1。这是一种commitment,人如果不是有所承诺很难认真对待什么事情,尤其这件事情不是很轻松完成的话,花了前去健身中心如同签了一份合同,如果合同不履行总是有所惩戒的。2。当然是健身中心比一般人家里有更加完善的设备,比如我一直对引体向上这个动作很犯憷,再加上我做肩膀有些小毛病更是不愿意进行这个动作的训练了,因为对我太难了。健身中心有一个设备可以让你自己调节重量来完成实在是太好了,循序渐进的训练永远是真理。3。非常重要的一点总是被人么所忽视,那就是专业教练的临场指导,很多人认为锻炼无非就是出大力,流大汗,其实不然,与其自己重复千百万人的盲目摸索不如听一听专家的指导意见。我做仰卧起坐的动作好多年都是错误的,锻炼得仿佛不是腹部而是腰部,这种指导的价值我认为才是去健身中心最有价值的地方。在中国你可以花这么一点钱得到这样的服务,在加拿大是不可想象的。4。锻炼要有一个好的环境和气氛,我始终对中国流行的软绵绵的音乐不太感冒,因为在欧美社会音乐也有其功能性的方面不仅仅是单纯欣赏的功能,在健身房里面有动感的音乐可以调整你的节奏与呼吸,减轻你的疲劳与锻炼的痛苦,这在自己家里比较困难,因为邻居肯定有不同的意见。另一方面,你可以看到健身中心无数的好身材,魅力在运动中有别样的定义,时刻会激励你努力塑造自己的身体,同时旁人的执著对你是最好的鞭策,这就是很多人去健身中心锻炼的一个主要原因。5。一个可以承受的价格才是你正确的选择,一个月两百多块算贵吗?想想看单车教练在台上领着你骑单车30分钟,不停地鼓劲,示范,瑜伽,跆拳道,有氧操等等的专业班,(当然大多数都是被女孩子享用了,)宜人的环境,耐心细致的现场指导,这一切算贵吗?如果是年卡的话一个月还回便宜的只有一百块左右,假如你一个月少在外面吃一顿饭,就可以承受的价格,你会说贵吗?6。健康的投资在一个刚刚从温饱型过渡来的社会里面有很多狭隘畸形的定义,比如在吃上面无所不用其极,其穷奢极欲比古代最腐朽的封建奴隶主时代有过之而无不及,还会耻笑西方人不懂得吃。中国现在所发生的一切在西方社会几十几百年前都曾经经历过,历史的阶段性是不能跳跃的,你可以缩短一个阶段但是基本上不能跨越,这是自然的规律,等到我们的后代在学校里,图书馆里学到现代中国的发展史,他们会用一种怎样的眼光来看待今天的中国人那实在是一件让人难以想象的事,也许读过“阿西莫夫”的科幻小说《他们的乐趣》可以给你一些启发。

六月十四日  气象预报有大雨,但是晴空万里

回到国内实在是人变懒了,大概这一个月基本上没有写什么像样的程序,心里内疚得紧,只好翻翻以前的小东西减轻一点负罪感。这是去北京前一天晚上给lxd改的一个纯c的实现,实在没有什么可说的,凑个数吧。和Monk聊天谈到了围棋,不禁又勾起了我从前的幻想,我对lxd简单谈了我得一些看法:认识是从差异比对产生的,概念也许可以看作是模式认定,我猜想这个过程应该在抽象之后,抽象是在差异比较过程中去粗取精,或者去异取同之后总结出来的模式这样一个过程,所有的关键都集中在比较异同的过程,因为事物是因比较而存在的,人的认识也应该是由比较而产生的,风格过于抽象,可以简单设定伟大的战略,具体战术的选择是为战略服务的,而最简单的设定甚至可以用人的记忆模式来设定,比如,最近的战术战略运用总有着较高的记忆优先等级,或者胜率高的战法总有较高的权值。Monk对围棋软件的批评在于他们分不清急所,总无法正确判断定型的时机点,这也许就是程序中形势判断的根本问题,究竟是否应该用“目数”来决定每一步的价值,这本来是所有程序的似乎必然的选择,但是,人类是否会这样去计算?是否应该用阶段来描述,就如同武功套路中的组合拳,一组动作缺一不可。

六月十六日  天气闷热,没出太阳,据说要下大雨,可是总不下,气象台的人要疯了

以前唯一有印象的莎士比亚剧本里人物对白就是"Denmark is rotten."直译过来就是“丹麦已经堕落”,我总是想把其中的丹麦换成中国,当然我不敢把Hamlet换成我自己,我还是有自知之明的。总之这个社会沉沦到了一个转折点的边缘了,很多人对于明天是既担心有憧憬,希望明天更好些,希望今天能长久。想起昨晚看的一部科幻片《time cop》,这是一个时空旅行成为家常便饭的未来时代,一个特别的精锐部队被赋予了一项前所未有的任务,防止时空旅行者回到过去去改变历史进程,用主角的浓重的中国口音的英语来说就是:I am protecting future by preserving history. 一个社会的传统被粉碎之后所谓社会领导者所意图的新的价值观未被社会成员所接受,于是一个尴尬的时代在中国出现了,从形象上说类似于电影中时空机器的一次操作失误,将时空警察传送到的一个时空坐标上已经有一个存在的人的个体结果两个人的血肉融合成了一个双体怪物,真是惨不忍睹。大多数的东方国家都比较强调保持其固有的传统,如日本韩国东南亚各个国家,唯有中国不太愿意这样做,也许传统束缚人太多,中国需要的更多的是开拓吧?

玩MFC时候发现了class wizard的一个小小的bug,再class下拉菜单里面找不到我定义的所有的class,让我很不爽因为要照猫画虎地跟着书一步一步做不成了,就去找class-wizard的文件,果然找到.clw文件,添加了class的项目就可以了。真是难为visual studio了要把一个c++的程序员傻瓜到vb,java之流太不容易了。

六月十八日 天气有些闷热尽管下了不少的雨

我可能有点感冒了,好像在加拿大三年我都没有生过什么病,回来竟然就生病了,看来他们说得不错,现在回国水土不服,其中的水土有自然的也有社会的。因为有些头脑发热就写一些胡言乱语。这些简单的幻想看似好像是大多数人的天真的幻想,其实不然,你看美国主流社会对一个简单的克隆人的辩论,对人体干细胞的提取的态度就知道,这并非大多数人的意愿,人从生物的本性来说是防卫性的自私的,即本能地对危及自己生存的一切采取抵制的态度,毕竟每个生物的本能就是生存与繁衍,如果有什么新的智慧生命体威胁到人类的地球霸主地位,人类会采取各种手段自卫的,哪怕人类知道从进化论的角度看那是徒劳的,人类还是会亲一切本能阻止新型智慧体的发展。这和自然界即人类社会中任何新型代表先进性的事物的早期命运是一样的,被压制,反抗,再被压制,再反抗,最终取得统治地位。因此,从这个角度来看机器人这种代表先进智慧和效益的智慧体一定会取代人类的统治地位的,而人类也会在很长时间里尽全力来阻止这场革命的发生。

昨天看AI的讲稿,有一个抽象的说法是识别的问题,就是一个函数来代表所有形式的认识过程Y=f(X),Y代表认识的结果,X代表输入,实际上任何的认识过程都可以归结成这么一个抽象的函数,没什么高深的,不过怎样定义X?因为现实中这个X可能有偏差,只能提要能够聪明地忽略一部分差异,也就是抽象的一个过程,或者特征值的识别。但是从生物体的角度来看这个问题似乎有一个最原始的解决方法,既不同个体之间对同一事物的观察在一定条件下是基本一致的,因此,偏差似乎原本就不存在,或者说偏差的产生不是最原始的认识过程的问题,而是对同一事物不同状态的识别的问题。比如一头牛A和B从同一个角度看会有大致一样的映像,但是从不同角度看的时候,A与B要都得出牛的结论则不是偏差的问题,而是抽象识别同一事物不同状态的识别的问题。

Algebra里面开篇讲得最基本的一个关系是equality,这个关系要满足三个属性reflexive, symmetric, transitive。i.e. define '=' as equality 1. reflexive:  a=a is always true ; 2. symmetric: a=b ==> b=a; 3. transitive a=b && b=c ==> a=c; 这个关系是最基本的关系因为生物体本能地实现了。假设生物体有一个buffer可以暂存映像,即Y=f(A)中的Y被存储在buffer中,生物体有一个最基本的元素级别的比对算法,运用与的运算来判断buffer中映像与新映像的异同,当我们再次识别一个映像而这个映像的客体是另一个对象的时候实际上运用了transitive法则,是同一个客体的时候运用了reflexive,其中不知道在什么地方好像都有运用symmetric吧?(最近,我一定使得了重感冒,胡说八道的东西越来越多。比如,我总在捉摸如果算法或者方法可以用数据来表达那么该是一场多么深刻的革命啊?)

六月十九日  阴天

照猫画虎似得重新照做MCSD非常的有感触,在几年前对C/C++一窍不通的时候学这个东西简直就是一个笑话,今天当我自己觉得学了三年的C++自以为小成来学MFC的入门的东西才感觉其中的复杂性,因为怎样设计这么一个系统呢?一个view/document的架构就是一个朴素的思想,message mapping是通信的机制,resource ID是一个识别的方法,这一切都要IDE做到自动化确实要花不少力气,bug是难免的。这也许也是VC++推出后其他的c++编译器销声匿迹的一个原因吧?毕竟这种东西的制作有一点点吃力不讨好,初学者觉得太复杂,高级用户觉得太臃肿,费了很大劲bug还是一大堆,也许很多编译器厂家当初不肯做的一个原因也在于此吧?

六月二十二日   天气预报总说有大雨,且信一回吧?

CCmdUI是一个控制菜单行为的类,比如enable,disable,checked等等,所以在updateCmdUI消息里面做菜单的控制;如果是一个modalless的window那么一定要先创建(create)然后调用ShowWindow传递显示类型参数,创建window的时候可以用一个资源ID指示MFC的模板ID,不过这是因为MFC又替你在类里面重新声明了一遍那个enum的资源ID。这其中的来龙去脉实际上复杂得多,我这才慢慢体会了一点点如今的界面设计程序员是多么的幸福,用Delphi或者VB之类的工具完全掩盖了资源与数据及其code的通信协调的麻烦事。春明同学几年前能够这么简单地看看书就去考试并通过也是难为的一件事,不过那肯定是似懂非懂吧?哈哈。前两天画了一个围棋盘就去干什么别的事情了,今天又想起来了当时应该是觉得用MFC作这样简单的工作太奢侈了吧?可能等我看看简单得OpenGL再来画会更好一些。

回国真是一种堕落,每天就是浪费时间,头脑空空,活的却很幸福的样子,浑然不知天高地远,一晃就是快两个月过去了。可以更深刻地体会鲁迅当初说的回到故乡发现大多数人还像他离开的时候一样说着从前说过的话,做着从前做过的事是什么原因。当然,现在毕竟进步了许多,时代发展快多了,现在我发现周围只有一部分人是如此吧?包括我自己,如果我还是生活在这里的话,也许也是如此。

六月二十四日  昨天看到火车站的所有火车都因为大雨停开了

关于lib文件要再第n次提醒自己,那仅仅是一个dll之类的接口文件,所以,#pragma comment (lib, "mylib.lib")应该是lib文件,不应该是dll,不过这一点我还不是非常确定,但是至少glut32.dll是这样需要在vc98/include下面有一个glut32.lib,同时并不是说有一个glut.h文件就真的有一个glut.dll或者glut.lib,那个好像是永在svg上的吧?这些可能是和平台的实现有关系吧?Linux上面有了一大堆的symbolic link来解决这些名字版本问题,windows上用环境参数。前几天偶然听某某人的一句话竟然猜想destructor能否不用类的名字,理由是“~”是destructor的标志也许编译器不再检查名字,结果是否定的。又看到居然又constructor声明在protected里面的,这好像和所有的c++的教科书相抵触,实际上很简单,因为这个类可能是很多类的基类,设计者不想让除了子类以外的其他人使用这个基类,当然,你可以把他声明成抽象类,不过这样不是也很好吗?

六月二十五日  昨天看到火车站的所有火车都因为大雨停开了,就把票退了

方法用数据来描述是一个遥远的未来。有生之年可以看到影子的是方法的归一,即泛型的方法,不过这是编译器一层的伪装,真正的不依赖类型的统一的方法似乎是没有的,除了继承与多态看上去比较像,因此,还是不能真正的自动生成新方法,那么能不能组合基本的方法呢?也很难的样子,但总是有一点点可能,除非你能够找到所有的“基本”方法,这总是让我想起我得那个猜想,也许所有的方法归根结底就是NP-complete里面讨论的哪些类型的方法。或者这样定义一个方法,某种样式的状态的改变步骤,这个定义非常地intuitive也很无意义,因为其中的所有词汇概念都是未定义的。不管怎样人必须在现阶段帮助IA学习:定义一个基础类定制出一个基本过程的框架,所有的新概念必须实现基础类的过程,当IA学习完成一个层次要上升一个概念层次的时候,用无差别的过程进行运算,运算的好处在于用时间换取决策的即时性,任何聪慧的个体也无非是平时对模式的积累运算的良好掌握者,并非完全的现场快速计算的优势,因此,与其一个高速的深蓝,不如一个良好模式积累的IA。

六月二十八日 天气凉爽,好像是吧?

从广州回来了。去之前和lxd辩论中我总是认为主观和客观之间有一条不可逾越的鸿沟,在主体这一侧一定有一个最原始的假说作为支撑点,否则一切的一切都没有基础。归根到底人类是依靠条件反射和模仿来学习的,所谓条件反射可以解释成大量数据中的重复出现的识别,模仿可以解释成function似的参数替换,也就是书上说的演绎法。学了一个小小的英文:归纳法是induction,演绎法是deduction,一个是从特殊到一般的猜想,一个是从一般到特殊的应用。相比较而言,归纳法应该产生在演绎法之前,并且要比较的困难吧?归纳法能够识别的,演绎法也都可以识别了,有了归纳自然可以运用演绎,所以,核心还是如何归纳?看到“relational database system”才真正明白为什么叫做relational,原来这是一个关系的表达方法,关系的表达可以用图,也可以用表,当然表是可以表达二元关系,图就不限定了?比如,combined primary key有两个fields A,B组成,那么关系可以看作是节点间的路径,那么A,B间的局部图应该是一个bipartite。看到Henry的宝贝儿子的学习过程,我们一致的结论是儿童可以毫无顾忌的摸索实践而没有任何的羞愧感,因此它们可以很快地学会很多成人认为很难的东西,实际上从实践的量来看,儿童绝对不应该比成人来得更快。关于成人与儿童的记忆力的争论,我倾向于认为没有非常大的差别,仅仅是因为儿童的接收更加有选择性,比如大量的信息被他们认为无法理解而丢弃,这样他们需要记忆的内容很有限,自然效率高。关于6岁以前人脑的神经元结构定型的说法是Henry说的,如果是真的,那么这是一个很有意思的问题,因为,究竟什么样的结构这么的重要以至于狼孩错过这个结构发展期后就失去了成为人的可能性,究竟是因为神经元绝对数量的发育迟滞还是神经元结构的过于简单造成的结果?条件反射归根结底是怎样进入也怎样输出,比如视觉的反射不可能反馈到听觉,我们触觉的记忆最终还是反映在触觉。不过且慢!好象人可以有触类旁通的综合感觉,比如听音乐会由视觉的想象,但是这应该是另外的问题吧??

七月七日     晴间多云

我总是会想起《Eagle Has Landed》里面的那个神勇的德军伞兵突击队长Steiner,作为一个军人他毫不迟疑地履行军人完成任务的天职,历尽千辛万苦来到丘吉尔的阳台前,在举枪扣动扳机的一刹那他的致命的犹豫让这个传奇画上了一个悲剧似的句号。为什么在最后时刻犹豫呢?所有的一切努力不都是为了这最后的一刻吗?事后英国警卫对此百思不得其解,还是英国的情报官做了一个总结:也许是他身体里面的一半美国血液让他犹豫了吧?不过即便他没有迟疑地叩动扳机,历史并不能就此改变,也许他的直觉告诉了他这一点,因为从来没有人相信那个暗杀丘吉尔的计划能够成功。关于认识我总是觉得IA不能仅仅作为一个观察者,它应该采用互动式的学习方式,就是试图检验自己建立的假说,用伟大领袖的话来说就是实践。实例教学不仅仅是被动的接收例子,应该还有主动创建检验的例子来证明IA的理解是真正确的。

七月十一日    大晴天

偶然翻到编译原理的语法基础部分,发现了一些疑惑。1。DFA的定义就是每一个状态都要对alphabet里面的每一个字母有定义才对吧?对于错误状态难道不存在吗?也许是我学的使用trap state来表达吧?2。错误装态是nonaccepting状态?还是final状态?这个问题比较傻,我自己的解释是这是两个范畴的问题,对于automaton只有final与非final之分,无所谓对错。但是对于化简DFA来说,就要分对错了,这仿佛是具体运用与纯粹学术研究的差别吧?现在回过头来看我从前自己摸索着写得化简DFA的小程序和书中的通用算法完全是两个不同的方向,我的是从小到大一步一步合并,而通用的算法则是从大到小一步一步分解,其中的难易程度及其可靠性自然是通用算法了。以前miss sunny寄给我的算法,我一直想把它实现,可是每次想要动手就觉得不妥,正如我反复说的,DFS,DFA的问题我画的心思是最多的,仿佛它们是某种本质的东西,我总想写一个完美的通用的基本的框架。也许一个人有了某种经验以后做事情反而会束手束脚,因为你的见识广阔了知道有更好的选择,手头的选择往往看不上了,反倒是一个毫无经验的幼童可以自信地以为自己的选择是唯一正确的选择,义无反顾地阔步向前。这个理由作为我整个夏天的无所事事也许可以作为一个自我安慰的借口,不过,我猜想作为旁观者也许会引申为我得另外的一些决定的理由。人的理由实在是一个奇怪的东西,对于同一件事情不同的人会得出完全不同的解释,我们对于人类的这种无序毫不加以责怪,却对于实现“归纳法”的程序的这种类似的结果非常的不满意,要知道理论本无所谓对错,不经实践检验,任何理论都可以在一定范围内正确。人类不会因为愚蠢的推理而被扣上非智能动物的标签,而机器却有可能得到这样的结论,我们是不是对于机器太过苛刻了?世界上的物种有这么多种,甚至很多的昆虫都被我们认为有一定的智能,可是人类的智能中的某些部分却是其它物种所无法比拟的,这样衍生下去,我们可以猜想当前人工智能的很多方向的最终结果并不能全部都达到人的智能,也许我们将来可以看到很多的研究方向的最终结果使人造智能昆虫,人造智能家畜等等,真正的人造智能人可能只在其中的几个方向上出现吧?

前天全家开车去“北辰山”游览十二龙滩,回来原本要写一篇日记,结果没有完成,现在就在无兴致了,因为,我现在非常的不喜欢平铺直叙的思维。

七月十二日   又是一个艳阳高照的大晴天

有时候你想到了一些事情,可是他们未必有什么用,比如,DFA可以看作是一个function family,其中对于每一alphabet你在每一个状态都是有唯一确定的目标状态,那么对于每一个alphabet来说DFA的目标状态的集合就是他的函数的值域,他的定义域当然是DFA的每一个状态了,这样对于所有的alphabet来说,DFA就是一个collection of functions。我还模糊的觉得化简DFA好像是在寻找maximum matching的过程,不过这一点我始终想不清楚。

我一直想把前两天看到的关于functionoid的有趣的想法记下来,这是我搜索google时候偶然看到的,我一直对于类的成员函数指针能否转化为全局函数指针抱有一定的幻想,这次看到那位大虾的深入浅出的解释才彻底放弃了幻想,这是一位真正的高手,同时他也讲了很多的东西,我的记忆是这样的:typedef void (MyClass::*MemFuncType)(int); 然后你就可以这样调用了:void myFunction(MyClass* pClass, MemFuncType pFunc){(pClass->*pFunc)(5);}我做了一些小小的实验,其中有些结果还是很有意思的,oop中的多态的实现还是挺复杂的,从这里似乎看到了多态的影子。我一开始还想错了呢。只于functionoid,今天可能又没有时间来整理了。总的来说很巧妙,真是奇思妙想啊。简单的说就是把一系列不相近的函数做成函数指针数组的效果,以便可以用index来捆绑参数。比如 typedef void (*FuncType)(int);

FuncType myFuncArray[4]={func1, func2, func3, func4); for(int i=0; i<4; i++){(*myFuncArray[i])(i);}

可是,如果你的一系列函数的参数数目类型不一致你就不能这样了,即便其中只有一部分类似你也不能这样,对吗?不对,你可以求同存异,(时间来不及了,回来再说。)

七月十八日   天气预报要来台风了

《空谈辑》。

七月十九日   台风应该要来了啊,可是很平静的,也许是黎明前的黑暗一样的道理

Rechard和Dragon请吃午饭,韩国馆子比日本料理还要贵。饭后闲聊到Benq收购Simens的手机和Lenova收购IBM的PC的比较,两笔交易可以说交易条件有天壤之别。Benq本身在市场就有自己的渠道,收购一个工厂顺理成章增加产销量,何况Simens原本一直是赚钱的,品牌在欧洲也是占前列,收购中还有五亿欧元的陪嫁,不像Lenova白白赠送IBM好几亿美金的现金,那些员工你是一个也不敢动,因为你自己在当地没有渠道啊。当然这个问题很多人都有分析,无需多言了,我感兴趣的是Dragon谈到一些轶事。比如那个Simens的工厂在一个六万人的德国小镇商雇用了三千个员工,一直想把工厂关闭帮迁到东欧或者中国区,但当地的政府和工会世间觉得反对,甚至工厂的工会为了妥协竟然答应增加劳动时间不提高工资,这一点在欧美的工会可以说是非常罕见的,我听到过很多加拿大的公司在破产保护下工会都不会妥协,可以想象欧洲的工业与工人是非常艰难的。这应该是当初欧盟东扩想要解决制造业危机的一个非常主要的理由与原因吧,但是如今发现中国制造比东欧来的更加便宜,索性欧盟也不扩大了干脆把工厂搬到中国来更好。比如妹妹所在的丹麦投资的工厂在波兰也有工厂,结果发现中国的成本更加的便宜,因此,这里就更大地扩大规模。

长久以来,高收入高消费的欧美用关税与贸易保护筑起了一道堤坝,堤坝内是国民财富的一个蓄水池,虽然工人实际上也在受到高额的剥削但是却可以维持一个较高的生活水平,并且垄断资本也能维持它的一个高的增长率。比如,工厂虽然付给了工人较高的工资,但是日常生活相关的垄断资本通过较高的生活资料价格又可以把工人的收入的很大一部分重新溜回到垄断资本的利润库里面,因此,工人还是受到高额的剥削。这种模式比低工资低消费对劳动人民的欺骗性更大。这一切的前提是要用关税铸成一个堤坝来将国内的国民财富限制在本国国内流动。而全球化的一个重要结果是在这个堤坝上打开了一个缺口把很大一部分国内财富外流到了制造成本更加便宜的第三世界,就好像水桶里盛水多少是有水桶中最低的那块木板决定的一样,虽然第一个缺口是日常的生活资料,很快的那个封闭循环的国民财富循环因为一部分的流失而形成了分流,最终也许整个循环回完全断流,全部转移到第三世界,这也许就是非常多的欧美人民对全球化的恐惧。如同Henry回加拿大时候当地电台的评论一样,本来加拿大这样一个发达国家应该是向较落后的第三世界的中国提供制造品的,可是现在反过来了,加拿大能制造的东西里95%中国都可以提供而且价格更低,加拿大反而成了出口木材石油等原材料的供应商和市场的角色,如今中国又不断地在全球收购矿山森林这些原材料,等有一天加拿大的矿山森林都被中国买走了,加拿大靠什么生存呢?

STL相对来说还是要比AI和自动机来得容易些。我记得以前看到一个自称高手的人写的c/c++程序员成长过程必经阶段里面提到在一个时期你会有很强烈的欲望来主动学习应用模版和各种算法,我现在也许就在这个阶段的开始吧?set<dataType, compType, alocatorType>中的第二个参数是比较函数“类型”的参数,你也许需要typedef一个dataType之间比较的函数的类型,在set的constructor时候会让你带进一个实际的比较函数的对象,就是函数指针了,我只能重新生命一个compType的变量来指向实际定义的那个比较函数,如果dataType是你自定一个一个class,那个函数多半是一个friend函数。说起来啰里啰唆,写成代码其实很简单,这总让我想起在正航的日子里黄连生的口头禅:show me the code。可惜这么简单的问题show code就太不好意思了。

七月二十一日   阴天很凉快

晚上重新看一部老片子<extreme measures>。

七月二十三日    应该是艳阳高照的大热天

今天才突然意识到“侯捷”的例子是不同寻常的用法。我从来不可能想到用这种方法来使用一个模版类如果这个模版类需要一个用户定义的比较函数作为参数,因为最通常的做法就是声名一个函数指针类型及其变量并使这个变量值像真正的实现函数,然后把类型带入模版类型参数,在set这个例子里面我们需要把实参带入constructor。可是侯捷的做法有些匪夷所思,你去声名一个结构并且重载operator(),他带两个你要比较的类型,然后把这个struct带入模版的类型参数,注意这里是把结构当做类型参数,在set的constructor不需要任何参数!我一开始不明白还分别把结构类型带入模版类型参数,结构变量带入constructor结果vc的编译器抱出来的错误让我迷惑了很久,因为vc把constructor当做是一个函数声名了!!!

set<Int, IntCompStruct> intSet(intCompStruct);  //This is wrong! As compile thought it is a function declaration!!!

七月二十五日 晴有云

昨天买了一本侯捷译的《c++标准程序库》觉得好像是得找了难得的武林秘籍,其中讲解的很多东西都是我苦思冥想的东西,并且很多东西经过讲解才拨云见日。晚上和stone去打牌顺便买了一套盗版的《福尔摩斯探案》,真是便宜二十几块,简直难以想象,我不知道在中国这样的国家里只是财富试论斤来买的,真让人痛心,当然我也算是见了个便宜吧,当年我买过原版的,可能在那个时代也是一两百块吧?

同时另一个让人哭笑不得的事情是在中国我这块自留地已经被征服查封了,我按照way2host的技术指导用tracert来试图连接就无法连上,看来一定是咱们的人民政府用某种类似搜索引擎之类的东西查到我说的一些大不敬的东东。也好,省得烦了。

八月十七日  风和日丽

昨天晚上半夜十二点历尽千辛万苦终于回到了家,结束了近一个月的云游。其间我的足迹遍及张家界,贵阳,大理,丽江,德钦,这里是我走过的地方

八月十八日    早晨在梦中听到下雨声

读两本候捷翻译的关于泛型的参考书有一种感慨:从前号称学过c++实际上不过是在c的基础上加入了oop的思想,这个并非是多么了不起的东西,因为oop不过是一种编程的思想,并非什么语言吧?至少这是我当初学习的时候看到的话。如果不学stl以及c++的标准库,那真是入宝山而空回!我想大多数程序员对于函数对象(functor)以及函数适配器(function adaptor)都多少有些吃力吧?至少我是这么认为的,在这里我找到了当初学习functional programming的感觉,当你必须象操纵数据一样地操纵算法的时候,我是非常的头疼的。

vector<int> v;  。。。vector<int>::iterator it=find_if(v.begin(), v.end(), bind2nd(greater<int>(), 5));

这里对于greater<int>(),我曾经迷惑了好一会儿,后来才明白我必须传递一个有比较功能的结构或者class的“对象”,因此,调用它的constructor会产生一个临时对象,然后以“传值”的方式传递参数给“函数适配器”bind2nd。把“方法”或者说算法以“传值”的方式传递参数很微妙,在书里面有很多的讨论,因为很多的方法已经有了某种预定的“状态”了。

八月二十五日    天因似乎有雾的样子

部分地完成了《新西行漫记》,一方面我现在变得更加懒散花了好几天在学习wc3,另一方面,存储在朋友手机里的信息始终没有完全倒出来。其中很多时候我觉得我只是一块引玉的砖,人的思想的火花真的需要碰撞才能产生,那么朋友之间经常角力顶牛未必不是一件好事,因为这时候也许是最能产生新的火花的时候。

九月七日  天晴

回到了加拿大还赶上了蒙特利尔黄金季节的尾巴。时差还是没有完全倒过来。住处没有了Internet生活其实会有更多的内容。

九月十九日  天晴

昨天是中秋节,早上和同志们去china town吃早茶,下午和roommate去朋友家包饺子,吃得撑了,晚上散步看了看月亮,加拿大的月亮就是比中国的圆,也大,也亮。早上起来用scheme写了一个quicksort,相信我,对于初学者应该不是很容易的。总结了几个小问题,先编一个小专辑吧

九月二十日  天晴

早晨起来头晕目眩,去跑了跑步,回来花了快四个小时才写出来一个permutation。用scheme操作实在是不容易,至少对于我来说是这样的。不过话说回来了,写在就是让我用c++去写一个permutation的算法,我也是很头疼的,我也必定是把一个数组还有一个游标的东西当作参数来传递给一个递归函数,当然还应该有另一个思路就是递归式地进行swap动作。这些应当都是作为scheme的一个参考吧?问题是在LISP语言里没有什么引用的概念,一切都是传值,这实在是非脑筋的一件事情。当然这四个小时还是有价值的,因为当我在做combination的时候,花的时间就不到五分钟了。

顺便把一个定义函数指针数组的小问题贴出来。

九月二十八日 天晴

今天在下载的visual studio2005的测试版安装好以后第一次玩了一下。总体感觉首先就是为什么我的电脑这么差劲,根本就像死了一样,其次,vc++至少在模板的支持上终于赶上了一步,比如我看书上的其它编译器支持的template-template参数现在终于可以了!太让人兴奋了。

九月三十日   好像天是晴朗的天,只是模糊记得昨天狂风大作,(还是今天?)

我被cnf和scheme折磨得不成人样,今天好像为他忙了快十个小时吧?一个人不吃不喝能够支撑多少时间?总算勉强维持了我的荣誉,最后写了一个勉强可以工作的版本。昨天看到网上一个大虾写了一篇关于部安装visual studio在命令行下编译的最精简的文件组数,试了一下总是有一个clui.dll的无法安装语言的错误,我想大概是中文操作系统的问题吧?不过,这种盲目的尝试究竟有什么意义呢?我是说我自己异想天开的想再vc6.0下运行vc2005,这样就算勉强可以,可靠吗?后来去参加vc2005的发布会,居然该地点了也不通知我!气愤!以为我是谁呀?nino说定义既然是要给所有的饰物用来定义的,为什么不能自己给自己定义?似乎有理。ww把我转述的uncle Red的名言“If women don't find you handsome, at least they should find you handy.”中的handy作了别样的解释,顿时妙趣横生,handy=at hand。说得很通的,的确如果有个召之即来的,挥之即去的男人来使唤当然好了。

 

十月一日  天气晴朗

老赵提醒说“国庆快乐”,我回答说,“国庆节在七月份,因为我已经不太承认这个所谓的国庆节了。”早晨读了一会graphic,明白了一些课堂上听不清楚的地方,实际上很多被大陆来的所认为intellectually shallow的东西未必是他们想象的简单,因为你不知道你从小被灌输的来得所谓知识被你认为是理所当然,天经地义,因而当你在看见他的时候便以为很简单,不去做认真的思索,这也许是国人的通病,因为中国的教育体制在学生很小的时候就已经把人类经过几百上千年摸索的成果无条件地教授给十几岁的娃娃,这个时候的孩子那里有可能明白那些经典背后的伟大,即便是在大学时代,大多数人还是幼稚天真的可笑,(至少我看到的大多数是这样。)而这个时候,我们的助教们又无条件无代价地“传授”了人类几千年的积累。学习是要付出代价的,最经常的代价就是失败,没有经历失败的选择,很少能够真正明白正确选择的,而大多数的中国式的教育基本上不提倡学生又重新摸索实践的方式,这从宏观的国家教育投入产出比来看是对的,一个穷国无法承受昂贵的高等教育培养一个在单位时间内不能够掌握定向培养的实用技能的毕业生。然则从个人的角度来看,这是一个人生的缺憾,比如一次驾车出游的经历中,大多数的良辰美景都在呼啸而过的奔驰中一掠而过,如果能中途不时地停留片刻,拍两张照片,徜徉一刻,慢慢地欣赏回味那该多好啊。这才是人生旅途的真谛吧,如果你不是很急切地奔赴天堂或者地狱,不妨时时地逗留片刻,你会在旅途的终点感到一次无悔的旅行的。在跟随Erdos Number=2的Rapheal学习linear algebra的时候才真正开始理解向量和矩阵,然则这种深邃的自然界的两大客观关系的标识工具在大多数我接触的中国学生眼里却是那样的不屑一顾,让我心里真不是滋味,有时候甚至觉得自己也许过于迟钝无法和“正常”中国人一样领悟其中的诀窍。难道笛卡儿的三维坐标系是能够从诗词歌赋盛行的封建中国式教育中产生吗?难道说崇尚形式逻辑的古希腊人建立的严密推理的几何学能够在中国式的沉迷于神秘主义哲学的土壤中产生吗?中国究竟有无产生过一个真正意义上的自然科学家?(狭义的自然科学不包括医学)你是否在每次使用三维坐标的时候都想到那只不过是我们默认的标准base的线性组合的系数而已,我们的标准base((1,0,0)(0,1,0)(0,0,1))的选择的巧妙掩盖了自然深邃的美。你是否在听到勾股定理时候深切地感受到中国人在剽窃毕达哥拉斯的伟大发现?勾三股四玄五能够说明两直角边的平方和等于斜边的平方码?要知道在中国连平方的正式概念都没有,更不要说仅仅发现一个特例居然要等同于发现一个普遍关系,如果仅仅认为这仅仅是中国式的命名法则,那么你对于泛政治化的民族自豪感的宣传的认识就过于天真。

十月四日  天气晴朗

吃饱了没事干,看网络上讨论的热火朝天的关于清华的那个博士生王垠退学的问题,看到另一个也是清华的他的学长的评论觉得有些不可理解,仅仅关于使用字处理文件就代表了一个学院的学术水平吗?如果这样的话北美随便哪个大学不都是领先中国很多吗?毕竟这便是用linux,pdf,ps等等的工具的遍地都是。“MIT有scheme,剑桥有Haskell”着一定说明什么吗?也许我有一点不知天高地厚,我想functional programming如果不考虑效率的话,随便一个有点水平的计算机的学生都可以用bison之类的编译工具编一个出来的,关键是其中的思想才是精髓的,而作为工具从来就是使用者自己选择的结果,如同道路,原本没有路,走的人多了就成了路,原本这类小工具都是使用者人人都有需求的情况下,用的人越多,改进的就越好,使用商业软件与不使用商业软件对于大多数非专业编程人员来说很大情况下是无奈的选择,比如在一个美育盗版软件的环境下,有什么趁手的免费的工具就用什么了,不是不想用好的,一是太贵,二是没有。当然我没有在王垠的环境下呆过,体会不到,不过总是觉得国内的人有时候发的牢骚有些莫明其妙。不过,那个小妮子长得好像还不错的样子,是个女生吗?我一直有些不确定,因为我一直以为计算机是女人的天敌,没有听说过有什么女性计算机科学家,当然Bacon的女儿Ada除外,不过这个十九世纪的女人不过十项发明赌博机器而已。

十月九日  似乎阴有雨

虽然说graphic不是很难,但绝对不会轻松,单单修改tutor的样板程序算什么本事?我决定自己按照oop的原则设计一点架构,不过实施起来还是有些难度,拼了一天仿佛强弩之末,精疲力尽了。wesnoth害得我好苦,昨天几乎熬了一个通宵,结果中午还要去参加programming competition,题目算是容易的,不过我头昏脑胀的我们这组只完成了两个得了个第二,当然这不是什么正式的比赛。wesnoth总结出了一个经验:最好的进攻是防御,最好的防御是进攻。我一直想尝试编译这个程序,可是这种从linux移植到windows的工作实在是辛苦,比夏天那个难多了。昨天晚上饥肠辘辘地和小孟,小朱去吃牛排,真是好,吃的我路都走不动了,那个牛排真大,沙拉真多,吃不完啊。技术上有什么心得吗?零零碎碎似乎不值一提,你看我现在思路都是并行的了,头脑不清楚啊。

十月十二日  似乎阴似乎晴

把前一两个星期的工作做一个小结以证明我还活着,还能写写小程序。graphic的oop的工作我决定暂时放弃,因为正如Mr.zhang说的那样在我还没有对全局有一个清楚的认识的时候做这个工作大多是一个失败的结果,尽管我不完全承认这是一个彻底失败的尝试,至少我自己都不太满意,因为运行效率也许灰尘为一个大问题,还有就是旋转的问题。Scheme的作业也贴出来以备以后的查询。Hanoi的code太ugly了最后没有采用。cnf-dnf的转换化简应该会用在project里面。

十月十五日  天因有雨

凌晨一点半钟,我似乎还是没有睡意。耳边是黑豹的《放心走吧》,眼前是这个夏天云游的杂感,往事的回忆对我来说仿佛是另一个世界的小孔成像投过来的上下颠倒的图画,一个人的想法是多么的难以捉摸啊。我对于重复的工作是这样的不耐烦以至于为了使几分钟的简单矩阵运算而去写一个小程序来做,也许是我对于自己的计算能力极度不信任吧,也许是对于graphic理论作业上写上计算从略觉得有些内疚吧,或许是我对于些重复的代码就不觉得是重复?无意中又让我对于vc++6恼火了一把,他对于模板的拙劣的支持非常令我气愤,比如一个模板类用到另一个模板类作为数据成员,其中的数组长度依赖于模版参数居然不支持:template<class T,int size>class Vector; template<class T,int size>class Matrix{public: Vector<T,size> vect[size];...};这样不行吗?真是盼望着有一天能够用上visual2003。AI里面的SAT的讨论有些眉目了,可是组员们好像并不理解或是明白我再说什么。graphic的project更是让人气恼,两个老外简直是白痴,一直在推敲proposal的英文语法,我甚至萌生了推出的念头,有时候我真想自己一个人一个组,说句不谦虚地话,scheme我完全可以一个人单干,但是这样对于我来说并不会长进太多,毕竟和别人讨论能受到启发的。比如关于clipping,我当时就很傻以为只可能保留平面函数小于零的一侧部分,为此我还煞费苦心地去切除对称的一侧然后旋转,那个老外在问我问题的时候,我才从tutor的错误中突然发现了改变符号的办法,这种灵机一动也许是要激发的吧?只是我一个人思考的时候总是想不到。晚上看了一遍George Orwell的经典小说<animal farm>改变的电影,在欢笑之余你总会对于人类的悲惨命运难过,猪竟然是所有动物里最聪明的,只因为他们善于模仿人类实施对于其他动物的专制统治?

早晨起来继续我的无聊的工作去用程序来计算graphic里面的旋转变换,一方面我现在已经不适合使用计算器了,学习线性代数时候那帮小留学生各个算得飞快,我却总是出错,果然我的程序发现我昨天晚上花了半个多小时的计算是错误的,hopeless!当然为了半个小时的工作画上一两个小时用程序来解决是否在中国这个唯生产力论的社会里能否生存是一个大问号,看样子我只能困死在加拿大这个冰天雪地的世界了。不知不觉中我的一个早上就这样过去了,看到Alex关于继续坚持最短的term先处理的message,我对于我的坚定信念又产生了怀疑,因为深度搜索中尽快到达搜索的叶子节点可以帮你的程序尽快返回,这种好处与减少返回的次数但是每次搜索的深度加深之间要怎样取舍呢?这种两难的问题总是让人困挠啊!甚至于我现在开始怀疑我是否应该选择出现频率最高的变量还是出现披绿最小的?这简直是将大厦推倒从来的想法,我应经头昏脑胀了。在一个系统里面究竟哪种元素是矛盾的主要方面,和多数元素都有联系的还是那些和大多数元素没有联系的元素?比如我是某单位的领导要去满足单位里每个成员的分房或者福利工资上的要求,这些难缠的雇员间有些有着之间或者间接的利益冲突,有些甚至是完全矛盾的要求,那么我的策略是什么呢?实现尝试满足那些与大多数人都有利害冲突的刺头儿呢还是下安抚那些老实巴交总是与世无争逆来顺受的软柿子呢?难道中国官僚阶层中蕴含着比世界顶级computer scientist都高明的人物,要知道这一类问题是无数科学家经年累月都没有找到好的解决办法啊。究竟矛盾的主要方面灾哪里呢?头疼啊!肚子饿啊!知觉总是告诉我那些与大多数人有矛盾的人总是最难各个方面照顾周全的,好像应该首先满足他们,可是知觉上来看在试图满足这些人的时候你遇到的反复是最多的,因为左右为难的情况最容易发生,也就是搜索的返回情况应该最多,是吧?难以置信???吃饭吧?

十月十六日  有雨

早晨起来把graphic的最后一些小问题解决了,还是有一些成就感的,当然美中不足的是大的framework是借用tutor的,我只是一个模型创建者,而且还是一个比较蹩脚的,没办法我不是学美术的料,也不适合做那些精细的工程,这方面的工作还是engineering的人比较强,他们可以与fine arts的人比美,一个是能够画精细的三视图,另一个是能够画美轮美奂的素描,我对此不在行也不是非常非行感兴趣,毕竟我们有更大的工作要做,比如金字塔的大的解构的设计,至于具体建设交给工程师们去干吧。比较值得一提的是我写了一个好玩的小函数可以把一个物体人以切割成多个部分,当然就是利用传进来的函数指针不断地调用clipping函数而已,不过挺好玩的,想象一下starship上有多少个小块,一个一个地分割多麻烦,这个不是很好吗?当然很粗造了,另一个是解决了camera旋转与model旋转的小问题,就是一定要先建立view-coordinate然后旋转model的时候要把model移回到view-coordinate的原点再旋转,这个在做model-view的时候大家都知道,但是当camera移动了大家就可能忘记了,因为观察者总是以自己的眼睛为世界的中心的,所以,才需要一个world-to-view的这么一个transformation。

十月二十一日   终于天晴了

昨天和前天都是无比辛苦的一天,考完midterm之后晚上又忙到半夜debug程序并且加了一个简单的heuristic函数,现在回过头来看我在cnf的认识上比很多同学要差得多了,一些基本的想法与思路都是前人已经反复尝试过的,在tutor的网页上有很多的讨论,可惜我一次都没有去看过,实在是太不应该了,以后要力戒之!昨天忙到连吃饭都快免了,晚上回到家的路上想到冰箱里空空如也,再怎么饿都要顺路去补充给养,临付帐的时候看到柜台前的巧克力牛肉干当时真是饿得想买,后来还是忍住了,没有标价格天知道要几块钱,我前面有个流浪汉样子的人物边排队边吃,我当时还觉得她挺自觉地,吃过了巧克力,面包,可乐,剩下一个空包装还拿在手里准备付钱挺好,可是结果收银员刚打价码,他就不知道嘟噜了什么跑掉了,把个收银员手里拿着吃了一半的面包在发呆,劳动人民苦啊,要不是穷到家了谁肯干这个?昨天早上跟踪我的sat程序真是有些苦不堪言,还好些过编译器之后,没有什么事更痛苦的tracing了,其实也不过是面对几百行如同天书的scheme中去一个个的断点查找,倒是让我体验到了一个所谓getlasterror的异曲同工的妙处,我的程序对于简单的cnf问题运行都还对,碰到几个复杂的就老实出莫名其妙的错,有时候队友时候错,有着明显的指针虚指或者随机性的烙印,我甚至一度怀疑gambit的实现上有问题,scheme本身的trace我用不惯,而且这种trace是发生在几千几万行之后的,我怎么也到不了,只能用最原始的显示参数的办法,可是有的函数被调用的次数太多了,出错之前都不知道要显示几千次,根本不行,甚至我也不知道在什么地方发生的错误,(现象是知道,但是真正的原因在哪里是个问题。)一个办法是把出错的函数一个个拆开来到这顺序调用,但是一个前提必须是在出错前的某个时间点这样环境才模拟成一致,这本身就是一个问题。二是一个getlasterror的idea,我在每个可能出错的函数调用之前都把当时的信息写入一个buffer里面,这样在出错前的最后一次调用我可以看到,因为写入缓存比拼木显示快多了,并且总是覆盖前面所以不用看天书一般的查找log,当然对于某些问题我需要比较前后结果的,我就涉及两个buffer,依次写当前和上一次的结果,这样可以看到两次之间的结果比较。三是通过控制输入缩小查找范围,不过这很有些土,我只好写几行小脚本做那些繁琐的初始化动作和调用过程,这样终于化了n个小时才找到了那一个随手的错误,很凑巧的这个错误只在输入的cnf有redundant variable, i.e. (AND (OR A B A) D...)的时候才会发生,而我的错误导致的时一部分的list里面是有些没有预测到的东西,实在是运气。以后我就记住了,对于我认为不可能发生的情况不应该否定他的存在而应当在程序里面让他出错,否则后果不堪设想,这就是为什么看到windows里面和stl里面很多函数写的一些让人不可理解的if,以前很傻得以为那些人不会写程序多写了很多没有用的不可能发生的情况,现在知道我有多傻了,再有人这样嘲笑我的程序,我以后就坚决地对她微笑。:)程序的写作有很多时候是对个人的否定的否定,任你有多聪明机敏,多么眼空一切,你终有一天会认识到自己的愚蠢,当然每个人依照个人的天分与努力这一天的到来只不过早晚而已,本人看来是有些驽钝,这一天来得出乎意料的早,不过,反过来早一天领悟这一点也许天分还不算太差,自我安慰一下吧。今天又想明白了一个极其弱智的问题,在AI的讲义里面有一个refutation的自动推理算法通过negate conclusion,导致contradiction来证明结论,或者中文叫做反证法,其中滑键的方法是这样的: in cnf:   (!A,B)^(A,C) ==>(B,C) because if A then B else C. So, either B or C is true. In other words, (B,C) in cnf. 结果我居然异想天开想把这个用到cnf证明里面来化简输入,殊不知这犯下了一个天大的错误:I am supposed to prove this cnf to be true. And I am using it as a rule to simplify itself which already assume it is true. This is called proof by begging. 用中文来说就是自己证明自己,这个反证法永远不会成功的:to prove A is true, by proof with contradiction, you need to negate it and try to find contradiction. What I am doing is just negate A and try to find if !A is contradictive with A which is for sure. But this contradiction can never prove if A is true or not because no matter what truth value A is, !A^A is always leading contradiction. I am just proving a theory by itself. 这个简单的问题看起来有些弱智,不过我当时还真是转不过弯来,因为老师的讲义里面有这个化简得方法我问什么不能用呢?后来才有想到一层,如果要去证明cnf是true的话你必须先驱negeate那么你想过着negate的过程要用多少次的De Morgan Law?因为,cnf已经是一种化简后的形式,断无理由再趋复杂化,只有我们再从knowledgebase推理简单的结论时候,这种negate才比较好用,这似乎是两类不同的证明,一种是从小的方向累计巨大的结论,另一种是从巨大的公理库里面寻找简单的推论,究竟哪一种工作更加困难呢?从涓涓细流累计成汪洋大海还是用精卫填海的精神熬干大洋?应该是一样吧(当n都是很大的时候)?

十月二十二日   天晴

昨天又在实验室里耗了一天,主要是写报告,当然主要是我写一些设计思想,实现原理,其他人补充修改,几次teamwork的感觉就是老外比中国人认真的多,写报告的时候可以使字斟句酌,反复修改,这样子的精神我原来不是很理解,上过英语写作就知道为什么了,因为英语老师的批改比这个还严格,不这样写行吗?当然我的文章都是被称作semi-chinese-english的让他们费解不少。其中也发现了我算法中的错误,在我使用simplification的过程之后压根就不可能发生variable的truth value冲突的问题,因为他们早就被替换了。几天准备去zellers买两条leevis的牛仔裤,只有17块钱。

下午是一个历史上非常痛苦的下午,我觉得我像一个白痴,这种感觉不论怎样的必要,对任何人都是一个绝对痛苦的体验。这种痛苦以至于我不愿意再次面对与回忆。

十月二十三日   天晴?

还是让会以冲淡痛苦吧,这是上个星期奋战的结果,一个cnf-sat的程序,算法上平淡无奇,heuristic也是人人都想得到的,就是count the occurrence of each variable and then proceed backtracking on that list which is sorted by descending order of absolute value of occurrence of variable.那么有什么特别的吗?就是特别的辛苦,如果完全一个人写的话当然是比较辛苦的了,至少对于我是这样的。今天读书发现的一个小问题不知道对不对

十月二十五日   天阴沉沉的

当选择对大多数我的同龄人早已成为过去完成时甚至是过去完成进行时的时候,我还在用虚拟语气探讨将来完成时的可能性

十月二十八日   天阴沉沉的,的确是阴沉沉的

昨天奋战了一天居然是去解决象8-puzzle这样的trivial的问题,实在是有些让人尴尬,当然了不作不知道,做了才知道自己很多的想法都是错的,hill-climbing的方法是要每次碰到以前的经过的节点都要update以下新的heuristic value,而如果按照A*或者monotone的原则你可以放心这种事情不会发生,但是这并不等于。。。且慢,等我看了结果再说,主要的问题是我是否自动就建立了最短路径呢?我可以保证找到最好的结果,但是我找的过程是否是最短的呢?我当时的感觉是不,现在开始怀疑了,如果我每次都是正确的路径那么我的确使用了最短的时间找到了最短的路,可是这一点我不信,因为,1,这是纯粹的greedy algorithm,2,如果这样,每次我和必要去记录我已经走过的结点,如果我不需要走回头路的话。这个问题有以下部分原因起源于我的疑惑,DY只能让我将信将疑,因为我不能相信这样一本权威的教科书会有这种纰漏,毕竟已经是第四版了,不过我始终有种感觉所谓的A* algorithm根本就是一个名字上的误区,正如书里面说的他仅仅是一个定理,一个完全无法应用的理论,正如操作系统里面所谓的完美的预测未来的一个算法一样根本无法实现,当然他的用处是给人们指明了一个算法的方向昂去接近他,因此在我看来monotonicity才是一个真正意义上可以操作的算法,因此,其中的heuristic的衡量标准才变为了可以测量的“世纪路程的cost”。可是如果再把它归回为无法衡量的cost of all possible path那么岂不是和A*本质上一样了吗?这就是我的怀疑,感觉上两条曲线最后都重合在goal state,即便上他们在初发的时候不重合,他们也有可能是一致的,(这实在是矛盾的说法。不过这是我的直觉,因为两条曲线都是同样的monotonely non-decreasing并且一条是另一条的upper bound)

关于我的glutobject现在可以看到一个希望了,的确是提高了不少的工作效率,我至少用它来画一张人脸只需要去考虑位置大小形状颜色就行了,再不用去写那些烦人的transformation了。

15puzzle运行无结果,我就把它放在学校的服务器上浪费资源去了,这就是使用stl的好处你的代码真正使write once,run everywhere,不像java那么蹩脚,(不过我是不懂java不应该乱评论吧。)等明天再看结果吧。也许会被管理员臭骂一通吧?当然这样做的代价就是程序的运行效率上稍稍地打一些折扣。

十月三十日   天气好得出奇

如果你拍你最强大的王牌师去进攻一个山头,猛攻一天一夜没有任何结果你该怎么办?我的选择应该是撤退或者换一个进攻点。glutobject就是这么一个结局,也许从一开始这个设计就是有很多值得讨论的地方,结果在不断涌现的问题中我的信心在不断的消减。首先是透明物体必须在不透明物体之前画的问题,这个还可以用flag解决,其次是我突然意识到很多组合物体有一致的运动的时候我总不能一个个的重复设定参数吧?这个用各个list也还可以解决,等到说看到我的螺旋桨的旋转的诡异我有些崩溃了,因为我一直怀疑我的矩阵变幻的类有问题,等到说我花了两三个小时调试才突然意识到原来是acos函数的值域的问题,比如arccos()的范围是0到PI,那么你想要实现360度旋转,你必须自己调整。也许这一切都还可以接受等到我发现尾翼的旋转时隐时现,我有些绝望了,因为我以为是3D-Rotation中另外一个类似的asin()的值域的问题,可实际上是display callback函数的强制刷新的问题,不过我对于swapbuffer和glutPostRedisplay是否等小事怀疑的,不过等到我发现不透明物体能被透过的时候,我的信心彻底丧失了,这正如早上我发现任何一个非完全对称的物体必须要两个响亮才能定义方向的问题一样,我对于我的的设计思想是否合理开始彻底怀疑了,这样复杂的系统能否让组里面的其他人采用呢?正如mr.zhang先前的意见,当我对于一个系统还没有从整体上有所了解的时候,要做任何的系统性的设计基本上是要承担失败的后果的。就此打住,留一个版本吧。

这两天倒是做了两顿比较丰盛的晚餐,但这也难以冲淡郁闷的心情,AI的考试和倒是真的有直接关系吗?我究竟要做什么呢?是否应该安于命运的选择?有时候会觉得加入自己是一头猪,一头没有思想的猪,一定要比现在轻松的多,不过话说回来,《animal farm》里的猪可是个个都是思想家,革命家,看来就算做头猪也要不断的学习马列主义的,因为那部George Owell的小说里面的几头猪都是有来头的,Old Major是列宁,拿破仑指的是斯大林,或者是赫鲁晓夫也行,这些可都是些有头脑的猪啊。

晚上去PA店买水果,看到街角一个穿紧身黑皮夹克的女留学生签了一匹硕大的狗在散步,心中颇不是滋味,想来人生不如意之时十常八九,心情愈发的低沉,子非鱼,焉知鱼之乐,子非鱼,焉知鱼之悲。

十月三十一日   天气 不是很好

今天早上在放弃glutobject之后很快地把第一人称视角加了进去。毕竟使用现成工具和制造工具的难度是不可同日而语的,这也正是人和动物的本质区别,昨天我应该说差一点进化成了人,可是很不幸最终我还是放弃了,重新变成了猴子。在十月的最后一天把作业贴出来当作对于夏天无所事事的一种补偿吧,也当作是对于AI考试一塌糊涂的安慰吧,我不是天才不可能明白我不懂的东西啊,当然更主要的是有些学过的东西也搞错了,这是不应该的。过两天好啊好研究一下alpha-beta-pruning。

忘了说了,我的15puzzle的程序在学校服务器上运行被管理员关闭了,我的帐号也被封了,我其实不是故意的,我以为dfs使用的内存并不多,不过想来原因是因为要记录所有搜索过的节点,这个数量非常的惊人,我问过教授又没有什么实际的办法,他也说没有,仅仅提到过类似于hashing,不过16个数字还能怎样压缩呢?

我的电脑有些古怪,我有时候觉得我的电脑好像被人控制一样不可思议。最后一次提醒一下,“...”operator是不能用在class的member function的。

十一月三日   天气 看不出来好坏

早晨起来花了一个多小时才找出来驻留在我电脑里的混蛋程序,我是通过taskmanager找出其中的端倪的,这是一个叫做expoirer.exe的由blue knot公司生产的广告程序,它的本事显然没有在我笔记本的那个厉害,只不过在注册表里的启动程序栏里把自己加载而已,不过这个程序太过分了,他每隔一段时间自己运行,也就是ie的变形体打开一个广告页面,是可忍孰不可忍?并且和我的微软拼音输入法的功能键好像发生冲突了,(这一点我不确认,反正我一股脑把另外一些开机就启动的驱动也删除了。)这一点让我很是恼火,同时也再次证明了一点,便宜没好货,国内的盗版软件的下载一定要小心,谁知道他不是作了一个木马在等你上钩呢?

十一月四日  凌晨怎么能知道天气?

Hugh Grant的电影总是幽默智慧并存,<Notting Hill>里面Thack offer Anna各种饮料,Anna一直说No,然后Thack只好问她是否对所有的问题都回答No,Anna想了一下只好说No。Thack的同屋Spike试图开导他,问他究竟有什么心事,Thack告诉Spike是关于那个美国女孩,他打开了Pandora Box,Spike若有所思地说,tricky, tricky,他曾经认识学校的一个女孩子叫pandora,可是从来没有看过她的box。《four wedding, one funeral》里面的joke就更多了,不过我大概只能偶尔地好像网络延迟一样地在几秒钟之后才笑一下。还有一件事我最近终于搞明白了,如果我不幸离开了concordia我的苦日子就来了,你完全可以现象一个非三流大学的计算机课程的繁重,我能不能还这么轻松地活着都是一个问题。

真是艰苦的一天,终于完成了这么一个看似简单的alpha-beta-pruning算法的模拟,看来我完全不是学算法的料,最后我发现书本的算法描述可以说是间接得到极点,但是完全够了,只是如我这样的人无法领悟,最后还是看了一下中文的算法书明白了一些疑惑,不过,终于学懂了一个算法,还是值得高兴的。我想不一定所有的人都已经领悟了吧,也许我不算最差的吧?关于并行处理的一系列咚咚我觉得充满了迷雾,这个“迷雾”如果放到graphic倒是不错,因为作业里面需要,可是哈啊哈。。。

今天旁听了一个博士论文答辩非常有感触,在回国的夏天里跟着林红也去厦门大学去旁听过一个数学系的博士论文答辩,当时当然专业的东西听不懂,不过教授问的问题还是明白的,比如其中一个评委会成员固定文每个人一个同样的问题,请介绍一下你的论文发表情况,而且对每个答辩者仅仅就问这个问题而已,其他的人有时候问的一些问题也非常的业余,连我这个门外汉也听得懂评委会听不懂,也可能没有时间看论文,因为有些评委是外地的,并且问的问题就一两个,实在实在是流于形式。而在这里一个加拿大的二三流大学里,我看得都脊背发凉,评委有一张密密麻麻的问题准备着诘责你,毫不留情面,哪怕是自己指导的学生,其中的问题很尖锐有些几乎是要推翻整个论文的基础,比如我对于软件工程所知甚少只能大约明白个大概,但是也看得出来答辩双方实在是非常认真地准备过了,我想在这里想糊弄人是不容易的。这和政治经济文艺艺术不一样,那些东西有时候你能把自己蒙过去了让自己相信自己是对的,很多时候你可以真诚地让别人相信你是对的,比如演戏时候演员自己以为自己就是角色最后人人都信服了,好像布什这种人坚信自己是对的,摆出一幅坚毅决绝的样子让你不得不能不信服他的信仰,又比如中国的经济学家们气势恢宏地做出种种结论让草民百姓大小官员们不得不信服,这在科学工程这类以实验结果为基础的学科面前完全没有用,因为我们相信的东西从来不是人,连证明这样的手段当初就是为了不依赖人的直觉的结果。也许应该重复一下我的老生常谈,在中国,你相信一件事是因为你相信说这个事情的人,你反对一件事情是因为你反对者个人,反之也成立,也就是你相信一个人就相信他说的事情,你反对一个人就反对他所说的事情。

《four wedding, one funeral》里面关于婚姻的一个说法非常地经典,那个葬礼的主角曾经说过当两个人终于说光了可以说的话题之后为了避免无言相对的尴尬于是他们决定结婚,也就是说婚姻只不过为了避免无话可说的尴尬,可是我们大多数的时候又看到女人唠唠叨叨抱怨丈夫不理睬他的絮叨,这真是矛盾啊。其中另一个潜台词是婚礼是婚姻的催化剂,电影里的几对伴侣就是在婚宴上认识的,所以另一个关于婚姻的说法是眼睛的诱惑,你看到了你就被吸引了,其他都是次要的。另一个好笑的 笑话是Charles为了摆脱尴尬和朋友聊天问及他以前的女朋友怎样了,朋友说她不再是他的“女朋友”了。Charles自作聪明的说你摆脱了就好,不然像她那样不停地背着他勾引别人还是早点散了好,朋友非常地愕然呆在那里半天才说她现在是他的妻子了。对了,终于听到了那句经典“比麦当娜少,比戴安娜多”。最后一个教训要记取的就是在婚礼那天不要和从前的情人见面,尤其你的未婚妻学过拳击或者跆拳道之类的更是要小心谨慎。

十一月五日  很难得看到蒙特利尔居然有大雾的天气

“子非鱼,焉知鱼之乐”这句话原本有三重的意思。

也许“子非鱼,焉知鱼之乐”还有第四重意思吧?

落英缤纷,秋意无限。循幽径尔登皇家山,心境豁然开朗。坐在枫树林中被金黄的落叶簇拥着,随手翻看一本《pattern matching algorithms》,没读几行就心潮起伏热血翻涌,开篇的一两个算法就有点石成金的感受,又仿佛醍醐灌顶的兴奋,忍不住掩卷远眺,天地之大真超乎井底之蛙的想象。看书的时候当你看到你的想法在几十年前就已经被人做过时候,你会既高兴又难受,高兴的事是你的想法不算幼稚,难受的是你出生的太晚了。(当然你现在能够想到和几十年前别人想到是截然不同的,今天我们有这么多的资料媒体,潜移默化中你并不知道这是你自己的想法还是受到外界的影响的,多半是后者,借用以前讨论plagerism时候看到的老外的警句,就是亚当时代里,亚当是幸福的,因为他不用担心自己会剽窃别人的思想,因为所有的想法只有他自己告诉自己。

十一月八日  阳光无比灿烂

早上花了一早上写了一个简单的propositional logic tester for zebra puzzle.

十一月九日  阳光,仿佛羞涩的小女生只敢躲在白云作的窗帘后面

昨天和同组的老外们讨论A*和monotonicity,发现几乎每个人都比我对这些概念认识的更加深刻,Alex解释说A*好像一种好的bounced&bounded可以给你一个“回头是岸”的机会,因此比普通的bounced&bounded有更好的效率,这个认识非常地深刻,这正是admissible的本质,monotonicity出乎我的意料反而是更加ideal的一个虚无飘渺的理想境界,我是在大家的反复解释下才明白的,只有上帝才由这种从来不犯错误的heuristic,它当然是比允许一定范围的错误的A*要更加的可遇不可求了。其中非常关键的一点就是我当初不知天高地厚地怀疑的一个地方就是,两点之间是否可能有比起直接连线更短的距离?我们这里不讨论超级平面,或者两点之间可以有多条连线,答案当然肯定的,因此,monotonicity的论证也就无懈可击了。(是吗?我好像还是不太相信。)

我想再次提醒自己的事就是inverse-compiler-compiler的想法,以及extened-DFA的想法。下个星期必须要完成所有slides的阅读,还有能不能去图书馆学习呢?

十一月十日  没有阳光?

OpenGL一个要小心的是,一定要先定义了light,才能enable他,不过这一点我想大多数人都认为理所当然,除非是我这样胡乱尝试才屡屡让系统报错。一个基本的教训使你不能够在gluLookAt之前画物体,这好像是以前就应该了解的东西,我好像忘了一干二净,但是你可以在glutLookAt之前设定光的位置与方向,这样光的位置方向是和你的view-coordinate相对无关的,也就是不论你怎样转动camera你看到的都是一样的,如果再之后设定方向与位置,则和你的camera有关,(这里面我好像中文也不会说了。)也就是说转动camera看到的光线效果不同。并且,这样设定的光的position是比较合乎逻辑的,因为,我按照例子里面的directional light只用坐标(1,1,1,0)来定义方向,只有在之后设定才make sense。

我觉得我就是一头懒驴,一旦吃饱了就什么都不想干了,和我夏天去德钦看到的那些马帮的骡子一样只能天天半饥半饱才行,当然要拉货之前马帮是要给骡子吃一些精饲料的,于是我也买了一些黄豆以备不时之需。:)

重新看了一遍《Master and Commander》,其中一句经典的话是“The strength of a nation depends on the courage of few.”想起类似丘吉尔说到二战中英国抵御纳粹进攻的胜利时候说得从来没有这么多的人要感谢这么少的人,大概有异曲同工之效,在遥远的东方一个天天号称崛起的一个老大帝国却很可能缺乏这么少的人。大英帝国的荣耀在他的海军,因此帝国的靠着海军征服了世界,中国今天不知道他的荣耀在哪里,如果是血汗工厂里的女工,那么至少应该把他们当作帝国成员的一分子,遗憾的是工农联盟现在已经不是中共依靠的对象了;如果靠的是民族资本家,那么就应该让资本家们都加入共产党,这就是三个代表的真正含义。

十一月十三日  阳光灿烂

OpenGL 这类的东西让我讨厌的在于有些东西是单凭我自己很难解决,而一个有经验的人只是一句话的问题,比如几乎每个学习图形的人都会碰到的问题,他让我困惑的一个宝贵的早晨:为什么地面不反光?

下午project meeting了整整一个下午,还是卓有成绩的,第一发现了我的alpha-beta-prune的一个bug,其次整理出了一个清晰可行的project2的algorithms。晚上我又几乎不动脑筋地写了一个bruteforce方式搜索zebra puzzle的小程序,第一次运行的时候我才意识到可能范围太大了,结果意外地发现了一个tester的bug,我又很快地缩小了一下搜索范围。

晚上借口程序运行又看了一遍《有话好好说》,这到底是一个灰色幽默还是黑色幽默,影片里面有着强烈的不安定因素,因为摄影机是手扛的,镜头是动荡的,取景是夸张的,剧情是跳跃戏剧化的,仿佛一个动荡的年代的躁动的心情,我不知道为什么每次看这部电影都有着相似的感受。(不知道吗?)也许这是一个时代的缩影,的确这是上一个世纪中国社会动荡中发展的反映。

侯湘婷说我是一只鱼,张雨生说我是一条一天到晚游泳的鱼。

十一月十五日  2005年的第一场雪就是这么悄悄地来的

今天和supervisor会面还是有些收获的,有些问题是我曾经想过但是从来不敢去考虑的,比如有些运行期才能知道的东西,你怎么可能在程序编译期进行预测或者就算在运行期进行控制这是多么的复杂的问题呢?还有依靠编译器得到的函数的dependency来进行程序的slicing,这是多么的ambitious的问题呀。下午teamwork一下子搞到了九点多钟,饿的我半死,不过还是很有些收获的,我觉得组里面的老外每个人都很出色,尤其是alex非常的有想象力,很多时候我很佩服他能够想出那样的点子。我在上一次的meeting里面已经知道了我的alpha-beta-prune有一个大的bug,可是现在懒得出奇,就是不肯及时改正,这里再次提醒一下,alpha和beta是可以交叉同时进行的!还有一个我一直想要做而没有做的事情是用15puzzle的运行数据作为程序的学习资料自己去找出规律,我想这应该比手工去找高明多了吧?听说hex game的那个manitoba的中国教授使用手工找出的规律,我实在是佩服他的毅力。如果我的方法可行的话,我不知道会有怎样的震撼效果?

十一月二十八日  好像有雾的样子

一直没有整理作业,今天要考试了什么也不想干就把我认为我比较自豪的我写得最复杂的一个Scheme的函数贴出来吧,这是AI的第二个project里面一个重要的函数,依靠它我们可以最大限度地减少搜索的范围,这个主意也是Alex想出来的,就是shortest-path

十二月一日 天阴沉沉的仿佛很忧郁

昨天看自己以前的日记完全不相信自己半年前的想法,所做的一切竟会被忘记的一干二净,我只能安慰自己说每个人都会忘记的只不过程度不同,同时也许很多人忘记的东西本来就没有什么价值,比如说一个人天天回忆自己以前在某条马路上看到的戴鸭舌帽的牵大狼狗的小留学生有多么漂亮有什么真的价值吗?:)真正的问题是遗忘也许是一种必要的学习过程,昨天上课讲的genetic algorithm,中文就是遗传算法,我一开始对之嗤之以鼻因为在我看来这完全是一个懒人在绝望无助下的最后的选择,比如考图形学时候题目做不完了剩下最后一分钟的时候老师提醒你选择题你可以尝试你的运气,的确,在做不完的时候,或者对于mission impossible的时候这种所谓的算法的确是一个死马当活马医的好办法,对于人类遗传基因这样天比文数字还要大的问题除了束手无策就是比赛运气了。不过当老师go through了一个例子后的comment确实让人振聋发聩,正常的搜索假如你因为greedy走错了一步你几乎注定不能翻身,也就是你注定走上了一条封顶的路,再多的努力与运气都不可能改变你的选择,而靠着遗传算法这样的交叉与变异,你还有咸鱼翻身的机会,当然你也可能从正确的路上偏移,这就要看你的运气了。回到最初的遗忘的问题,当我的记忆模糊时候,原先清晰的思绪也变得模糊,但是难道不可能原先因为过多的干扰导致的错误的思路因为去伪存真而变得清晰吗?仿佛大浪淘沙一般我的思想经过了风吹雨打的考验存留下来的也许是大自然的真谛,也许“借我一双慧眼把你看得清清楚楚”应该改为“请给我时间让我忘却你的好与坏”,自然当你忘却了一些“应该”忘却的记忆,世界就变得如此的可爱,不是吗?很可惜我无法忘却我现在还没有吃饭,我无法忘记我还是饥寒交迫地生活在异国他乡,哦,不对既然我已经准备入籍了这就是我的家乡,我怎么差点把这忘记了,我应该忘记我曾经在梦中梦想过的我在遥远的中国生活的时候可能会过上的荣华富贵,这样我会感觉好一些的。顺便说一下,我一向认为遗忘是计算机实现抽象的一条可行的办法,你忽略一些属性以后然后再对两个class进行属性比较你会发现它们本质上是一样的,前提是有意识地忽略或者忘记另外一些属性。我能否忽略我的低级神经中枢的对于食物以其他的一些请求呢?我好像就是不能忘记我还没有吃午饭,冰箱里面也没有什么好吃的,为什么我不能忘却应该忘却的?我以前在日记里面说从前的科学家说科学是一个严厉的master,那么在我看来computer science简直是一个冷酷无情的master,我始终无法忘却这辈子我都应该应为这个残酷的master而忍饥挨饿,对于还没有发生的事情我能否忘记呢?

十二月三日 好像早晨在下雪

看网上电视里《我爱我家》总是吃饺子,馋得我央求同屋的捞着一起包饺子吃,吃得撑了就费了很多功夫写这么一个无聊的ID3算法,这个算法很简单但是很有效,恨我一年前的想法很像,因为非常的intuitive,一般人都能想得出来,不过我认为最神奇的inductive的基本原理都无外乎如此,在比较异同的过程中发现变量与常量,实际上人工智能的精髓就在于找出pattern以便减少搜索的范围,当然从哲学的角度来看,我也同意书本的说法,这种所谓的学习真的没有学到什么,因为这些结果都是从原来的knowledge  base可以直接推理得到的,只能算是一种对知识库的refinement而已,然则真的有什么样的天才可以从虚无中悟出真理吗?按照马克思主义哲学来看不可能有先知先觉的圣人,那么人工智能如果要去追求那种超凡的智能很可能是一种失败的尝试,因为我以为所有的结论都是或多或少从从前的基础中获得的,换句话说应该是一个可以从当前知识库中进行resolution-refutation可以得到的,只不过当我们对当前的KR的定义有不同而已,比如在学习数学分析的时候,有不少证明我认为我可能一辈子都无法想到的原因是老师的证明完全跳出了当前的context,比如让你去证明微积分的问题,结果你有一种线性代数或者几何的方法来证明,这算不算是天才的想法,但是仔细一想,其实也没有什么只不过你不会把当前的搜索范围扩展到整个数学的范围罢了,从这里我们可以看出其实你永远不可能想出你没有接触过的方法,只不过是直接或者间接而已。由此我在想象人工智能这样的学科在西方的研究领域里,在没有大的哲学思想的引导下走入歧途时很可能的结果,也许我应该抽空去loyola看看马列毛斯的关于人类认识方面的著作。

十二月四日   晴,干冷

因此,你要问一个人的前途在哪里,一个民族的前途在那里,一个种族的前途在那里,一个星系的前途在那里,一个进化体系的前途在那里吗?在发展中。。。在进化中。

十二月七日   晴,阳光灿烂地让人心醉

写程序也许是治疗失眠的良药。磨蹭了好几个星期来有心情去改正alpha-beta-prune里的一个简单的bug。为什么?也许是觉得有些失败吧?

十二月十三日   早上好像下过雪?我不记得了

《大话西游》实在是很难理清其中的来龙去脉,其中的时空因果的交错完全是一个所谓的无理头,逻辑与时间有着某种深刻的联系,正如同逻辑与几何关系之间某种偶然而又必然的关系一样深不可测,昨天在睡觉前模模糊糊看了半页纸的“数理逻辑”其中说到某些公理其实和其中的wf的具体内容无关,是无条件成立的,由这些“公理”可以沁出无数的新的公理,也就是generalization。我印象中在AI课本里类似的动心叫做"substitution",不知道两者是否是一回事,实际上再说一遍陈词老调:数学的普遍性使得他在各个领域以不同的面貌出现。然而如今我看到的却是比数学更加普遍的“类似于”公理的公理,这实在是一种模模糊糊难以捉摸的感觉。我的记忆力越发地衰退了,以至于我有时候幻想我可以忘却饥饿,忘却我只是一个想成为somebody,想要做something,但是又懒又平凡的凡人。

graphic的project也许是我目前最难以启齿的一个,我的同伴完成了大部分,而我仅仅做了一些似乎是微不足道的工作,无非是飞行控制系统,(比较麻烦的是怎样让飞机总是沿着当前机身的方向前进而不是x或者z轴,我当初的想法被证明是一个错误的尝试,因为我当时想以两个向量加一个坐标来表示飞机的位置及姿态,但是向量的计算是一系列的线性方程组的求解,这是很麻烦的,因为有很多分母为零的问题,并且将来旋转的平滑过渡是很麻烦的问题,最终还是要回到角度定义,因此又何必用向量呢?)现在我回到了角度的方法证明是对的,要描述飞机的位置及姿态,你需要一个坐标和三个角度,不过,三次旋转中的第三次有一点点地技巧,否则会有莫名其妙的效果。碰撞测试的算法其实非常的简单,就是应用两个响亮的内乘积为其夹角的余弦来求解点到直线的垂直距离,我为了定义子弹的飞行用类似飞机的飞行控制参数及一个坐标加三个角度,在家上一个启始时间。爆炸的模拟就更简单了,无非是把碎片当作子弹一样处理了。相比之下我当初的好高骛远的设计想法实在是太好笑了。

刷牙的时候忽然回忆起我以前的想法,世上本无所谓逻辑,逻辑的本质不过是状态中deterministic的表现,因此,我们才会看到逻辑存在于万事万物间,并非是万事万物有逻辑的存在而是万事万物中我们唯一可以认识的就是这种deterministic的模式,因为,知识就是信息的压缩形式,只有deterministic的压缩方式才是可行的方式。由此看来,可以对于道德经的开篇作更深一层的理解:道之为道就在于道存于无形,而任何有形之算法都不是真正的“元”算法,那个可以产生所有算法的算法从来就不是什么真正的算法,因为“元”算法如果可以入普通算法一样的表达他必定不能产生所以的算法,这似乎有一点点Gudel的incomplete theorem的味道;名之为名就在于它不能“名”自己,因为能够命名万事万物的“名”是不能够有形的,否则必然有他所不能命名的“名”。诚所谓“道可道,非常道;名可名,非常名。”

我想我唯一可以有希望成就的是一个哲学家,因为按照《围城》里赵辛楣对于哲学的评价就是:“在我们这些做实际工作的人的眼光看来,学哲学跟什么都不学全没有两样。”正如同中华文化历史中被世人津津乐道的糟粕一样:既无法证明它的正确,也无法证明它的错误,不立文字,意会言传,因为但凡付诸文字就有推敲的可能,有了被反证的机会,所以但凡颠扑不破的真理从来不敢真正写在书里,写在书里的都是从这些所谓公理衍生出来的定理。(以上这一段纯属无理头的胡诌,真正有意思的是“圣经模式”,所谓相信上帝的人都是被耶稣的所谓“奇迹”所说服的,但是这些“奇迹”又都只存在于圣经里,因此,圣经是典型的用圣经来证明圣经本身的正确,和我以前所说的用马列毛斯来证明马列毛斯自己。)

十二月十四日   今天和昨天一样的冷

互联网的技术在改变着人们的生活方式,这几天再看PLU的网上电视直播,实在是一个我当初做梦也没有想到的媒体传播形式,不知道PLU直播是什么吧?星际个人联赛。

十二月十六日   今天一大早醒来以为起雾了,实际是漫天的大雪

今天完成了我负责的部分的报告,我想还是有些价值的,或许对于飞行控制,及碰撞检测的简单算法是有保留价值的。

看PLU联赛的间隙瞄了一下新闻,感觉有两个值得注意的问题,一个是WTO的前途问题,一个是中国对于农民的生存的问题,这看似很遥远的无关的话题实际上是一回事。早在很多年前,我们那位姓朱的总理就采取了长痛不如短痛的办法,预见到了今天无法避免的严重问题,想想看发达国家仅仅百分之几的农民对于GDP贡献不大的农业却要提供巨额的补贴是为什么?是因为这是一个国家的战略利益之所在,中国难道不是供重要吗?想想看好记忆的人口要从土地上,农村里被赶到城市里作贫民,这个社会变革还小吗?当初的英国的资本主义原始积累是让羊吃人,今天不过是换成了美国的棉花,加拿大的土豆之类而已,GATT的存在正在越来越受到怀疑,这个问题是我那时候的毕业论文,当然我和今天的大学生写论文并无二致,只不过摘抄一些别人的观点,加上必要的注释形成自己的看法,拼凑成一篇字数合乎要求的所谓论文,不过其中的引语还记得,所谓GATT(关贸总协定,即WTO的前身)不过是一个富人俱乐部,真正的穷人是来看富人间勾心斗角的热闹的表演的,正好像《围城》里说的洋车夫把客人拉到饭店门口别指望能跟着进里面吃饭,照样回家喝西北风罢了。这也不难理解世界上的区域经济越来越兴旺,各个大洲都是关起门来拉帮结派划地分赃。全球化虽然不可阻挡,但是区域经济组织的发展必定能起到抗衡的作用,甚至最后世界的大战时在不同贸易组织之间进行的。想起什么了吗?《星球大战》不就是这个意思吗?正如《围城》里说的巫医神汉信口开河却往往一语中的。我虽然不信占卜之类的无聊的动心,却也和书里面的张买办一样相信自己有hunch,往往能看到事物的本质与潮流。中国在十年到十五年间将完成资本的原始积累,并且新兴的民族资产阶级将完成本阶级代言人的选择与培养,中国的政体将开始彻底改变,数以亿计的农民将失去土地成为真正的城市无产阶级,而发达国家的经济危机将在一次更加深刻的技术社会革命之后发生,一个对于世界经济严重依赖的中国要么轰然倒下,要么挑战世界的霸主,过程与结果都是无法预料的。

十二月二十日   今天一大早醒来发现我又过了一个庸庸碌碌的一天

对于一个只有starcraft或者diablo这样的任务的凡人是否应该承受空乏其身,行弗乱其所为的折磨呢?答案是对的,因为那只是一个必要条件,平常人都会经历,只不过只有非常人才会动心忍性增益其所不能,我没有增益我所不能充分证明了我不是那种非常人,因为我宁愿挨饿也不愿意费精神询问一下我的贷款为什么没有下来。

关于事物的证明我忽然想起了我在云游期间碰到的两个西班牙人,其中一个应该是学生物方面的,它的一个经典的论断是:当有人问你一个为什么的时候,直接回答他为什么不?这真是一个世人的俗套,因为当我在学computer architecture的时候,那个不学无术的家伙就是这样做的,我问他为什么相对地址在程序里面有着更重要的地位,它的直接的回答就是难道你认为绝对地址更重要吗?这个答案当然间接证明了什么不过这是一个trick,一个不需要有任何先决条件就可以作出的放之四海而皆准的trick。当我们要认识一个事物的时候,最直接的办法反而是认识事物的反面,这真是彻彻底底的irony。难道不是吗?当我们给一个爱问问题的小孩子穷追猛打的时候我们不是常常这样用什么是男人来解释什么是女人,或者什么是大的来解释什么是小的。也许其中深刻的内在是我一时无法体会的,但是也许直接的答案是指一类的概念往往是有某种对称性,如果你把是与不是也成为对称性的话。另一个直接的引申是概念的定义又时候就是内涵的范围划定,那么当我们用否定来定义一个事物的时候无形中就划定了概念的内涵,因为根据the law of excluded middle和the law of excluded contradiction,逻辑就是非此即彼,不能模棱两可,当然我承认这种形式的定义和严格的定义相去甚远,因为真正的recursive definition一定要定义一个terminal的例子,而这类定义是一个mutual recursive definition,即A是由!A定义的,!A又是由A定义的,永远没有一个头。当然骗骗无知的幼童也许是可以的。不过这其中真没有什么深奥的东西吗?在学design and analysis of algorithms的时候,老教授证明A=3是这样做的,证明A<=3 and A>=3,很明显这两个同时成立的解集的交集是A=3,这里面也许有什么数学上的逼近的思想,不过间接地看这个关于证明的问题,就是当你肯定你知道一个事物的全部的时候当且仅当你也知道这个事物的对立面,否则你一定会在这个事物与其对里面的边缘徘徊着不知所措。假如这个时候你被一个恼人的幼童缠着问什么是这个东西的时候,不知所措的或者不以为然的你都有可能回答他这个东西的对立面就是它的否集,不知道你自己的conscience是否会躲在角落里冷笑。

十二月二十二日  又在下雪

现在除了天天盼着PLU的直播就是用骡子下载电影电视剧,又看到了《编辑部的故事》,过了这么多年才发现从前的日子是多么的值得回忆,那个时候的人心里想的是多么的简单,单纯,忽然记起了当年的葛玲曾经是我的偶像,一个知识女性,受过高等教育但又对于世俗时尚充满小市民的憧憬。

上了三年学终于又明白了一个最简单的道理,勤奋刻苦往往是成功的最基本的保障,我现在可能最缺的就是这个。

晚上老张请吃饭,和两位大牛加上一头小猪彻夜长谈,请教计算机中的一些问题,获益良多,很是高兴,比如再次总结性地明白了计算机并行处理的三种模型,线程级,比如Hyperthread,指令级,比如pipeline,向量级,比如MMX。等等。

又明白了一个真理就是我今天肯定是比以前学懂的东西要多得多,而感觉经常碰到比自己强得多的人的原因不是自己越来越笨或者自己越来越谦虚而是越学得多你会知道自己懂得越少,你看到的别人懂的东西越多,比起两三年前什么都不懂的时候自我感觉还最好的时候相比较长进了一些。

下午又开始看从前的课本想要明白怎样判断两个语言是否相同,除了画DFA并化简又没有别的办法呢?并且语言不是regular的怎么办呢?

十二月二十五日  不知道是什么天气

昨天晚上被拉到大教堂看弥撒,坐在那闭着眼睛就想睡觉,因为听唱诗班在巨大的管风琴伴奏下宛如天使般的歌声真是一种美妙的享受,当然我对于音乐的评价一向是以多块让人入睡为标准的,从这点来看教堂的圣歌当属第一,我睡得很香,不过我不认为这是对上帝的亵渎,因为我本来就是一个无神论者,来教堂只不过看看热闹。

今天包饺子请了两三个同学来吃,神聊了一下午,因为我冰箱里什么都没有了,(原来也没有什么可以吃的,哈哈)只好不留大家吃晚饭。这就是我的圣诞节。

                                                                    二零零

一月四日  天气不算坏,大街上的霓虹灯显示着零下4度

早上去参加所谓的citizenship的考试,再过一个月就算是这个国家的正式公民了,只欠吃饭时候浏览的那些垃圾中文报纸里有一篇文章也是写公民考试,题目是《归顺》,一幅酸溜溜的仿佛天朝大国的臣民跑到从前的附属国当二等公民的心情一样,真是典型的阿Q精神,入乡为何还不随俗,当“白雪枫叶”国家的子民有什么亏待的呢?虽然是穷困潦倒可也算是生活在the most fertile country in the world,这是我在考试完后等待的时候看到的宣传移民的广告上的口号。

去年的这个时候,当我犹豫不决地想着我的年终总结的时候曾经总结出所谓的国际惯例中的那个“惯”字既是习惯的“惯”字,也是惯性的“惯”字,也就是说一件制度的形成往往如这样习惯成自然,从一开始的偶一为之到后来的一发而不可收拾,不过,中间必须经历过一个能否持久地考验期,但愿一个好的习惯能够在朋友的监督下不至于太快地夭折,那么本周么完成,如何?(现在在报告的截止日开始写作似乎成了我最近养成的坏习惯,虽然这也是入乡随俗的一种表现。)

每当我在忙得不亦乐乎的时候总是期待着将来有一段完整的空闲时间来做很多我想做而做不了的事,可是当这个时刻来临的时候我在干什么呢?天知道过去的十几天我是怎么生活的?洗澡的时候想起了从前听说过的希腊神话“奥德赛”,其中希腊英雄乘船返家的时候路过海妖的岛屿,俄底修斯知道没有人能够抵御海妖得歌声就让水手们都塞住耳朵,并把他绑在桅杆上,这样虽然海妖得歌声是那样的令人抗拒航船照样向前驶去,我想连半人半神的希腊英雄也无法抵御一些世俗的诱惑,世上基本上没有什么人能靠个人的毅力坚持自己的信念很多年吧?也许那些真正执着的人都有一些束缚防止自己觅食灵魂吧?

一月五日  又是大雪纷飞的日子

早上去买书又花了两百多刀,心里很有点心疼的意思,不时心疼钱而是心疼自己万一又没有读书才让人心疼。冬季的学期我的运气总是比秋天要好,好比苏联红军总是在夏秋防御而在冬季反共吧。想起了我对于java的一窍不通好比《围城》里说的学旧体诗的干预说自己不懂新体诗,而学写新诗的决不敢说自己看不懂旧体诗,学c++的人总是敢于盛气凌人地宣布说自己不懂java,或者不屑一顾地说我不学,而学java的似乎不太敢这么反过来说,因为java实在是傻瓜化的多余了一点,当然我试着装了一下visual2005也是一样地感觉,程序惊人的庞大笨拙,我得可怜的机器几乎停止了,没办法只有卸载。

一月九日  又是又是大雪纷飞的日子

去年的总结是迟到的,今年的也许该说无可奈何的了

有同学来要AI的资料,让我又勾起了一段伤感,本来都已打算盖棺定论的句号又被临时改成了逗号,不,实际上是顿号,因为仅仅是短暂的停顿而已,并不会从此变成惊叹号,当然在外人看来这一切不过是遗传的问号,明天再结束的军号后面再添加两个中国式的军号就变成了尽在不言中的省略号。。。

晚上终于下决心把去年的衣服全部送到洗衣房去清洗,当然最主要的原因是一个下午的“学生骑士团”浪费了无数的光阴,强迫自己去洗衣房看“组合算法”。这门课看了个开头却总有相见恨晚的感觉,从前我曾经苦思冥想过的种种问题其实都在这其中,甚至我念兹在兹的窝自己眼中的AI的问题也都在这里面可以找到答案。然而我又有些困惑,照教授和作者的说法这方面早就是计算机界的经典领域,自从上个世纪70年代后就已经有了定论,据说此方面的书甚至都只有那以前出版的。我曾经看到一种评论说,天才Erdos所感兴趣的大部分问题都是这个领域的,据说其中很多是死算机科学的奠基石,或许大师把后人的工作都干完了。

《Blade Runner》究竟有多少种结局呢?这部电影是我个人认为的最经典的几部科幻片之一,其成功之处在于电影的音乐与画面,在没有CG制作的时代这个是绝对的经典,其中更有一些时代的痕迹时非常有意思的,那时日本正是如日中天的鼎盛,打油买下整个美利坚的气概,影片中处处露出美国人那种不满又无奈的心情,洛杉矶成了东方人的天下,到处是象形文字的广告和标识牌。

《The Island》(逃出克隆岛)可以说是带着深深的DreamWork的制作痕迹,这几年他做的一系列科幻片几乎如出一辙,《Pay Check》,《Minority Report》,《A.I.》。。。甚至在很多特技上你都可以看到相似的影子,题材的住址(theme)大都是一个:科学进步的成果如果被滥用会怎样?当然西方社会的科幻片绝大多数都是阴暗的调子,充满了对未来的恐惧,《The Day After Tomorrow》,《Water World》看到了人类对气候的影响导致灾难的降临,《The Time Machine》里面反映了人类对自然规律干预所带来的backlash,在六七十年代对于宇宙飞行的热情消退以后,科幻片似乎成了灾难片的代名词了。

一月十日  又是又是大雪纷飞的日子

我想去桂林

组合算法的书实在是比较的艰深,看起来几乎是逐行的证明,当然比起数理逻辑的通篇符号推导还是容易得多,那种书我在图书馆看到几乎都是剑桥的天才写的,这方面还是老牌名校强过美国的名校,因为美国主要是有大公司在背后撑着。好像一个小时就看了三四页。

我整天都在用电驴下载电影,它的图标很有意思,就是一直蒙着眼睛的懒驴。俄底修斯如果没有被绑在桅杆上是过不了海妖统治的海域的,人如果不像驴子一样被蒙住眼睛在这个五色使人目眩,五音使人乱耳的世界里是不可能拉磨的。

在所有的007系列里面我只喜欢一部《The Living Daylight》(黎明杀机),罗杰姆尔太过于老态龙钟,虽然是一个英国绅士的派头,却和间谍的身份不符,皮尔斯虽然有相貌有气质,却过分英俊了些,表演的成份太多,因为间谍的相貌首先是大众化的脸谱,只有提摩西达尔顿让我觉得合适,同时这部戏构思完备,跌宕起伏又不失真实,再加上其中的主线是反对当时前苏联入侵阿富汗的正义之举,因此无论艺术性还是思想性都远在其他剧集之上。当然我在大学的时候喜欢那个女演员,就是那个拉大提琴的莫斯科音乐学院的女学生,多年之后才知道她的名字叫做玛利雅德堡。

下午看大决战很受鼓舞,指挥员的决心和毅力往往是战役胜利的保障,于是下定决心从今天开始每天晚上去图书馆看两个小时的书,就算是在那里睡觉心里也比较踏实。晚上看了一个半小时的书睡着了两次,这本分布式计算设计的书实在是空洞,至少开头部分都是写在纸前网络那门课里面学过的,到最后十分钟才看到比较有趣的RPC,感觉和我那个时候在“正航”做得那种DCOM没有什么区别。回来的路上想到当时教网络的老师,至今我仍然心存感激,在这所名不见经传的三流大学里我还是着实地学到了一点点皮毛的,其中有很多教授都是那样的诲人不倦严谨认真。不小心又看到两个小留学生,门面全部用白粉刷过一遍,妖冶的好似Van Helsing里面吸血鬼的情妇一样。:)

一月十一日  不是大雪纷飞的日子

做了一个很奇怪的梦,忽然糊里糊涂地进了城堡,一个完全陌生的城堡,城堡的主人根本没有见过,也根本没有怎么说过话。看到Java里面的所谓BufferedReader期限完全不理解为什么要这么多此一举看了两三遍说明才恍然大悟原来就是类似于C Language里面的library中fgetc的意思,这个东西在学comp444时候最有体会,还自己写过,这样看来Java也不都是傻子,这样的包裹方式也还是挺有意思的。

一月十五日  终于迎来了严厉的天气

来到加拿大才知道写报告的重要性,似乎中国的大学很不重视这方面,结果我总是在这方面吃大亏,前天comp495的报告差一点就被否定了,因为我那根本就不像是报告,简直是一个小小的summary。反观这里的同学写报告无不非常认真,各是有其重要,而且不管怎样一定要加上一些图标,table index, figure index也很重要。今天被小皱交到实验室学习,还是有一些小小的收获的,有一段时间没有玩c++,编程的时候有些翻来覆去的,想法多了路子多了,考虑得多了,反而变得慢了。以前不知道怎样定义一个数组类型,现在也知道,其实和函数指针类型的定义很像:typedef  unsigned int Set[20]; 以前不知道什么时候留下的概念一直认为short是8个bit,真是好笑,今天才发现是16bits。

一月十六日  天气变得更加严厉

今天冒着严寒去银行把政府退给咱的几块钱存到户头,毕竟对我这样的人来说钱是非常非常重要的,顺便去实验室下载安装MPI/LAM,我实在是搞不懂是否我可以在任何一台服务器上使用MPI?并行处理对我来说好像是天方夜谭,cluster对我而言是圆的还是方的?当然也明白了一个很幼稚的问题,学校服务器上面有一个文件服务器叫做www,在上面的文件时可以webpublishing的,我以前一直以为只有alcor才是唯一可以网络发布的,看来对于网络来说我的知识比普通专业的多不了多少,努力学习吧。为了使自己振作起来,我决定去健身房办一张卡,毕竟一个月40块钱的YMCA会员的消费超过了我的经济能力了。昨天,杨大虾给我讲了一些东西,只觉得非常的清楚,但事后好像忘了很多,什么MPMS,SPMD,SIMD。。。我对这些还是非常的陌生,看看MPI的接口说明感觉很多都好像是同步的东西。handle,communicator从那个函数获得呢?不对称的网络是不是也可以使用MPI呢?PVM是什么碗糕?我现在记忆力下降的速度几乎是exponential,因此把我要做的是倾泻下来吧,我准备这个学期学会emacs或者vi中的一种。(这样的雄心壮志要被所有计算机系的学生笑掉大牙的。但是我确实不会,只会用pico或者nano。)

晚上去图书馆看书的计划只实行了一天,我现在几乎就是hopeless了,那么今天晚上在坚持一天吧。

一月十八日  天气阴沉沉的

学校图书馆的书借了很久都没有看过,书非借不能读也的借字不是从图书馆借的。今天翻了一下design pattern,因为杨大虾说OOP有三种境界,class-->pattern-->??我忘了,反正我现在还是在第一层或者一二层之间也不用关心最高层是什么了。我对于这一类极高的抽象的东东的看法是你绝对不可能跳跃式的学习,不要以为最高层的武功威力最大就从一开始就学最高层的武功,实际上武功都是连贯的,你没有钱一层的基础根本不可能理解上一层的设计,否则只是纸上谈兵是的卖弄名词,这类人可能你每天都能遇到很多,口若悬河实际并不知道怎么去做。我的体会是那些pattern也不是什么天上掉下来的不过是些代码写多了总结出来的,而它的真正意义是在于一种程序员之间的共识,大家能够很快地交流,也就是说有了共同语言可以一点就通,所以这本书说实际上有时候设计这些pattern的名字是一件更难的事情(这也许是我杜撰的,我是这么认为的,携带马的时候我在给方法其名字上画的时间非常的多,有时候为了把心爱名字保留给最合适的方法费了不少心机,也许学过软件工程的知道团队必须有共识,共同的语言,大家有共同的vision,对我个人也是一样,一个月以后我回头看我的代码我感觉如果是看别人的一样那就是失败,但是如果名字起得好,我很多时候甚至重写一遍都写得差不多。)不过,闹笑话的是我看到那些pattern以后很高兴,就拼命去找有没有源代码,后来google了一下觉得我还是没有理解真谛:framework是一个设计好的架构,是别人想好了方法名字流程,数据流,你自己往里面实现具体的代码,当然你是可以找到这个源码的。可是pattern仅仅是一个设计思想,超越了framework你怎么需要真正的源代码呢,他仅仅是一种设计思想,你可以找到范例但是你绝不应该有现成的源代码呀!否则不就成了library了吗?书上说的library和framework的比较很生动,library是更侧重code-reuse这方面,它是尽量地不涉及设计部分,而是一些最基本子常用的底层方法的实现,应该有着最少的assumption从而有着最广泛的重用性。这正好跟framework相对,因为framework是设计好的架构却没有具体的实现,一边又最大限度的设计重用性。写到这里我突然想起来了三种境界是:class-->framework-->pattern,总之我大概就刚从class浮上来的途中吧。但是并不能说这三个东西是迥然分离的,实际上人的思想从来不可能绝对地停留在一个层次,这些最高级的抽象是低级实践的总结,比如classfactory的想法我很早就实践过,那个时候想写一个深度搜索的“套路”,(DFS)就写了一个框架,因为DFS和DFA很像,无非是定义出所有的搜索选项,以及目标条件,然后或者用递归或者用循环去搜索,并输出结果,当时不想把类的名字写死(hardcoding),就用一个指针代替,让后来的人自己定义产生类的方法,当然你可说这是纯粹的继承,但是本身pattern就是一种设计思想,具体用什么实现方法并没有限制啊,也就是实现的设计。不知道这样总结pattern是否正确。

顺便说一下,小时候看的电影《未来世界》之前确实有一部《西部世界》。现在看六七十年代人们对未来的想像很有意思,你可以比较一下那些人们预见的是对的,哪些到现在也还是幻想。

一月二十日  天气暖和的不得了

新闻上说莫斯科遇到几十年不遇的严寒,蒙特利尔确实我来的这几年里最暖和的一个冬天,简直和厦门的冬天感觉一样,下午单单看着那明媚的阳光如果没有注意到地面上的积雪那就是厦门的气候了。整天在下载《古钿任三郎》来看,感觉很是心驰神往。

另外下载了一个<TLS>的另一个结局,是一个皆大欢喜的结尾,两个主人公各自有了新的生活,不过总是觉得还是原本悲剧式的结局更加得艺术化一些,所有的问题都不作解答,观众可以做任何的猜测想像,而这个另类的结局仿佛为了满足观众的好奇心与怜悯心所做的一个安慰剂。一个由这三个句点组成的省略号被导演进行了一番挖掘演绎,一个变成了问号,一个紧接着的惊叹号,其间穿插了若干个逗号,顿号,在一系列的似曾相识的引号过后,(都是一些可能在那里看到过的吧)突然一个破折号引出了一个大大的句号。仿佛两颗原本在各自不想干的轨道上运行的行星在一个偶然而又必然的时间地点不期而遇,在即将擦肩而过的瞬间彼此因为对方的万有引力而被吸引,在俘获对方的同时也被对方俘获,从此变更的轨道在继续近似原本的公转轨道的同时还成为彼此的卫星,在互相的卫星式的旋转的同时多多少少保持原来所剩无几的自转。然而这种混合轨道的旋转的不稳定性导致终于有一天彼此卫星式的旋转的离心力大于彼此间的向心力,其中一个卫星不知是因为原本的惯性还是因为另一颗恰好路过的行星的吸引力脱离了这个不稳定的系统,结局大约有这么一些可能性:1。两颗脱轨的行星彼此都和另外的新的行星组成了一个相对稳定的卫星-行星子系统;2。其中一颗与其他行星组成了新的卫星-行星子系统,另一颗恢复到了最初的轨道继续无休止的绕太阳公转;3。两颗脱轨的行星都恢复到了当初的轨道期待着下一次的捕获与被捕获;我们现在看到的<TLS>的结局应该是第二种,男主人公组成了一个稳定系统,女主人公留下了很多的未知数,然后突然在消失了三年后,三颗行星在大街上相遇了,在短暂的重逢中并没有回答女主人公的结局是什么,一般的猜测是至少目前还是在公转中,然后片尾音乐结束了故事。我看到的下载的这个结局是近似于第一种情况,主要是花了半集的篇幅交待女主人公怎样自觉自愿地重新被另一遇到的行星捕获与被捕获,悬念没有了,味道也淡了很多。大凡情理之中意料之外的事情是本有可能性,智者察之,因势利导之,于无声处听惊雷。

今天吃多了就去了健身房,资本主义残骸劳动人民的办法就是让你穷得顿顿只能吃肉,好像养猪场的饲养员一样的残忍,不要以为我是在说笑话,你只要看看这里的中国人总是买那些特价的食品就知道这实际上等同于用最少的饲料喂肥一头猪一样的功利主义。我不想成为这样的受害者,因此我决定少吃或者不吃。就好像为了避免死读书而拒绝读书一样。

Unique factorial representation.

一月二十三日  天有些阴郁

《古钿任三郎》似乎也走到了它的尽头,那个经典的谜题被揭开:对面走过来一个男人头顶上还顶着一个红脸盆。这是什么意思?我想绝大多数人都猜不出来是什么意思,因为这是一个应该为大多数人所熟悉的问题,那个男人一边小心地循规蹈矩地走着一边又要小心翼翼不让两盆里的水洒出来,为什么不把脸盆放下走路呢?这个红脸盆是编剧手中的《古钿任三郎》,是大多数男人手里的未完成的事业,是不可能放下的,因此虽然编剧也许觉得无法在继续,在观众的要求下,应该也会再次向福尔摩斯的《归来篇》一样让这个侦探复活的。

我的中文名字被google特异地删除了,真不知道这是一种特别的轻蔑的抬举还是一种技术上的垃圾清除,总之,我觉得非常的不可理解,搜索引擎会这么无聊吗?也许他觉得我无聊吧?不过,我再次简单验证了一下,情况是这样的,google是按照这个人的社会地位来决定搜索的人名是否应该被留在索引中,比如我妹妹和我都没有资格上索引,我爸爸就可以,这就是google的商业策略。

晚上玩了一小会儿MPI,感觉不会比socket programming更难,当然这是因为别人作何太多的工作,我只是当了一回傻瓜罢了。如果没法运行,mpiboot,编译mpicc -o target source,运行mpirun -np number exe,本机运行mpirun C exe。我猜想是不是每台机器上都是有这么一个daemon在运行,否则你怎样启动远程的机器呢?

GrayCode a与integer b的转化可以这样a=b^(b<<1);  b=for(int i=1; i<sizeof(int); i++)a^=(b<<i);

下午去实验室睡了一觉很满足的,主要是一个同学要我去给他一点帮助,否则我才懒得去实验室呢。顺便把latin-square的搜索改了一下,也就是说所有的搜索问题都是这样:一个按一定顺序产生所有元素的机制,一个用以检验所有产生的元素的判断机制,其中可以作适当的优化,比如快速跳过不合格的元素的机制,那么你就可以在判断的函数中输出你的结果,这个中心思想就是线形的bruteforce搜索,关键是怎样产生所有的元素的方法。Combinatorial Algorithms可能是我寻找了许久的方向吧,事实上计算机最基本的binary representation里的two's complement, one's complement等等都是来源于这个领域,自然数的表达的本质也是来源于此,可以说就是按照什么顺序排列subset的问题。这个pattern够不够普遍了?!!!

我今天把头剃了,希望头发短一点,见识能够长一点。现在总是振作不起来,比起从前的想得比说得多,说得比做得多还不如,现在干脆不想也不说,更不做,每天活得比猪还幸福。

一月二十六日  天好像下雪了

让C++程序员来写java需要多长时间来学习?我想需要至少四个小时的学习吧?(夸张了吧,前提是你对java一窍不通。)但是有些东西可要小心不然你会怎么也想不出来的。一个class一个文件,package是目录名,import=include不过要换成package,所有的变量名都没有分配内存,java里面没有静态变量,因此,C++程序员总是会忘记用new给变量初始化,constructor你要老老实实地加上空挂号即使没有参数,所有的方法都封装在了一个一个类里面了,因此你要证书转字符Integer.toString(int),在windows里面最好设定环境变量为classpath=你的工作目录,在java里面exception如果忘记catch编译器不会放过你,这一点倒是比较好,C++的const被换成了final,你想要用传出参数int&,对不起primitive type都是传值,你只能用对象,不过在RMI里面的参数你必须要用实现了Serializable interface的类,我因为不知道这个照实地迷惑了半个小时,后来打电话问了两位大虾才有了一个眉目,本想自己去实现,稍微读了一下sun的介绍就赶紧放弃了,没有想象的那么简单,还是用String代替吧。总之,用一句从加拿大学生那里学到的英语就是java sucks。

一月二十八日  天晴了,不下雪了,晒衣服吧

昨天在实验室里耐着性子折腾了一下午,最后发现RMI很傻的,根本没有办法做到remote transparent,而我已开始天真地以为可以在RMI参数里面传引用以便作为传出参数,实际上这是有前提的,第一是一个RemoteObject以便在远程建立一个stub,然后。。。我当时没有写下来现在就全忘了。

一月三十日  天好像又下雪了

不知道为什么心情总是有些沮丧,半夜里从梦中惊醒居然是自己成了电视剧的主角,而那个OL似曾相识,然后开始怀疑自己的记忆,究竟作业的deadling是不是昨天,慌慌张张地提交之后在确认自己是杞人忧天。想起了rmi的registry不仅有些感慨,随便有个名字就可以bind,居然可以把这么复杂的通讯任务简化到只靠媒妁之言的地步,而DCOM里还要用一个唯一可识别的guid,bind 的随意当然也就导致了可以非常容易的rebind,unbind,而且sun.com上说得即便getRegistery了也不代表远程的success,你还是要进一步的验证。

想到和supervisor的appointment,就开始为那些个不可能的任务辗转反侧,仿佛要重新设计新的programming paradigm一般,distributed&parallel是这样的复杂,你却还要在这复杂之上拨云见日理出头绪定下规则,这简直比对没有任何可预测性的人性进行预测规范还要难上加难,因为一件工作如果是绝对不可能,那么反而是一件最简单的任务,反倒是看似不可能实际上又有一丝可能性的任务才是难上加难,因为你不能说不能,可是真的去做实际上比不可能还不可能,人力总是有所不足。昨天一直想把作业贴上,说起来也许没有多少编程的量,可是毕竟是第一次用java些个像样的东西,以前唯一接触过这个语言的是老师给的code,让你填空找错,当然那个也不容易因为是多线程的东东。鉴于是第一次学习一门新的语言,给一颗星星以资鼓励,总的来说也不能说很简单毕竟是用rmi实现一个client-server,自己写一个toy的象征性的database,也考虑一些synchronization的问题,因为rmi是可以multi-thread的,我当时对于java的众多的static method是否thread-safe问题总是将信将疑,得到的信息也有些不一致,当然最后我还是倾向于tutor的意见,只要sun的程序员不是白痴就应该保证这些static method绝对不会用到global variable,那么temporary variable是存在每个thread的自己的独立的stack里的,虽然众多的thread共享一个static method,但只是共享一个code or text of code,没有data,这都是些只读的东西,每个thread仅仅维持一个instruction pointer指向某一个instruction,context switch回来还是一样,不会有什么问题,而我记忆中的Linux的library的没有thread-safe的tempfile,random number之类的函数是因为用到非temporary的变量,可以看作是global的

后来我猜想我的烦恼可能就是别人弃之如敝褛的我却求之而不得。

去学校实验室看到同学用JDBC通过ODBC连接数据库(Access),这里面有一个Java非常强大的东西,就是从class Class的forName方法动态获得类,这个东西好像delphi里面也有就是所有的类可以通过一个“元类”(meta class)来寻找和构造,只要你给出名字,这样像java这样的动态系统才做得到,是的动态链接变得无比的强大,因为这比接口还要广泛,当然比接口还要慢不知道多少,不过这些有一部分是我的想象,应该差不多吧。另外一个就是关于两个thread执行一个synchronized RPC等效于一个thread执行asynchronized RPC的问题,应该是让两个request金可能同时发出以便不让较快的server空等。

 杨大虾提到过的所谓reflexive,我现在也明白了,应该就是利用Class class的forName()方法去获得一个类的指针,然后再利用getInterface方法获得它所实现的接口吧?这个听上去好像是interface unknown的最基本的三个Interface之一啊,我当时实验的时候挺高兴,以为发现了什么新东东,一写下来才觉得这不就是所有接口原本就有的吗?COM里面支持vb的接口调用不就是这样的吗?这应该不算是所谓java所独有的吧?应该是别的什么的利用java动态执行其可以获得类型的特性,也就是RTTI(run-time-type-information)。

MPI看来是没有想象的容易,毕竟这种程序要比socket-programming难一些,因为是SPMD有很多地方的code要写成多个process运行的,虽然没有同步的问题,可是毕竟是远程的。要记住c++的编译器是mpic++。晚上在实验室通过了compilation,当然还有逻辑错误,不过我想溜到明后天吧,晚上回来觉得有些兴奋就写了一个用thread来测试mutual exclusive的测试,用到了一个CyclicBarrier的同步的东东。java好简单啊。

晚上睡不着只好爬起来看《King Arthur》,这部片子当时首映的时候去电影院看过,非常震撼,现在重温以便依然是那样的令人热血沸腾,片子中的女主角也是我喜欢的类型,典型的亚马逊女战士,善于使用弓箭和短兵刃,要知道在整个冷兵器时代英国的长弓是历史上最强的弓箭了,而罗马的重甲骑兵可能是也是最强的骑兵了,(帝国时代里面是拜占庭的骑士),阿瑟作为salvation knight的首领当然是最强的了。

二月一日  天好像不下雪了

晚上睡不着,早晨偏又起得早,爬起来把昨天调试一半的MPI的程序调试了一早上,看来我当初是夸了一点海口,说什么MPI比socket容易,其实虽然说没有同步等等烦人的东西,如果你要写成SPMD,也就是单个的程序,你一定要头脑清楚你的master,slave的区别,写惯了c/c++程序对于变量都很小气的,时常为了少一个变量而处心积虑地反复用,这实在是一个坏习惯,我也一直在改,想想看徐国编译原理的都知道对于c/c++这种静态编译的临时变量来说(函数内变量)都是些stack里的偏移量,除非说是很多循环根本谈不上什么资源浪费,而对于coding,debugging来说临时变量也好看的多,而最要命的就是我花了将近一个小时找到的错误正是我忘记了master/slave区别的地方,结果算法部分都是没有错的,我却始终怀疑,始终没有想到是最后文件输出的错误,(在远程的slave输出了一大堆文件没有报signal11的segment fault才奇怪呢),当然这里面也有一个主要原因是i/o总是滞后并且因为context-switch的关系顺序无规律才让我始终不知道是master还是slave的问题。以后应该明确n#就是指的那一个node的process出的问题。相比之下,java的程序员简直就是花花公子一样的浪费内存。

中午吃的多了,为了帮助消化屈尊到学校救济贫困办公室指出了他们工作人员在我的案子上的一些错误,他们表示政府会很快把上学期的钱给我了,回来的路上高兴的合不拢嘴,下个月的粮草终于又着落了,写完日记高兴地躺倒睡觉。

二月四日  天没有下雪,健身房星期六早上不开

MR.D写email来问combinatorial algorithm这门课好不好,我当时不知道应该怎样回答他,事后想来大致可以猜测他的想法,当我在学习另一门算法课的时候,我认识到了两件事,第一我没有学习算法的天分,被老师骂得都没有信心了;第二无论是什么样的复杂的算法问题也许最终都可以化简为最基本的组合算法,也就是enumeration, generation, searching of combinatorial objects。这个大胆的假设是我自己这么说的,我不指望别人来评判,反正这是我的想法,想想看我们的算法的基础数学实际上是可以完全用形式语言来表达的,而formal language和集合理论有着千丝万缕的联系,直觉上觉得本来就是一回事,比如说逻辑不过是一个集合理的一些特定子序列,(当然我只是这么模糊的感觉,就算是Intuition吧)那么当你为了一些非常非常需要效率的算法而苦恼的时候,你几乎一定会求助于组合算法。我想大多数的计算机的书都不会说所有的算法都来源于组合理论,及其组合算法,我想我不妨大胆地假设这个原因是因为这一类算法非常的抽象和普遍,对于特定问题有时候并不一定是最好的,因为大多数实际问题我们或多或少都有一些额外的信息可以利用来设计更有效率的算法,反而是最普遍的算法成了最没有用的算法,这几乎是计算机领域的大实话,好像很少有人这么说,至少写到纸上就要被大家笑话了,所以我就自己对自己说吧。可是如果你的问题是要去解决最普遍的问题是用于最普遍的领域,缺少最基本的假设,那么你的算法是不是只有组合算法可以用呢?我心中一直想像的这个问题就是意识的朦胧时刻,或者说《2001,A Space Odyssey》的开幕曲里面元人在连最基本的工具还没有发明出来的时候,the dawn of mankind。道可道,则非常道,名可名,则非常名;如果一个算法是基于某种pattern的话就失去了普遍性,然则没有pattern又怎么谈得上算法?java或者delphi里面都有class of class的概念,这其中的玄机有时候是非常的微妙,class可以依据名字让虚拟机在runtime找到产生,然则class Class本身是否也可以或者也许要用名字来产生呢?problem of chicken and egg的问题是能够让人疯狂的,当初关于set可否成为自己的元素的问题就让某些大虾疯掉了,我当然不敢去尝试。本来一直想去读那本国内买的影印版的《logic for mathematician》可是总是想的多做得少,也难怪那本书实在是艰深无比,我自己课本里的Turing的关于program不可知另一个program的证明都没有看懂,怎么可能看懂Godel的incomplete theorem?不过是怅惘一下罢了。

这几天过的乱七八糟的,主要是RMI的莫名其妙的问题,我偶然中运行了两个远程的server,结果我的server端的synchronization就变得一塌糊涂,marker的意见是应该是我的同步的code有问题,我前天测试盗版也似乎也是这样,但是我实在想不出我的semaphore有什么问题,也许我应该做一个简单的test case,我甚至一度怀疑学校lab用的NFS的问题。MPI的小作业也花了我一两天,主要已开始很畏惧这种cluster的程序,很小心翼翼翻来覆去地想,写完了还挺得意,后来和上过这门课的同学聊起来,发现居然连不会写程序的人都知道怎么写,让我很是沮丧,都不太想保存了,不过为了尊重历史还是贴上吧

我以为哲学是一门寻找和研究pattern的学科,形而上学有的时候是必要的,因为广义上说所有的pattern最终都可以找到自然界的应证,致使多寡早晚的问题,于是预先穿凿出的pattern虽然看起来脱离现实未必不是将来的时为普遍的现象,只不过不同时期的人类认识能力与手段的限制不能够意识到那些未发现的pattern。

有一天晚上碰到一个感叹号,一晚上的心情犹如波浪号,思绪万千好似破折号,然而那种冲动只是一个小小的顿号,两三天以后回想起来仿佛是引号,也就是说如同听别人的故事一般陌生。

二月七日  天好像有下过雪吧,至少现在没有

我想15puzzle也许可以尝试着用minimal change of permutation的想法,当然还有很大的一个gap。不过我的idea非常的simple,假如context可以有一个rank函数来linearize的话,搜索问题就可以分割,不过这好像是废话。今天尝试这个idea,去在breca上把generating subset in the order of Gray Code的工作分到11个cluster上,(master不做运算)分的方法非常简单,用rank产生那个subset,然后next一定的次数,master汇总所有slave的时间,这个尝试当然没有什么意义,不过,第一,我尝试着把code写的fancy一点,以便好像学EE的人,结果不得了,&,^,|的操作负的precedence竟然比==,!=等等的逻辑操作负低,结果就出现了一大堆的想不通,比如if (a&(a>>i)!=0)。以后还是写的kiss一些吧,(keep it simple and stupid)第二,cluster单台的计算能力就已经超过了我的想像力,难怪要150k加币呢。气愤之余偷偷地把我以前写的15puzzle放上去run一run,不用白不用。

二月八日  天灰灰的

早上决定去健身房,既然头脑不打算工作,身体就运动吧。8puzzle的事情变味道了,我想去做个试验。

二月十一日  下午的阳光是那么的灿烂,可我还得要去实验室镇是难受

奋战了一个下午也没有把namingcontext搞定,这里就看出java的丑陋之处,明明就是需要指针的地方用了一大堆的看的莫名其妙的东西搞得我晕,namecomponent是个什么东西啊?看上去像是STL里的map一样,总是出错,后来晚上又去才发现了我的错误,binding字串和binding对象是不一样的,比如邦定对象是这样的:NameComponent path[] = bankContext.to_name("Branch"+branchNo);  ncRef.rebind(path, bank);你生成的namecomponent的数组是靠namingcontext的借口方法to_name实现的,可是你邦定一个名字却是这样的:NameComponent hostNode= new NameComponent("my host name", "host"+branchNo);  NameComponent hostDir[]={hostNode};
bankContext.rebind_context(hostDir, bankContext);你先生成一个namecomponent的实体,在生成一个她的数组然后用NamingContext的借口方法rebind_context得方法,rebind可以反复绑定。不过我到现在也不知道怎样制作树状的namingContext。另一个有意思的小实验是这样的,你run若干个server,然后你从client端去调用interface,你甚至根本就不知道有多少server,在哪里,这比较naive地给你一个给你一个启迪怎样去实现老张的load balancing。

昨天忘记说客户端怎样解析namingcontext:BindingListHolder bl=new BindingListHolder();
BindingIteratorHolder bh=new BindingIteratorHolder();  ncRef.list(1000, bl, bh);  Binding bindings[]=bl.value;你最简单地办法就是搜索这个database,for (int i=0; i<bindings.length; i++)
{  //org.omg.CORBA.Object obj = ncRef.resolve(bindings[i].binding_name);   //String objStr = orb.object_to_string(obj);    if (bindings[i].binding_type==BindingType.ncontext)
{     NameComponent nc[]=bindings[i].binding_name;  for (int j=0; j<nc.length; j++)
{ System.out.println("kind="+nc[j].kind+ " id= "+ nc[j].id); }}简而言之,namingcontext给你的事一个数组的数组,每个数组是一个namecomponet的数组,每一个namecomponent是一个map或者说对子。

二月十三日  下午睡得好舒服,可是却只睡着了一小会儿

如果有人自称学过计算机,那么问他一两个组合算法的问题;如果有人号称是大牛,那么让他去解决一些组合算法的问题;如果没有组合算法世界上根本不会有计算机科学,我觉得我在这方面非常的吃力,并不是照着算法写程序,那是一般的猴子都可以训练的出来的,我不是在贬低谁,说到底不过是条件反射,用香蕉训练猴子做算术的方法也适合于培养程序元,但是组合算法确实不可能靠这种低级的条件反射能够培养的起来的。我觉得我也许经过无限长的时间的进化最多就只能进化到猿人一级,要真的变成人可能性是不大的。

Did I re-discovered a well-known vector space?

看百年世界大战,了解了以色列的建国历史,我觉得任何一个稍有同情心的人都会支持以色列的。

二月十四日  天不冷只是灰蒙蒙的

在生活中如果某个话题变得索然无味,你不妨顾左右而言他,在email里我只好选择沉默。

二月十六日  今天有暴风雪

每天坚持去图书馆学习的誓言只执行了一天就无疾而终了,不过坚持每天去健身房倒是完成了80%,看来我的身体要比我的头脑来的听话。今天总算把midterm应付过去了,还是惊出了一身冷汗,组合算法的题目猛一看就懵了,还好是开卷考试并且是可以在家里完成的,于是我就变小程序来解答,因为我现在笨得连数数都不会了,幸好我有先见之明没有去教室里答题,不然就完蛋了。下午去教授那里才明白我自己想的那个revolving-door算法的变形只能适用于集合size为奇数的,不过我想应该是可以解决的,不过我实在是有一点点没有兴趣,因为我知道在算法方面我毫无前途索性不去努力了。最近粮草有些不继,下个月看来还得去学校问问。对了前两天我下载了firefox,虽然我从来就是微软的铁杆支持者,这一次实在是没有办法,看来微软确实是有些病入膏肓了,IE臃肿庞大的以至于我不敢开超过五个窗口,并且一大堆的pop-up广告让我烦不胜烦,我一直猜想是某种hook的机制,可是我实在不知道怎样删除,没有办法微软对不起了,我想这个公司的人也越来越没有朝气了,迟早有一天会遇到危机的,或者现在就是了。

二月十七日  今天雪停了

去实验室,我为什么不能像前辈的留学生一样起早贪黑泡实验室呢?肯定是因为他们没吃饱饭,我还有一口剩饭就不努力了。

二月十八日  今天很冷很冷的

虽然我不算勤奋,但是春假的第一天又是星期六的早上还去实验室的人毕竟没有一两个,当然我是去做我为完成的作业。本来想写一个distributed transaction protocol给tutor替我检查,结果一动笔才发现不是那么回事,正像教授说的那样,你自以为抖动了,一上讲台却发现没有什么可说的,你自以为很明白可是当你准备写下你的想法立刻就暴露了你的错误,写program之所以比写伪代码或者protocol,algorithms之类来得慢的一个原因就在于你的思想是有很多的遗漏与错误,为了帮助我思考不妨把我的想法写下来吧:每一个participant都是决策者与被决策者,也就是说他们要独立判断一个incoming的transaction的request是否和当前的冲突,所谓冲突,意味着source或者destination帐号有重叠,outgoing的destination冲突交给对方处理?(还是应该本机处理吧?)。。。刚开了个头就头疼,脖子疼,试验室里呆了一天还真得挺累的了,不写了。

二月十九日  今天还是很冷很冷的

一大清早去实验室,结果一个早上一直在为filelock交学费,最后才明白最好把filelock当作advisory也就是cooperative instead of manadatory因为这个本来是取决于操作系统,即便是号称平台无关的jvm也不能掩盖所有的问题,下午一觉醒来才证实了自己的一个可怕的怀疑,我真是笨到家了,居然该代码的时候不小心翻下这种低级错误:filePointer.seek(offset,size,toShare); if (filePointer.readFloat()!=UnDefinedData){filePointer.writeFloat(0);}...看到这个问题了吗?我本来已开始的时候小心防范现在还是着了道了。(不明白吗?想想流的特性,就是stream)。一个早上在semaphore加filelock的双重机制间写代码仿佛在惊涛骇浪上耍杂技一般的容易翻船,因为我还要时候是考虑是否exception之后系统仍然robust。

在试验室里呆了快一天,写了一个无比繁杂的近似单线程的服务器组,说是单线程但是因为JVM会对每一个请求都创建一个server instance实际上还是多线程,因此使用了大量的filelock和semaphore,交叉在一起非常的tricky,同时总算弄清楚了一点,java的filelock是mandatory的,而且对于被锁定的区域的写操作不会引起任何的exception。你获取和释放filelock最好使用semaphore来保护因为在你自己写之前也要释放,有可能你已释放立刻就被别人锁定,所以里面类似要注意的问题很多,比如如果一个标有多个线程在访问,其中只有一个会把他从一个状态写为另一个状态,而从另一个状态写回来则有很多线程,那么同布置在一边就够了,你可以节省那个当读的线程的同步开销,而另一种情形在你进入wait()之类的block状态之前一定要记得释放semaphore,否则就死定了。如果你不使用wait之类的函数也就不必notify,因为semaphore应该会自己唤醒等待的队列,java一个比较诱惑很多程序员的地方就是内部的同步机制作的很全面,让很多人舍不得放手。感觉这个程序虽然还只是初步的常识就已经让我几乎把操作系统课堂上所有的同步范例都实践了一遍,从这个角度来看我其实应该要感谢Dr. Probst我那时候无知而又莽撞,对他有很多的不敬与诅咒,实在是不应该。总体上来说我在concordia上的三年学里面,只有computer architecture这门课是外聘的一个完完全全的东郭先生,其他的教授都还是让我学到了不少东西,当然取决于我当时的悟性与态度理解的程度不同,总之,我觉得concordia不见得比其他加拿大大学差多少,网络上称之为“清华”,也就是“清一色华人”也仅仅是针对研究生和某些其他专业,计算机本科没有多少中国人,第一是辛苦,第二是大多数在国内号称学过计算机的人不愿意再上一遍,实际上这些人该不该上他们自己心里清楚。反倒是我反正都是心血乍练,兴趣盎然。不过从一个线性代数的例子我觉得中国学生应该重新审视自己,当时刚入学的时候我发现我的线性代数的基础课(不是linear algebra,而是更基础的矩阵运算),没有被免修,我就去找Dr.Ford理论,他就简单地写了一个向量问我了一个简单的问题,我当时根本就不知道他再问什么,那时候根本就不知道原来线性代数不止是解行列式,立刻没有脾气去上课了,后来意外地被免修了,还恋恋不舍呢,看来东西方的教育的差别有时候比很多中国人心目中的差别要大得多,中国的历史基本上没有任何数理的内容,中国人的思维习惯也投机取巧的成分多很多。

二月二十一日  今天又下雪了

一大清早去实验室,路上明白了一个道理,java让程序员成了傻瓜,我原来写TCP的packet习惯了没有想到java竟然把一个connection包装起来了,也就是说你每次建立一个java的socket连接实际上内部使用匿名的port number使得你可以直接获得回复,我结果傻傻地自己去用类似selector之类的技术实在是多余。另一个我没有想明白的地方现在也明白了,java的filelock是在JVM之上的mandatory的,实际上很好理解,因为不管操作系统的filelock机制如何,你在JVM上的文件都是完全被监控的,这也就是为什么我用两个不同文件指针,其中一个设定了filelock另一个也被锁定了,在感觉上应该是cooperative or advisory的,在应用上看起来是mandatory的。另一个namingcontext的问题还不是很清楚,我使用的是persistent的也就是说先前的namingcontext都被保存在文件里了,我想要unbind总是不成功。目前我对于java server端的multi-thread有了一个初步的认识,我的想法是这样的,在每一个server内部程序员当作单线程来编程,但是每次有一个请求java idl或者java的CORBA会创建一个server的instance来达到multi-thread的,这样就要求你非常小心你的static与非static变量,如果你要做线程同步一定要运用这些static的global variable.同时在联合使用filelock和semaphore上我已经比较有体会了,尽量不要到处乱throw exception,这是一个如同goto或者break的坏习惯因为它会把程序的流程搞乱,最好的做法使用变量来做flag。而exception的原则是你对于不知道什么样的错误才应该使用,对于你知道的类型,你应该处理而不是简单抛出留给别人处理,当然有很多人不同意这个观点,我仅仅是这样建议,因为,exception的效率不是大问题,最主要的是原来应该改作的一些工作有可能没有作,比如semaphore,socket,filelock等等的释放,这是一个主要问题,java虽然号称垃圾回收但是绝不可能做到资源回收,也就是说非内存的管理是无能为力的,我就遇到了不少socket没有释放占用端口的问题,比如我仅仅需要得到localhostname而财大气粗第new一个socket,使用getlocalhost.gethostname之类的方法,结果很随意地把监听端口给了这个临时socket最后又close了结果下次运行这个端口就不能用了。在一个非常intuitive的低级错误就是filelock以后自己要使用也要先release,但是在多线程的环境下有可能被别人抢到这个filelock,因此我必须用一个semaphore去同步tryLock的方法,这里面就埋藏了很多的陷阱。比如从效率的角度看RPC是很慢的如果你获得semaphore之后要去call RPC或者socket,最好用filelock等到rpc或者socket返回以后再来重新获得semaphore。

二月二十二日  今天又下雪了

一大清早去实验室奋战到下午两点才发现了其中的错误,我的filelock,semaphore等等的synchronization都是无懈可击的问题出在我对于sun公司过高的期待,这些白痴让我昨天喜出望外以为socket建立的inputStream,outputStream可以区分“session”,也就是用一个匿名的回电Portnumber,实际上没有这么回事,我还是得自己实现,虽然无比的简单可就是没有人去做,回来后又累又饿,休整了一下午,一锅水的土豆被烧干了,我居然躺在床上看东西方冷战历史的纪录片里睡着了,侥幸没有造成大的灾难只不过在我n次烧糊锅的纪录里加了一次土豆而已,(n>=5/月)。现在继续出击去实验室。有奋战了一个晚上,就吃了一个土豆和同学的一条巧克力棒,不过终于解决了这个问题,其实我花了五六个小时trace仅仅因为我随手一行的错误,真是一个教训,在这种server的tracing实在是痛苦,我只好把三个server上输出的结果拚到一个文件里一条纪录一条记录的比对,实在是辛苦。不过也证实了我刚刚说的是错的,java的socket的确是实现了connection的功能,因此多个thread同时监听一个端口是可以各自得到各自的消息的,我因为怀疑这一点还自己去写了一个实现,其实很简单,就是选择一个portnumber,然后当作参数传给listener,以便他回答得时候用。当然你必须对于这个portnumber的选择进行同步。写完了我发现其实不需要,因为java确实是实现了,否则我的服务器有多个server instance的时候大家都监听同一个portnumber,你怎么能区分回答呢?把这个作业贴出来吧,实在是因为这几天太辛苦了,虽然我知道很多人很早就完成了,我还是对我自己的这个作业情有独钟,毕竟多线程的服务器程序是很不好写的,尤其要防止死锁,还要防止同步问题,等等,就不必说CORBA的技术有多么复杂了。给两颗星吧!

二月二十三日  今天雪停了

一大清早醒来想到为了一个作业花了近一百个小时实在是辛苦,而且有些夸张,我总结原因应该有这么些:1。java没有学过新学乍练,一切都在摸索阶段,比如finally的意义就理解错了看到他跟在try-catch后面就想当然地认为一定是异常的时候才调用,又比如花了好几天才发现java里面根本没有传出参数,虽然所有的对象都是传引用但是是const的引用(当然这个世上一作业花的时间),再比如java虽然没有friend可是你可以把一个类声明在另一类里面,结果外面的类的成员数据都成了嵌套的类的全局变量,这个c++好像也有不过我从来没有这么做过,java不支持default-parameter,这一点让人很烦,我想多加一个参数必须的改动所有的代码。2。很多复杂的技术没有吃透之前就要上到server之上,那后果是不堪设想的,比如sun.com里面对于filelock的解释模棱两可,让我误以为filelock是否为mandatory是由操作系统决定的,实际上它的解释的对象是那些同时使用其它开发工具和java以外的程序的程序员,而对于JVM之上,java有绝对的控制权用得着听操作系统吗?因为这我花了一个早上才发现不释放filelock机便是拥有者也无法写,这一点似乎是很直接了当我想大多数人一定会觉得我很白痴,我很冤枉因为我看到sun.com上写的filelock由platform决定最好是treat as if advisory,何况从效率的角度来看也应该是advisory的快。再比如namingcontext这是个很复杂的东西,我一直没有弄明白她的机制,试验了二三十小时虽然可以写入读出简单的信息,结果后来发现我使用的是新版的persistent的nameserver,数据不像transient仅仅在内存里,重新运行绑定还在,我想先卸载那些先前的binding,总是抱错,后来不敢再试验了,我想这是这个作业里面最大的失误与遗憾。对于socket我始终把它当作纯粹的socketAPI来编程,结果走了不少弯路,因为当时学networking作ftpserver的时候很清楚TCPpacket在逻辑上没有所谓的session概念,当你有多个线程同时监听一个端口通信的时候,你肯定要自己分辨消息,不创建一个全局的static的socket来统一监听,你又更好的办法吗?人人都听,发现不是自己在等的回答怎么办?post到公共的告示板上?这不是更糟糕吗?我当初就是这么做的,一位在服务器端写成多线程的效率高,可是殊不知这未必是最好的模式,因为那个时候还不清楚java是针对每一个incoming的RPC来生成一个server instance以便实现多线程,因此,虽然在以前学delphi听说过这种threading model并没有什么概念,对于程序员来说最好的做法是server内部单线程简化编程,让java自己去实现高效率。当然你必须清楚地意识到server内部那些是必须static那些应该是non-static的,这一点的理解又花了几十个小时的捉摸查找咨询,我感觉sun.com的帮助要比MSDN来的差劲,很多过时的东西依然在那里一直与误导我,甚至是教授自己。关于多个服务器的同步问题在和tutor讨论的时候还是模模糊糊的概念,还想着要使用某种protocol来实现一个total order这本来是一般的想法,后来仔细研读才发现使用filelock就已经解决了同步的问题,因为lock说到底就是同步的工具,而唯一需要解决的是deadlock的问题,那么选择非blocking的tryLock方法就可以了,不过我花了好几个小时才注意到这个方法会抛出异常因为一开始我看帮助的时候说如果不成功就返回null,那么想当然地认为抛出异常实在是sun公司这帮程序员吃饱了撑的,有什么必要呢?仅仅因为没有一个getlasterror的机制只好用异常来告诉调用着失败的原因,是这样吗?现在想来应该是这样当时可是没有想到。这个错误的代价就是几个小时,当然和其它问题混在一起是很misleading的。我其实编程的时候非常的小心翼翼处理这一类异常改变流程的问题,因为我痛恨没有释放的counting semaphore这会使得我的程序在异常之后不能恢复运作而死锁,因此这方面反倒是都正确的,不过我的最严重的失误被一个很迷惑人的错误pattern导致我始终在怀疑filelock的失误。问题是这样的,我用等数量的线程同时从两个帐号对着作transfer,比如一组线程从A帐号到B,另一组从B到A如果文件德读写保护与同步都是正确的话,做后两个帐号应该保持不变,当然前提是两个帐号开始时候balance一样,每个线程的transfer金额一样,可是我的结果是两个帐号总和保持与开始一样,基本上两个帐号不等,我想对于绝大多数程序员来说第一反应就是这时transaction嵌套导致的racing condition,比如线程1读了A的balance,然后被打断,由线程2写了一个值,然后线程一回来再写,这也是我最担心的,从来没有想到还有第二种可能。因此这个debug的好费是惊人的,因为单单是建立一个运行环境就很罗嗦,我因为hardcoding了机器名字,就只能在那几台电脑上测试,最后不得已把三台服务器上的输出结果放到一个文件里逐条记录得比队才发现,这种这种pattern的错误还有另一个简单的解释,那就是一个transfer中,两组thread的transfer成功次数不一样,这听起来很白痴,可是,这时我的一个小小的失误,我在返回之上出了一个错误,导致客户端统计transfer成功次数不对,你想到了这种白痴的结局了吗?你想到了说明你和我一样白痴过,你没有想到说明你连白痴也不算,当然这很好呀。:)另一个关于static和non-static的考虑来自于文件指针,我当初为了保护文件的读写,使用一个global的static的文件指针,(不然你有多个文件指针单靠mutex你能同步吗?在内存建一个当前记录表?我想过这个方法,不过还是需要顺序查找,我不喜欢,并且这表你也要同步保护。)可是当我运用了filelock以后实际上同步问题已经解决了,只要每个server instance内部保证是单线程的你可以不用再对写与读的文件指针作保护,也就是说每个server instance可以有自己的独立的文件指针,同时你还需要一个全局的static的文件指针用来让所有的server instance来lock文件lock,一旦成功你就放心大胆地写文件了。这样才会有最高的效率,发挥多线程的优势,这一点是我最自鸣得意的设计。当然你必须用一个mutex来保护这个全局的用来lockfile的文件指针,因为你释放的时候又可能有被别人锁住,他的高校体现在lock成功以后不必每次读写之前再去抢夺mutex,可以让别人有机会去filelock。当然我的数据库的设计上我觉得也是比较有独特之处,这是有一点点模仿database课堂上学到的很多东西,这作业只要求存balance,于是我用了一个RandomAccessFile把文件定义成一个类似数组的形态,用帐号的index来查找记录,当然这有两个前提,第一可能的帐号数量不大,第二每个记录都是规则大小,这听起来好像限制很多不使用可是你想过没有着这正是database里面index文件的特征,不是吗?也就是说当我这个baby database扩展的时候我可以用这个做index部分,然后每个记录存放真正的记录的地址,(我是不是以前说过这个,我对这个设计太情有独钟了,不由得反复提到。)我这里所说的index实际上也可以是记录的hashtable,其实两者本质上是一致的,都是constant查找时间,不要误会我认为binary search是constant,我的意思是这里的index是randomaccess的index,也就是说给定一个地址,查找时间是固定的(简直是废话,对对,我在说废话,我要去吃早饭了,昨天就吃了两个土豆和一小碟午餐肉当晚饭。)

自吹自擂了这么一上午我也饿了,想到cynthia的一句话听得我非常受用,我都是自己摸索着前进才有这么些心得体会,哈哈骄傲两天吧。说自己的体会,让别人去笑话吧。

二月二十五日  今天好像又下雪了

早上计划去玩健身房直接去实验室,结果发现不知道是什么节日健身房不开,实验室也要登记才能进,花了半个早上仅仅能够把apache server运行起来,其他还是一团雾水。晚上请教了大虾证实了我的一个错误的观念,TCP本来就是connection的通讯,怎样分配port以便reciever回复本来就是协议自己实现的,和java没有关系,是我自己搞糊涂了。晚上心情郁闷,夜不能寐,只有壁橱里仅剩的一点法国红葡萄冲当安眠药了。按照加拿大学生的话说有些东西是用来spicy life的,如果突然没有了连前进的bait都看不到了,那么。。。

我其实非常不喜欢引用别人的东西,当然因为我现在记忆力越来越差,我只要稍微耐心等一等,就会忘记那些使我看来得,哪些是我自己想出来的,这样我会不断地觉得自己好有独特见解啊。那么就把以下的看来得摘抄一下作为批判中国传统文化的一个论据吧:

二月二十七日  今天好像天气不错

从我的家到实验室要经过健身房,因此,每天去实验室和去健身房成为同一件事的两个步骤,有时候我先去健身房后去实验室,有时候我先去实验室后去健身房,不管怎样组合我都不需要走重复的路。哈哈我再和你开玩笑呢,因为这里的生活非常地充实,你完全可以感受到我每天的丰富多彩的生活。中午吃完饭去找导师,他又给我了一个新的选择,我觉得我可能更适合一些吧,总之,这短短的半年里,我已经从我当初所寄托的AI偏移到不知什么地方去了,唉,走一步是一步吧,很多时候曲线救国是必要的。下午,在实验室里看rajago的东西,看来GPU的programming是要接下去打交道的东洞了。不过现在还不很确定吧。同时把自己昨天写的一个不完整的程序发给了Y大虾,我是看了他的程序和essay后受到启发改写了一下,在一些细节上我们还有不同的看法,这有点像软件工程里的design decision类的问题,从不同的角度看问题,会得出不同的结论。我还要再想一想。同时作业快堆成山了,我的webservice的环境设置总是不成功,java的一些帮助早就过时了,很多library版本更新的链结构都变了,根本就对不上号。只是知道这几样是必需的:classpath里面必须包括soap,xml 解释器的路径,java_home必须是java sdk的路径,catalina_home是tomcat的路径,path里面包含tomcat的bin的路径。这样设置后,run “startup”可以运行tomcat server。 然后我就不知道怎么办了。

三月一日  今天天气非常不错

昨天早上我终于发现了我第一个RMI作业里面同步错误的原因,原来是对于“finally”理解错误,以至于多了一次semaphore的release。当然应该还有static的问题,慢着,实际上如果semaphore是唯一的,应该不用担心文件指针有多少个的问题,因为我没有用filelock,每次对于所有的文件读写都是锁死的,也就是说始终只有一个读写。这的确看来很糟糕不过对于第一个作业来说是可以原谅的。

今天发现我很多的想法都是错误的。1。关于socket我已经认识到了自己的错误理解,首先不可能两个process同时侦听同一个端口,因此,我好像有糊涂了,因为TCP的所谓建立连接应该仅仅是概念上的吧,socket API我记得只有accept,send,recv之类,要想让收听方恢复只能在message里面写上自己的hostname,及其portnumber,是这样吗?2。实际上,java RMIi并不需要为每一个RPC request创立一个新的server instance而是直接调用implementation class的method。3。java synchronized的方法实际上是诗的所有的方法都只有一个thread执行,意思就是你生命了method  A, B,C都是synchronized之后,当你的client段去调用不论是A,B或者是C都回被synchronized即使他们是不同的方法。我想他们可能使用同一个global的monitor来实现的吧。

三月四日  今天天气非常不错

昨天的debug也是非常的艰苦,完全可以说是大海捞针,如果你的程序在小的数据里运行正常,当数据达到一定程度出错,十有八九是溢出了,比如我使用以极其愚蠢的办法去跟踪,从(72,8)=11969016345个循环中查找其中的错误,听上去虾仁而已,这主要是我的脑子基本上生锈了,写程序的时候很可能没工作,所以我骂了自己一个中午的白痴,一个愚蠢的错误耗费了将近两个小时的debugging,我差一点没有完成我的MPI的计划。最后还是有点满意的,虽然程序不复杂,也没有多少值得夸耀的地方,可是因为用了一点点MPI来并行处理,总还是可以谅解的。也因为如此,昨天居然没有去健身房,今天一定要补回来。

三月六日  今天天气非常非常不错

昨天,今天都是艰苦的战斗,我累得以至于想不起来我昨天到底写了什么程序了,为了组合算法的作业,我每一个问题都写了一个程序来解答,最后一个问题的最后两个testcase,我的改进的MPI的程序已经跑了两天了,我估计case7应该需要计算三年才行,太夸张了。没时间贴出来,下午还要赶另一个作业webservice的我现在还没有开始呢,后天就要交了,怎么办!

三月八日  今天天气非常非常不错

早晨终于写完了webservice的报告或者说designchoice文档,然后一口气把这几天来写的程序都贴出来吧,实在是太辛苦了。首先是minimal-weight的MPI的改进版,把原来的unrank函数改为Knuth的successor函数应该由在这方面提高两百倍,我这事写了另外一个程序进行比较得出的。这是一系列小程序。昨天饿着肚子干到了快十一点终于把所有的webservice的结果测试完毕,这个程序基本上是在CORBA的架构下不需要多少编程,可是tomcat的配置环境整整折腾了快两个星期,就是昨天我也没有办法正确配置环境而是直接从同学那里全套拷贝的,其中搞明白了一点就是每次server重新编译的时候,一定是有什么部署文件被拷贝到tomcat的什么地方,因为只有重新启动才能看到改变,也因此,你必须在tomcat的webapps/soap下面编译才行,除非你知道怎样部署文件,我其实看到过这些说明,可是我实在是没有多少兴趣研究,在我看来这款免费软件和java一样是一种对付傻瓜的捉迷藏的工具,java的版本不停地变,而这tomcat也是每个版本的配置文件方式都是翻天覆地,纯粹是一帮子无组织的业余软件爱好者的作品,因为每个人都只是为了自己的方便重新设计了一下新的配置方式,要知道在软件工程里面最容易的解决方案有时候就是推倒重来,而困难的事怎样让新的适应旧的。另一件事情就是在webservice里面测试死锁的时候必须把每个thread睡觉的时间加长因为webservice很慢的不这样的话几乎没有机会让远端的请求成功地锁定冲突的纪录。我在前天晚上对于配置仍不成功的时候甚至打算赌气交白卷了,想着我的编程作业的荣誉要被玷污了,昨天当完成了作业的时候心里很高兴,尽管很饿,当时荣誉总是被保持住了,就像在学AI的时候用scheme编程解决cnf问题时候绝望地向别人求援的无奈一样,但是最后我终于还是完全一个人完成了整个team的工作。还有,java愚蠢地不给程序员开放destructor,结果一帮儿童乱丢垃圾以为java阿姨可以清理所有的垃圾,可是对于系统资源怎么释放呢,在servlet内我怎样去call我自己的finalize函数呢?因为webservice里面每一个请求来了,就穿件一个servlet对象,什么时候,怎样释放变成servlet-container的工作。再有,前端的“call”租好不要声明称全局的反复用,应为没有文档我不知道怎样清除参数,结果出了很多奇怪的东西。

三月九日  今天天灰蒙蒙的

昨天晚上上试验课,有个同学提了一个问题,就是servlet的创建与消亡不收我们的控制,那么它定义的一些全局变量能否一直保存在内存中,答案是把它声明成static就行了,至于为什么它不会随着对象的消失而消失,根据c++static的定义,它根本就不是对象的数据成员,当然不会因为对象的产生而产生也不会因为对象的消失而消失了。等一回就要去宣誓效忠加拿大总督了。

去实验室打印大师们的论文,回来去dollar店买文具简直让我难以置信,原来买一支笔的价格现在可以买三支了,原来买一百页的现在可以买一百五十页了,原来的订书机现在变得非常精致了,看来中国货又降价了。

三月十四日  今天天灰蒙蒙的

犹豫了两三天还是决定把最后的一个小小改动的版本贴上,毕竟keep it as it is的原则还是要遵守的。另一个就是没有时间继续的一场讨论,实在是可惜。这两天我为了global-checkpointing想破了头,依然有很多不清楚的地方,其中一个至今无着落得技术难点是monitor module,如果是借用CORBA本身的机制究竟要在哪里去寻找呢?POAManager?可是我能否在指定的机器上run一个server呢?如果checkpointing不是database里面的nonquiscent or non-interfere形式的,那么看起来checkpointing就很简单了,可是recovery如果采用undo,是否已经commit的transaction也要都rollback,应该是一个coordinated rollback否则globalcheckpointing就没有意义了,可是message log里面的message都要replay一遍的话,我究竟是相信log还是相信incoming的message?如果两者顺序不一致的话该采用谁的呢?这就是系统的non-deterministic的大麻烦。

昨天花了两三个小时写一个迪归版的minimal-change-order-of-permutation,应该说不难的,可是我并没办法比别人快,这个也是我所力不能及的地方,参加ACM绝对是对你自信心的打击,看来我还是喜欢那种随心所欲没有时间压力的方式。

告诉你一个北美的公开的秘密,计算机的研究生基本上没有什么用,这一点国内好像都还不知道一样。

不立文字,意会言传的好处就在于一半没有人能够确切地说你错了,包括你自己。中国的历史人物大多谙熟其中的要义,或者把意见时说的空而又空,或者说的细而又细,太空的话你没有办法应用,太细的话你同样没有办法拓广应用。关于recovery的问题向了好几天没有什么眉目,下午去之前,似乎有了一些方向,已经讨论就发现自己错了,讨论结尾似乎又有了新的方案,可是随后和tutor一讨论却更加糊涂了,首先我的所有的假设和架构全被推翻了,旧的想法没了着落,新的想法有不成立。实在是一件头疼的事,请相信我,这绝对不是什么trivial的问题,比如,我一直以为应该采用global checkpointing来实现coordinated rollback,可是tutor说不对。

三月十五日  今天天灰蒙蒙的

这两天学会的大实话。

我想我最善于做的就是想象,不论是算法还是理论,这是我早上吃早饭的时候编出来的,不知道对不对。

三月十八日  今天天好像灰蒙蒙的

庸俗到看《都市男女》,无聊到看《武林外传》。当然看这类恶搞调侃大陆主流传媒的东西的确解气。昨天讨论project一下午还真是有不少收获。另外昨天早上去gym总算想明白了一个问题,就是Mr.M解决的问题,我在exec里面想要另外启动一个process正确的做法是:cmd /c start cmd /c java new_window。原因其实很简单,在windows下长大的人根本就是把很多复杂的东西当作是理所当然,比如在Linux下几乎没有人会问出像我这样的愚蠢的问题:没有shell怎么能够在命令行启动其他程序?command就是dos下的命令行解释程序,也就是shell,只不过在windows下习惯了图形界面没有多少人从命令行运行,或者运行的时候没有了这种体会,我就对与cmd和command的区别完全没有想法。反正command不行,只能cmd。

三月十九日  今天天气很不错的

从本质上说,中国大陆现在的政治体制是封建君主集权制度,经济上采取的制度从效果上看和资本主义制度也没有什么两样,虽然劳动者有选择部工作的权利和自由迁徙的权力,但那也不过是选择被剥削的时间地点方式及其程度的权力而已。有时候,我偷懒整天整天地看那些无聊的网络电视,事后给自己一个堂而皇之的理由,对中国各社会阶层作分析调查,这种所谓的超级跨国界的社会调查并不是我发明的,所谓西方的中国问题专家都是这样,坐在宽敞舒适的办公室里领着政府或者机构的优厚的薪水与资助随便翻阅一些中国的媒体,透过字里行间寻找可以标新立异的视角揣摩当前主流的思潮与民意。这种调查的准确性完全无法证实也无任何必要证实,因为自然会有其他的“立论家”各取所需选取符合自己想象的结论。理论之为实践服务者就在于此,仁者见仁则仁者选取支持仁者之见的理论来支持仁者之见,智者见智则智者选取支持智者的理论来支持智者之见。

从经济上说,中国目前各个行业门类齐全,是成为世界工厂的一个先决条件,因为世界上没有几个大国或者国家经济圈能够提供如此齐全的配套体系,然而各个行业发展程度的相对不平衡导致不同领域的资本家对与中国目前国家机器的要求不一致,比如对于行业发展处于快速上升阶段的对与中目前的经济上的无序是受益者,可以趁乱取势;对于相对成熟行业来说政府对与经济管理的低能成为这些领域的资本家所强烈不满的原因;企业规模的不同对于当前的经济秩序也有不同看法,经济秩序从无序到有序的过程本来就是竞争淘汰的过程,中央政府与地方实力派的割据矛盾有时候会反过来影响这个经济发展进程,大企业与中小企业的矛盾最终会透过各自的政治代言人反映到政治论坛上。民族产业与国际垄断资本的矛盾在经济竞争过程中也会在政治舞台上反映,终究会有一个转折点会让现有的中央政府在两者之间作取舍,而这个决策点的早晚有时候甚至会引发国际间的政治危机。国际垄断资本的代言人在危机发生之前也不排除提前采取措施通过各种手段影响中央政府,这些手段也包括最后的终极手段,战争。世界经济的竞争说到底是资源和市场的竞争,在拥有技术门槛的领域可以简单地透过技术垄断来保持领先者的竞争优势,在资金密集投入的领域可以透过早期的资金积累实现资金门槛实现垄断,对于个别资源密集型领域可以透过先期控制资源实现竞争优势,对于市场密集型领域可以透过先期布局占领市场实现竞争优势。当竞争优势丧失时候,跨领域竞争者可以透过调度不同领域的资源来重新建立竞争优势,这些资源包括政治引导力,这些手段包括动用国家机器的终极手段,战争。

上个世纪的两次世界大战基本上是由于老牌帝国主义依靠早期殖民统治各自垄断殖民地的市场与资源导致新型帝国主义在市场与资源枯竭的时候被迫依靠发动战争要求重新瓜分殖民地引起的,战后随着殖民地的消失,帝国主义主要靠国际垄断资本以自由贸易为掩护进行市场与资源的垄断并以此来获取超额剩余价值,当这个瓜分过程结束的时候,垄断资本进入相对稳定的时期的前提是没有新兴的垄断资本来窥伺霸主地位,假如中国的新兴资本从根本上威胁到了老牌垄断资本的统治地位,也许会引起国际政治的干预并引发战争。这个危机的时刻并不一定会等到中国新兴的垄断资本实际威胁到老牌垄断资本的时刻,因为危机的处理的另一个手段是危机杜绝,因此,提前爆发的战争并不是绝对不可能的。

按照远交近攻的战略,最先引发的垄断资本冲突应该是在中日之间爆发,政治上的仇视绝对不是仅仅因为一个庙宇里面的一些排位所引起的,而是两边的政治家对于长远的经济竞争形势的担忧,美国仍然以拥有全世界的市场及南美的事实上的殖民地而静观其变,欧洲在东欧的新扩与非洲及中东的势力范围也可以维持一段相对较长的发展,唯独世界上唯一的超级强国日本必须立刻面对中国对于自己既有市场及原料的竞争,以日本的狭小国土资源贫乏来看,其大多数的优势集中在制造业相关的技术及市场上,这些本来是欧美与发展中国家间的竞争缓冲区,现在必须立刻面聆新兴经济体的挑战,日本在退无可退的境况下只能铤而走险,利用目前现有的资源优势迅速建立超级强国所必须的政治军事影响力,否则一旦经济优势丧失之日就是日本沦为二流国家之时,因此,日本必须以遏制中国的发展作为自己的发展国策。在五六年前我们讨论问题的时候实际上还没有清醒地意识到中日之间冲突的不可避免性,对于中日必有一战的讨论还只是停留在可能性的问题上,随着时间的推移,人们才开始意识到国际政治上高瞻远瞩者的先见之明,因此今天的有见解的政治预言家更集中地在讨论中日之间的这场即将爆发的战争的发生的时间地点形式与规模,当然对于战争的结果及对双方的影响的预测与分析更是令人感兴趣的问题,总的来说,中美爆发冲突的可能性微乎其微,因为在中国一百年后挑战美国之前必须要先挑战日本,仿佛擂台赛里中国会不会在第一个回合就K.O.了也很难说,大概是50%对50%吧?相比之下,台湾的回归也应当是在中日冲突之后才能做一个彻底的了断。

早上起床看到杯子里面还有昨天没有喝完的一点红酒,就着早点吃喝之际头脑发热胡言乱语了一下下,代表我今天头脑很正常。

三月二十一日  今天天气 非常不错的

我的生活已经平凡到每天都去gym,而且居然到现在也没有怎么开始动手写project,天天看CEG星际,或者就是小资生活《都市男女》。发现了一个完全没有用的事实,latin-square实际上也是一个vectorspace,就是说你做出第一个latin-square然后可以从当前的这个latin-square通过两个操作来span整个vector space的所有latin-square,这两个操作一个row swap,一个是column swap。可是这个事实有什么用呢?几乎毫无用途,我本来想用这个方法来生成sudoku,结果发现它比直接用backtrack还麻烦。看到《都市男女》里的依据陈词滥调,女人是男人的学校,想想看我好像已经毕业好久了。

晚上睡不着就爬起来看下载的《神话》(The Myth),与最近那个“无聊”的馒头比起来有着天壤之别。第一电影必须要有要有个主线或者说故事情节,虽然同样都是神话传奇,但是至少成龙的片子都有一个主题。第二,电影要有观赏性,金喜善的唯美造型比张跛子的狐媚要好看得多,同时成龙的电影最大的特点是真刀真枪的武功与特技,不仅仅是电脑特技,更多的是演员自己的表演,比如金喜善的那一段朝鲜舞就比铁笼子里的马戏表演好看得多吧。第三一般来说电影毕竟是一个教育媒体总要给人一些积极向上的东西,就算是说教,也总比没有强,好像那个馒头到底他要说些什么呢?我不知道,虽然成龙说的很简单,但是保护文物总是好事情吧。第四同样是多国部队的演员阵容,成龙至少让韩国人说的普通话中国人能够听得懂,情节和历史也有一点关系,时空交错式的蒙太奇手法虽然老套,但是总还是在帮助讲故事。相比之下,那个姓陈的简直就是古龙预支了稿费之后随便乱变得武侠小说,可是古龙虽然总喜欢峰回路转,他却有本事自圆其说,而那个土导演明明是个刻板的性格却要去模仿这一类不羁的魔幻,实在是东施效颦,邯郸学步的可笑。

今天下午花了好几十块钱拍照片准备yearbook,虽然说只是一个二流大学的本科毕业在很多人眼里不知钱,可我却知道这一百个学分的来之不易,这三年整整学够了一百个学分,可以说是身经百战,真应该找个时间回忆回忆,想想看我在读本科的时候都没有觉得学习有这么轻松过,反倒识到了研究生发现一大堆中国人在这里凑数真是感到有些愤愤不平,可以说很多中国人根本连加拿大的二流大学的本科都不可能毕业却今天在这里号称在读研究生,实在是让我脸红。

三月二十六日  今天天气 非常不错的

我对于组合算法的作业的评价就是很有趣,也很无聊。有趣的地方是这门课你几乎可以用程序来完成所有的作业,很无聊的事几乎所有的程序都是基于现成的算法来完成的,仿佛是根据菜谱来做饭的厨子的工作。

And this max clique problem.

三月二十八日  多好的天气呀!!!

多好的天气呀,中午吃完午饭和教授争论bounding function的一个小问题,然后我打算去皇家山走走。老赵说春天来了,因为气温已经到零上十度以上了,的确昨天去健身房看到加拿大的小姑娘已经穿裙子了,人说“春江水暖鸭先知”,我说女人对于春天的来临更加的敏感。

三月二十九日  多好的天气呀!!!

昨天半夜居然碰到了停电,这简直就是在文明世界的灾难,你难以想象在加拿大人们对电力的依赖。为了证明我居然能够在这样的灾难事件中生存下来了,把一个非常trivial的东西记录下来,这是作业了。

三月三十日  多好的天气呀!!!

朋友问我怎么玩计算机模式,我完全忘记了,我甚至想不起来怎样运行scheme了。赶快记下来吧。老师告诉我,我的想法其实不对,因为latin-square有着许多互不相关的group,仅仅靠改变顺序,(permutation,relabelling)你不能从一个group到达另外一个,所以总的数量远远大于我的想像。

一个人情高并不代表这个人不会出卖自己,好比古代青楼的名妓的清高一样,不过是对别人说,我可以讨价还价但是是在一个比较高的基数上的。所以,我最近在重新检讨我的清高程度,也许现在我。。。

四月一日  天有些灰蒙蒙的

network的程序的debugging是比较痛苦的,当然我发现我确实是变得有些迟钝了,一个stop-and-wait的UDPSocket的bug找了将近两天,当然是比较低级的错误,这一类的错误一般都是和我的先入为主有关的。比如一开始的时候,错误的信息总是接受方的buffer溢出的症状,随后我就把所有的怀疑都放在了接受方,java的datagramsocket是这样的,它既可以做receiver,也可以做sender,同时也可以是multicast的socket,就是说当它作sender的时候,remote的ip地址,portnumber之类的设定也可以在发送的datagrampacket里设定,当然接受到的datagrampacket里也包含了发送方的地址及端口。因此,socket可以是一个广播的socket,对于datagrampacket来说你必须给他一个buffer(byte[]),从这个buffer读写数据的话最简单的作法是用stream的方式来做生得自己去写数据类型的转换一类无聊的工作,也就是找一个实现了java的datainput,dataoutput接口的类,他们是DataInputStream,DataOutputStream,但是这两个类是建立在stream读写的基础上的,因此从byte[]到stream我去找了一个ByteArrayInput/Stream, ByteArrayOutputStream。这样你就通过实现了datainput,dataoutput接口的类来读写数据了,这是java编程里面常常出现的一类技术,即在一些原始的类质外包装一个实现了某种接口的类,这样一边使用某些接口方法,如我刚开始看到java的时候的bufferedreader之类的情况。不过我在使用bytearrayinputstream的时候脑子可能是停顿状态,因为我当时并不是很理解我在做什么,这一类的stream只不过维护了一个内部指针而已,读了数据之后你要及时把指针重新指向buffer的头,比如调用reset方法,同样的事情发生在bytearrayoutputstream身上,她内部也不过就是一个指针,写完了你同样要reset指针啊,我花了好几个小时明白了第一个reset,居然又花了将近一天明白了第二个reset,真是白痴级的好笑!另外我对于stop-and-wait也望的差不多了,居然没有概念,因为可靠性是依靠自然数的连续性来保障的,就是没一个自然数有一个唯一确定的successor,这个唯一性以及自然数的totalorder导致我们可以实现exactly once也就是说没有遗漏,没有重复。当然另一个作法是同学的建议,是基于UDP packet的生命是有限的,为了保证唯一性,我们可以维护一个序列号的窗口,检查是否有重复,是否有遗漏是有sender来保障的,即每个包都必须确认,从这一点来看,我们的实现有些累赘了。

看《星际之夜》,有一个日本玩家表演TvZ的建造顺序简直是一种艺术的表演,我现在才知道原来星际是可以这样玩的,我当然是一个不折不扣的白痴级的业余参与者,主要是欣赏战略战术过干瘾。然后是一个浙大学生玩家的大学生活独白,中国的大学生活就是这样子的,居然学校机房可以让你随便安装游戏,这简直是难以置信。当然了我想我晚出生几年一定是一模一样地这样生活的,呵呵。  

中日之间的话题总是网络新闻的热点,我常常在想这两个民族的异同,总的来说,两个民族的素质的差别不是可以道里计的。晚上做作业把sudoku的程序整理提交,然后又看《古钿任三郎》,这一类挑战仿佛就是一个积极向上的民族的特质。联想同屋的老赵看的那些中国主流媒体的电视剧感到这个民族实在是不可救药,整天沉迷于那些遗老遗少的陈芝麻烂谷子。我小得时候接触的日本的书,电视等等大多是智力开发类的,仿佛整个日本民族天天都在不停地动脑筋提高智力,憧憬未来,欣赏科学幻想。

本来晚上应该写程序争取完成project的,可是我总是提不起精神,最近这个星期差不多有一半时间没有去健身房了,一方面有些懒惰,另一方面时常被同组的同学抓到实验室,总之我这个人是懒惰成性的,假如我是中华民族的代表的话,中国的确是一个非常懒散的种族,所以才造就了我这种人。上个月政府把半年多的补助一次性发了下来,结果当月的伙食费我就增加了50%。    

四月四日  天又下雪了

今天学到了不少的东西,原来orbd不能正常run的原因是因为他有一个default的port number被占用了,不是ORBInitialPort。对于.net编程环境实在是有些羡慕,非常的周到,非常的强大,不过可惜我的破电脑应该是不太能够跑的动吧,然后花了大量的时间在看PLU的经典回顾,对于super的强的正面攻击力非常的欣赏。最近学习非常的松懈,生活也不是很规律。希望final之后能够恢复一下。 PLU联赛里我另一个喜欢的选手是WyW兔子。

四月五日  今天不下雪了但是也没有太阳

吾尝终日而思也,不如须臾之所学吾尝终日而学也,不如须臾之所思

我家的旁边就是皇家山,循着很陡的公路爬到山脚下还是挺费劲的,至少我觉得比在健身房踩stairmaster要累得多,下山回来的时候在Lincohn小街看着那些古老的建筑,突然听到新买的mp3里梁咏琪那带着磁性的声音心中忽然有一种莫名的震撼,仿佛心底里的振颤。为了捕捉着稍纵即逝的感受,我沿着街道走了两三圈。最后什么也没发现,我想也许是好多天没有去健身房,神经过于敏感吧?或者就是国产货里的通常都有的背景噪音的副作用吧?我想起这个花了150刀的MP3就有些气愤,made in china的东西就是这样令人气愤,功能上几乎应有尽有,价格上几乎无可挑剔,1G=150dollar,但是质量上实在令人发指,比如作为音乐播放器,你总会听到电流的背景噪音,你是什么心情,比如按了两下开关就死机了,你是什么心情,我到futureshop换了一次实在是懒得再跑了,看到背后一个小孔写着reset才恍然大悟,在中国硬件工厂里的软件编制人员对于有bug的程序通常就是这样处理的,大不了你全部清零一下不就行了吗?我想这种做法对于日本或者其它国家的工厂来说几乎是不可接受的选项吧?

重温PLU的经典战役,看到ZZRvsWyW的那一战非常的爽,因为ZzR在野外隐藏了一个兵营,等到进攻的时候,野外的那个兵营加入了30%的兵力,这个欺骗性的战术让兔子上了当。

每次考试之前我都是不务正业地干些别的不相干的事情,比如胡思乱想,东拼西凑,下午又靠看PLU催眠因为晚上要上课。洗澡的时候突然想到我在上个世纪遥远的年代曾经也读过一次大学,那是在一个著名的上海麻将大学里学习了四年的麻将八十分陆战棋围棋桥牌,回到家之后父亲非常的气氛,我却不以为然浑不知有什么了不起,因为当初方鸿渐游学欧洲还不如我拿了一个真的文凭呢,何况那个年代大家都是这样读书的。也许现在国内的大学还是差不多这样吧,只不过时代进步了,玩的东西花样更多了。后来工作以后过了几年之后就开始做恶梦了,内容总是大同小异,因为读大学的时候我基本上在期末的时候老也想不起来课程得名字,书本的名字,当然老师的名字就更是不记得了,一本新新的课本只在学期最后一堂课老师透露考试内容的时候用来画重点。所以,现在我重新读大学的时候特别注意教课老师的名字,虽然有个别课程的书本名字还是记不全但是专业课的老师大体上都记住了,这总算是一个进步吧。大话西游看多的人总是念念不忘那个着名的六段论,就是“当初。。。可惜。。。假如。。。我会。。。如果。。。那么。。。”,我试着往我身上套但是我发现这是不可能的,因为假如把我完全恢复成当初的我,放回到当初的环境,我多半还会做同样的我,因为本性难移,仿佛deterministic一样;退一步来说把一个改变过的我再放回从前的年代,可是环境决定人,我在那个环境下还是多半作大体相同的事情,结论非常的令人气霉,平常人赌咒发誓的所谓上天如果再给我一次机会之类的话完全是自欺欺人的,我从前老是做噩梦后悔也是毫无道理的,因为我当初并没有做错什么,重来一次也还是如此并没有什么可以改变的。唯独今天在一个完全不同的环境里做一个几乎完全不同的事我才有可能有不同的结果。听起来仿佛是宿命,但是这里有一个原因是昨天上课老师讲的系统的determinism我当时不是很同意,老师说的是很多系统的bug是一些timing event造成的,因此有一定的non-determinism所以一个容错的系统如果让所有的replicate运行在一种asynchronized的状态会有更好的容错性因为不会所有的replicate都出错,这个idea其是很不简单的,常人总是以为100%的复制是最好的复制,殊不知这种接近自然的做法有着独特的好处。

四月七日  今天有些冷

晚上时期末考试,这是第一次碰到的在家里进行的,当然难度要稍稍的大一点,不过和“算法分析与设计”的考试比起来容易得多,因为基本上对我来说如果一个问题能够用计算机来解决的话,我就会觉得容易得多,至少我的脑子不够用的时候,我可以求助于电脑。当然我不是说我没脑子,而是我懒得动脑筋,我宁可动脑筋让电脑帮我去解决问题。早上和下午花了将近一天时间企图实现Knuth's dancing link,难度也不是非常非常难,但是绝对不是什么容易得挑战,对于指针这类C程序员的基本功来说不算什么,问题是它那种奇妙的算法非常的高深难懂。等到考完试再玩吧。看录像看得都忘了还有考试。

四月八日  今天实在是太冷了

在没有写日记的日子里我是否和行尸走肉一样呢?因为人的记忆力是有限的而且有欺骗性,过后很可能什么也回忆不起来,那么一段空白的记忆和一种行尸走肉的生活有什么区别呢?今天要继续考试,虽然不难但还是要花一些时间吧,早上去皇家山跑步,感觉实在是太冷了,如果没有强烈的阳光的安慰我实在是没有勇气坚持下去,当然和路边穿超短裙露大腿的女人比起来我实在是太脆弱了。

四月十二日  天气很好可以穿单衣了

这几天实在是太累了,每天都是半夜回家,早晚两顿饭都吃不上,因为project明天就要交了,后天要demo。累得我都懒得睁眼睛了。

四月十三日  天气很热居然有二十多度

好像一开头就是说累,今天总算我们的fault-tolerant project完成了,又上了一课,以后要牢牢记住java里面synchronized的函数是一个同步的大陷阱,据说函数实际上是class级别的同步,意思是说凭直觉你要吃大亏,比如说一个class里面有两个方法A,B都是synchronized那么你在A里面是不能让别人再进B了,因为这个class里面所有的synchronized的方法都被你独占了,这实在是一个大陷阱。突然想到我心里的惆怅,记的老爹说我无病呻吟,可是假如我连呻吟都没有了那肯定就是病了。因为我不久前说我的痛苦就在于有的时候我的自信膨胀到可笑的巅峰,有时候我又感到很沮丧因为当你发现你所得意洋洋的东西在别人眼里不值一提的。不过我安慰自己说这就是一个人再学习,至少认识到了应该学习。我想现在应该把这个huge project的我负责的部分代码保留下来了,当然这个对于非分布式系统领域的人来说是不明其所以然的,我现仅仅是部属这个系统就要解释一大堆,不要说其中primary-backup的逻辑了,对于CORBA的namingservice系统我当初仅仅是浅尝辄止,这部分全部是由HM负责的,这部分差不多是整个系统的一半左右吧,我不能在这里公布,除非你想要,当然如果你想要你就得说,你不说我怎么知道你想要呢?当然我不能公布因为我已经提供了下载的链接。HM这部分作了很多很有意思的工作,包括我负责的部分有不少也是他改过的,比如UDP的server部分,我一开始的时候一直不愿意在里面做一个监听的线程,后来证明他的修改是对的,这样子的做法使大多数监听socket的做法,received不等于delivered,用户仅仅是从buffer里面取而已。又比如他在client端实现的global unique ID是依靠namingservice机制来做的,但是这个network上的同步方法是很普遍的做法,bind,unbind都会有exception,trybind不会,这样所有的client都先去rebind一个标志位,然后访问一个unique ID的发生器,比如一个递增的序列号,然后出来的时候检验unbind,如果没有exception证明你可以放心地使用,否则再取一次。就好像两个人一起去吃饭,留在后面的买单一样简单好用。

四月十四日  下雨了又变冷了

玩玩指针,knuth的dancinglink仿佛是玩杂技一样,我想不会有多少人能够懂得,索性我也不解释了,真想明白其中的玄机,自己去看knuth的paper吧,否则不会明白的。我跟朋友解释的时候说,这和武侠小说里说的一样,功力不够就算拿到了武林秘籍一样没有用,如果贸然强练武功最后非要走火入魔吐血而死。

四月十六日  下雨了又变冷了

今天没什么事情,除了吃了半斤多的猪肉就是把dancinglink写成一个class,因为要解决N-Queen问题。似乎学计算机的学生没有不知道8-queen问题的,不过我一直懒得写程序玩过,因为觉得有些不值得,说到底backtrack,或者DFS都是一回事,除非像今天这样用奇妙的指针玩的backtrack,奉劝想当然的朋友不要急于下结论,其实能够明白knuth的算法的人不会太多的,据教授讲,knuth的这种解决max-clique的方法是很多NP-complete问题中最快的一种办法,因此很多问题都实现转化为max-clique的问题然后再用knuth的这种方法。如果你真明白的话,你应该会惊叹,原来程序还可以这样玩!这就是The Art of Computer Programming。

四月十八日  不下雨可是还是挺冷 的

今天断断续续地看了快一天的virtual synchrony,还是不太明白,其中有些关键的东西始终模模糊糊,说是看了快一天,实际上包括早上爬黄家山,下午睡大觉的时间,可能真正看书的时间不超过两个小时吧,不过一个章节居然要让我看两个小时可以想象是多么的困难啊。为了证明今天我有活着,把两个星期前考试的考题贴出来充数。最近质量控制放得比较松,很多程序都给了星星,以资鼓励多写多练。为什么每次看TLS的结尾部分都有那么强烈的震撼感觉呢?而且看到了传说中的alternative ending。

早晨起来天气非常的好,结果还是无心读书,因为不懂,reliable distributed system实在是玄妙的紧,非常的晦涩难懂。只好把星球大战翻出来看。最后决定去理发。昨天在百无聊赖之际胡思乱想想到了一个15puzzle的解决办法,因为我觉得15puzzle绝非普通的max-clique问题可比,或者就是一个非常非常大的max-clique问题,因为他的元素实在是太多了,那么如何trace搜索过程中的重复问题是至关重要的,通常一个排列(permutation)的表达方法就是一个数组,可是这个数组还是有些太大了,何况比较两个数组的异同也是一个遍历数组的过程,而我们仅仅需要知道一个是否一样的信息就足够了,那么这个要求又没有让你想起什么呢?我想如果你和我一样有想过这问题就应该去想象一下所谓电子签名的原理,或者MD5之类的东东,原理应该就是找到一个唯一的映射,这个唯一的映射就是comb-algo里面学到的一个特性,任何一个数x都可以表达为一个unique的序列s.t.他们是i!的系数where 1<=i<n and (n-1)!<=x<n!。这并不是唯一的办法,其实只要你找到这样一个unique的序列就行了,那么至少对于一个长度为25左右的排列64位的长整数十足够了,当然看起来好像减少的内存不过是25-8=17bytes,可是其中比较的时间应该也要考虑进去就觉得核算了,过几天我写一个简单的测试来说明吧,总算能证明我还是能够思考一些简单的问题的。另一个小问题是关于project里面数据正确性的事情,我始终觉得没有把这个问题解释清楚,的确把一个复杂的问题用最朴素的语言来解释往往才能说明你是真正深刻地理解了,否则。。。其实也许可以这样说,这个系统里内部牵涉到三个基本的元素间的状态一致性问题(consistency),primary与backup之间,primary与primary之间,正常运行过程中,因为是一种lockstep的紧密同步操作(closely synchronized),所以你不必担心有什么问题,至少对外是一致的,那么在任何一个操作的开始与结束都是一致的,唯一有问题的是在一个operation的中间,(这里其实就是一个transaction的概念,either all or nothing),借助于log,只要我们能够维护状态与log之间的一致性那么也就可以在failure之后设法恢复三者之间的状态一致性,(写到这里,我觉得我又回到了当初的起点,我怎么可能把这样一个复杂的问题用朴实的语言解释清楚呢?还是放弃吧。)。。。

我还是看看我的羊肉汤怎样了。

为什么我每次去图书馆看书看不上二十分钟就睡着了?

晚上吃得太饱了撑得厉害。slides上说recoverability不等于high-availability,同样recoverability也不等于high avialability。这一点其实就是我的报告理想写而写不清楚的。

四月十九日  天气太好了早上又爬皇家山

今天下午去找教授终于比较清楚virtual synchrony了。

四月二十三日  天下雨了

这几天过得仿佛浑浑噩噩,对于考试一点也不上心,居然无聊的看起组合算法的书了,难道每次只有考完试了我才对一门课开始发生兴趣?再一次提醒一个小东西省得忘了找不到,tracert是windows下的命令。

今天看了新闻不禁感慨万千,中国的领导人实在是一代不如一代,自邓公以后再无一人可以入老夫的法眼。曾几何时,老江屁颠屁颠地一厢情愿地要和小克建立所谓的“协作型战略伙伴关系”,结果被小克冷笑声中放了五颗导弹打在大使馆上,真是热脸贴了一回冷屁股。这一次,小涛又打算一厢情愿地来个所谓和平崛起,还没起来就被小布打了一耳光,先是司仪硬生生地用“中华民国”的称谓来奏国歌,后来又让个轮子功的泼妇出来骂街,你想想看像白宫那样的地方连个耗子都进不去怎么会唱这么一出?可笑的是小涛一心巴望着小布给他个“国事访问”好见见美国主子的尊容,去年来了一趟没见着,今年可好,如此被这么修羞辱了一番,要是换作任何一个其他世界强国的领袖早就找个地洞钻进去了,还有什么脸面一心巴望着让美国人来压制台湾?这些读书人出身的所谓“领袖”就是不明白毛主席当年的斗争策略:越是怕打仗就越有可能被迫开战,反而是豁出去舍得一身剐才能有可能避免战争。大炮没有架在城门口怎么可能奢谈什么不战而屈人之兵?看来十年内这些窝囊废是一定会被逼着和日美打一仗了!

四月二十四日  天下雨了

看离散的书时非常费力气的事情,那么看comb-algo的书就更是费力气了,我几乎就是一个字一个字的反复扫描,一页纸的证明我反反复复的看,每看一遍都发现自己错了,每看一遍都发现自己明白了一些,当然每次看结论都不明白为什么。其实,这个principle of inclusion-exclusion的问题我原来就想过的,而且关于surjective function也就是onto function的个数问题我还专门讨论过一次,可是现在都忘了,只好再翻离散,真是圣贤之书常温常习,圣贤之理时刻在心。(这是《雍正王朝》里老状元被田文镜羞辱之前所说的话。

四月二十六日  天不下雨了,出太阳了

怎样形容一个人的短视呢?我几乎是盲目地相信了一个事实,然后就按照头脑里的印象去做了,发现预期的结果没有出现,于是才开始怀疑头脑里的蓝图不对,回过头来一步一个脚印地检查,最后发现一个最简单的事实,这看上去几乎是白痴般地问题解决办法,可是回过头来说,你有什么更好的办法吗?似乎没有!因为一个人头脑中先入为主的错误几乎无法自己自动地去纠正,惟有实践,所以说实践是检验真理的唯一标准。我前几天想用一个定理来做15puzzle里面的排列数的特征值,结果到了debug阶段才意识到一开始就是错误的,应该有别的办法,不过我的头脑想不出来一个公式,我想用电脑去“想”,也就是trial&error或者说搜索或者说尝试,总之,人脑不如电脑。

DSD的final可以说是我经历的最tough的考试之一了,首先题目非常的tricky很多问题是平常我们不愿意深入探讨的,比如2pc会blocking的状况为什么3pc不会呢?这个问题我原来就是take for granted认为可以就是可以,具体为什么没有想过,当然是因为简单地用脚趾头没有一下子想出来了,现在当然就通过考试题目明白了很多,2pc也不是不能防止只是大多数时候使用2pc的应用都着眼于效率没有人会去考虑fault-tolerance,因此,很少有人会想着用log来解决那种唯一死锁的情况,也就是initiator和其中的一个process一起down掉了,我现在明白为什么3pc可以解决问题了,原来以为blocking是由于2pc不允许vote commit的process abort的原因,现在才明白是因为,那个failed的process有可能已经commit的缘故,因为这个时候其他活着的process不知道是否那个process是否是commit,如果贸然abort会造成inconsistency,3pc增加了一个缓冲时期,使得failed的process最多进入的是一个prepared的phase,即便其他process集体abort也没有造成事实上的inconsistency。那么对于3pc这个状态是否是要用log的方式来解决呢?一开始我觉得不用,因为彼此broadcast了解各自的状况检查是否还有进入prepared的process来决定是否可以commit就可以,可是后来一想对于failed的process一旦recovery之后不是还要查询log来决定是否应该commit吗?这是否说明我们需要log呢?这也许说明我们需要log记录结果,不说明我们需要log来打破这种死锁。另一个特点就是题目的数量非常的多,总共15页纸,几乎每个问题都是要阐述的,很多问题很有可能你不知道他问的是什么,或者你根本就不知道有什么样的问题在问题中,design的课程就是这样,此亦可行彼亦可行,如何取舍?这种论述既要简洁明了全面又要一击要害非常的难,因为时间上的限制就直接防止你东拉西扯式地赚分数,我写的手都发疼了刚刚完成。再次就是实例design的题目非常地贴近实战,一个实例的应用如剥茧抽丝般地一步步深入几乎涵盖了fault-tolerance与high-availability的全部问题与方案,很多的是一个设计思想,如果没有题目的提示,实在不知道怎样答,但也正是提示很明确有时候不知道自己除了重复题目的描述还要写些什么,这是最让我担心的,就是面对一个design无所适从的感觉。

去考试的路上无聊地模仿《围城》里关于葡萄的哲学,比如有人总是说自己考试只能发挥出正常水平的一部分,照例这些人应该觉得乐观因为所有的成绩都有希望提高,可是这些人实际上是悲观的因为他们好笑又一个无形的上限永远无法达到最好成绩。想知道吃葡萄是从好的吃起还是从坏得吃起呢?去看原作吧。

四月二十七日  出太阳了,阳光灿烂的紧

世间的问题大概可以分为三种难度,第一种是用脚趾头都能想明白的,第二种是用手指头都能想明白的,第三种是用大脑才能想明白的。绝大多数人和我一样整天只用脚趾头思考问题,很多有学问的哲人是习惯用手指头思考问题,只有大师才是喜欢用大脑思考问题的。当然我并不是说平常人放着一个脑袋不去使用,不可否认一般人也并非一年之中从不是用手指头和头脑来思考。所谓脚趾头大约是一个人的经历所积累的所谓经验,因为这种经验常常跟一个人走过的路呈正相关,所以我称之为脚趾头的经验,用脚趾头思考大概就是典型的经验主义吧,你从来不太会建立新的模型,只会在固有的模型上加上一个经验验证的权值,你的经验模型被验证的成功率越高,你就越是会习惯地使用它,这种有趣的现象被很多无聊的人称之为性格或者习惯。当然这种模式你往往不是主动地建立一个模型,但是你有可能被动地接受一个模型,如果这个模型足够简单以至于你能参悟到这个模型的话。但是当你固有的模型无法解释的时候,你会怎样做呢?受过教育的人也许会寻求推理假设,然后利用重放类似的输入来检验假设,从而检验新的模型,这种假设推理大多数的工作使用的是手的书写,键盘的输入,你可以建立新的模型,但是这个过程是完全地基于实践的,因而我称之为用手指头思考,因为手本身就是一个实践的产物与工具。真正用头脑思考的人并不多,因为纯粹靠大脑就能建立模型并且检验模型的人只能是大师级的人物,这样的人几百年才能出几个,这样的事对于大多数人来说一辈子也不会发生一两次,比如爱因斯坦据说第一篇论文是关于光电效应的,它在没有实验条件的情况下纯粹是靠头脑中的模型推演出的结果,仿佛今天让某人不在欧洲的高能粒子实验室工作却要总结出一个全新的理论一样的困难,所以这种大师头衔没有几个人堪当。当然你应该明白用手指头思考的人不一定就决不会用大脑思考,只是频度深度的区别罢了。我是习惯于用脚趾头思考的人,偶尔地是用电脑练习用手指头思考。

发完议论,心血来潮决定去拜访远在皇家山另一边的蒙大的WLS,电话约好在山顶的charlie碰头,于是吃完早饭开始了2.5公里的急行军,一路上越过m条马路,n个红绿灯,遭遇了p个牵狗遛弯的老外,终于一分不多一分不少地准时赶到了山顶。等了半天才看到WLS拖着蹒跚的脚步爬了上来,终于两大主力红军胜利会师的激动人心的时刻到了,两位坚持在两个不同的根据地的革命领袖越过了重重的马路的封锁爬上了这座全城最高的皇家山在这里会师了,这次长征是播种机,是宣传队,是。。。(以下略去一千五百字)。来到了蒙大,这座传说中的美女集中营,到处是莺歌燕舞,还有潺潺流水,HEC高处入云端。(其实应该是蒙大的医学院的主楼入云端)来到了学生宿舍,看到了传说中的真正的学生宿舍,里面住的都是传说中的真正的蒙大学生。。。(以下略去废话一千五百字),来到了图书馆,看到了传说中真正的法文书籍和传说中的学生刻苦读书的景象。。。(再略去一千五百字的废话),来到了传说中的学生餐厅看到了传说中的学生认真补充食物的景象。。。(算了不略去了反正都是废话。。。)。总而言之,这是一个真正的大学的样子,设备齐全,秩序良好,学生刻苦努力,实在是让人羡慕,如果这里不说法语该多好啊。

四月二十八日  出太阳了吗?好像是,可是为什么春寒料峭?

在实验室里奋战了整整一天一只搞不明白OpenGL-Extension的环境是怎么样的,稀里糊涂地download好几个extension,到底是SG的还是Nvidia的,或者是说我的显卡是什么就应该用什么?最后比较RG留下的原始环境参照代码好像有了一线方向,其实编程我都不怕,怕的就是这种环境设置的问题,想想上一次为了设置web service的soap的环境花了我将近两个星期还是不行,当然这一次是C不是java没有什么大不了的无非就是努力工作以实验室为家而已,现在才有了一点点昂扬斗志的感觉。加油啊。昨天也终于明白了一个长久以来不明白的地方,我原来的glutObject的问题的确就是depth-test的问题,致使问题并没有解决,因为我一旦enable,立刻就变成乱七八糟了。早上出门的时候再想我所要找的序列应该不至于是“glomb number”吧?

五月二日  出太阳了吗?没有,因为下雨了,很冷的

WLS的project很有意思,一方面是视频捕捉图像识别,当然对于机械专业来说不可能太复杂,可是和camera结合还是很有意思的;另一方面是纯粹的EE,因为你怎样用并口线去操纵一个DC motor呢?如果不是步进电机呢?比如用脉冲宽度来控制(pulse-width),这些是学CS的人很难接触的,又比如怎样和一个实时的系统通信呢?中断或者信号等等都不行吧?这个rtsAPI用一个共享内存和应用程序同信,他自己据说是屏蔽了windows的所有中断,用一个内置的timer制造出了一个脉冲信号通过并口发送给马达,当然你可以传递不同的脉冲带宽来控制马达的快慢,角度等等。还有一小部分当然就是路线的选择,物体的大小,中心的计算,这些在cs的学生看来就相对简单了,不过怎样动手制作组装电机就是机械系学生的本行了。

经过两三天的瞎碰我总算知道是因为我的显卡不支持ARB_fragment_program而不是我下载的OpenGL的extension不对,基本上,如果你使用glew来作扩展,他会自动检测什么样的extension可以用,(至少检测的方法比较容易吧,对这个“自动”我还不是很确定。)也就是我问RG的问题,OpenGL extension是有几方面决定的,一个当然是显卡本身的硬件支持,在一个是厂商的驱动程序支持,当然也要有openGL的extension来发掘应用。所以这不是一个简单的问题。今天瞄了一眼成绩,comb.algo得了一个A,这只能让我叹口气,因为从来没有这么原本容易得到的机会被我给放走了,总是有些不服气,尽管自己有不足之处,可是再次借用项羽的话:那是“非战之罪”。接下来就是集中精力来读RG的code,好好努力吧,星期天顺便把那个sequence number的问题再想一想。顺便说一下,NVIDIA的quosal 8xAGP 64M不支持,Radeon 9800 Pro AGP 128M支持。

macro是非常令人费解的,比如看到#define offsetof(s,m) (size_t)&(((s *)0)->m),你能明白是在取得struct s的成员m离s开头地址的距离吗?我猜想没有多少人明白的,至少我是不懂,如果有人明白,不妨教教在下,先谢过了。

五月五日  出太阳了吗?出了,因为不冷了

偶然听人说到笔记本电脑才忽然想起我自己也有一台的,在斗室里brute-force式地遍历了一遍居然没有找到,一下子开始紧张担心会不会被人偷了,可是在这个路不拾遗夜不闭户的国家里很难想象有犯罪的存在,虽然中国人的论坛里总看到某人被入室行窃了如何如何,总觉得他们有点像是被劫富济贫了,这样说的太损了,如果老天有眼会惩罚我的,当然如果他有的话。再仔细地寻找记忆中的上一个checkpoint,似乎有一个记忆的link指向了我买的那一大堆高高摞起的储藏箱,是不是我把电脑藏在箱子里了?真正使翻箱倒柜式地搜索终于找到了那个熟悉的slim的身影,浅灰色的据说是莱奥娜丽在HP干的唯一一个工作,(我对这个女人的唯一的印象就是他的一张照片上夸张的宛如芭蕾舞演员般的手势的演讲场面,看来这应该是一个善于做秀的女人,难怪HP被她折磨得疯了,就把她赶走了,IT这个行业是个怪圈子,里面的所谓职业经理人都是圈内人士,谁能保证风水总是你家赚?此地不留爷一定要有留爷处,大家彼此性格方便,所以这些头面人物都是走马灯似地轮流转。此间奥妙详见拙文)也就是花大价钱设计的一个logo,多少回忆的盖子被揭开了呢?两年多的陪伴应该有多少故事值得回忆呢?我的喜怒哀乐,我的一举一动从没有离开她的监视,这么亲密的伴侣不妨就给它一个“她”的称谓吧。可是不知从何时起我开始不再使用笔记本了转而天天和那台台式机耳鬓厮磨的缠绵,被冷落的HP渐渐地封存在了尘土之中,慢慢地在斗室间显得更加的多余,不知何时何地在一个完全没有印象的日子里被打入了冷宫,从此在我的生活里消失了,从此虽然就近在咫尺却如参商般隔绝。究竟一段感情能够维持多久呢?相看两不厌,惟有敬亭山,可是在现代的社会里我们对于电脑的态度却是一句口号,“更高更快更强”。

那么就重新拾起独孤大虾在“剑冢”里埋藏的宝剑吧。

五月六日  出太阳了吗?没有,因为下雨了

OpenGL extension实在是只能用诡异二字来形容。我的台式机不支持GL_ARB_fragment_program,我的笔记本呢,干脆连GL_ARB_vertex_program也不支持,断断续续读code好几天了还是不太明白很多东西,尤其shader language要从头学起现在还是一无所知,对于octree也只是明白个大概,几次想重写结果都是刚开头就被阻住,先在写程序越来越慢的一个原因就是思前想后的时候远远多于勇往直前的蛮干。看到RG的程序里面view-transformation的matrix是左乘的非常迷惑,也就是坐标x矩阵而不是矩阵x坐标,是否我记错了呢?或者view与model本来就是这样反着的。

读RG的notes让我感到惭愧,很多人在拼命,而我在飘着,都已经十天了我不知道我都干了些什么!虽然中间有好几天是别的事情打扰了,可是我又没有认真读一读code或者书呢?虽然我自信可以以差不多的速度完成octree的coding,可是那是因为我学过这一类的东西,如果让我和RG一样去摸索,我就不可能像他那样了,也许是该我放弃C++改用纯C的时刻了,graphic的东西和那时候学systemcall差不多都是效率致命攸关的领域,RG比较了一个简单的C++的access function和纯粹的数据访问,fps有三倍的差异!回过头来看这个软件工程的问题,我是否也该保留一些notes给后人呢?如果有的话?可是我的英语没有办法描述那些微妙的想法,这一点就是印度和中国的差异,在写作上我们有质的差异。

在生活中我们有很多MutualExclusive的工作,可是人类社会的所谓semaphore大都是cooperative也就是执行者之间必须有一个最低的rule遵守,比如男女共用的washroom只好用一个牌子或者灯之类的作semaphore,可是如果要实现mandatory的机制就很难了。有一个电影用mobilephone作信号,可是这一类的信号的可靠性变成了分布式系统里讨论的failure-detection的难题,究竟non-response是transient-failure还是别的什么咚咚呢?更复杂的事情是Byzantine General的难题,如果这个failure非常地smart以至于自己能够选择error来误导你的话,比如葛优总是说我们在开会。

RG的code并不复杂可是为什么我总是不能静心读下去呢?究竟是读书困难还是读code困难,或者是读作者的notes困难?若夫心绪不宁,思绪若飞,何当镇定灵台?下个星期应该要申请护照了不然我这样一个黑人怎么像话?PLU的个人联赛不知道什么时候才开始啊!

五月十日  出太阳了吗?出了

幸亏我学聪明了没有贸然问RG他的分布式程序写了没有不然就闹了个大笑话,他用macro来定义本地和并行的程序(比如#ifdef DISTRIBUTED #include "DistMain.cpp" #else  #include "SingleNodeMain.cpp" #endif )(我以前很少用编译期宏指令,看来我要多学一学因为有的时候只能是靠编译宏指令来解决一些问题,淡然也方便不少。),我在Visual的界面里竟然没有注意到,无意中拷贝的时候才发现了“大油田”,我这个人实在是太无知,总把别人想象的和自己一样笨,等到看到了MPI里自定义数据类型才知道困难的地方,刚开始还跟着例子走,不一会儿就迷失了,只是模糊记得Linux里有个系统函数可以打包不连续的地址块可以来实现这个东东(这个只是感觉和当前的MPI无关),但是自定义数据类型之后再定义就迷糊了。还有RG用到了很多OpenGL ARB里面的东西我几乎还是一无所知,比如动态查询处理的pixel个数等等,这些东西在他的本地程序里我都没有看到过,看样子他的distributed部分作了很大改进,因为他的notes我仅仅读到一半就看到他在筹划的很多的东西,看来我又一次低估了别人的工作,高估了自己的能力,想在一个星期内完成别人好几个月的工作首先是对别人的努力的不尊重,其次是对于自己的能力的不尊重,也就是说指望自己做自己不可能做到的事情。昨天说起来丢人,想要试验一个简单的想法结果第一步就卡住了,后来不知道为什么OpenGL一定要加上glFlush才行?可是我以前的程序里都不要的阿。 看notes之所以困难就是说里面的东西都大都是些模糊不清,甚至错误的东西,很多不成熟的想法在这里被记录,一些思考的过程被披露,除非你有相似的经历,并且带着目标去捕捉特定的东西否则只是浪费你的时间。我本来问教授的时候猜测RG可能做了一些visibility testing的工作来culling,教授认为他可能想过但还没有做到,我后来明白他的code在作一个他自己的所谓prefix搜索,也就是找到合适的密度,这一点我倒是凭着脚趾头的逻辑猜到了,这个idea看能不能应用那片octree的paper来做?我好像上个星期想要作一个什么15puzzle的全路径搜索,现在都忘得差不多了,再记录下来吧。不对,我市要先解决一个permutation的signature的设计问题,当时在考试没时间,现在又时间了又忘了。(或者不想玩了。玩别的去了。)看来图形和并行这两大块没有一个不是硬骨头,都是数据与算法密集行业,我真应该用心去学啊。

昨天跑到皇家山上去跑步,气喘如牛,比洋妞都差远了,当然我想大多数的中国人体质就是这个水平,别看中国在奥运会上拿了几块金牌实际上整个民族的身体素质还是没有多大提高,办奥运会纯粹是政治考虑,老百姓在那里瞎掺乎,把那几千个亿的钱搞搞体育设施建设不好吗?主要是人民没有当家作主的权利,连预算的审查都没有参与怎么称得上是当家作主?WLS说他现在明白我当初回国时候的感受,就是仿佛鱼儿离了水,所以他只在北京短暂停留,的确当今的中国早就不是穷人生活的地方了,如果毛泽东还活着,他很可能要再写一篇《中国之当前各阶级之分析》或者是《中国即将到来的农民运动之考察报告》,这种状况其实已经不是什么秘密了,连小胡自己也开始在内部承认自己的党已经变质了,这是一个前兆,我想这个消息是确实的,因为据说他和小布什谈话时候坦白地向美国低头交底的也是这么说的,他说他现在每天大部分时间都是在处理内政也就是国内矛盾根本没精力与美国来较量。什么内政呢?无非是吃饭穿衣看病教育,这些人类最基本的需求。

前几天在大街上碰到Dr.D.F,他总是主动和我打招呼并且和我聊了几句,我心里始终觉得承蒙错爱受宠若惊,心里的感激简直就只能入滔滔江水才能形容。

上午去皇家山跑步,还是气喘如牛连海军陆战队女子分队的要求都达不到。下午去试验室待到快饿晕了,总算是有点成就感了,第一是冲洗安装wmpi应该是很顺利的,第二是重新编译RG的程序,中间遇到一点点地小问题,一个是RG用的openGL extension的版本不太一样,这个还不是主要的,最重要的是我一直不知道我必须把OpenGL32.lib要加入,所以全部的library包括OpenGL32.lib, glu32.lib, glut32.lib,glew32.lib, glew32s.lib,当然其相关的头文件和dll也必须放到适当的位置。编译的时候会产生大量的warning比如说链接不一致等等,不管他反正程序可以run。

五月十一日  出太阳了吗?没有,为什么?因为天上有乌云。(废话)

你知道天空为什么是蓝的吗?你知道为什么一年有四季吗?这是《我的野蛮女友》里的无理头式的问题。答案就是因为我说了算。你知道为什么我的OpenGL的library原来不能工作呢?因为,我设置nearplane时候设为了0。然后为什么就可以了呢?我不知道,我只知道以后再上comp471的话,你不用再编程序写code了,用了我的library保管你比别人编程速度快非常多倍。(夸张!不过我当时的确是把我的直升机程序重新作了一遍,大约只需要半个多小时吧,当然只完成了绝大部分吧。你可以试一试啊,)当然我的程序里面有一个重大的问题,我会慢慢解决的,其实我在我的project里面应该已经解决了吧。我忘了。我现在的记忆里只能维持两个星期,如果有人找我借钱过了一两个星期你看看我还能不能记得,哈哈,因为我压根就不给你借钱的机会,当然我有时候会心血来潮找你借钱的。

五月十五日  出太阳了吗?没有,为什么?因为下雨了。(废话)

我也许知道我为什么现在写程序越来越慢了,因为瞻前顾后太多了,比如昨天就为了定义octree里面各个子结点的enum顺序居然就翻书查看comb.algo是否符合GrayCode的顺序,这实在是太夸张了吧。很多时候我总在想怎样把comb.algo中学到的应用起来,可是好像很不容易,就是一个dancing link我都想了好久,好像除了max-clique这类问题之外都用不上,也许是我脑子装不过弯吧,教授的说法是用一种incremental的方法来记录变迁,我的理解是把深度搜索的context拷贝变成了指针的传递,看来我的看法似乎是太intuitive了,不过怎样incremental我也不是很理解。至于说lookup table的想法倒是比比皆是,比如看到一篇octree的paper说的很有意思是把set的generation应用到了,因为octree无非就是一个8个bit的set表达,那么set的顺序是否应该用order of minimal change呢?似乎要,可是有什么好处呢?realtime的图像变化符合minimal change吗?不知道。另外就是算法中学到的有一个矩阵快速乘法的思想就是化乘为加,因此那一片paper里面也有这么一个idea(好像他们是有实现的),就是把octree的点全部quantizate到中心,然后所有的点实际上都是一个对于上一个点地偏移,在geometry transformation中矩阵的乘法可以变为加法,M*(P+dp)=M*P+M*dp,因为后面两项都可以预先计算的。我的想法是在此之上的发挥,如果不先进行quantization到center,而是把每个点都记录成对于中心的偏移,那么这个思想也可以运用,不过工作量好像太大了吧,因为这成了偏移的偏移。另外想起来了RG说过的实际上我应该不需要链接OpenGL32.dll因为这个是MS的实现,windows默认都有的,一定是我增加了glew.h排斥了gl.h造成的。

常常听从国内来的人老生长谈式地说coding是最容易不过的事情,可是我始终不能苟同,如果这是件容易的事情我应该会感到厌烦的,因为简单重复的工作任何人都回厌烦的。问题的关键是coding的内容,如果有的人把参数设置,事件响应就当作是coding的全部那实在是有些无可奈何了,老实说有很多所谓程序员的工作实际上本身就可以用程序解决,也就是说他们的code本身可以用code产生,现在之所以需要他们仅仅是为了给产生code的code设定参数,一旦产生code的code本身也可以自动被产生,这些程序员就失业了。不明白说什么吗?比如原来我就干过一点点用c产生perl的事情,当然是部分的了,只是为了防止机械重复工作的错误。总之我觉得我现在每写程序的时候空发议论是世界上最容易的事情了,因为我可以安慰自己说我虽然没有coding但是在打字啊。码字工没有高低贵贱之分,只有分工不同。。。

五月十六日  出太阳了吗?没有,为什么?因为天上有乌云。(废话)

今天整理垃圾堆,意外地从里面发现了一张政府半年多前寄给的我的好像支票一样的东西竟然有六百多块,一时不敢相信,经过朋友确认才真的相信那确实是六百多个刀的支票,真是天上掉下来的馅饼,这个月的生活费又有着落了,哈哈。。。

五月十八日  出太阳了吗?没有,为什么?因为下雨了。(废话)

有所失必有所得,然而有所得必有所失,这个看似平常的俗语其实在离散数学里有非常深奥的道理,这个道理甚至于非常多的其他学科的自诩为什么博士硕士的都不明白,然而最深奥的道理有时候往往如哥伦布树立鸡蛋一样明显而又为所有人所忽略,那就是你很难把一个完整的鸡蛋树立在桌面上,可是敲碎了一头的鸡蛋呢?你想过没有呢?正所谓不“破”不“立”,有时候你实在不得不佩服中文的贴切。回过头来说那个浅显而又深奥的道理,在逻辑学上所谓“真”与“假”都是一些常量,在研究这眼里并没有什么区别,因此我们也无需认为“真”就比“假”来得好,因为说到底他们不过是一些记号而已,可以等量齐观。假如我们所有的理论都是建立在deterministic的基础上的,即我们只关心逻辑上的implication,i.e. A ==> B这一类的问题的话,我们完全可以根据对称的原则建立一个“假”逻辑的世界,就是像童话里的“假话国”,凡事都和我们颠倒的,很明显的他们的世界也是确定的或者deterministic的,也就是他们的一切理论的逻辑基础和我们的一样坚固。说了一大桶我也没有说到正题上,那就是所谓“祸福”本身在自然的主宰者看来并没有什么本质上的区别,如同硬币的正反面一样,作为人自己建立了好恶然后“趋利避害之”,然而世界是这样的复杂而广泛联系,牵一发而动全局,趋利避害谈何容易!

作为现身说法,我好像平白无故地捡了一笔原本就属于我的钱,因为加拿大政府是世界上最清廉的政府,支票不领明年也可以领,是你的总是你的。可是昨晚上我就发现我很笨居然忘记注册了,夏天便成了真正的假期了,但然没有想到的事我被推荐当了comp6231的TA和POD,想来也是有意思,上个学期我刚上这门课,现在来辅导别人真是典型的现学现卖。

经过一两个星期的迷茫好像有了一点点地方向,找到了一点点感觉,知道我该做什么了。去实验室吧。

五月十九日  出太阳了吗?没有,为什么?因为有雾。(废话)

关于OpenGL的矩阵的乘法,我一直摇来摆去搞得稀里糊涂,本来挺简单的一件事,我甚至在学comp471的时候就觉得很简单很清楚的事情还自己亲自用过呢,结果却变得糊涂了,真是应了那句话,看着简单的事情如果仔细思考的话也许会有很多的发现,(这句话使我自己临时想出来的,没词了。)总之,明白了一个大道理,就是OpenGL这么做是由大讲究的,很可能是为了装备有vector-register的GPU设计的,(事实上,Fortran的矩阵和C是不一样的,正好就是这样的,因为,作为科学计算工具,矩阵计算是家常便饭,所以。。。)具体是什么我已经详细写在了英文的日记里了。其实这个道理没有多深奥的,作为计算机专业的学生应该都可以想到的,只要你去想过这个问题,当然你要上过类似的基础课,国内叫做“计算机结构”。

五月二十二日  出太阳了吗?好像有。不过只有一小会儿,天很冷。(废话)

花了快一个早上才想明白当初我们在project里面遇到的synchronized的陷阱。原因就是synchronized的方法是atomic的方法,不同的thread是无法重入的。

头发越来越长,脑子越来越慢,我越来越只能思考一些中国国家高级领导人才思考的问题,也就是说拍脑袋的决策问题,反正比扔硬币强不了多少的决策问题,换句话说废物都能干的活了。因为一个简单的octree我磨蹭了一个多星期了,每天只是写两行就停下来了,当然这其中的客观原因是我对我要做的事情始终充满疑虑,究竟我是否应该存储所有的层,究竟我该不该把多个点归结为一个中心点?将来怎么把颜色或者说texture加进去?不知道,因为这个想法实在是太naive了,按照我从computer science学到的经验就是这么trivial的idea一定早在很久很久以前就被别人无数次地尝试过后称为“常识”了,绝对轮不到我了。正如Dr.M所说的graphic令人沮丧的就是每次你以为你想到了一个主义的时候你很快就发现可能上个世纪就有人尝试过你的想法了,这也正是英语里面常说的笑话,也就是只有亚当和夏娃不用担心自己会犯plagerism。很早以前,就是上个学期刚刚开始学java的时候,我曾一直想写一些小小的C++程序员看待java的tips。一直没有动手,总算今天开了个头。java vs. C++.

五月二十四日  出太阳了吗?好像有。天很冷。(废话)

制作了一个小小的slides用来解释synchronization的。今天觉得我这两个星期什么也没有搞明白,根本就不理解octree的用途。

五月二十八日  出太阳了吗?好像有。天很冷。(废话)

郁闷中。。。

五月三十一日  出太阳了吗?好像有。下午午睡热得我受不了了一觉醒来下大雨了。

郁闷了好几天总算meeting的时候有点东西可以交待了,至少我没太过于丢人吧,因为总算是改写了一下octree。实现了RG's paper里面描述的结构,把他的three pass改称了1.5次,当然他是不小心随手多traverse了一次计算boundingbox,但是至少第二次用BFS来traverse tree是不必要的。当然,我得所谓0.5次是说,我在第一次partition space建立octree的时候记录下了点的顺序,让后就是按顺序拷贝而已。有一点可以明确的就是原先设想的viewer-dependent-level-detail是有一些空想的成分了,虽然很多的paper都这么谈节省内存等等,实际上对于rendering用处有限,比如一百万个点一般来说也就是10层左右,可是有很多曾被简化到几十几百个点实在是没有意义,因此没有几层可以用了。另一个idea就是预先计算PVS(potential visible sets)的一类的,在复杂场景(scene)比较有用,(这一点和frustum culling有些类似的),但对于我们这样的单一物体实际上沦为计算backface culling了,二者通常是硬件去处理的。所以这也是一个没戏的想法,归根结底还是要回到parallel上来,或者distributed方向上,两者到底谁先谁后是无所谓了,实际上这两个方向是很难割裂的。另一个当前的头等大事就是GPU programming,RG使用了assembly的shading language,而现在大家都开始用高级语言的shading language了。这是这个星期的头等大事,要记住啊。我现在总是忘记大事,而对于诲人不倦的事情时非常的高兴的在做

现在回过头来看我这一个月都干了些什么呢?实在是有些乏善可陈,后来明白了,因为我已经忘记了我这个月做了些什么,当然就觉得我什么也没有做。比如看半个月前的日记,我得那些想法,我是忘得干干净净,不提醒根本想不起来!当然我对于学术的东西忘得很快对于杂七杂八的事情倒是记得,比如这个月又用政府的钱配了一副眼镜,无意中又从垃圾堆里找到了政府发的支票,第一次当POD和Tutor等等。真正的程序我写过没有呢?我得library改了一个数字号称很大的工作?除此之外居然花了快两个星期来写一个简单的DFS,改code比自己写来的慢吗?当然还是学到了很多,比如,RG用了很多宏命令来设置不同的模式,这和常量的作用异曲同工,可是仔细一想,这至少节约了大量的执行期的if then,反而使变量的一个内存的节省是小case了,会不会我太小气了,以至于在分布式系统里面谈论节省几条汇编指令的优劣?当然另一个我忘记提的就是他设计的project很好,所有的子project都编译成lib有一个主的project进行静态链接,同时,我还发现他居然是设置成了动态链接VC的debug 的dll,这一点我还想不明白,也许是release version和debug version的设置吧,以后留心看看。在一个学到的基本东西就是OpenGL的ext不需要你添加任何的dll,唯一需要的是一个glext.h的头文件,当然你甚至可以自己写调入那些extension的函数,当时用RG搜罗来的extSet实际挺好的,你也不需要用glew32.dll因为总有一些warning说你的ext函数编译部以至之类的东西。对于vertex_buffer_object要这么理解,就是第一次的时候是把数据上传到GPU的内存中,然后你再调用bindbufferobject并传递index作参数就是在refer那一个bufferobject,然后可以像使用vertex_array一样地设定vertexPointer,normalPointer,texturePointer,不同的是现在的pointer地址不是真的地址,而是在bufferobject里面的偏移量,可以想象这节省了从CPU到GPU的上传时间,虽然现在AGP据说能到1G,毕竟节省了很多。当然要注意,vertex_buffer_object和vertex_array是冲突的,同时使用必定down机重起。今天meeting里另一个问题显示了RG所评价的Dr.M的knowledgeable和循循善诱,可以说对graphic这一领域无所不知无所不晓了,借用《The Matrix》里面Morphius对Neo赞扬Oracle的话就是说,Try not think in terms of correct or wrong. Regard it as a guide who can help you to find the path.的确,是否把一个点加上很大的spatting传到pipeline好呢还是你自己定义所有的pixel来的好呢,凭直觉应该是前者好,因为这毕竟是让hardware帮你完成工作了,这个问题不用再想下去了。还有一点就是关于frutum culling的优劣问题,应该要成为一个定论不要再纠缠了,虽然它只对于复杂的scene比较有用,但是当object离得很近的时候也会有用的,同时我们采用octree的一个重要目的就是可以做frustum culling,因为这是一个hierachical结构,从根开始可以很快地判断结果不会占用displaycallback的太多时间,对于occlusion culling就没有这个特点了,所以结论就是frustum culling很便宜应该使用。这个月好像没有什么可以想得起来的了,就到这里吧。

六月二日  出太阳了吗?好像有。朦朦胧胧的。

昨天买了一台暴强的主机知道我现在用的显卡是什么?ATI X1600 PRO 512M,简直就是超酷了,知道pro级的显卡是什么概念吗?那就是巨贵啊,199刀啊!现在我把两台主机叠放起来,使用一个David强力推荐的转换器共用一套键盘鼠标,只要轻桥两下立刻切换到另一台主机上,真正实现了并行,分布式,除了用一个爽字来形容你还能怎么表达呢?

 六月三日  出太阳了吗?好像没有。因为下雨了。

今天早上混乱地道出搜罗有关GPU得咚咚我现在觉得GPUProgramming不是一个短期可以实现的目标,并且在这上面能出多少结果始终是一个未知数,甚至会被当作intellectually shallow吧?因为毕竟在学术上没有什么价值吧?当然作为game公司的programmer总是好的.因此还是回到并行这一块吧,我想实际上imbalancing的问题只是一个学术上的问题,现在我面对的是一个简单的场景,固定的object,不管怎样最低限度每个node都要完成最低的工作,如果因为物体移出view volume以外,这并不代表说我应该让这个空闲的节点分担别人的工作,因为我们的工作是固定的,没有必要变来变去的。一个稳定的输出哪怕慢也未必比一个不稳定的时块时慢的系统来的好,因为我要欺骗的是人的眼睛。

想起了很早很早以前使用工作组的时候的事情,因为windows只是认user name,所以若你把两台电脑上的administrator的密码设成一样,就可以互相访问共享文件了。当然还有一个前提就是要启用文件共享的服务,这个可以在netsetupwizzard里面做的,实在是很久没有用过网络上的电脑了这些基本的东西都忘了,比如使用netsend之类的命令之前你还是要启用messanger的服务的,当然这里的messanger和windows messanger是两码事了。

饿着肚子漫步在st.catherine大街上,天色阴郁,云飞风紧,小雨点似乎很善解人意似地往你的脖子里钻。总的来说,人的本性正如三字经里说的,人之初,性本惰,如果我吃饱了喝足了决不会为这样一些问题发愁,比如使sort first,还是sort middle,是否应该由master来决定visibility test然后在收集所有data的时候才能正确地写入framebuffer,究竟有多少种buffer呢?colorbuffer, framebuffer,accumulationbuffer,texturebuffer,stencilbuffer,pixelbuffer ect.究竟哪些是概念上的,哪些是实际存在的,还是说和具体的实现硬件相关?究竟应该从那个buffer里面取,究竟应该写回到哪一个buffer里去呢?我在想,世界上像我这样安贫乐道的人还有几个?从物以希为贵的原则来看,我差不多快成为国家级保护动物了。你看,我基本上拒绝一切有可能使我自己堕入荣华富贵的机会,比如我不买彩票(当然我没有闲钱),我不玩股票期货(穷人哪来的本钱),我没有主动去找工作挣钱(我懒,我有错吗?),我基本上不给自己被富婆包养的机会(我倒是想,可哪有呢?),国内凡是招聘CEO的我肯定也不会去(好像还没听说来这里),走路基本上只看天上的云彩和路上的美女决不给自己捡到百万英镑的机会(加拿大的支票你也取不了现金),每每有朋友谈起做生意赚钱的事情我就闭上耳朵(你倒是试试看能不能闭上?再说了,我是明知道他们都不大可能成功的。),总而言之,一个人到了我这种境界了,除了世界局势和PA特价青菜的消息都不能再引起我的注意了,这样的人算不算纯粹的人,高尚的人,一个脱离了低级趣味的人,一个。。。慢着,白求恩塑像前又有一堆中国人在照相,一望便知是公款来旅游的,拍两张照片作为学习成果的证明,然后夹带着连去看table dance的发票一起报销,这种生活实在是令人。。。哎,反正我是没机会了,谁让咱来这插队呢?可是话说回来了,真让我国他们那种生活我一定会很痛苦的,你想整天吃饱了喝足了,除了发愁怎样吃喝玩乐每天腻味死了,连半年吃一次冰激淋得快乐都没有了。又来到了前年夏天吃冰激淋得大教堂前,那时候有两个看上去像是俄罗斯的音乐家在演奏吉他,我就到对面的麦当劳买了一支1.03元的火炬冰激淋,坐在教堂门前的石阶上边听演奏便打瞌睡,那音乐实在是太动听了,听得我只犯困,后来就去Ailes百货店里的真皮沙发上睡觉去了。啊,这样的生活享受,他们能有吗?

六月四日  出太阳了吗?好像不知道啊。

今天花了一个早上被RMI的remoteObject折磨,原因是我想返回一个class,这必须实现Serializable的接口,最简单的就是找一个class来继承,我觉得remoteObject挺好的,就从那里继承,结果总是抱unmarshalling的错误,后来看例子采用普通的类,仅仅声明实现Serializable接口并没有实际实现居然可以实在是玄妙。“rmic”始终有很多末民奇妙的东西,还是仅仅用javac来的安全。我对于RG的paper里面的东西总有些将信将疑,莫非他仅仅是在谈设想?或者他的code另有玄机我还没找到?难道他抄的那几段汇编能有大名堂?不太可能。又或者他还有别的版本?

六月七日  出太阳了吗?好像不知道啊。

没来由地受了一肚子窝囊气。中午会面发现自己像是一个傻瓜,所有的事情都想得不对,下午准备尝试让硬件做visibility test我用color的index来检验,可是readbuffer或者readpixel好像不对啊。后来发现了rasterPos的一个用途,就是随后的glGet(GL_CURRENT_RASTER_POS)可以得到Transformed的坐标。教授叫我看North Carolina的论文,还没有找到。好累啊。晚上心情很不好。

六月九日  出太阳了吗?没有,因为有下雨了。

郁闷了一个下午,最后在小雨中散步了快一个小时。有时候感觉真的如歌里唱得那样无奈与无助,到底为什么郁闷,甚至我自己都不知道,只是觉得很压抑,那种感觉仿佛是带领一支残破的游击队和全副武装的德国最精锐的党卫军装甲师对阵一般的无望。totally clueless,对于一连串的invalid operation我并不是绝对担心我不会最终找到原因,可是,这样的进度实在是比龟步还要慢很多啊。frustum culling的一个小小的bug耽误了好几天,虽然最终找到了我却毫无轻松的感觉,我的意思是说,这仿佛是一个被宣判死刑的囚徒发现审判书上有一两个错别字便要求上诉,结果并不能改变什么,因为本来VFC根本就是只针对复杂场景才有用的,比如早上按图索骥去Dinesh Manocha教授的网站去下载他的录像才体会到像这种power plant之类的才叫做复杂场景或者超巨模型,这时候当然是极其的有用了,而像我种小模型实际上毫无用处,因为为了取出千分之一的点是完全不划算的,(octree如果平均来看搜索不能超过三层,否则就是只有最多百分之几的好处而已。)我的quantization的idea实在是幼稚的可笑,以至于我都不好意思提了,究竟clientside的state和serverside的state有什么区别呢?glEnableClientState?是什么意思呢?我不明白人的一生中可以犹豫多少次,去年的夏天我在最后的一刹那犹豫了,当时以及事后我都不清楚,仿佛在《The eagle has landed》里的男主人公在小说结尾扣动扳机的一刹那致命地犹豫不决了,连当时大义凛然的Winston Churchill德what are you waiting for?也回答不了,的确,totally clueless。作者的解释时Karl Steiner的德国血统的一半要求他不惜一切代价完成使命,哪怕对于目标极度的怀疑,而他的美国血统的一半却在他即将完成的一刹那开始质问那个使命的意义何在?前年夏天我在一种不经意之间虚度了一个宝贵的夏天,你可以说我当时没有条件,毕竟我连Linux的ls的参数都搞不明白,结果几乎是在最后二十天才看到了一些希望,可惜已经太晚了,我真担心这个夏天又要重演悲剧。我并不担心困难,我所担心的是我身上的异化的迹象,一旦失去了最初的热情,所有的一切都是转眼成空。一个丧失了用键盘思考人生的人还有什么。。。对于RG的其他部分代码我也只能一步一步地探索,我当时大言不惭地说已经看到了70-80%现在我不知道怎样对自己解释。

六月十四日  出太阳了吗?阳光灿烂,心情也就好了。

昨天筋疲力尽中(因为本科毕业了,哈哈。。。),毕业典礼古色古香安排的滴水不漏,井井有条,每当屏幕上出现某伟仁兄或者仁姐拥有出名字以外的多个title的时候大家都会热烈鼓掌表示由衷的钦佩,至少计算机系,和软件工程的各位大家都彼此清除整个本可读下来的课程实在不算很轻松,虽然是二流大学,也绝对没有国内的大学那样好混,要拿到高分当然就更不容易了,这里虽然没有什么风气说是一定要排个名次,但是大家对于本系那几个with great distinction的还是钦佩的紧的。

今天持续充电中。。。为了对自己有个交待,过去的一个星期里,我也不是闲着,我在当应答机,回答问题,改作业,(当然看官如果不是中级水平的程序员,或者对于分布式程序设计感兴趣的专业人士还是不要进去看了。)但是对于OpenGL除了去试验了readBuffer里的颜色来测试输入点的visibility之外没有什么进步,不知道要在这个星期的meeting里怎么谈了。。。

六月十六日  出太阳了吗?阳光灿烂,心情也就好了。

Dr. M给我的感觉仿佛是和煦的春风,每次当我对于前方充满迷惑于怀疑的时候,和他谈话之后就又有了信心。我现在还需要了解的就是two-pass的blending的algorithm。然后就可以开始进攻了,不过到底需要不需要创建线程来同步呢?好像很明显的需要。

写到这里突然决定进行一次长途跋涉拜访朱春明,于是沿着atwater大道跑到他家里去和他的两个同学踢了一个半小时的足球,真累啊。晚上吃了好多西瓜和一顿丰盛的晚餐,饭后闲聊了一些关于相对论和进化论的话题,一不留神都已经半夜了赶快做最后一班地铁回家,回来后洗个澡,筋疲力尽的快乐地给今天画了一个句号。真是幸福的一天啊。

六月十九日  出太阳了吗?阳光灿烂,心情也就好了。

改作业改的我是昏天黑地,结果发现这个班级里面高手还是不少,又一两个真的是专业级。顺便在看在线的《编辑部的故事》,又看到了我年轻时候的偶像,戈玲。

六月二十五日  出太阳了吗?阳光灿烂,心情也就好了。

头疼,头疼。昨天发生了什么事情我今天就忘记了。是前天偶然看到的F1赛车,还是大前天,仿佛我收到了两张mr.Y送来的学校的支票,是半个学期的TA的工资,我当时在暗想如果把这个也记录下来被胡一刀看到一定会夸我有大文豪鲁迅的遗风。当年就是他告诉我鲁迅的日记里无非也就是记录一些某年某月某日某人来借钱若干之类的流水帐。那天聊了很久都是关于北美这里的股票操作的,正好我的这个TA里面的程序就是一个股票交易系统,想想看,完全有可能有人去写一个程序自动地进行股票短线炒作,比如一分钟之内就脱手的速炒,风险完全可以控制,盈利基本上是一个很小的固定数,这样一来巨大的交易额来获取利润,有没有想过如果纽约证券有一天统统是这些无生命的程序在炒作的话,这个世界的末日就差不多来了。有没有可能资本真正地从这些无意义的交易中产生新的价值呢?决不可能,经济规律一定会惩罚美帝国主义的这种投机主义的,毕竟资本归根结底还是要靠人的劳动来创造,假如有一天机器人成为劳动的主力,那么意味着世界的主宰就成为了机器人,人类的末日就来了。期待中的PLU比赛又一次的失约了。头疼,头疼。

下午,学习三国演义里的赤壁之战部分,着重于计策的实施细节。昨天的半个西瓜就当作是午饭的一部分了。目前关于我的头疼的另一部分仍然无头绪,也就是从background运行的daemon里面来画得window和我从普通的程序产生的window究竟有什么区别的问题,也就是在main里面怎样用纯得win32api来画window问题,待我找出我的就笔记本的资料再说吧。

六月二十七日  出太阳了吗?阳光灿烂,心情也就好了。

头疼,还是头疼,昨天终于等到了图书馆用email通知我借的那本书由到期了,长就以来这已经成为我的作风,图书馆的书接回来从来没有翻过一页纸然后静静地等待到期归还,如果时亲自去图书馆看书几乎可以肯定在二十分钟之内我确定肯定以及一定会昏昏入睡。我总在发着全世界懒人一样的感慨,假如我能够在努力一点,我肯定就。。。 昨天我有一次发下宏愿,不破楼兰誓不回,可是结果不到九点钟我就从实验室回来了,当然楼兰没有破,不过倒是回来之后发现了楼兰是可以破的,我有一次地犯了一个低级错误,我为了防止自己忘记分配buffer给socket,有意识地县把buffer长度变量初始化为负数,这是我从以前的一次灾难性经验力学到的,可是我的确没有忘记分配buffer,我只是忘记把这个buffer长度变量改回来了,结果折腾了几乎半天时间呐,真是被大虾们笑掉大牙。有时候我在开始回忆当年黄连生所说的他写程序熬不过三十八岁的话,我现在越来越不太敢出手写程序了,竟然开始写一些伪代码了,堕落的和那些写java的人一样了。今天在我在图书馆睡着之前我总算看到了MTU时maximum transmission unit德所写吧。我现在在自己家里睡不着,一到图书馆就睡着,为什么不搬到图书馆去住?

下载了微软拼音2003感觉那简直就是一个飞跃,你可以想象微软中国研究院做了多么了不起的工作,的确这些细微末节的东西在很多人眼里没有什么了不起,可是这是自然语言哪,说明他们的模型现在已经超越了很多教科书里的描述了,至少我是这么认为的。

最可能成功的事情不会使我最想要做的事情,最想要做的事情也绝不是我认为最可能做的事情,最现实的事情和最可能的事情以及最想要做的事情也是无关的事情。突然收到才会意识到也才想到,其实那件事的最佳人选是这个人,虽然并不是我最认同的人,我最认同的人并不是什么最佳的人选,有时候偶尔地想起email的落款上的一对彩翼,只可惜灵犀指却难以跨越太平洋或者是大西洋。究竟Petzold的教程被我存到哪里去了呢?难道是安睡在最早的那台compaq里吗?还是后来的那台韩国造的杂牌笔记本?想到这里我就恼火google desktop  search不能自定义搜索文件的位置害得我只好删除了已经超过了一个G的巨大index文件。晚上吃不吃饭呢?好像只有蜗牛罐头了,这个星期要记得去学校问问看为什么夏天不给我发补贴。

六月二十八日  出太阳了吗?没有,因为下雨了。

昨晚去实验室结果一个人也没有,我还以为我记错了日子了,想想看大家都在考试吧,一个人待着也不敢走,就听在线的音乐吧。今天早上想起昨晚收到的RG的mail总觉得不甘心,可是造化弄人,MPI居然比我用UDP快了十倍还不止!难道。。。听梁咏祺的歌曲居然听出伤感来了,为什么我每次穿短袖的事后天总是比较冷,我穿长袖的时候天比较热呢?非常的沮丧,明天的meeting不知道要说什么?

 

七月三日  出太阳了吗?好像有吧。

搬家了,从一个陋室搬到了另一个陋室。看好莱坞的老电影看的很高兴,江的事美国人嘲笑欧洲人的事情,一家子美国人周游欧洲,遇到的各个国家的笑话,比如嘲笑英国人的酒店房间里没有卫生间,房门没有房号结果晚上统统上错床,租车老是忘记要左行,结果不停地撞人撞车,可是每一个被撞得英国人都是喜笑颜开,还不驻地道谢。原来这是美国人在嘲笑当时有名的“英国病”,也就是高福利带来的问题,比如被撞得车子可以去保险公司索赔正好把以前的小毛病一起修好,被撞的人正好可以带伤休假出去旅游疗养。来到了法国,公共场所法国人的肆无忌惮让美国小孩子看的热血沸腾有样学样很快就学会怎么去夜总会狂欢了。来到了德国,德国人的好客让他们在一对陌生老人家里吃住了一天,临走的时候两个老人还不知道这一大家子是哪里来的。来到了意大利,遍地都是犯罪连换个旅行支票都会遇到打劫绑架。

七月五日  出太阳了吗?好像有吧。

很巧碰到了D君,原来他就住在我隔壁,他聊起了很多一些我闻所未闻的事情,心情也有些郁闷,因为有些事情不知道是不是就是现实的问题。我常常想钱这个东西肯定不是好东西,有了它你就会变懒,但是没有它你也活不下去,最好的解决办法就是刚刚好,但是前提是你不缺钱。矛盾啊。

七月六日  出太阳了吗?好像有吧。

生活中有很多无法解决的难题,比如一块面吃不饱,两块面又太多了,方一个辣椒尝不出味道,两个辣椒又有些太辣了。吃饱了撑得怎么办?去看爵士乐我穿的拖鞋走不了那么远,就近有fantacia的专场电影,我又舍不得花钱,再说了队伍排得无比长,那么还是只好回家了。回来的时候发现以前总是碰到的一个小留学生原来就住在隔壁的大楼里面,可是那又如何呢?

七月八日  出太阳了吗?好像有吧。

郁闷。什么是无稽之谈?所谓阴在阳之内,不在阳之对,结束结束在开始开始之前。获取RGBA之前要记得设置GLUT_RGBA和GLUT_ALPHA模式。

七月九日  出太阳了吗?好像有吧。

OpenGL的pixelbuffer读与写不是对称的,就是说读是可以直接,写却是要经过transformation变换的,看来只能求助于extension了。晚上看LarryKingLive的对布什的专访,感觉美国的民主制度实在是世界上最完美的制度,依靠这种先进的制度美国至少还可以维持繁荣一百年以上,在这之前有一个CNN的一年前的纪录片反映北朝鲜的现状的,当然是应因这两天的北朝鲜导弹危机的,当然那些从隐藏摄像机拍到的纪录片可以有一种震撼的感受,仿佛就是再看一遍《1984》一般。

七月十一日  出太阳了吗?好像有吧。

这些日子里我只会说一个英文单词,clueless。OpenGL没有开放类似于直接写colorbuffer的函数,drawpixels绕了一层,你必须使用一个current rasterPos的object world coordinate来指明当前的colorbuffer的位置,可是这个功能对于别人很有用,对于我却很头疼,我怎么知道当前的colorbuffer的原点对应的物体坐标呢,除非计算MVP的inverse,并且我用的事gluPerspective,不然用glOrtho也没有问题了,可是能够用glOrtho吗?物体太小了根本看不见。而且,另一个好笑的事是rasterPos用的坐标原点是在左下角,通常windows coordinate在左上角,这看样子是OpenGL的规范了,并且如果是float的话数值是在-1与1之间!另外一个讨厌的东西是关于drawPixels,他还需要设定pixel矩阵的内存存放方式,这个市在另一个pixelStore里面的东西,UNPACK_ALIAMENT的设置决定了下一行的地质开始“跳跃值”,这个有时很tricky的东西,因为drawPixel不仅仅是写colorbuffer,也不仅仅就是写RGB,它可以有多种方式,那么每一个group的数据类型也可以多种多样,因此对于32位寻址方式你必学给他一个提示,到第一行完了下一行开始要跳几个byte。如果这近几年使问题的全部我也就谢天谢地了,问题是我总觉得:1. rasterPos是要让整个写入的pixel data都apply transformation matrix的,当然我认为Sushil的说法是对的,仅仅是一个coordinate,不过我还是不放心。2。这样的buffer写来写去太慢了,我想用类似于vertex_buffer_object的东西来直接读写colorbuffer,比较有希望的事pixel_buffer_object,他用的是ARB,可是查询了一下ATI居然没有,看来ATI被收购真是活该,他的那个extension setup的简单的小程序非常的令我费解,我常常怀疑写那些宏命令的人和我哪一个理解问题有困难,仿佛是他写了很多不应该的东西。而且,我怀疑我眼睛看花了,居然vertex_buffer_object没有实现我就能用!肯定是我眼花了。

恍惚之间从睡梦中惊醒,原来该吃午饭了。炒菜的时候忽然想到那些不久之前的梦想与失落,当时的情景就如同大多数人所执著地认为的那样,那是唯一的选择,一旦失去实在让人不知进退,然而时过境迁幡然回首却发现你所谓失去的从来就不该属于你,你得到的也许才是你本该得到的,那种感觉仿佛拖着伤寒病体在饥寒交迫中修铁路的鲍尔科察金忽然看到身穿貂皮大衣一身贵妇打扮的冬妮娅的感觉,你会突然开始质问当年心底里所憧憬得到地理现实与真正的理想有多远。当然如果你以为我所谈的是人,你就太小瞧我了。

七月十四日  出太阳了吗?好像有吧。

郁闷了很多天终于看到了一线曙光,其中一个absurd的问题还是OpenGL的extension的问题,至少我是这么认为的,只要我enable了GL_ARB_vertext_program之类的我写入的point的color就变成了白色这是在世难以捉摸的事情,我也懒得去看OpenGL_ext的文档了,那类文档非常的晦涩,纯粹是开发人员的自问自答,对于原来非扩展的部分不熟悉的话,完全不知道再说些什么。另一个大的调整使我终于决定把显示的终端和输入用户操作的终端分开了,这样省事多了,省得我总是为perspective和orthogonal显示模式发愁,让教授对于我的concern非常的不理解,我也了解他的心情,就是赶快验证一下这种纸上谈兵的可能性,在图形方面的大师对于网络和并行不甚了解当然是非常担心一条路从一开始是否可行的问题,可是这一行很多都是实现的细节,也许看来不可行的实际可行,也许看来可行的实际不可行,我也不知道该怎么说,原本我比教授还没有信心,自从被他打了一极强心针,变得比较有盼头了。不过其实我想记下来的事我现在好像随便一看就知道是有一个同步与异步的问题了,比如一个master和若干个renderer同时要发包给displayer那么你用blocking的MPI_Recv不死机才怪呢,这种问题应该能在一分钟之内想到,当然我是早就怀疑了,只不过为了调试方便采用同步的收发,不然那才是chaoes呢。早上起来看Plu的联赛很过瘾,有一个博士发帖子问还有没有爱玩sc的博士,我谈不上玩,只是喜欢看直播,比那个什么狗皮世界杯好看多了,当然世界杯我是几乎一次也没有看过了,现在我好像越来越与凡人的兴趣爱好不一样了,不知道是好事还是坏事。应该是两分吧。下个星期去学校再去问问钱的事情,现在的政府就是这样不负责任,居然不知道应该主动来问问我们劳动人民有没有钱花,难道总是要我亲自去查询他们是不是犯了错才行?

七月十五日  出太阳了吗?好像有吧。结果又下了暴雨

昨天好热阿,据说有三十多度,惹得受不了了只好违背原则第一次晚上去实验室,因为有空调。当然去实验室之前还是要微服私访体察民情一下,独乐乐不如众乐乐嘛。当然我平常所有的衣服都是微服了,我平常时时刻刻都算是在体察民情了,只不过我这个民比一般的民情特殊一点,大家都有的我不一定有,大家都没有的一般来说我也没有。早上起来去实验室转了一圈,在证实了一下同步传输导致死锁的问题,我敢说同步接受不一定会丢包,就是说先前接受的也许会存在某个内部的buffer里面,但是这一点谁也不敢保证,也没有什么意义去研究,总之只能用异步接受,这样连广播(broadcast)也不能用了,同时明白了一点,ready-send,与non-blocking的异步send是不一样的,前者要求ready-receive或者异步接受已经post了接受的请求,这个看来要求有点高,只好用普通的异步了。就那么几行代码我却懒得写,磨蹭了一下决定再次体察民情去了,反正已经微服了。外面真热闹,整个st.Catharine大街变成了地摊街,连La Bay都开始练摊了。人民欢天喜地地裹着我看不懂得节日,我看了看觉得没有什么我可以买的东西,第一,基本上那些东西我都不需要,第二,没有预算,娱乐开支千年大概就透支了,不知道今年的预算是否已经被预支了,服装的预算去年底一口气买了三条Levis的牛仔裤也已经用完了,至于其他的开支嘛好像今年还没有编列吧,啊,不对是今年又买了一台电脑全部都挪用了,看来这种人回国当领导一定会把文教体卫七七八八的经费都挪用的,危险啊,新奎没有机会当领导不然怎么得了啊。走过一个草台班子的厂子看到免费演出美国百老会似的歌舞,看着很不错劳动人民大都列着大嘴乐个不停,这种形式的文艺活动要多多开展,找个机会让小胡给下面传达一下,明年多拍几批干部来这里学习一下,顺便帮我从国内带点东西过来,当然这个就不用传达了。大概国内过来的人的英语程度可以用一些简单的单词加以测试,比如这个funkyZone里面的funky就是一例,我去年丢的那个带usb memory的手表就被Alex称作funky。视察结束的时候碰上了大雨,我心里在为那些摆地摊的感到难过,好不容易开张清仓处理全都被突如其来的大雨淋个透今天肯定是亏大了。在这里做生意的真难啊。回来后第一件事就是再喝一罐可乐。

七月十六日  出太阳了吗?好像有吧。

今天仍然好热,大约三十多度吧,也许在可以预见的将来,魁北克要变成亚热带了,那个时候我要迁移到北极圈去生活了。吃饱了撑的,就上街溜达,发现了一些表演,比如苏格兰风笛的吹奏完全是一种异步的过程,就是说不断吹起到气囊里,然后就保证了气流的稳定输出与声音的连续,用不着吹奏者有超人的肺活量一口气吹到死。这种独特的方法是所谓的中华文明永远想不到做不到的。西洋鼓乐队的演奏很抢眼,尤其是指挥很风趣有感染力,这是一个相当困难的同步过程,要所有的队员都依照同一个节拍演奏本身就是一个不断调整的过程,当然因为有一个统一的时钟频率问题好办多了,不过指挥大部分时间并不在指挥,因此平时需要队员之间根据彼此的节奏调整,这个过程是实时系统的关键问题。早上去解决了一个小问题,现在系统算是OK了不过好像是lightmaterial没有设置的原因,图像是黑色的,什么时候去试一下,不过最大的问题还是怎么改成多线程的系统,我想先稳定一下,不然一个使用OpenGL的再MPI之上运行的并行的不仅仅是数据分布处理得还包括功能分布处理的实时图形处理系统要在进一步便成多线程恐怕又要一大堆的bug等我去找,这个还不是我最担心的,毕竟问题比较简单,最主要的是OpenGL的extension部分由时候对我来说实在是捉摸不透因为从来没有真正玩过,除一个什么nusance的问题,我又要想破头了,像上一次我是只能把code拆到最最简单才发现是gl_ARB_vertext_program在搞鬼,实在是辛苦。

好莱坞的黑白老片子很有意思,今天看了一部浪漫戏剧,明白了一个道理就是一个粗心大意的愚蠢女人可能比凶猛的虎豹更危险,整个电影里的女主角就不断地在制造麻烦,先是拿错了高尔夫球,然后开错了车子,拿错了钱包,偷开了别人的汽车一边逃避罚单,这一切给男主角,一个当天下午要举行婚礼的博物馆的自然学家造成了巨大的麻烦,一会儿要去从涅狄格州抓豹子,一会儿要被迫冒充别人的名字,最后被投入监狱,丢了未婚妻,丢了捐助人准备捐给博物馆的一百万美元,总之麻烦接着麻烦,笑料连着笑料,我想所有的观众发自内心的唯一的想法就是全男主角赶快离开这个漂亮女人十万八千里才安全。整个电影的一个突出特点就是好莱坞黑白片时代主角对白很快,说话非常的连珠。

七月十七日  出太阳了吗?好像有吧。

早晨起床还是晚了没有看到Plu的八强赛的开头,不过有幸看到韩国留学生pj对阵贝克汉姆的大战,这一场大战实在是经典大气教科书式的pvz,小贝打得不错!打败了韩国职业联赛水准的对手,好。

七月二十日  出太阳了吗?好像有吧。

无一种下载了一部居然是加拿大拍的电影《Decoy》,这不过是证明了我以前听到的说法,加拿大的电影就是sex+horror。现在我每天玩的这个多线程的并行处理几乎每一步都是同步与死锁的问题。

写下我在tutorial上的重复的冬冬。

七月二十一日  出太阳了吗?好像有吧。

每个星期一和星期五早上固定要看plu实况。刚去倒了杯牛奶回来就看到pj打出了gg,难道zerg的7d开局这么可怕吗?刚刚写完就看到F91页gg了,不知道第三局会怎样?估计F91凶多吉少了。昨天忘记汇报了,我把所有的异步接受又改回了同步接受,因为所有的Non-blocking收发方式没办法控制节奏,结果通讯和rendering的速度差很多的情况下整个系统总有很多问题,比如rendering node比master node慢很多。可实际上整个系统必须和frameNo进行同步因此采用asynchronous的send,recv完全没有意义。

七月二十四日  出太阳了吗?好像有吧。

怎么解决死锁问题?最好的方法就是跑步爬山加上充足的睡眠。结果让我发现了这个当初想不到的bug,如果某一个节点没有一个点可见的话,mpi就不在发送,那么我的synchronous的sending,recving就会死锁因为少了一次接受。bug找到了但是performance依旧很差只有大约6fps。不过对于数据很大的model也是一样,所以这也许是一个好现象。

现在人生最大的乐趣就是周一周五的plu的个人联赛,的确能获得plu的总冠军一定是实力的象征,因为从初赛的决赛反反复复,没有实力是不可能获胜的。super实在是当之无愧的霸主。

无意中下载了一部后工业化的科幻电影,导演绝对是一个学现代艺术的电影学院出身的学生,片子中的演员无论从服饰造型,发型举止动作乃至器皿都是超现实主义的作品。比国内那两个土老帽的导演有气派得多了,不过电影的内涵实在是幼稚之极了。

七月二十六日  出太阳了吗?好像有吧。

无意中转到了一个厦门的网站,xmfish,厦门小鱼挺有意思的吧,主要是有一点点想家了吧。好不容易找到了一个glWindowPos结果发现是arb的,而且ATI的显卡不支持,实在是郁闷。联想到下午花了两个多小时也没有把一个简单的问题解决就更加郁闷了,这个问题不过是克隆几个兔子而已阿。

七月二十八日  出太阳了吗?好像有吧。

期待了一个星期的plu比赛变成了群魔乱舞。又重看了一下《古佃任三郎》,相比之下中国的所谓知识分子等等演艺界人士仿佛是打着赤膊两脚沾着稻田里的泥巴就进入教室上课的出身,还需要好几代的熏陶吧,这就是中国和日本的差距。

吃饱了饭撑得就上街溜达,看到一个仿佛满脸酒气的无家可归者向我乞讨,当然我知道他这是出于礼貌性的动作,并不表示他认为我是日本人或者我是中共派出的大款考察团的成员,我对于乞丐对我的高看感到由衷地感激,仿佛自己也突然摇身一变成为有钱人了,慌忙掏出两块另一毛的硬币交给他。路过街头四人室内乐队,又掏了一个两毛五和一个一毛钱的硬币作为我崇尚艺术的证明。想起来明天要冒着生命危险去漂流不禁心潮起伏,浮想联翩,这是一次价值五十个刀的活动,我经同学再三动员再下了决心,为此有专门去zellers买了一双价值20元的凉鞋,顺便买了两袋子价值不到5元一袋的日本大米,想想看现在能够买到的100%made in japan的东西就剩下大米了。在魁北克生活的穷人就是这样幸福,比如我是中就不知道自己有多少钱,反正银行户头里一直都有钱,怎么也化不完,甚至还计划八字收入的5%捐给逼我更穷的人,反正也没有几块钱。现在吃饭我已经每顿都是超市里买的剥好皮煮熟的对虾,连生得我都懒得买了,吃得我实在是腻味死了,按照电影《甲方乙方》里那个土大款的说法就是,顿顿龙虾鲍鱼都给我吃恶心了,反正就是那个意思吧,想想看在这种环境下让我奋发图强找工作挣钱实在是比登天还难啊。小时候听过一个伊索寓言,讲的是知了再下田里自由的歌唱,屎壳郎却辛勤地积攒着宝贵的粪蛋准备过冬,等到冬天来的时候,知了饥寒交迫地找屎壳郎接济过冬的粪蛋,屎壳郎冷冷地问知了,你在夏天的时候干什么呢?知了面露窘迫地说,我在唱歌。屎壳郎说,那么你现在就跳舞吧。我想,我就是那种知了,明知道会冻死还是喜欢过这种无压力生活的知了,左邻右舍的那些辛勤工作的同胞们的生活我怎么也不愿意过。无意中看到年轻时候崇拜的偶像的第二次雌性生命复制体的照片觉得实在是难以理喻,看来雌性动物对于生命简单复制过程的初级产品有着难以理解的快感。

八月一日  出太阳了吗?好像有吧。

看了一个下午的电影,是八十年代美国中学生问题的电影,当然不会比现在的中国严重多少吧,我的意思是这些问题每个国家和地区都有而已,昨天看了一部我小时候,也就是上大学的时候看的老电影《in the heat of night》是一部主题为种族歧视的悬念侦探片,影片的主角是一个在那个时代几乎不可能的角色,一个黑人刑警,这在南方小城市里简直是做梦,想想看在烈日下的棉花田里工作的黑人农民能够不被农场主打死就算是仁慈了,当然我说的事美国二十世纪三十四十年代,那个时候一个星期的工资如果是140块美金那就是超级高的工资了。上个星期六的漂流实在是有些让人精疲力尽,所谓exciting&exhausting,rough&tough,至今我身上还都是划伤,我突然发现学校给我的个人空间可以当作下载网址

八月四日  出太阳了吗?好像有吧。

当初有一点点私心没有把这个记下来现在费了很多时间去找。该死。

Runtime.getRuntime().exec("cmd /c start cmd /c java Test");

晚上很郁闷因为期待中的支票没有受到,虽然我不缺钱,可是心里却很不好受,也许是因为现在昼夜不明,也许是因为突然在睡梦中惊醒发现自己堕落到了无耻的地步,看看现在每天都在干什么?大概一天就工作一两个小时,然后就不知道在干什么了。夏天,每次都是充满遗憾与悔恨的季节。下定决心重装系统,因为那太老电脑的windows实在是被折磨得不成样子了。无聊之于下载了一个QQLive的东西,上面的东东实在是太可怕了,想想看如果现在的年轻人都看的是这些东西那么还有什么希望呢?当然,我不年轻了,随便看一看没有关系吧。记下前两天的想法,就是一部传输的时候,做一个flag来让通讯与图像的线程轮流使用数据,当然,这是原始的同步,如果displaycallback发现MPI在使用数据,那么就直接返回不要重画图像了,这样是不是好呢?

八月五日  出太阳了吗?好像有吧。

忘记了《high anxiety》是关于一群疯子的,我一直以为是另一部希区柯柯式的悬念片。脖子疼得什么也干不了,早上看了一小段世界上最简单的压缩算法,就是fax的压缩,我现在打算用第一个bit代表黑白,当然恰巧地2's complement正好可以用正负来表达,当然如果牵涉到多几个东西,就不能用一个bit来表到了,还有就是在星期一的报告里我要提到用set表达的好处,一是因为避免重复,因为同一个octree node有可能多次被涉及,再一个是顺序,如果以近似BFS的顺序来写入OpenGL pipeline的话,我可以尽量把他们凑成整段的数组用vertex array来提高效率。有时候想到那个电影《devil's advocate》也就是“魔鬼的邀约”,的确每个人都有可能向魔鬼许下心愿,《scorpion king》好像也是一样的意思,好像“死魂灵”里的把灵魂卖给魔鬼的结果,有时候为了得到你必须主动放弃很多。

半夜睡不着,无聊中在线听所谓的最红的超女唱的歌,感觉实在无法理解,因为除了音色中性的近乎男性以外一无是处,夸张一点说,这个什么春的声音比以前任何一个音色中性的男歌手还要男性化,而且很难欣赏那种毫无技巧的干嚎,也许现在的中国酝酿的一代叛逆的暗流随时准备挑战任何的传统与束缚,只要是反权威的产物就是她们的偶像,又或者这个时代艺术行当里中性是某些社会组成的宠爱,比如酷暑中难得的凉风什么的。

八月六日  出太阳了吗?好像有吧。

顶着脖子的剧痛去实验室debug,好累啊,要从MPI的各个节点找bug有多难呢?因为我的节点还都是不一样的code,而visual6的trace只能从0节点,所以我只能改变节点顺序,这有多困难啊。最后花了一个早上只是发现好像是molton-code的错误,不过这个时候我已经精疲力尽了,回来吃饭看wcg的比赛,然后作了一间历史上最无聊的事情,看qq直播的“美人直播”,这简直是堕落吧,在加拿大这种节目是午夜以后的话题,而且目标观众都是中年人感兴趣,可是看来在中国直播的对象大概都是中学生吧。

刚来加拿大的时候不小心唯一买的一本大部头的书就是《C unleashed》,当时应该是快四年前吧,那个时候才刚刚开始学习C/C++,这样的一本书被我翻了两页就当作了无用之物,束之高阁,这两天教授推荐的encode/decode就是其中的范例,我才开始觉得这种从knowledge到master的进阶的东西不是什么人在什么时候都可以看的,也不是所谓的每个字每个章节都看的,大概到了一定阶段,你看的懂得书是因为书里面的内容你大约都已经知道了,而为了或者书里面的知识却又不是通过阅读这本书来获得的,这似乎是一个chicken&egg的难题,其实,仿佛金庸的武侠小说里面的武功一样,有些时候仅仅是为了融会贯通,可是如果你连听都没有听过,或者从来没有任何体会怎么可能去融会,又怎么可能贯通?所以有的时候有的书是蜻蜓点水式阅读的。那么这种书是否值得花钱购买呢?我也不知道,总之,有的时候读一句比读十页还重要,否则还有什么叫做触类旁通举一反三呢?每一页都读了,还触什么通什么举什么反什么?这里再一次感慨几年前看帖子里说C/C++的程序员一般是三年一小成,五年一大成,想想看经常碰到不少人说自己会写C/C++程序,实在是有些无语,因为一套掌发挥熟练地沿联合在实战中应用可能还需要很多年的磨练与体会。去年觉得自己三年有小成回国比划了一下,感觉还是差得远了,看来这个三年一小成和人的资质阅历勤奋都有关系,不是自然而然的,所谓五年一大成可能就和张无忌看九阳神功里面的注释所说的一样,什么第几层需要练几年里指的都是吴学天才在名师指导下心无旁骛勤奋刻苦的修习,普通人可能一辈子都不一定修炼得到。

八月七日  出太阳了吗?好像有吧。

下午一觉醒来一位有时日薄西山,谁知道才两点多,昏昏然踱到实验室继续三天来的trace,终于功夫不负有心人发现了那两个bug。当然这都是些第五个烧饼的故事,前面的两三天里面我已经费了很大劲来排除错误范围,还写了一段简单的code来检验octree的每个节点设者的moltoncode的正确性,今天只不过是顺理成章地发现了问题,我只能允许10层的octree,因为32个bits里面有四个市分配给level了,那么剩下的28个bits只能由九层了,当然第一层没有任何必要存储信息,所以是十层。另一个bug是什么呢?说来好笑,又是数数数错了,在octree的叶子我必须忽略掉一些点,因为根据RG看到的一篇论文没有必要在一个octree节点容纳过多的点,这当然是统计学上的原因吧,因此,在这里我翻了一个小错误,相邻的节点容纳的点重叠了一部分,这在以前的程序里是看不出来的,因为重复至多是重画一遍没有关系的,但现在就是空指针的大问题了。啰里啰唆写这些细节无非是想让自己记住MPI程序里debug的困难,最好是谋定而后动,至于像G教授天真的所谓intelligent的控制就不用去想了,因为实在是太不切实际的困难了。昨天去小岛的沙滩上游泳,回来大吃了一吨,结果今天吃了一天昨天打包的扣肉。记得有时间的话顺便读一读RG另外的paper,可能会有些帮助吧。晚上决定学习怎样使用wincvs不用不行啊。

八月十日  出太阳了吗?好像有吧。

昨晚上我以为我找到了压缩的诀窍,现在看来还是没有用,因为压缩率好像很小的样子,大概只有几倍吧,头疼啊。

八月十二日  出太阳了吗?好像有吧。

今天终于明白了VC++6的debugger中的条件break,这实在是一个大笑话,说出去实在是有些丢人了,想想看用VC6也差不多三年多了居然debugger都没有用到这些基本功能,而且知道今天才开始学习VSS的使用真是让人汗颜,当然值得安慰的是我终于明白了不要去费脑筋去学习wincvs因为VSS的简单功能就足够我用了。另一个好事情就是我现在开始翻看以前买的看不懂得书了,比如MCP的那三本书实在是好东西,只是我以前大部分看不懂,现在总算有些明白了,虽然迟了些,better than nothing,我随鲁顿但是能够不断有所进步就是好的。

八月十三日  出太阳了吗?好像有吧。

今天拿着朋友给的两张女子网球赛的票步行十几个地铁站走过大约七千多门牌号来到了网球场。把一张11.4刀的票以7刀的价格卖给了一个法国女孩,犹豫再三决定也看看网球,当然是另一张票不好卖了。正好那个法国女孩子(当然年纪早已超过女孩子了)成为我的业余解说,当然她的英语不一定就比我好,很多词她也只知道法语,不过室外网球好就好在空气新鲜阳光灿烂。另一个比较有意思的就是网球赛的门票种类繁多,不同的座位,场次,场地,等等价格都不一样,同时我拿到的票又可以去所有的场地看。这才是真正的体育产业化所应该具有的,因为单单为了一场比赛而买票看实在是太不划算了,另外,加拿大的任何一项公共活动的组织管理都是一流的,首先有大量的工作人员在服务,即便是外围的很远的道路岔口都有人指引方向,从这一点来看国内的服务实在是太差劲了,价格也实在是太贵了。回来的路上吃了一个汉堡一杯可乐,花了6刀实在是贵,把我走路省下的车票钱都花完了还不止,当然我走路并不是纯粹为了省钱,更重要的是锻炼并且观光,比如经过petit italia就是“小意大利”社区的时候看到了一场非常好的意大利歌剧,演员虽然是业余的水平实在是高,要不是记者去卖票我都打算一直看下去,回来的时候在小意大利社区又看到了一场高水平的篮球赛,我虽然不是球迷也不会玩篮球,但至少知道这些社区篮球队的水平不必中国国内的专业省队来得差,可能都更强吧,总之,中国东亚病夫的状态从来都不会说因为在奥运会上用钱砸出来的几块牌子而改变,全国劳动人民连吃饭都成问题怎么可能健体强身?黑人和白人的身体素质实在是太好了,三分球也投得太准了。在回来的路上又碰到了一个什么葬礼或者是宗教祭祀活动吧,场面很宏大,路边的居民庄严肃穆虔诚,我内心里很羡慕这里的小孩子从小就能学习一种乐器比如小鼓或者单簧管,小号等等,这才是一个全民健康的社会,因为如果不去培养一些有益的嗜好人肯定就会空虚无聊,这个就是当前中国的现实问题,太多的人无聊的除了吃喝玩乐别无所好。

八月十五日  出太阳了吗?好像有吧。

今天早上去解决给养的问题,一个失去hr部门改地址,不让我永远都收不到我的paycheck,改称direct-deposit省的烦了。另一个去询问了一下为什么政府给我夏天的评估是零,答案是当初我申请的时候没有说我是否需要钱,这个理由很好,下次一定要记住,福利社会有一条就是你有需求你就要说,你不说我们怎么知道你想要,你想要你就说啊。装么作样去图书馆视察了一下因为图书馆和我的我他的直线距离不超过25米,作为邻居当然要多走动走动,胡乱翻了两页就回家做我的“泡椒牛肉”去了,现成的调料配上pa的上等牛肉味道好极了。看看八卦知道今天日本小泉照样我行我素参拜,从另一个角度讲是值得佩服的,因为作为中国人这种行为是不可忍受的,可是反过来对于日本国民也许这是一个信念坚定的领导人的表现,这种事情仿佛刚停火的阿以冲突,就是再过一万年也说不清楚谁错谁对,只有大约美国式的方案才是一劳永逸的,当初美国把小日本大得服服帖帖的又踩上一只脚踩了几十年,所以今天日本和美国之间不再有分歧有争议。昨天花了一两个小时才明白了一条,我又一次在结尾的时候犯了错,找啊找,找到640000个像素的尾巴才发现是最后一段没有加上,不过这个bug并不是致命的,因为现在的错误大都是混合的,今天又花了一两个小时明白是坐标的问题,下午睡醒之后我再做一个艰难的决定,究竟是去实验室还是不去?如果不去那么又没有什么好的有说服力的理由呢?找吧。

八月十七日  出太阳了吗?好像有吧。

你接触美国的媒体越多,你就越觉得美国的伟大,美国的伟大就在于他的制度,这种制度的优越超越了任何的时间与空间,国家与民族,从而能够保证美国作为世界领袖在继续领导世界至少两百年。美国的媒体在讨论布什总统是否是一个白痴,并播放了他大量的所谓“出丑”的电视演讲片断,我感到震惊的不是这是不是白痴的问题,而是在我看来完全超越任何一个中国人和级别领导人水平n倍以上的(n>50)的乔治布什先生竟然在美国的精英眼里被看作白痴,可见美国的精英对自己的要求有多么的高,可见美国主流社会对国家领导的要求有多么的高,可见美国潜在的力量有多么的大,在我眼里布什的英语水平是很高的啊。哈哈(我这是夸他还是贬他,总之布什就是讲话有些直白而已,可是这也比只会照本秘书团拟的讲稿宣读要强一万倍了,而中国绝大多数的所谓领袖都不过是如此,这种差别不可以道里记。)

八月十九日  出太阳了吗?好像有吧。

Battle for WesNoth已经进行了快一个星期了。在一望无际的大草原上人类的骑兵在肆无忌惮的横冲直闯,可怕的重甲骑兵手执着伤害力加倍的长矛在不远处游弋着等待着猎物达到一次冲刺能及的距离后给予致命的一击。年轻而鲁莽的轻骑兵则一次又一次地发起自杀式的冲击试图冲散我们精灵族由精灵武士和精灵射手组成的防线,在密密的齐腰深的茅草中还隐藏着弯腰隐蔽潜行的人类弓箭手,他们虽然没有精灵族弓箭手的准确快速,但是在人类轻骑兵冲击的时候趁机射出的冷箭同样是致命的。草原上的精灵族失去了森林的掩护仿佛成了一群待人宰割的羔羊,没有根据地没有安全的后方,受伤的战事依然要和其他战士一样组成环形防御圈来保护身体更加脆弱的精灵族的法师们。草原上稀稀疏疏的村落远远不足以用来恢复伤员,这时候完全要依靠精灵医生每个回合少量的治疗效能,在每一个医生周围都围满了受伤的战士和射手,而最外面才是一道越来越稀疏的由精灵组冠军战士和少量元帅组成的环形防御圈。在少数面对着人类重甲骑兵窥伺的核心阵地上,还有少量的精灵族宝贵的高级骑士,这些是当年追随精灵族领袖的部分人类骑兵培养起来的,他们和人类的重甲骑兵同出一辙,大家都可以在对方还击之前给与双倍的伤害,但是同样地在以及没有致命的情况下也会得到双倍的还击,所以这些强力的突击部队只有在敌人已经遭受重创之后给与致命一击的时候才能最大限度地发挥作用。

终于找到了那个愚蠢的bug,花了快一个星期,当然这期间基本是断断续续的,我查补短式一步一步地检查的,写了一系列小的测试程序,最后才发现我又是数数数错了,好笑的问题,15个bit究竟能组成多少数字这种问题再上计算机的第一课就在讲,我结果又搞错了,真是无可奈何。

说话间,YP送来了学校发的TA的支票,是三张间隔半个月的各172.75不知道总共应该是多少,上一次是多少也忘了。为什么没有thesis的支票?

八月二十日  出太阳了吗?好像没有吧,因为下雨了,很冷的。

在夏天即将过去的一刻我正遇有了一点点值得自豪的事情,我终于可以编译BatterforWesNoth了,聪早上五点多钟到下午一点多钟的艰苦奋战终于成功编译运行了,去年年底的时候我尝试过一次,但是失败了,现在经过一个夏天的锻炼对于一个有上百个文件的project我不会太惊慌失措了,对于静态链接动态链接总算是不那么陌生了,至少对于编译器爆出的多线程动态库于静态库冲突的错误不至于完全没有方向了,这还是从RG那里学来的,当然你现在用google搜一下可能什么问题都有答案,但是在没有google的日子里自己慢慢捉摸呢就是真的牛鼻了。另一个小问题就是vc6对于typedef的synoniom会当做不同type至少__int32和int会当做不同类型,于是函数参数的选择要小心不然会有编译器爆出ambiguous的错误当做是函数重载,很讨厌,似乎gcc不会这样不同情理,不然为什么那些在linux的人会这么写而不出错呢?对于linux下的动态库如何设置路径部署我始终不明白才导致要使用VC否则单单一个编译也没有什么可夸耀的,仿佛见到一本乘法口诀表照着做了一遍一般而已。

八月二十一日  出太阳了吗?是的,阳光灿烂,下午去皇家山溜达了一圈

操作符重载的时候,vc6对于类型很敏感,对于__int32和int当做是两种类型,但是对于普通函数的参数则检查很松散。

八月二十二日  出太阳了吗?是的,阳光灿烂,上午去皇家山溜达了一圈

其实我已经捉摸了很久了,现在再次读了一下确认是这样子的。很久以前我做了一个试验,结果惊人的我自己都不能相信,就是用mpi发送一个大的数据块居然比我用socket还要快很多,当时可能有什么其他的原因我的socket程序会比较慢,但是有一点要注意的就是wmpi的synchronous-send并不代表返回的时候receiver已经完成了接收,而是代表starts to receive,这一点在MPI的protocol里强调说到底是等到receiving结束还是仅仅是receving开始就返回是由实现方定义的,至少wmpi是这样子的,所以我的数据块还没有发送完,我的程序函数已经返回了,于是看上去比较快吧。这也许可以解释那个现象,at least partially。 Battle for WesNoth拥有我需要的一切,我可以找找看作一个假的main跳过很多部分直接到load and run,这样就可以调试了,第一步是设计一个combat-leader的定义,这个leader必须是级别或者经验值较高的并且在前线的,其次它统帅一个战区及其战区内的所有单位,这样所有的单位的作战策略是一个group为单位来考量的,其战果评价也是基于group的,比如leader是否得到保护,group提升的单位个数,group的威胁系数。不过要解决战区重叠和战区范围划分的问题,这个仿佛和人类社会的实际问题一样,我想还是采用固定的行政划分为好,动态地划分虽然聪明但是很难,电脑需要比人脑聪明吗?我只需要电脑摹仿人脑就可以了吧。当然将来可以再有更高一级的智慧来协调战区的划分,基本上这是一个狼群战术,就是单位的行动是基于group的。这时我的第一个计划。第二步也许是战例分析比较学习,仿佛machine learning一样,WesNoth里面有这完善的replay纪录。实在是我想要得都有了,这不就是我梦寐以求的吗?也许将来服务器上也可以累计更多的战例作为资料来分析。以彼之道还致彼身的乾坤大挪移招数也许是无往而不胜的!人类棋手的学习无非也是如此,从自己和别人的经验里面学习,实战,总结,再学习,再实战,再总结,再再学习。。。

八月二十三日  出太阳了吗?是的,阳光灿烂,今天还没有去皇家山呢

BattleForWesNoth的AI比我所有的想象还要复杂一千倍,我应该对自己感到羞愧。V for Vendetta有着明显的时事政论的痕迹,让人一望而知就是刚从欧洲的某个电影学院毕业出来的,整天在酒精与大麻浸泡的狂欢排队里生活的所谓艺术家的反专制反社会的作品,通篇你都可以看到所谓拾人牙慧的地方,主题(theme也许是更妥帖的种文字)也许是《1984》加上美国的反恐计划也就是home security plan,风格也许是zorro+mask,感觉是说教,因为通篇都是人熟悉的陈词滥调,比如人民不应该害怕政府,政府更不应该害怕人民,再比如911是一个美国当权者的精心策划的阴谋,(这一类的希望耸人听闻的东西在美国多的是,比如有人说登月计划就是摩羯星一号的翻版,又比如有人因为心理障碍愿意承认谋杀了多年前的选美小皇后等等),你可以说整部片子相当的幼稚,因为在好莱坞任何一个投资人是不允许把钱这样扔水里的,观众不喜欢说教,不管你喜欢不喜欢美国的反恐政策,希思罗机场天天都存在炸弹威胁,这一点你怎么也不可否认,当然正好给我一个不再为去欧洲旅行筹措旅费的借口了。哈哈。

八月二十四日  出太阳了吗?是的,阳光灿烂,今天还没有去皇家山呢

昨天的meeting让我有了一些紧张,因为我觉得我是一个彻头彻尾的slacker,早上我有了一些新的idea,当然是在教授的主意上改进了一点,不知道有没有用。看了一部二战盟国战俘越狱的电影,一个感觉就是纳粹在怎么凶残其实还是很人道的,至少没有当着其他战俘的棉区枪杀逃跑的战俘,我想起是一个重要原因是盟军的强大,如果纳粹自己也直到有一天自己会战败受到惩罚,那么自然会比较收敛,当日本侵略中国的时候,从来也不会认为自己会被打败,当然不用顾及这些,事实上没有美苏中国是永远打不垮日本的。战俘的待遇多少反映了实力的强弱,作为弱小的一方就不要想着做了俘虏后悔怎样,所以共产党军队总是教育士兵宁死不当俘虏,也许的确是生不如死吧。

西部牛仔骑马的姿势非常得帅,当然也包括女martial,这是《gunslinger》里我所得到的印象,一个三角恋爱,杀手,警察,和杀手的雇主,也就是一个男人和两个女人的故事。另一点就是美国式的民主的基础来自于司法的民主,在人人都有枪来解决纠纷的时候,人民感觉到了人人生而平等,人人有得到公正审判的权利,同时人民需要一个共同的规则来解决矛盾,司法的权威从人民那里获得,也同时受到人民的监督,实际上在西部拓荒时代的警长大多时兼职的,下班以后和别人没有什么区别,不存在中国式的青天大老爷恩赐的司法。

八月二十六日  出太阳了吗?是的,阳光灿烂,今天还没有去皇家山呢

终于精灵族的队伍到达了大草原的边缘,只要渡过眼前的那条大河在穿过绵延的大山就要回到精灵族的家园了。战士们疲惫的脸上终于露出了一些兴奋的神情,阿拉贡也不禁长吁了一口气,一瞥眼看到身边甘道夫紧皱着眉头不由得心头一紧,问道:“大师,怎么了?”甘道夫两条雪白的长眉紧锁着,神情严峻地说:“这个渡口才是我最担心的地方。。。”。正说话间,一个精灵族的侦察骑兵飞驰而来急急地报告说前面大河的渡口附近有一个人类的据点,而且他们的侦察骑兵也已经发现了我们要渡河的企图正在集合部队冲向渡口呢。阿拉贡顾不上甘道夫的解释立刻传令精灵族机动性最强的圣骑士部队和所有的侦查骑兵迅速抢占渡口旁的小村庄并坚守等待善于防御的精灵族弓箭队的接防,然后阿拉贡把精灵族三个武艺最高超的冠军战士队长召集到面前,让他们做好全军殿后的准备工作,这些精灵族的冠军战士个个精通刀术和箭术并且配备了最好的盔甲盾牌是精灵族防御力最强的部队,并且因为武艺全面,不论是远程攻击还是近身格斗都有着很强的战斗力,不过因为盔甲厚重他们的移动速度也相对较慢,甚至比精灵族最慢的医生法师部队也快不了多少,因此他们正好殿后保护法师部队。然后阿拉贡命令刚才来报信的侦察骑兵去渡口试渡并在河中心的小岛上建立防御阵地,接着命令所有部队以攻击队形向渡口快速前进。直到这时,阿拉贡才松了一口气转身来看甘道夫,只见他凝神望着大河神情非常肃穆,阿拉贡不敢打搅他,于是两个人默默地骑着马跟着队伍向渡口前进。

当精灵族的主力来到渡口旁的村庄时候,坚守在那里的弓箭手和少量先期到达的圣骑士部队刚刚打退人类的第一波的快速骑兵的冲击,这仅仅是一次火力侦察,当人类的重甲步兵和弓箭手也达到的话那才是真正的战斗开始了。精灵族的法师周围又聚集起大量受伤的战士以便获得治疗,能够在森林里隐身的神箭手也悄悄地埋伏在村庄旁边的小树林里面,身披金色铠甲的冠军战士和弓箭手肩并肩地以村庄为核心构筑起了一道防线,这是一条宽大的一字长蛇阵,这个阵型式精灵族在平原作战中经常采用的,他的特点是确保中间的每个战士的两翼都有同伴加以保护,他的弱点在两翼,一旦被高度机动性的人类快速骑兵绕过两翼攻击后方整个防线几乎肯定要崩溃,同时在两翼的部队会有超过一个正面的方向要防御,压力最大,因此这里往往配属最精锐的冠军战士来坚守。今天防线的右翼的奔腾的大河成为天然的屏障,长蛇阵只需要加强左翼就行了。

远处天边涌起一团黑云,黑云上是一片片的黄云,其实那不是黄云,那是人类重甲步兵方阵行进时扬弃的黄土,只见一排排黑灿灿的铁甲从天边慢慢走来,渐渐地都可以听到铠甲兵器碰撞的震耳欲聋的哐啷声。在所有种族中人类的重甲步兵的防御力是最强的因为他们的铁甲最厚从头到脚罩住了全身,而当这些铁甲武士组成方阵彼此依托即便是冲击力最强的人类骑兵也不敢对他们发起冲锋,因为你面对的不是一个人而是整个方阵的战士,精灵族的弓箭在他们面前简直成了火柴棍一样无关痛痒。阿拉贡不禁倒吸了一口凉气,他没有想到在这个渡口人类竟会部署他们最精锐的战士,看来只能冒险让精灵族的法师上阵了,法师们释放的魔法可以完全无视厚重的铠甲直接秒杀铁甲战士,但是这要冒很大的风险就是一旦法师不能一鼓作气全歼方阵,剩余的铁甲战士的反击对于脆弱的法师是致命的,而更危险的是在这些铁甲方阵的背后往往隐藏着人类的长弓手,他们的弓箭同样是对法师的致命威胁。因此进攻时候一定要在最关键的时刻在最恰当的时刻让法师部队出击并且要一击而退,让防御力强的弓箭手和精灵族战士来顶住敌人的反击。更让人担心的是人类冲击力巨大的骑兵部队到现在还没有看到踪影,在这片起伏的丘陵地带人类的快速骑兵往往可以隐藏在山丘后突然发起冲锋,有时候在弓箭手无法完全发挥弓箭防御的情况下冲散精灵族的防线,在防线被突破的时候全部的希望就寄托在精灵族有多少预备队可以冲上去堵住缺口。

战斗开始了,人类部队发起了教科书式的进攻,他们的战术是用重甲步兵配合弓箭手和少量法师部队作阵地进攻式的冲锋,在削弱精灵族的防御之后,大量的快速骑兵部队配和少量的重甲骑兵向防御最薄弱的防线加以冲击首先撕开防线然后各个歼灭孤立的防守部队。精灵族的防御阵地核心是地形很有利的村庄,哪些经验丰富的弓箭手很轻松地顶住了人类第一波的冲击,然后阿拉贡果断地命令法师部队大胆地迅速接近重甲步兵依靠魔法歼灭了大部分的方阵武士,然后冠军战士和少量圣骑士对那些受挫的人类弓箭手和步兵发起了歼灭性的反击,远处小树林里隐藏的神箭手也突如其来地截杀了隐蔽接近的人类骑兵,人类部队被打败了并且开始向他们的城堡撤退,精灵族战士乘胜追击企图一举夺下城堡,这时候突然从城堡吊桥下冲出大量的黑衣战士,只见这些黑衣武士如鬼似魅,完全无视精灵族的弓箭,从箭雨中穿梭冲锋竟然绕过了正面的防线直扑精灵族后方脆弱的法师部队和从前线撤下来的受伤的战士,顷刻间大量的精灵族伤员被斩杀,刚刚大量消耗了魔法还来不及恢复的魔法师被无情的屠杀,阿拉贡情急之下急忙命令全军放弃攻城全面后撤救援,这时重新整顿的人类骑兵又趁势从城堡中冲出一路掩杀,直到精灵族退回到渡口村庄防线才算稳定下来,这一仗打下来精灵族元气大伤,很多经历了草原会战幸存下来的老兵都阵亡了。天黑下来的,大雨也下了下来,河水开始上涨,原本平缓的河水变成了一匹怒吼奔驰的野马。阿拉贡在营帐里召集各个首领商议明天的渡河计划,大家一致认为此地不可久留,一定要在后面的人类追兵赶到形成前后夹击之前渡过河去,渡河的顺序是善于涉水机动性高的侦查骑兵打头阵,然后是少量的神射手,和大量的弓箭手,行动迟缓的法师医生部队和冠军战士殿后。这样一来明天的防御的部队就会减少,面对可能的战斗谁也没有把握。阿拉贡和大家这时候都把目光都集中在始终一言不发的甘道夫身上,面对大家期待的目光,甘道夫陷入了沉思,过了许久才抬起头说到,“正面的敌人固然很难对付,河对岸的虎视眈眈的兽族部队的拦截其实更加的危险,因为我们的战士经过连日的行军打仗非常疲劳,又刚刚涉过大河队形散乱,敌人以逸待劳半渡而击,我们的损失会很大。而这一切还不是我最担心的,我最担心的是那个上古的神话要成为今天的现实。”说到这里,甘道夫缓缓地环视大家,接着说到:“那是记载在法师公会的一个传说,说的是人类的法师有一种强大的召唤术,他召唤的怪物是那样地强大以至于他们自己也不能控制,这些怪物会不分青红皂白地向所有人发起亡命地攻击 ,这种可怕的怪物就是身体巨大的海龙,他们是水上的霸主驰骋在大海上甚至可以掀翻大船,本来是不会出现在河水里,只是受了人类魔法师的魔法召唤才逆流而上来到内河。如果这支人类部队里有法力高深的魔法师使出了这种可怕的召唤术恐怕我们精灵族的部队就要在这条大河里全军覆没了。”听到这里,整个大帐里静悄悄地,人人都摒住呼吸,期待地望着甘道夫。甘道夫深吸了一口气接着说,“今天我想大家也都看到了,这些人族的黑衣武士是人类皇帝的亲兵卫队,轻易不会远赴沙场,他们出现在这里我想很有可能是人族王子波密尔亲自在把守城堡,我想他的魔法老师萨罗曼十之八九也在他的身边,如果人族法师里有人会这种可怕的召唤术的话,那一定就是他了。所以我想我们一定要预作准备,事到如今我也顾不得别的,只好拼死使出我的全部法力召唤人鱼部队来助战了。”说到这里大家都不禁地轻轻地啊了一声,要知道在所有的种族战士中人鱼部队是最美丽的,她们有着纤细的长尾巴,五彩缤纷的鳞甲,一头乌黑的长发配以美丽动人的歌声曾经迷倒了不知多少的船夫和水手,据说凡是看过她们美丽面容的战士都会呆呆地忘记防御目瞪口呆地成为俘虏。(欲知后事如何且听下回分解。)

看到了丁贝莉的确是惊为天人似的绝色佳人啊。早上一直在找modelloader的bug,那是一个恼人的问题,不是所有的点的radius都有定义,因为不是所有的点都有定义face,这个问题实在超过我的能力了,我实在不知道ply文件到底是怎么样的一个意思,我自己的octree也有bug,居然还是有很多点的radius没有定义,即便我强制地给每个point已经定义了radius之后,我的radius市区周围最近邻居的若干个点的最长距离。当然这都是RG的定义,我只是拿来用而已。

八月二十七日  出太阳了吗?没有,因为块十一点了田还是如同早上七点半一样的黑

终于plu联赛总到了春季联赛的末尾,super会不会以2:4失败呢?前景很黯淡。3:3了,super能翻盘吗?期待中。。。

八月三十日  出太阳了吗?有啊,刚刚从皇家山上回来

我想一个人最幸福的时刻无非就是整天不愁吃喝,在蓝天白云下登高远望,在背风朝阳的山坡上舒舒服服地躺在松软的草地上晒太阳打盹。我觉得我没有什么不满足的了。

昨天不小心到intel的网站看到一个编程比赛,当然我知道我其实不善于这种,不过玩玩也无妨,第一个题目是howeasy,不过也不是那么easy吧,我做了一个NFA来写code,结果得分还是只有80%,不知道那里错了。

月一日  出太阳了吗?有啊,刚刚跑步去要支票

突然想起来学算法课的时候教授讲的所谓heuristic algorithm,各种各样五花八门,结果最后竟然有惊人的一个说法,有时候random的选择甚至比所谓的各种各样的复杂的算法效果一点都不差,这真是出乎大多数人的意外,至少我是这样认为的。想想看我一生中所做得对于我自己的所谓的重大决策几乎都是random的,上大学的时候交给父母做决定,谈恋爱的时候大多数听任对方的决定,后来有想法的时候又听任命运的安排,大多数时候对于一件小到是否出门去人家公司面试都犹豫不决能拖则拖,实在不行了就扔硬币,一次不行再扔一次直到结果是不去为止,反正事后能给自己找到理由就心安理得了。当时来加拿大的决定也许就是一个电话加上所谓半个小时的考虑就决定了,现在想想看实际上是给自己几年时间的无所事事找个理由,今天回忆往事觉得我就是一个随机算法的实践者,一个人用一生的碌碌无为能够检验一个算法的可行性能不能算是一点点成就呢?我现在越来越喜欢克莱德曼的浪漫钢琴,仿佛行云流水的思绪中的飞花落叶,在这个“秋日私语”中的自己给自己打打分数算是一个人生的备份吧,即便明天有什么难以预测的转折也可以从将来的时空轨迹里回头察看这个历史的checkpoint,仿佛visual source safe的历史节点,(我不想解释计算机的问题了,总之,人生其实仿佛一个版本控制的程序,只不过我们不能乘坐时空飞船回到过去创建一个branch。但是至少我可以时时刻刻地设定check-in的结点,以便将来某一天回过头来比较异同。当然每天太阳升起来的时候就是checkout的时刻。)昨天和今天都打算备份数据,不由得有些感触,人生的备份虽然不能时时地load&save但是作为生命的见证总是对当事人有意义的,否则,人生一世草木一秋,究竟有多少异同,难道生物本能驱动的传宗接代就是人这种所谓“高级动物”存在的全部意义?或许现代人早已学乖了只是利用传宗接代的副产品(side-effect)来凡世间走上一遭?早上顺便去看看了看comp6231对TA的评语,大约是有15%左右对我是极度的不满,评语刻薄的超过了我对于最差的TA的曾经有过的最恶毒的评价,当然另外15%可能的是相当的满意,曲线的分布大概是符合正态分布(normal distribution)吧?我被讨厌的程度应该没有超过布什总统吧?

偶尔翻了一下旧书看了看signal的定义,在每天例行的马桶沉思阶段想明白了一个问题。一个函数指针的定义和函数指针的返回类型有着微妙的差别,我当时一直要把两者混淆起来,比如:void (*signal(int signo, void (*func)(int)))(int);究竟函数指针signal的返回类型是什么呢?改写一下比较容易,(以下Steven的定义)typedef void  sigfunc(int); 我们定义了一个类型,不过这并不是指针,我喜欢定义成这样:typedef void (*psigfunc)(int);然后我们在改写原来signal的定义为如下:sigfunc*signal(int, sigfunc*);用汉语来说就是一个函数的原型prototype是这样的,返回值是一个“返回类型为void的带一个int参数的函数”,而他的参数有两个,一个是int,另一个也是一个“返回类型为void的带一个int参数的函数”,这就是signal的定义。需要说明的是一个函数如果定义成这样了就是类似于const的一个函数也就是说不再是函数变量或者函数指针变量了。如果变通一下,我改称typedef void(*mysigfunc)(int);  typedef mysigfunc* (*mysignal)(int, mysigfunc*);那么mysignal就可以作为一个类型来定义函数指针或者说函数变量了,比如mysigfunc myPtr=signal;当然你问我这有什么用,我一时还想不出来,总之我的理解就是linux里面这个signal是一个人家已经定义好的函数,(我私下里给他改名叫作signalRegister,因为它的作用就是register一个handler而已,比如我们有一个default的signal handler组成的函数指针数组,每次你call这个signal的时候顺便把这个数组的里面你要替换的handler的index连同你自己的handler作为参数传进来,signal就帮你改了一下这个数组并且把原来的数组里的值返回给你。我想Linux应该就是这样,虽然我发誓我没有看过源代码,我想不会错的。)那么如果连这个register本身也可以被别人替换,比如我有一个register的register来管理一大队类似于signal这样的register函数,那么有一天,我也想重新register一个我自己的signal的时候,我就会需要这个函数变量或者指针了。好像有一点点虚拟驱动注册的味道,虽然我从来没有接触过这个方面,应该差不多吧。

月 五日  出太阳了吗?有啊,刚刚去皇家山上转了一圈

我想如果我能够平衡节点间的computation&communication,那么这就是有点可以写一篇论文了。我想验证一下OpenGL的clickcount的意义。在《the last samurai》里日本和同时期的中国是那么的相像,同样是皇帝的老师同样的一心侍主,可是仿佛结果是如此的不同,在一个所谓“聪明”的社会里,人们更加明白所谓失败,所谓被征服并不会维持一千年,中原大地从来没有被一个外族侵占一千年因为我们这个民族坚信我们伟大的繁殖力最终会融合我们的敌人或者我们的征服者,因此没有人愿意为了这个提前到来的结果而牺牲短暂的生命,因为那样做很傻,百年之后谁会来祭奠你?就算又有如何?不过是一抔黄土,因此,我们这个民族在世界上算是聪明的民族,常常在苟延残喘之后躲在角落里面窃笑那些所谓献身的蠢货。samurai这个角色绝不可能出现在中国的文明里,因为留得青山在不怕没柴烧,因此,康有为在他的老师最需要他的时候落跑到了日本,苟延了残生比起那些五位牺牲的所谓“六傻子”来的聪明的多,因为死了有如何?多一簇坟茔又有何用?你终于你心中的信念是你自己的事,而这个所谓信念并不像大多数的投资一样回给你等价的回报,那么你何必忠于他?当然当你自己也不相信你自己的信念的时候,相信你的人又何必相信你的信念?在一个没有原则与牺牲的社会里有谁肯去做傻子?就算有个别如我一样鲁钝的偶尔做一回傻瓜,肯定不会有第二个,因为连布什总统都知道这么一个谚语:A fool cannot be fooled again!所以,我们这个民族会被世界征服,但绝不会被征服一千年,因为一千年后我们的后代会比我们的统治者还多一千倍。在历史的长河里有时候,retreat is not an option。

月 五日  出太阳了吗?有啊。

众里寻她千百度,却见那人正在灯火阑珊处。动态地调整computation&communication并不容易,但是MPI的传输过程却直接就反映了这种平衡,也就是我用non-blocking的模式传输不久能够最大地再个节点间平衡computation&communication吗?当然这是在不改变每个节点的工作量的前提下的一种平衡,正如我在我的英文日记里写得那样,仿佛“分布式系统设计”里面的一个个概念在我的生活中被实实在在地检验测试一样,一些事件可以没有顺序,可以用异步传输,但是另一些事件仿佛“逻辑时间”的概念一样有着固有的顺序,我又必须在异步中加入一些同步的点,这种混合的模式又仿佛是“virtualsynchrony”一样的味道,当然,我这些不过是很简单的应证概念而已,但是每次这种调整都伴随着一对得难以寻找的deadlock的bug,明天再找吧,这种debug总是很伤脑筋的。我上一次完成了大部分的异步传输,最后发现太多的同步问题有统统改回了同步传输,现在又要改回去,实在是头疼的事情,但是最讨厌的事情是就算改成了异步传输结果仍然非常的不好,比如目前也仅仅从3到4,当然你可以说这是25%的提高,可是我知道这是没有多大意义的。

昨天看了半天的电影,又一部片子很好看,大约是将律师替穷人打官司的,现在才真正体会到美国司法制度的公正与完美,一个纯粹地市场导向的司法体系奠定了民主的基石,没有司法的民主也就没有政治的民主,不知道是不是所有的人都知道这一点呢?我猜想至少中国的大多数劳动人民还被蒙在鼓里,包括前苏联那些被欺骗了的劳动人民,在没有建立起民主公正的司法体制之前奢谈民主政治结果就是被新的民贼利用来作为他的新独裁统治,这种例子俯首皆是,比如台湾目前的困局也就是一个例证,俄罗斯当年的叶利钦何尝不是一手遮天?选择普京在一定程度上是为了保他自己安度晚年,当然今天台湾的唯一的进步就是陈水扁不能像李登辉一样的随心所欲地决定他的继任者。

月 九日  出太阳了吗?没有啊,因为下雨了。

早晨起来给教授留了一份备忘录,然后就准备义无反顾地向前冲去,虽然我对于这个压缩究竟有多大意义表示怀疑,可是我等不及了。前面的道路似乎是平坦的,无非就是一个机遇字典式的压缩,想想看有什么压缩算法不是基于字典呢?又有什么压缩算法不是基于观察分析到的“重复”的pattern来加以利用呢?把四个byte的颜色压缩成两个byte的index,究竟有多大意义呢?1比2的压缩率有意义吗?当然如果我减少index所占用的bit数,我是可以加大压缩率的,不过。。。快速查找我决定采用static hash table,hash function就用最简单的平易吧。然后这个四级hashtable结构就变得很像是Linux的文件指针inode一样了,至于conflict我就用最简单的linear-probe吧,比较讨厌的是刚才在雨地里走才想到的每个render会有自己的color-index-table因此,这是一个比较浪费内存的解决办法,哎,我的内存啊。写了大概半小时就回来休息休息。

月 十日  出太阳了吗?有啊。

早晨起来改程序,我又犯了错误,对于bit操作我总是出错,比如0xFF右移三位最大的数字是什么呢?这个问题太白痴了。中午吃多了撑得慌,就步行十几公里去Monk取我的支票,一路上蓝天白云风景如画温度适宜实在是赏心悦目。路过superC为了锻炼臂力,专门买了一大堆东西提着回家。

月 十二日  出太阳了吗?有啊。

昨天发现我买的二十个咸鸭蛋其实都是皮蛋,咸鸭蛋外面是黑色的,里面是黄色的,皮蛋外面是黄色的里面却是黑色的,多么奇怪,郁闷啊,这么多的皮蛋要吃到什么时候啊!早上终于解决了color-index的最后一个我认为的bug,就是short int溢出了,我原来假设不超过65535不成立,只好硬性规定hash-table冲突的时候用旧的index,这样等于jpeg里面的index意思吧。昨天又明白了一个常识性的问题,如果没有lighting,glcolor决定颜色,否则,还要看是否colormaterial是否enabled,如果没有,颜色不再由glColor决定,而是material决定,如果colorMaterial有enabled,那么glColor和material一起决定,如果你call glColor的话,否则只有material。你听明白了吗?我想如果你没有接触过OpenGL不会明白,因为自然语言表达实在是太困难了。记住,enable colorMaterial一定要先设定color material,我想lighting之类都是一样的道理。我觉得我写的hash-table很值得我自己佩服一下。到了银行才发现支票找不到了,以为丢了,结果放在家里了,昨天DVDClub又charge了我六十块钱让我买DVD实在是没有什么可买得了,实在是太贵了,一片要三十块,我用电驴子下载不要钱,不过为了保护知识产权宁可我吃糠咽菜也要让那些大牌明星和他们背后的大公司吃的宝宝的,这就是一个人的精神,应该不是一种病。

月 十三日  出太阳了吗?不知道啊。

早上去实验室明白了一个简单的道理,微软的NVIDIA的显卡驱动非常糟糕,更新以后drawArray总算运行正常了,但是采用新的sfc文件格式还有bug,我头昏脑涨回来了,看“凤凰台”的世事批斗会很好看,中国的所谓的自由的言论开始慢慢在发芽,这个趋势大概在十年内会让一个政党完全崩溃。

蒙特利尔出了一件大事,旁边的一个学院就是Dawson发生了一件枪击事件,死了几个学生。下午和教授meeting他就再说这件事,因为门前的St.Catherine大街都被封闭了吧,我不知道,反正我也没有时间去看。教授认为我的想法不太对,因为flat-shading才会有这种颜色分布,不过我随后查了一下OpenGL发现smooth-shading和flat-shading对于point是没有区别的。

月 十四日  出太阳了吗?没有,因为下雨了。

昨天杀人的那个小子经过实验室印度同事确认是印度后裔,当然是有点怪异的了,他是一个射击游戏的狂人,甚至给自己写好了墓志铭,Lived fast, died young, left mangled corpses.早上去实验室又把颜色部分改回了没有index的部分,准备尝试running-length-compression,当然应该先看看数据分布验证一下昨天的假设。在那个小子杀人之前的一天我正好去那个mall里面转悠,还奢侈地买了一个烧开水的小电器,我想我对于奢侈的生活从来就不惧怕,于是又买了一个made in France的平底锅来煎鸡蛋,made in China的质量都是很差劲的,我只要经济上允许肯定不买。Made in Canada的东西虽然大多数都很贵,但是质量一般都很好,就算粗笨也是有理由的,因为能用很多年的东西当然会笨重一些。支持国货,只买made in Canada的。

在连绵的中途山脉里行进着一支精灵族的部队,他们全部身披金色的精灵族锁子甲,这种铠甲虽然不如人族的板甲来的坚固但是相当的轻便更加适合身手敏捷的精灵族战时使用。而这种金色的梭子家有时经过精灵族能工巧匠的淬火锻造可以说是这种铠甲中的极品,除非是精灵族的冠军战士是没有资格披挂的,而这样一支庞大的精灵族冠军战士队伍可以说是极难见到的,要知道这些冠军战士个个都是精灵族的战士中经过五重大比武的佼佼者,弓箭,刀术,防御,进攻,越野各项都是全能,如果能够集中两个营的精灵族战士就可以横扫中土各部落了。如今阿拉贡就是统率着这样两个营的冠军战士去执行一项不可能的任务。。。

两天前的一个黄昏,一个精灵族的白马战士正急速地穿行在中途山脉的羊肠小道上,白马战时满身尘土贝利日报晒得通红的面庞流露出极度的疲惫。终于道路的尽头出现了一座巍峨的城堡,这就是精灵族在中途山脉里的号称擎天玉柱之一的“水边城堡”(Atwater Castle)。阿拉贡和甘道夫正在大殿里焦急地等待着这名信使的到来,这位白马战士带来的精灵族另一位将军拉格勒斯的回信,可是这封回信却让本已经焦急万分的阿拉贡变得更加焦急。甘道夫轻轻地抚摸着白色的禅杖,慢慢地仿佛自言自语道:“如果我们不再三十天内穿越中途山脉,这里几万名跋山涉水九死一生的精灵族战士就要全部困死在这里,可是这里有保皇党的两个重兵把守的关隘,地形险要易守难攻,再加上道路曲折不宜大兵团作战,实在是一个难题。如果拉格莱斯将军的情报是准确的那么问题就更严重了,保皇党的大部队可能已经在向这里进发的路途上了,留给我们的时间就更不多了。”阿拉贡背着双手在大殿里慢慢地踱来踱去,静静地听着甘道夫的述说。“现在唯一的办法就是组织一支精锐的小分队偷袭保皇党的关隘,一旦得手大部队立刻迅速跟进穿越中途山脉,同时留下一支有理的部队坚决阻击保皇党大部队的进攻掩护主力,可是这阻击的部队有可能会全军覆没。”说到这里,甘道夫默默地看着阿拉贡。阿拉贡听了下来默默地取下腰间的长刀,轻轻地抚摸着向这七颗绿宝石的刀鞘,慢慢地抽出宝刀,只见一股寒光慢慢地映在阿拉贡坚毅的脸上。突然霍地一声,阿拉贡宝刀还鞘,坚定地一字一顿地说道:“这些精灵族的战士都是随我们出生入死的兄弟,我们经过这么多的生生死死才走到这里,怎么能够丢下任何一个呢?既然迟早要和保皇党决一死战不如就在这大山里,打赢了缴获的给养绝对不成问题,打输了我们大家就痛痛快快地一起上天堂。”阿拉贡一双如刀锋般的眼睛紧紧盯着甘道夫,甘道夫长吁了一口气:“既然你决心已定,那么就赶快给拉格莱斯回信让他早作准备吧。不过这山林作战部队宜少不宜多,你就把所有的冠军战士集中起来吧。”

月 十八日  出太阳了吗?好像有吧?因为阳光若有若无的样子。

好像source-safe和source-control是两个不同的程序吧?一个是类似于cvs的版本控制数据库,另一个是和visualstudio捆绑在一起的一个程序吧?如果,从两台电脑访问同一个数据库,最好还是用两个user,并且windows是简单的共享文件机制,记得要把写的权限设定共享文件,不过我感到迷惑的是,我指能够checkout一个版本,然后总是有数据库联接只能一个之类的莫名其妙的错误,总之,只能一个user写或者说checkout,但是。。。不明白。

蒙特利尔的秋天同样是天堂般的美丽,气温凉爽,吹面不含的杨柳风荡漾在被毛玻璃板的白云过滤的阳光里,人的心仿佛也像气球一样想要升起来了,(这里套用《围城》里烘托方鸿渐求见苏文纨之前的气氛),我当然觉得没有必要把这样好的天气浪费在女人身上,最好的方式应该是把自己投入到这样的天气里,难得啊,过了这个月就又要白雪纷飞了。中午吃饱了,就徒步去superC买菜当作郊游吧。往日灿烂的阳光如今只是朦胧一片,映衬着教堂钟楼那铜绿色分外分明。这里的楼房都很少有高楼,如果让国内那些依靠市面工程加官晋级的父母官看到一定要摸着肥硕的大肚子耻笑不已,可是,房子矮一点有什么不好,加拿大真正是地大物博,人口稀少,每个人的空间可以大一些多好啊。

月二十五日  出太阳了吗?好像有吧?因为刚才有看到。

很偶然地用google到了高中同班同学的跟人空间,看到他的生活,听到他的声音,很显然我是看到他的文字会想起这个同学的声音,我想几乎没有什么变化,还是一个率性豪迈的好男儿吧,现在号称“有求必硬”,够YD吧。当然我也可以明显感觉到我们是生活在两个不同的半球,两个不同的世界,我现在头疼的事情是别人所无法感受到的,假如从原则上一个想法是错误的,怎么有可能通过局部的优化来解决呢?仿佛GCD的所谓保鲜技术不过是延缓并非根除。今天看到新闻说是陈良宇被抓起来了,看来海外的新闻并非空穴来风,十有八九比国内的可靠。头疼。。。忽然想所谓的AI也许某一天我们醒来就发现完全实现了,比如现在的google就是这样,所谓AI无非是高级的搜索,所谓的“思索”不过是另类的“搜索”。

如果说我在某个领域里有创造性地话,那一定是在厨艺方面,这两天我为了处理太酸的桃子决定把他们全部当作蔬菜来烹炒,桃子蘑菇豆腐虾仁大锅会真是举世罕见的创举!在实验室里我感觉实在是沮丧,好像我完全忘记了我早上干了些什么,VSS好像丢掉了一些版本,当然也许是我的所谓版本是一样的版本,但是。。。当然我现在知道了checkout的comment是没有用的,只有checkin才会作为版本的一部分保留下来。

月二十六日  出太阳了吗?好像有吧?因为刚才有看到。

早上终于改成了pipeline,falgun这个机器用的是100M的网卡明显太慢,这样三台render结果却也只有不到2fps,但是当运气好的时候能够达到4fps这说明pipeline是有潜力的,如果每次displayer显示比transmit慢,是否意味着我不用去压缩?如果我能够有更多的cluster就好了。下载了不少蔡依林的mv作为了解无知(物质)的力量有多大而已,ignorance is power,这是真理。桌别林的老片子实在是经典,准备下载circus来看。我在烹饪领域的技能又有了新的突破,现在开始制作八宝饭,日本圆米+中国香肠+绿豆+枸杞,白红绿霎时好看。这个台湾的小骚货唱歌实在是太难听了,当然她应该去当舞娘。

月二十九日  出太阳了吗?没有,因为下雨了

在这样阴雨的日子里,人的心情更加的阴郁,在阴暗的小屋里关上灯听着克莱德曼的忧伤的钢琴曲睡午觉。所谓pipeline纯粹是一个笑话,我觉得非常的沮丧,虽然多少是预料之中的,但是还是一个沉重的打击。

月 三十日  出太阳了吗?有,因为我出门走了走,阳光灿烂。

下了几天的小雨终于放晴了,出门走了走,本来想走到Antony家里混饭吃,可是我一打电话说明来意,他就吓得赶紧推托要出门打网球,哈哈,上一次吃了一次美味还是让人回味啊,不过我已经忘了吃的是什么了。最近,我发现洋人的pasta很好吃,做起来也简单,微波炉加热一下就好了,当然尺多了就会吃腻了。这一阵子我不断尝试新的烹饪技术,做过剁椒牛肉,水煮牛肉,红焖牛肉,粉蒸肉,爆炒蘑菇桃子,各种各样的罐头,包括蜗牛,午餐肉,红烧鳗鱼等等,中式烹饪吃腻了就改一改西式烹调吧,比如小比萨,pasta,等等,不知道这以后还有什么可以尝试的?沿着运河边走边跑心情很舒畅,赋诗一首

十月一日  又遇阴雨,心情郁郁不欢

噩梦连连,又遭风雨,成诗一首

十月四日  早晨起雾了

computer scicence比所有其他学科来的好的唯一的地方,也是最大的优点就是,如果你发现了什么不合逻辑的事情,只要你深入去探索,你一定能够找到原因,因为任何的程序都是人写的,所有的硬件都是人制造的,所有的环境都是人为的,而所谓的物理化学生物之类的走势有很多的观察到的先贤充满了不可知的因素,偶尔的你找到了一个合乎逻辑的解释,其实很有可能是另一个环觉得结果。当我看到用vertex-buffer-object居然能够让显示时间降到0,我其实就应该想到这是不可能的,可是我当时过分迷信extension的威力了,后来在发现居然读取framebuffer的时间和模型大小成正比简直让我要疯掉了,当然很快地当我使用glFinish就发现了原来一切都是浮云,因为VBO并没有提高一星半点的速度,读取framebuffer的时间是一常量,显示图形的时间是和模型成正比,仅此而已。

前几天我不停地为账户上的化不完的钱而发愁,设想了各种各样迅速花钱的办法,结果计划还没有付诸实施,咱们可爱的政府就来了一封信说多给了我三千块钱,黄粱一梦而已。

十月十一日  晚上又下雨了

从国家公园回来还没有写下什么心得,不过我知道这种对周围环境的淡漠的到来是迟早的事情,正如我刚来蒙特利尔时候预计的那样,如果我不在当时写下当时的所观所想,事后是绝对不会再有那种热情或者说情绪去做了,所谓司空见惯寻常事而已。的确来加拿大好几年了,对于蓝天白云绿水青山的感受是比较淡漠了,抑或是我现在记忆里的极度衰退已经开始如常人般看过即忘了?其实何必要说如常人般呢?我本来不是凡人吗?在已经模糊的记忆里,十多年前来到加拿大的那一次看到的红叶要比这四年来看得都要红得多,那一次去的Ottawa的附近的国家公园里延公路两侧到处是红得刺眼的枫叶,是蓝得如同硫酸铜一样的蓝天,绿得如同氯化铜一般的湖水,当硫酸铜和绿化同混合在一起那就是我俯瞰这些湖水时候的感受:中学的化学实验。这两天来我一只念兹在兹的设想原来又是一个幻觉,在并行处理里面人的思维总是不够的,尤其像我这样有些迟钝的脑子,竟然会对于一个简单的问题想不明白,比如我们的client的程序比server程序快很多,比如快两倍吧,那么每次client都给server发一次信息,自然他有一半的时间都是在等待,那么如果能够在server多开一些buffer每次执行一半的时候接受一次client的请求存下信息,这样client就不用等待了对吧,当然我们假定接受发送信息很快,问题是要多少个buffer?实际上是一个很简单的问题,可是我却想不明白。答案当然是无限多了,如果程序持续运行下去,也就是说类似于openGL的swapbuffer的主意根本不行,实际上OpenGL使用swapbuffer并不是要提高速度,而是为了消除flicker而已,看来我最近总是有幻觉。当然今天晚上还是有收获的,第一是想明白了这个问题,第二是发现了微调sender的各个事件已达到最大的concurrency是很有效果的,其中一个比较讨厌的问题就是一个周而复始的循环的第一次执行顺序和其后最合理的执行顺序是有区别的,仿佛自动机原理中的起始节点和其后的节点是不同的。就到这里吧,昨天改作业改到两点多还是挺累的。

十月十四日  又下雨了

终于蒙特利尔的冬天要来了,经过了一个漫长的夏天我都快要忘记了这里有着地狱般的冬天,世界上的事情大都如此,很多事如果不是真得到了眼前你总是不肯相信,或者根据以往的经验你认为不可能发生,可是的确发生了,怎么解释?是否定眼前还是否定过去?一个唯物主义者绝对不应该否定现象的存在,相反试图用理论解释仅仅一个方面,最重要的还是要去验证这所谓被修正的理论。世界上的事情原本就是easy to be said than done。我总觉得学计算机的人决不可妄自菲薄,因为这是一门科学的科学,从理论到实践,从数据到知识,从知识到理解,从理解到智慧,无所不包,无所不在,绝对不是所谓的一半的工程科学或者一般的自然科学所能匹及,说它是智慧的科学,或者是科学的科学是理所应当的,有什么是比探究科学本身,只是本身更加无可比及的?道可道,则何为道也?名可名,则何为名耶?试想看,计算机科学从诞生到成长发育现在可能还处在少年时期不过几十岁而已,当今社会已经为之翻天覆地,设若他能够发育进入青壮年则明日社会会变成怎样?而从这个层面上来看,他的近亲,所谓“电子工程”说到底不过核物理化学生物一样不过是一门所谓的科学而已,两者根本不是可以相提并论的。

从前看《The battle of wit》的引言说,解码不一定需要疯狂才行,但是毫无疑问地,那是有帮助的。如今换作debugging也一样的适用,昨天我差一点为之疯狂,因为我不能相信原本同步的系统现在突然变得异步起来,我反复地扫描我的code没有一丝地痕迹,这个时候,无神论者容易怀疑这是系统的bug,教条主义者则坚信问题应该出在自己一方,只有疯子会开始怀疑这是一个合理的现象,实验主义者主张实验一个简单的例子来重现现象,本本主义者认为应该重新查阅MPI的protocol,悲观主义者希望通过google找人帮忙,无为主义者想着明天太阳升起来的时候也许一切都有答案了,机会主义者希望跳过这一步直接改换triangle模型。。。

最后的实验给我的启示是也许这真的是现实,我的猜想是test函数只能监测non-blocking-sending逻辑上的结束,而这里我认为如果接受方也采用non-blocking-receiving的话,sending结束的标志不在于receiver是否post了receiving的request,而是receiver背后的接受buffer是否能继续接受,也就是说,sending所能感知到的接受只是实际的socket放入接受缓存队列的过程,是否接受方已经提取了data是一完全无关的问题。所以一个fast-sender是无法与一个slow-receiver同步的,如果大街都用non-blocking的send&recv的话。另一个小问题是关于Macro的,我想每一个c程序员都会在一个时期爱上宏的,不过这段恋爱可长可短。

十月十八日  好像要下雨了

我想一个人喜好的音乐多少反映了一个人的心态吧,这一年来我越来越喜欢理查德克莱德曼的浪漫钢琴,是否是一个时期的结束,或是另一个时代的开始?我越来越觉得实验事实最适合我呆的一个地方,并行处理对我来说只是一个开始,分布式系统我只是一个初学者,图形系统我更是一个门外汉,然而我想这个世界上也许像我这样水平的人多如牛毛,但是如果我能坚持下去必定会有所成就吧,虽然data-paralleling在学者的严重可能不过是intellectually-shallow的哑哑学步,可是我始终认为一个人没有实践一下前人所走过的道路谈何更进一步?轮子不需要在发明一遍,可是不等于说你不可以再制造一遍,虽然不需要任何一个计算机的学生重新象Linux一样重写一个操作系统,可是至少应该有能力有信心说,给我时间我也能做到你所能做到的,虽然那可能是我生命可以延续时间的很多倍时间,然而只要不停歇总是可以做到的吧。当然这听上去愚不可及,不过我确实是这么想来着,那就这么着吧。我找了好几个小时却找不到soft-irg的那个trap代码,学comp444的时候教授演示过sysCall是怎样在linux里实现的,当时没有记下来,现在全忘了,以至于连这个mode-bit是硬件层的保护还是软件层的保护都记不清了,内存访问应该是硬件层吧?记得下一次遇到Mr.Z的时候问一下。我前两天再学习怎样适用office用excel来画chart,用visio来画cause-effect图,其实我是想搞明白在系统中message传递的时间图(timeline),但是我想不明白,因为在同步的信号间又有着异步的传输,所有的通讯都是非阻断的什么时候结束并不能立刻知道,就如同wmpi的技术支持说的,synchronous-send结束是在receiver开始接受的时刻,但是你知道这个情况确实在你invoke一个wait或者test的时候,这并不能真正反映接受方的时间点,因此这就是为什么fast-sender会越飘越远让slow-receiver落得越来越远的原因,所以,我在每一个round的开始要进行一次同步,如果立刻就test那么着和纯粹的blocking-send没有区别,系统会完全的synchronous慢很多,worst-case是把所有的send都变成synchronous-send然后速度慢了整整一倍,那么我用non-blocking-synchronous-sending在frame开始发送,在frame结束test,让整个系统有一种近似virtual-synchrony的模式,也就是non-blocking-send只在下一轮开始的时候test那么这样效果应该是最好,可是我确画不出timeline。人的想象力是有限的,我看不到的东西我大约是想像不出来的吧。

你想过null指针还能干什么吗?一个macro是这样的#define offsetof(s,m) (size_t)&(((s *)0)->m)这个定义多棒啊,我当初还非要声明一个变量来做,却不知道typePtr->member本身就是一个偏移量,当然如果有人异想天开希望member是method那么就大错特错了,应该没有人像我这样想吧,因为c++method是靠另外一个隐含参数来实现的,和struct无关,只有初学者才会想象class是struct+method,不过OOP本来就是教育学生这么想的,难怪吧。

也许斗转星移物是人非之后的一天每个人都会有着相同的结果,这个结果可以看作是一个proof,不论是Erdos似的another roof,another proof还是寻常人的行万里路读万卷书,抑或只是吃喝玩乐,都算是一个吧,本来没有什么重要与不重要之分,讨论的人多起来了,也许我们就认为那个结果重要,没有人问津了,人们就说不重要,凡此种种不一而足,陈词滥调的很,只不过人人选择回答的问题有可能不太一样,有时候根本谈不上人去选择问题而是问题来选择人,你回答也好,不回答也好,都算一种答案,这和Turing Machine有些不同,因为对机器来说否定的回答也必须是一种显式的回答,没有回答不作为否定来说,无声就是默许不成立。所以人生相对于计算机来说相对容易些,如果你做不到,或者你不知道,生活中你可以选择沉默,选择过一种无声无息的生活,没有人会责怪你,因为没有人能够听到你的声音,所以没有人会知道你的答案,这两者到底是因为先有原因才有结果还是因为这是结果也就变成了原因呢?我不知道,我选择沉默。但是在计算机里你必须声明你不知道,否则一个证明就不能继续下去,从这一点来看,完全清醒与理智的头脑往往无法完成一个人生的证明,有人把这称为fault-tolerance,也就是容错性,这可真是有些irony,我不知道这样的叫法对不对,我就选择沉默吧。对于这个社会的大多数成员来说,在他们三十岁的时候他们已经基本丧失了重新学习的能力,原因当然是不需要,原因当然也是不可能,因为即便你这样的傻瓜证明了你有这个能力,然后高兴的向众人宣布只能招徕一种注定的回答:so what?这个证明有意义吗?

忽然间想到了blade runner的结局,短暂但是更加的璀璨,而当replica发现无法延长生命的时候,在生命的最后一刻说的就变成是一种希望,一种希望其它同类能够看到它所看到的vision,这种uncommon的生物的最后的愿望原来也是这样的common。

十月二十三日  好像要下雨了

看这些海外新闻网站的国内新闻,已开始你会觉得国内仿佛还是清朝的统治时期,后来你会觉得是北宋末年,估计在后来就是明朝末年了,因为十几亿的老百姓所喜闻乐见的黄金档的电视剧都是清朝的,去年刚回国的时候不解的很觉得老百姓没文化的紧,后来明白了,因为有情绪没出发泄,借古讽今而已,新闻喉舌不敢说,只好让所谓文艺工作者来让穷百姓出出气。回来这一年来却觉得时政仿佛是小时候看《水浒传》的感觉,因为到处是所谓的官逼民反的味道,当然不一定是真反,其实你看水浒就知道普通人当时就算再穷也不愿落草为寇,实在是林冲走投无路了才不得不去投靠真正的亡命徒,如果遍地都是草寇的话那早就不是什么北宋末年了,应该就成了五代十国了。从point-based改回到了triangle-based仿佛是改邪归正,又仿佛象最早的那批人那样地重走一边探索之路,虽然夸张一点,但是我觉得我会比较真正地体会到其中的优缺点,当然这些道理是粗浅的不能再粗浅的,平常人一般用脑子想一想就够了,只有我比较笨拙只善于用眼睛和手来配合脑子去想,说的粗一点叫做没有预见性,说得细一点叫做来源于实践。当初Dr.M就一针见血地指出了shading-mode是smooth的时候我不可能去压缩pixeldata,后来当然我投机了一下,因为point-based的再OpenGL里没有实现smooth-shading,实际上是flat-shading,因此我得以压缩了pixel,飞了很大的劲,结果不过是压缩了一半,那段时间是最辛苦的时候,因为大部分的bit操作来不得一丁点的错误,否则数据就是一塌糊涂,而错误在那里是非常难以看到,因为面对一个frame的pixel数据无从找起。现在改回到了triangle-based我突然有一种被欺骗的感觉,因为ply文件里单单用point来显示实在是骗人的快,因为以这些点为定点的三角形可以组成好多倍的,速度当然不是一个数量级的,我不禁对我的前人的测试比较的结果有些不安了。前天一起去吃饭,我学到了一条,也许我对于操作系统的理解还都是286,386时代的概念,至少我就没有意识到虚拟内存地指现在是有好几级的mapping了,那么在这种前提下自然不再是传统的经典的操作系统内存保护模式里说得用base,offset两个寄存器进行硬件保护了,由此推广,所谓的mode-bit也不应该是直接的硬件保护,反正user根本接触不到硬中断,软中断全都是在os监控之下的,monitor模式其实更多的是一个概念而已,所谓进了一个们自然就是一家人,那个看门的就应该是int80的trap式的softirq了。你既然一定要过这个门,我自然不怕你侵略了,所以也才有所谓的黑客的buffer-overflow的诡计,否则都是硬件保护那里还有漏洞可言,不过我想实际的物理上的低端地址应该还是user的禁区吧,因为bootstrap-loader顺理成章地从那里开始。

十月二十三日  好像要下雨了

究竟哪一个更容易懂一些呢?是比利时大侦探剥落的法语加英语,还是“豆豆先生”在“blackadder”里面的中世纪英语?哈哈不是炫耀我的品位有多高,而是对于那些看美国儿童片,比如“friends”的同学们的一点点bs。

十月二十五日  天好像也不是很冷

很久很久以前,我曾经为这个问题所困扰,就是从WMPI创建出来的window除了主节点外,其他节点上只是显示成一个小图标,于是每次运行的时候我都要在实验室里跑来跑去的点一下这个图标让他正常显示,我甚至于想抛开glut自己直接用win32API去创建window,不过一则没有时间去搞这些旁门左道,另一方面想还是兼容的好,因为OpenGL本来唯一值得称道的就是跨平台,我自己这么搞一个简单的东西哪还不如去学习directX去直接提高效率呢。摒弃这就是我当时的最大的错误,一个EE学生常常会犯的而computer-science学生决不应该犯的错误---只见树木不见森林,在细微末节上追求所谓的效率却忘记了最大的性能提高来自于合理的设计,优化之能提高非常有限的效率绝对不能本质上改变运行效率,否则就不叫优化,应该叫做改进了。
当中与我不得不想办法解决这个问题来临的时候,我只有最后的选择,那就是去改glut,简单的创建glut一个工程然后几分钟的trace就明白原来问题就是这么简单:正常情况下,如果一个child-window他的window-style除非创建者指定是不会线式地设定为visible的,因为很有可能创建他的parent-window正在做什么工作。所以我所要做的就是强制这个child-window为visible。为什么openGL创建的window会成为child-window呢?因为在mpi主节点以外都是从一个所谓的wmpi-deamon或者说service创建出来的,所以除了主节点外当然都是child-window了。
Hacker原本的意思就是指一些程序员跑到人家的系统里随心所欲的乱改一通,多数情况对于一个成熟的设计系统任何的改动大多数都是糟糕的,(否则也不叫成熟的系统了)我想我不算什么Hacker只不过做了一个大家都能做的事情hacking了一些glut,改动了一个参数,当然这个改动很糟糕,可是没有办法呀,实验室里电脑不够用,(当然要首先保障那一个只会到实验室里测试游戏的XX小XX了),我的supervisor只好问我能不能把三楼的实验室电脑加到我在九楼的实验室的系统?Concordia sucks!两年前购买的8台高性能的图形cluster到现在还不能让我使用,一年半前订购的Nvidia的高端显卡现在才到,已经跟我家里的电脑的显卡差不多了,实验室里的图形工作站的1G的网卡坏了,我请求更换,订单一个月前就下到了tiger-direct.com到现在还没踪影!
发了一通牢骚才想起来主席的教导:牢骚太盛防肠断,风物长宜放眼光。
就到这里该做饭了。

十月二十六日  天好像也不是很冷,本来背起书包下定决心去gym,结果发现倒闭了

Concordia是一所没有围墙的没有自己的gym的大学,(夸张一点,北美的大学百分之八九十都是没有围墙的,concordia的loyalo也是有一个gym的,downtown这个虽然连旁边的matropolis中学都不如,可是严格地说也不能算没有,同时新的EVbuilding的basement也在改建一个,所以。。。)可是目前我还是没有gym可以去。

难与易有时是正如探们本身一样很难定义,有时候很容易定义,有时候很难定义,请注意这里本事就是一个循环定义,当我们试图定义“难与易”本身的时候有用他们自己做了定义的一部分,我绝对不是第一个犯这样错误的人,我也绝对不是第一个故意犯这样“错误”的人,(同样地在定义错误的时候,很多人是这样的定义的:凡是不是正确的就是错误的,当然正确的定义也是类似的,即凡是不是错误的就是正确的。这个好像在编译原理里面提到过,同样是recursive definition)许多大思想家哲学家以及所谓伟人的很多理论就是这样定义的,当然不会这么明显的一望而知,大多数时候罩了一层面纱,所谓“绝对真理无需证明也不必证明”,所谓“所有的神迹的来源是圣经,神迹的叙述证明了上帝的存在与万能,上帝的主宰意味着必须相信圣经。”一切的一切假如不能重现,不论他的来源提供者有着多么高的可信度都是值得怀疑的。而让人信服是一个巨大而艰辛的过程,证明一个理论是错误的也许是最容易不过的,最简单的就是给出一个反例,而证明一个理论是正确的即便你给出几千几万个符合的例子也是不充分的,而一个完全依循纯粹逻辑生活的人是很难生活在这个世界上的,因为完全相信一件事几乎是不可能的,除非给出严格地证明,单单靠例证是不足为信的。我想这并非完全是空对空的空发议论,看看中国人一直为之自豪的所谓“中医”吧,连带的一大堆的所谓“易经,八卦”之类的糟粕,至今还有人准备用所谓的以上所说的“例证”来证明其存在的价值。我在这一点上很赞同鲁迅对待中医的态度,正如《笑傲江湖》里“杀人名医”平一指所说得那样,每天庸医杀人的案例远远超过江湖上斗杀身亡的案例,翻译成现代语言就是也许每天中医误人杀人的案例超过了中东战火纷飞的杀人个数。因为所谓个案的证明是不足为信的,比如一个患感冒的人依靠正常的抵抗力也许一周时间正常就康复了,可是很凑巧的确成为支持中医者的佐证:星期一,感冒开始了,可是要上班没时间,多喝开水也许就行了;星期三,感冒加重了,也许是加班太累了,今晚不加班了吧;星期四早上头疼欲裂感冒达到了最严重的程度,(当然这个时候也许就是康复的开始),实在受不了了,办公室里整天研究“易经”的博士生白督殊推荐了一个老中医下班去看看吧。下班了话了一百块钱买了一包中药,回家煎了吃,晚上睡觉出了一身汗;星期五,好像感冒开始好了,老中医真神了!(天知道你自身的抵抗力正常也会让你在一个星期内自然康复,即便老中医给你吃的是一包他们家的香灰你也会好的。)从此你成为“白督殊”的义务广告员,从此再打着发扬民族文化传统的旗帜下让老中医混口饭吃。

我注册mpi-errhandler总是不成功,索性就用atexit来做好了,反正是一个进程。

十月二十 九日  天好像也不是很冷,也就是四五度的样子了

昨天折腾了一个早上一直对于java的wait,notify有些不解,原因就是原本的观念是synchronized的函数在同一时间只能被一个线程调用,也就是说一个线程没有走出这个函数前不可能有另一个函数进来,可是在里面调用了wait就不同了,原因是这个wait不单单是检查信号量把当前线程置为等待组里面(wait-set,从这个set就可以看出不是用queue之类的FIFO模式,所以才能在notifyall的时候不分先后),还同时要让他放弃monitor的ownership,这个所谓的ownership相当的抽象,应该和win32里的mutex的ownership差不多吧,也许就是在所谓monitor结构里面放着线程的id吧,anyway那个所谓的synchronized和wait应该本质上是一回事,就是都是monitor ownership的争夺,没有就自然被放到wait-set里面睡觉了。唯一让我觉得比较好的就是如果没有没有ownership而去call-wait会有异常抛出,这一点至少是manditory的,不过好像String的+=不是线程安全的,实际上我也没有找到这些操作符的定义,不知道是在什么级别上实现的。又看了看COM感觉还是难,我现在大概就刚刚会用dll的水平。

十月三十日  天好像也不是很冷,也就是四五度的样子了

折腾了快一天才搞明白了remote-wakeup或者叫做wakeOnLAN(WOL),写了一个历史上最简单的小程序实现了从九楼遥控启动休眠状态电脑的功能,搜索的时候还看到有人在网上卖10美金这样的小程序,当然它的功能要全一些,无非就是做了一个用户界面而已。多少还有一些自豪的。

十月三十一日  天好像也不是很冷,也就是四五度的样子了

昨天忽然把自己以前拍过的一些风景照片又重新浏览了一遍,觉得很伤感因为很多照片记录了当时的心情,后来因为这里的空间不够大都删除了,现在把一部分纯风景放在这里,算是给他们一个永久的归宿,仿佛这样心里才有了一种寄托与安慰。正如我在相册的描述里说得那样,在纯粹的风景中,人是多余的。
十一月二日  天好像也不是很冷,也就是四五度的样子了
下载了老电影《佐罗》因为喜欢开篇介绍阿兰德龙的话,他可能是欧洲最好的剑客。

闪电战:如果从南向北进攻的话,在城堡的左翼是众多的城镇,在南北边界处是一个险要的山口,这个方向对于北方防御是有利的,因为第一,山口离北方城堡较近,可以先于南方占领有利地形以逸待劳,第二,北方在山口的后面有防御纵深,因为是丛林加山丘,万一山口失守还可以建立第二条防线,第三,南方在接近山口的地方是一条横着的河,只有一条小桥可以通过,北方只要布置少量的人鱼部队就可以协助步兵防御山口。这里显然应该是北方重点进攻的方向,因为这一侧对于南方是他的经济命脉因为这一侧的城堡比另一侧多不少,因此作为南方是一定要防御的,于是这个方向成为兵家必争之地。在第一场战斗中我发现对方是一个少有的谨慎小心的对手,一个决不主动出击,一个稳扎稳打的硬角色,他的进攻从来都是在兵力,地形,兵种搭配占优,时机有利的时候才进行,并且进攻的次序天衣无缝,比如先用法师这种攻强防弱的特种兵撕开我军防线的缺口,随后可能用骑兵冲击消灭我负重伤的防御部队,随后再用防御力强而且便宜的枪兵巩固阵地保护好受伤的进攻部队,以便让我的反击无效。在我抱怨闪击战这张地图对保皇党过于有利之后,它示强地选择了兵种随机。这一次他是兽族,我决定孤注一掷,实行一场真正的闪击战!首先,放弃表面上容易防守的右翼,因为容易防守所以我的对手一定不敢孤军深入,索性我就放空城计,仅仅招募一个侦察骑兵占领城镇。第二,放弃所谓的精兵政策,改为招募便宜的战士以便用量取胜。于是我除了一个侦察骑兵以外 只再招募一个人鱼部队作为辅助进攻,然后持续大量暴兵用人海一般的丛林战士冲击对方易守难攻的山口,诚所谓出其不意,攻其不备。果然对方没有准备,第一他既没有及时把右翼防守的部队调往左边,也没有大胆命令他们突进对我进行骚扰,而是原地防御;第二他居然招募了三个人鱼部队防守中路的水面,第三他的部队数量不足对于我的疯狂进攻没有准备,再加上我的出奇好的运气,居然几次反击都奇迹般的挡住了,于是胜利的天平向我方倾斜,我方主帅坚持每个回合暴一个战士补充前线的损失,并及时把受伤的部队撤下来休整,在取得了优势之后,我非常谨慎的放慢进攻节奏以休整部队为主,并没有持续进攻,这样在他的主帅亲自上阵的时候依然没有挽回败局。最后在我方绝对优势兵力的情况下取得的完全的胜利。这就是战略的胜利。

十一月四日  天其实已经很冷了, 当然比起往年来说还是暖和的

最好的防御就是进攻,这句话的真正意义在于说如果你能够持续进攻一直让敌人根本无法对你进攻,那么你也就无需防御。但是战争实践是你往往不可能在一轮持续的进攻中彻底消灭敌人,当进攻的矛头顿挫的时候也往往是敌人开始反击的时候,这时候如何进行防御呢?正确的做法是在进攻的后期就要着手转入防御,而只有纸上谈兵的书呆子才会真正相信字面上的所谓“最好的进攻就是防御”。因为,如果你能够在一次闪击中彻底消灭敌人你的确是不需要防御的,可是这超出了军事战略的范畴了,大概世界上只有美军打击不成比例的伊拉克之类的才是这样。

在进行阵地式的防御的时候,最基本的是利用有利的地形,但是还有显而易见但又并非为所有人所明白的一些军事常识,一个是防御的纵深,一个是反击的实力。

世界上没有绝对坚不可摧的防线,但是世界上常常有让敌人望而生畏的防线,那是因为在敌人攻防转换的时刻也就是我军反击的时候,敌人在进攻态势下必然是难于组织完美的防御,如果在我军反击时对敌人造成的伤害远远大于我军防御的损失时候,敌人是不敢贸然进攻的。这就是反击的威慑作用,比如我们常常在一线防御阵地配置一些价格低廉的丛林战士,他们可以有效地损耗敌人精锐的突击力量,而在后方我军配属一部分精锐的高低结合的突击兵种,当我军反击的时候,先用高级兵种重创敌方突破防线的精锐部队,然后适时地用低级兵种消灭他们以便达到升级部队的效果,同时在反击的后期重新用建制完整的低级防御部队建立新的防线保护我军反击时受创的精锐部队。因此决定防线稳固的根本条件还是整体的反击实力,这是一种积极的防御完全不同于被动的自杀式的消极防御。

防御的纵深同样是保证反击战成功的一条,如果防线单薄,一点突破导致全线崩溃的话就根本谈不上反击了,防御纵深并不是简单地累积兵力,如果是这样我军应该在兵力上占优势又何必采取守势?因此,防御的支撑点的选择至关重要,在关键的位置配置关键的兵力是防御的关键。最根本的就是利用地形与ZOC(zone of control)使得我方防御部队的防御面最少,防御方向最有利。对于至关重要的防线支撑点要不惜一切代价坚决防御,这些点往往是所谓失而不可得,得而不可失的防御阵地,也就是从任何方向来说都是易守难攻的坚固的点,因此它必然是敌我必争的焦点。有时候为确保核心阵地的牢不可失,必要时有可能要采取违背防御原则的措施在核心阵地前集结兵力消耗敌人进攻核心阵地的精锐突击力量。要记住对于防线的稳固来说多大的牺牲都是值得的,因为在我军有足够反击实力的情况下坚守防御的支撑点可以最大限度地扩大我军的反击战果从而从根本上杜绝敌人对于我军防线的进攻,也从而最大限度地减少了我军的损失,所谓不战而屈人之兵。

有时候最好的进攻是防御,在正面坚固设防的敌人阵地面前主动露出破绽诱敌来攻,然后趁势发动反攻一举突破敌人防线,这也常被称为钓鱼战术。或者在我坚固设防的阵地前故意部署若干孤立但是防御坚固的部队诱敌,在敌人大量消耗有生力量或者不利防御的阵型暴露在我突击部队面前时候以雷霆一击之势将其消灭来攻达到牺牲局部取胜全局的目的。在兵力补充时,有时要切忌采用添油战术,所谓添油战术就是逐步将兵力投入到主战场,因为这样无法在战场上形成优势兵力达到打歼灭战的效果。因此一般来说突然性的暴兵可以达到迅雷不及掩耳盗铃之势不给敌人喘息补充的时机,但是在战争焦灼我方持续进攻时又要讲究每个回合都有部队补充不停歇地向前线输送,切不可耽误任何一轮因为前线的部队在受到重创时及时撤换新部队进行防御进攻至为重要,不但可以让受伤的部队及时休整来节约资源,更重要的是这些受创伤的部队往往是已经获得经验值得部队,他们的价值远远大于那些没有任何战斗经验的全新部队,因为升级后的部队将成为敌消我长的关键,在资源与战斗力上都有着不可估量的价值,从心理上说可以严重挫败敌人进攻的信心进而达到攻无不克,守无不胜的境地。

长夜漫漫,网络无边,不知胜负手可愿手谈一局?

最长的一天:这是在“霍洛岛”上的三人对战地图,三个英雄出生在对称的三个角落,地图的中央是一个由六个村庄拍成蜂窝型的战场,这里成为兵家必争之地。我遵循我的一贯原则在小地图上坚决只招募最便宜的森林战士,因为在平原与村庄防御中这是性能价格比最高的选择。这个战略是二次大战中苏德战场上德国人用血的教训学到的,当时德国人追求坦克的精良选择制造少而精的虎式豹式坦克,而苏联则是选择大量建造便宜的T34坦克,在战场上形势焦灼的时候部队没有形成数量之前就实行精兵策略是一种注定失败的例子,因为高级兵种耗费大量资源,对于我军要大量防御的阵地要点来说是不够的,兵力不足就导致无法及时用补充的部队替换已经负伤的部队,同时高级兵种升级的空间要小很多,因此从理论上说大量招募低级兵种有着更大的性能价格比,这也就是为什么我坚决只招募丛林战士的根本原因。

在战争的初期,我立刻就意识到在我的西面的对手是一个菜鸟级的玩家,因为它雇用侦查骑兵,在小地图上这种耗费18金子的兵种相对于14金子的丛林战是绝对是属于华而不实。我开始时决定不理会西侧这个菜鸟 而是专心对付北方的矮人玩家,因为如果我和西侧的菜鸟拼个你死我活北方的这个矮人一定会大占便宜的,消灭了菜鸟不会赢得整场战斗的胜利,而消灭了北方的劲敌确多半可以获胜。于是我首先用我的英雄对于矮人的先头部队进行杀伤以便当我的丛林部队赶到时候可以更加容易地消灭它。一般来说让主力英雄孤军深入是异常危险的,一不小心就会被敌人狙杀英雄,但是我知道矮人是个老玩家不大可能向菜鸟一样招募更多的快速部队,我的英雄应该会在矮人的主力部队攻击范围之外。就在我准备给矮人先头部队致命一击的时候,一个意想不到的情况发生了,西面的菜鸟的主力英雄突然杀到了我的大本营前,他这样做是愚蠢的,没有事先侦查就直接用主力英雄这么深入敌人防御纵深是异常危险的。我抑制住内心的激动,调兵遣将将原来准备包围矮人的部队掉过头来对菜鸟的主力英雄发动猛攻,果然在我的三面包围下,他的主力英雄受到了重创,我决定冒险一击,把我的主力英雄也调上去给他最后一次打击,成功了,西面玩家被消灭了,为了防止他剩余的部队对我得英雄的疯狂报复,我立刻派战士挡在了我得英雄的前面,这样可以保证不会有危险。随后这个沦为电脑的玩家的剩余部队开始发动自杀似的攻击,我的主力迅速调整补充,在我重新招募的丛林战士的合力进攻下,这部分残兵败将被我消灭了,这个时候我才得以喘口气重新开始向中央挺进,可是就在我忙于剿灭突入我后方的这些残兵败将的时候,北方的矮人已经占据了所有的中央村落并且开始由此向西南突击准备收复被消灭的玩家的城池,如果我不能在此之前抢占那些资源,我将陷入极大的被动。于是我调集我所有的部队奋力向中央进攻希望能够控制这个交通枢纽阻止敌人抢占西南的资源,同时我的主力英雄不再呆在东南侧我方 城堡里招募部队而是星夜抄小路赶往西南准备占领敌人的城堡就地招募部队就地组织防线,因为我得丛林战士行动力较低,同时目前我得资金补充较慢只能一个回合招募一个战士,与其坐等不如赶快冲锋。结果我的主力部队正好撞在了北方矮人在中央以逸待劳组成的坚固防线上,大部分的部队都被分割包围围而歼之了,不过也正是矮人族集中精力在消灭我得进攻部队的时候,我的主力英雄却顺利地到达了西南城堡,与此同时我积累下来的金子足够我一轮招募半队的部队。这时候成了战役最黑暗的时刻,敌强我弱,此时我为了抢占西南,完全放弃了原来的基地,进攻中央的主力也消耗殆尽,北方的玩家此时踌躇满志抛出了劝降书,我沉着地应道,I will take my chances。

与此同时我新招募得半队主力在战争弥雾散尽之后让我得对手颇为吃惊,当然它还是坚信胜利在望这些不过是延缓他的胜利而已,这时候他的策略是导致他日后失败的最根本原因,从兵力上说他暂时占有优势,但是从资源上说我们不过是旗鼓相当,因为它虽然占有中央,我却把西南一角和我原来的东南一角占据了,应该说他并没有绝对的资源优势,何况中央地带的村落实属战争争夺的焦点,仿佛三国时的荆州很难说会持续提供资源远不如角落的村落易守难攻,同时从恢复受伤战士的角度来看中央的村落完全是无用的,这样看来我也许在资源上还略略领先,可是我的对手这时候却改采用精兵政策招募30gold一个的昂贵的火枪兵,要知道这个火枪兵在进攻上也许可以以一当二,甚至是三,可是在防御上并不比一个普通的矮人族战士强多少,资源上却是昂贵一倍,于是这种战略注定了他的部队补充数量不足,在后期他为了应付兵力的不足只好开始招募攻防都很差的刺客部队,这种部队完全忽视ZOC可以长驱直入我得后方在屠杀伤员方面简直像一个屠夫,但是它不是主力作战部队而且非常的昂贵,于是在后期的作战中他的刺客虽然有几次突入我得腹地占了一些便宜,但是随后就是有来无回地被消灭了,从资源上说这并不核算,因为每次我也不过是消耗了一个14g的普通战士,而且是受过伤的也就是已经参与战斗给敌人重创之后的完成了人生的价值的战士,他却派遣她的24g的全新的刺客来突破防线消灭伤员,如果是使用在突破防线的关键时刻,那它的价值是无可估量的,因为很多时候战争的胜负就决定于最后的一击,仿佛千钧重担悬于一发,很多时候这最后的一击成为胜负的转折,攻防的转换,对于这种可以在敌方各个阵地任意游走的刺客来说他经常成为防御方的噩梦。然而他的孤军深入经常让我得后方的主力英雄得以施展,这从作战效能上说是大便宜,因为双方的主力英雄除非迫不得已绝不敢轻易上战场,而主力英雄的作战能力远非一般单位所能匹敌,现在变成我得主力英雄在后方毫无危险地发挥强大的战斗力然后从容地恢复,招募,而他的主力英雄除了招募无所事事,这本身就是一个绝大的便宜,这应该也是胜利天平倾斜的一个重要因素。

话说战场上当时又出现了另一个潜在的威胁,我现在是占据了西南向中央进攻,但是我得旧基地东南角因为上一轮的全力进攻主力损失殆尽实际上已成为空城,如果这时候对手拼死守住中央同时派遣少量部队占据东南将会取得决定性的优势,形势依然十分危急,于是我又采用同样的策略,主力全力猛攻中央,主力英雄凭借能够在丛林隐形的特殊技能潜伏着向东南挺进,然后突如其来地出现在我得旧基地附近,这的确让对手吃了一惊,因为当战争弥雾刚刚散去我可以看到东南角虽然村落都被对手占据可是防守部队仅仅是一个脆弱的弓箭手,对手显然没有料想到我得英雄会潜行至此,同时他也看出了我要就地招募士兵的策略,于是命令弓箭手不惜一切地抢占主城 试图拖延我招募的时间以便给她中央主力进攻赢得时间,不过这时我西南主力的进攻已经让他在中央的主力腾不出手来增援东南,于是我得主力英雄配合一个贴身的侍卫合力向弓箭手发起冲锋,只一个回合就让弓箭手重创,撤退,于是我得主力英雄迅速占领主城 然后招募了半队的丛林战士。此时中央的战场呈现出焦灼的态势,北方的部队质量数量上虽然都有一定优势但是因为经过两轮我方的全力进攻大部分都是负伤的单位,同时在战斗中我得一个丛林战士升格为英雄牢牢地把守住了通向西南的大门,敌方一时间也无法纠集部队向西南挺进,因为我在东南的部队正在向中央蜂拥而至,此时对手依然采用精兵政策,招募了昂贵的狮鹫部队,事实证明这还是一个不错的策略因为狮鹫部队在沼泽地带惊人的机动力大量的屠杀了我得伤员,然后又惊人地撤退回他的后方远比刺客来的有效的多。这时候他的精兵政策的缺陷暴露无遗,他始终无法突然暴出一波兵来持续扩大他在中央战场上已经取得的巨大优势,而那些受伤的精锐突击部队因为没有后方新的防御部队的接替全部被迫就地转入防御与恢复,这就给了我可乘之机,我的新的一波主力于是像潮水一样向中央冲去。我得对手看到了潜在的危机,主力英雄御驾亲征,这威力的确不小,他的刺客部队以及狮鹫部队在我得后方肆虐横行,我也不顾一切地向前线补兵,我知道只要我坚持住我得资源优势就会显现出来,对手的后劲不足只是最后的回光返照,但是目前绝不能让他大量歼灭我得主力,只要能够做到和他拼消耗就行,于是我得主力英雄在最危急的时刻也亲临前线,两家的 主力英雄一度是只有两步之遥,矮人英雄在看着我得英雄消灭了他的忠实的为队长之后咬牙切齿地在地图上我得主力英雄头上贴上了一张标签“dead king”,这当然是他的愤怒,我及时地在英雄周围部署了一道防御圈,最终我得英雄全身而退,经过这一轮的较量矮人的主力精华尽失而他的补充部队再也没有质量的优势,而同时我得两个英勇善战的战士升级为了英雄,从此人民解放军开始了战略大反攻,因为我方第一次开始在质量和数量上超过对手了。

然而反攻并非一帆风顺,他的目前最精锐的已经升级的狮鹫部队和杀伤力惊人的火枪兵对我得威胁极大,我派遣我的一个刚刚从战士升级来的英雄和他的卫兵去剿灭这股凶残的敌人,我的轻敌让我付出了惨重的代价,英雄和他的卫兵以及随后增援的一个战士全部阵亡了,这是一次惨烈的损失,虽然在正面战场上我军已经牢牢地把握住了主动权占据了中央战场,可是如果不及时消灭这两个逃入我方东南腹地的顽敌我方将有极大的隐患,一旦让他们恢复元气我得中央主力不但会腹背受敌,我方的资源优势也会不复存在,于是我派我得主力英雄连同中央部队建立一条牢固的防线,同时抽调出我最大限度的机动兵力向东南展开围剿战,这一次我方部队有着绝对的优势,一个升格的英雄带领三个丛林战士,而敌方的火枪手刚才侥幸逃脱厄运却也奄奄一息,胜利是确定无疑的,问题是有多 快,要知道我方在中央战场上存在着巨大的压力,虽然敌方处于劣势,但是由于我方分兵同时由于东南方资源的暂时易手,在短时间内矮人部队爆发了一波主力向中央平推了过来,这才是关键的大决战,如果我方能够迅速消灭东南流寇收复失地以及正面的敌方的进攻,那么胜利就指日可待了。但是如果东南的绞杀战成为旷日持久的追击战,又或者正面之敌对我造成重大杀伤,胜利的天平也许又会重新摇摆不定,这将成为这场战役的又一个关键的转折点。在这个紧要关头我得对手明显信心不足,对于受伤极重的火枪手机动灵活的狮鹫部队决定单独逃逸,于是在一场围杀中这个血债累累的火枪手成了丛林战士的刀下鬼,而那个侥幸逃脱的狮鹫也被重创暂时失去了作战能力被迫逃回敌人后方休整。在正面战场我得对手同样显得信心不足,没有采取集中兵力进攻的方式反而分兵企图在侧翼的沼泽地的进攻中占一些小便宜。这里不会成为决定性的战场因为它不可能改变战斗的主动权,只是局部的战斗,因为如果矮人取胜了,对于精灵族主力无妨而同时并不解决丝毫问题因为矮人的正面战场依旧需要防御否则他的主力城堡就会暴露在精灵族的进攻之下,因此这时一个在次要战场上发生的一个次要的战斗,他的输赢注定改变不了矮人族失败的命运,可是如果是一个优秀的战略家应当明白他在不利的局势下唯一的改变命运的战场应该是在中央,虽然这几乎是不可能的,但是这确实是唯一的机会。矮人族失去了唯一的机会之后就只有负隅顽抗了,首先在沼泽地的争夺上虽然他的机动灵活的狮鹫部队占到了一点点便宜,但很快在我方的反击下连他目前唯一的精锐狮鹫部队也覆灭了,我也终于实现了一定要消灭它的誓言,全军军心为之大振,全部主力向矮人族的腹地前的天然屏障护城河挺进,在这里矮人族的主力英雄以及最后的主力全部发动了自杀似的疯狂反击, 矮人族甚至还出动了他的独一无二的防线突破者--敢死队,这些矮人族狂战士是所有种族中最可怕的兵种之一,他们一旦投入战斗决不退缩一直疯狂缠斗直到一方阵亡,这种玩命似的攻击堪称神风特攻,在所有种族中绝无仅有,对于敌方坚固设防正面狭小的战场敢死队的攻击是可怕的,可以说只要有足够的数量世界上任何坚固的防御阵地都会顷刻间在他们疯狂的前赴后继的自杀冲击下土崩瓦解,甚至很多主力英雄都对他望而生畏,因为也许敢死队不能一击而杀,但是重创之下的主力英雄往往被随后赶到的敌人所屠杀,这种战术对于攻坚来说可说是矮人族独一无二的法宝。果然在敢死队和火枪手的配合下,我的进攻的英雄损失了两个,不过这时候我得资源已经足够允许我立刻招募高级兵种补充前线,损失的英雄立刻被招募了出来,同时我还招募了精灵族的攻击力最强的神箭手,这些命中率高而且稳定的远程攻击兵种实在是随后攻城战所不可缺少的。

这一切都在转瞬之间,当我得后续高级兵种赶到城下的时候,矮人族的主力英雄已经伤痕累累,身边仅仅剩下一个刚刚升级来的忠实的卫队长,对手这时发出了一声长叹:精灵族的进攻之波真是不可阻挡啊。在这一声长叹时候,他的卫队长被我的三个英雄以及一个士兵围杀而死,另外一个精灵族英雄带领一个战士围住了矮人主力英雄将他打的奄奄一息,这时一个精灵族老战士冲到了矮人王面前举起了长刀,矮人王手里端着已经打光了子弹的火枪最后看了一眼满是血泊的矮人城堡,低沉地说道:来吧,让这一切结束吧。我打出了一行消息给我得对手:我会让你死得像一个战士的。手起刀落,一切化为尘埃。。。

一场持续了将近四个小时的激烈战斗结束了,随后我对我的的法国对手说,我总算可以有一顿快乐的晚餐了,祝我好胃口吧。他说,bon appetit。

十一月七日  天其实已经很冷了, 当然比起往年来说还是暖和的

折腾了一个下午都搞不明白为什么我得网络连接是正常的,但是就是上不了网,后来打电话一问Mr.Z,他立刻就告诉我说是DNS服务器的问题,果然牛。很久没有用breca的cluster了结果统统都忘记了。mpic++, mpicc是分别为c++/c的编译命令,运行时候mpirun -np <number> program,但是第一次运行的时候必须要lamroot。另一个不明白的东西就是我用non-blocking的recv的时候好像会丢失,也许是我没有初始化MPI_Request吧,再试一试吧。下个月应该要搬家了,明天签约,月底记得要把我得无线网卡要回来。还要记得去办护照,不管有没有钱旅游,先把护照办了吧。

十一月八日  天其实已经很冷了, 当然比起往年来说还是暖和的

写了一个简单的MPI排序的小程序,所谓regular-sampling-quick-sorting。说白了,不过是external-sort或者merge-sort的变种,主要是用cluster来分段quick-sort然后再分段merge。根据我得简单的测试,大概只有当属组长度超过7000000的时候才快过单机速度。

十一月十日  天其实已经很冷了, 当然比起往年来说还是暖和的

晚上又要去TA不想再做饭了,想去买几个包子吃,没想到竟然如传说中的那样又关门了,饥肠辘辘中决定去PA去买熟食来吃,所谓熟食不过是烤鸡。烤记者东西其实也如《围城》中形容古典小说中偷情男女的感觉的比喻,就是烤红薯,闻的比吃得香,吃不着比吃着还香。顺便去看了一下“有求必硬”的博客,感觉挺有意思的,他们初中一个班的一波男女居然还能凑在一起搏饼,挺好的。

十一月十一日  天其实已经很冷了, 当然比起往年来说还是暖和的

Roommate说电脑中毒了因为下载了3721的杀毒程序,我实在是无语,像3721这样臭名昭著的流氓软件提供的杀毒程序你也敢用?仿佛是找一个强盗去讨教怎样防盗?

有时候,我觉得在最困难的领域里探索的人可能都是两种人,最聪明的与最愚笨的。最聪明的因为他们一方面要挑战这个人类的极限,另一方面仿佛这是他们的使命感决定了,他们不去还有谁可以去?可是最愚笨的人呢?第一,他们愚笨到以至于不知道这是最没有希望的领域闯入了一个一般稍有头脑都知道规避的领域,第二,他们愚笨是因为他们不知道自己愚笨以为自己和世界上所有的聪明人一样的聪明,以至于无数聪明人用无数的方法向这些蠢人示范也无法使得他们认识到自己的愚笨。另一方面这个领域的特点决定了这两种人可以共存,首先这个领域很可能都是一些无法解决的问题,对于这样的结果天才和蠢才来说是一视同仁的,结果面对一无所获的结局蠢才肯定比天才来的高兴的多,谁也不比谁强多少,对吧?所以,如果你知道你是一个天才,你也许注定应该去挑战不可能的任务因为这才能体现你的人生价值,同样如果你知道你是一个白痴,你也应该挑选那些不可能的任务,因为这也是最能实现你的人生价值的地方。

看了《迷失东京》(Lost in Translation)这样的垃圾片,我简直都要呕吐了,是谁曾经向我推荐的?简直是超级的浪费时间,一部比“无稽”还要滑稽,一部比“无极”还要无际的无聊的电影!从头到尾我都不知道在干什么,一个故作呆傻的滑稽演员,一个无病呻吟的迷失在东西方物化差异的低级看图说话教学片,一个初次来到日本对于文化艺术有着电影学院导演系刚毕业的本科生的毕业设计作品。反正我觉得自己被骗得很惨。对于《Da Vinci Code》来说,我更加喜欢男女主人公,男主角Tom Hanks自然不用说了表演的角色都有一定的深度,装白痴也比一般的白痴有内涵,当然我从一开始到结束也没认出他来,只是觉得这个人看上去很眼熟,仿佛小时候我家隔壁卖酱油的老头那样的亲切但是又想不起来他的长相的感觉;女主人公从她一出场我就怀疑她是Audrey  Tautou,最后果然是她,她一出场就是如同她在Amelie里面一样的耍花招骗人,自称什么法国情报局的cryptalist,真是亏她想得出来,看来女人的魅力大都是和她们的欺骗形成正相关,否则也就不叫魅力了,应该叫做媚力了。

十一月十四日  天其实已经很冷了, 当然比起往年来说还是暖和的

昨天听了图灵奖得主的报告,写了一点点笔记

十一月十六日  天其实已经很冷了, 当然比起往年来说还是暖和的

要申请护照还要像赶集一样起个大早,反正睡不着干脆天没亮就排队去吧,去之前看了一段“郭德刚”的所谓电台不让播的响声,我的感觉是现在的社会已经越来越变得脱节了,GCD已经越来越走向他当初的对立面,可能某一天醒来发现中国整个社会开始酝酿着一场新的革命,这些变化是潜移默化水到渠成的。另一件事情实际上是有关电视节目的,大体上你看过北美的所谓讨论节目尤其是清一色的所谓女嘉宾的节目,你会有一种感觉,只有一种,那就是进了大陆的菜市场了,所有的女嘉宾都在同事大声争辩着说着自己的观点,计算机通讯上可能叫做multiplux吧,反正就是几千只鸭子的呱呱声而已,看一次觉得新鲜,第二次就觉得恶心头晕了,这也许就是所谓的“善于沟通”的技巧吧,让我想起了改作业里那些software engineering的学生的分布式的程序代码,极其华丽,可是效率极低,一个remote-transaction居然要传递四五轮以上的message,绝对把通讯当作免费来用,他们只是片面的被告知说计算机硬件的发展导致软件的成本越来越变成人力维护的成本,可是这又一个基本的前提就是你的程序基本上要有一个最低的效率底限,否则一堆垃圾再怎样也不知的维护。当然我对于java的reflect这种强大的动态语言的威力使敬而远之的,这无论如何是一种大趋势,也许这是c/c++唯一不足的地方。昨天听了一个使用Knuth的dancing-link的讲座,觉得非常的感触,我当初怎么也想不出要怎样去使用者一个有些振聋发聩的技巧,昨天的讲座可以说是一个完美的演绎,如果我能够把它改写成当初的DFS的模板的话,将来我就可以找到他的应用了。

十一月十七日  天其实并不是很冷,比起往年来说还是暖和的

今天想着要把我的程序移植到Linux,结果第一步就是怎样mount我的usb闪存,这完全是一个历史的循环,同样的问题在也许一年多前就是我的疑问,现在又来一遍,我的记忆越来越成问题了,我甚至开始怀疑我回国的时间了,是一年前还是两年前,很显然答案是一年半以前,哈哈。。。 偶然的读自己的当时的札记,感觉那时候还是一个有为青年的样子,仿佛真的是lxd所说的愤青的样子,现在好像全然不是了。重新再装一遍fedora,不知道还是否会发生同样的问题?早上打电话去问sympatico怎样在linux下连接到adsl,电话那一端的technique support的声音好小啊,仿佛是从印度传来的一样,谁敢说不是呢?叫我等了半天然后明确地告诉我说不支持linux,这才叫做干脆,于是我也只好下定决心把昨天买的14块钱的switch换成29块钱的router不然这个问题就大了。另一个小小的发现就是,在安装linux的时候bootstrap-loader的设置你可以选择放在哪一个操作系统的分区里,这就是为什么学校实验室里有的机器的double-loader的菜单是windows的,有的是linux的,当然等我装好了就可以验证一下了。总之,我觉得现在看我以前的东西仿佛是又一点点看天书的味道,几乎完全是新鲜的东西,仿佛需要total recall一样。最近看新闻才明白什么叫做web2.0,比尔盖茨认为这是概念炒作,因为仅仅一个用户自己添加维护内容的特点就要算作是一个新的互联网时代有一些夸张,我也部分同意,毕竟教主总是对的,(我自己封他为我的教主),如此算来我的这个札记加故纸堆岂不是web20的元老级的呢?看看很多人现在写博客的热情,这些也都算是我当年玩剩下的?

十一月十八日  天其实并不是很冷,比起往年来说还是暖和的

台湾的所谓民主实践说明了一个朴素的道理,就是在温饱问题没有解决的时候,政治民主也是一种奢侈,也就是说你和所谓贩夫走卒之流谈国计民生是徒劳的,你所谓的辩论证据也是徒劳的,因为信者恒信,不信者恒不信。比如在中国儒教文化的社会里,包括香港新加坡等等,99%的暴民(mob)都坚信当官就是吃香喝辣的,然而一个可笑的马英九先生非要把自己树立成一个完人,一个不贪财的清官,普通的老百姓不怀疑才怪。正所谓禽有禽言,兽有兽语,和一些社会底层的阿公阿妈去讲什么民主法制也是无异于对牛弹琴,因为正如奴隶社会里鞭子是奴隶主与奴隶对话的工具一样,洋枪是殖民者与土著的唯一的共同语言一样,在台湾的中下层劳动人民唯一听懂的语言也无非是一日三餐升官发财(还必须要用当地的土话来讲才行)。为什么美国可以实践所谓的真正的民主?因为美国人口的大多数是中产阶级,生活在社会底层的本来也不会关心政治,因为没饭吃哪里会去投票?远水解不了近渴。一个社会如果廉耻都没有了又何谈什么民主法制?要知道强盗杀手都讲究行规,何况一个社会的领袖?因为有些社会行为的准则是无强制约束的,完全是执行者本人自觉遵守的。比如《kill bill》里面杀手bill就反对暗杀一个处于昏迷状态的敌人,因为这样做虽然有很大危险留有后患,可是如果这样下流地谋杀一个对手会lower us,将来自己内部的杀手成员也许也会丧失最低的道德准绳,反过来不择手段地对待自己同伙,这就是所谓盗亦有道。假如一个政治家完全不顾及长远利益树立一个反面典型,可以想象自己的对手以及同伙也会不择手段无所不用其极地来对付自己,到头来是一个一损俱损的局面,因此稍有理智的人不会愿意看到这样的结果,除非它本身就是暴民,亡命徒,光脚不怕穿鞋的。我想一个从社会最底层爬上来的政治家往往会有这样的勇气去做这样的对决(比如这个陈姓瘪三),所以选择社会领袖并非不看他的出身,并非是白手起家的政治家就是对社会有益的选择,这其间的风险就是台湾今天政治僵局的集中体现。出身贵族未必就是坏事,美国的政治家大都有背景,这不是坏事,因为至少他们有所忌惮不可能会穷途末路亡命狂奔不顾一切地不择手段似的穷凶极恶。

最近看到所谓的中日关系在缓和,很多人不理解,看了好几篇中日甲午战争前中日政治军事经济对比的文章,深切地感受到中日之间的实力对比是不可相提并论的,因为当时据这些文章的分析中国无论在武器数量质量上都是旗鼓相当的,甚至在经济上洋务运动还是让中国的新经济略微领先,在人员上清朝的留学生不少都是舰队的管带,士兵也很勇敢,可是结果还是输了,而且输得一塌糊涂说明中日之间的实力对比绝对不是简单的数据可以看出来的,也许制度仅仅是一种民族精神的体现并不是力量的根本源泉,所谓是果不是因,因此MR.Z的一句制度使然是一言以蔽之了。因此,如果一个清醒的头脑和一双睁开看世界的眼睛应该清楚地得出一个结论,中日不可交战,再战中国会败得更惨,因此这就是锦涛低头的根本原因。

十一月二十二日  天其实并不是很冷,比起往年来说还是暖和的

我新买了一个无线的路由器,是trendnet,去年圣诞boxingday的时候大减价十块钱外送一个无线USB的网卡,可是现在急着要买,就要三十块钱了,还要rebate。设置来设置去,很花了心思,逼得我不得不去研究局域网的设置。antony说不用router,bell公司的adsl modem有一个内置的router,网址是192.168.2.1下次试一下。这个router比去年的问题多的地方时总是重新启动,并且默认的设置是connect on demand,于是我总要不停地重新连接。另外我的电驴emule不能通过防火墙了,我看到可以设置NAT转换,但是毕竟麻烦,我自己的router为什么要那样麻烦,于是去下载最新的firmware更新之后多了很多新的菜单,可是选择不要connect on demand,并且我发现默认的emule的端口4662时被屏蔽的,并且我改不掉,看来这家公司够坏的,我之后改变emule的端口,结果才可以通过firewall,奇怪的是同时屏蔽emule的设置也不见了,难道说这个router会智能化到以至于检测特定的程序?我猜想应该不会,也许是我无意中设置的?可是为什么我自己也不能改变?另一个常识性的东西是假如我的笔记本同时有无限网卡和内置的网卡,那么我就应该针对各自的连接设置两个不同的ip,如果我需要设定固定ip的话。

今天偶然看了看国内的几个视频网站,觉得根本无法和youtube相比,真是叫做没有金刚钻就不要揽瓷器活,根本带宽没有解决谈什么在线视频?这一行当全是烧钱的活。

十一月二十四日  天其实并不是很冷,比起往年来说还是暖和的

对于我来说,偷懒的结果就是夜夜失眠,在没有写程序的日子里,我才感到度日如年,晚上用红酒催眠也无济于事,现在总是怀念那些无梦的日子,虽然我现在也是无梦的过着,可是晚上睡不着,白天一过中午有昏昏欲睡。

十一月二十七日  天其实并不是很冷,比起往年来说还是暖和的

为了正确配置三个router,我费了九牛二虎之力还是不行,其实我想这可能就是我的无知,voip的phone-adaptor不会让我改动他的lan-ip地址,有意思的是我发现居然可以用电话键盘来设置他的ip,mask,gateway等等,很有趣,这种程序便起来应该就是一个DFA,想到这里我对于国内的硬件编程就是一肚子气,基本上国内的小电子产品都会有一个reset键也就是说程序员根本不敢保证它的程序会怎样被用户搞乱了,反正就是恢复成原厂设置,我就是按了那个trendnet的reset键结果什么都练不上了,只好去futureshop换一个,原来买的那个mp3也是如此,一旦reset就全废了。mokhov写的那个什么作业我总觉得是非要把一个简单的问题复杂化,为什么不能让学生集中精力再synchronization&deadlock监测上呢?问那些个无聊的问题干什么?还得我花了半个多小时读他的废话,发现问题和操作系统完全无关。今天,我觉得M教授的眼光还是非我所能想象的,同样是直觉他的就是正确的,我总是对于hierarchical-depth-buffer-algorithm嗤之以鼻一位没有什么用,实际上真正去看那些depth-buffer才体会到他的巨大也才体会到其中有大量的重复的数据,如果不采用这种snapshot的idea才真叫作浪费,好笑的是我已开始就先入为主,以看到初始的结果就急急忙忙的写报告说要证明自己的观点,后来改了该发现自己的采样有问题,数据的coherence一般是方块的,我用row来采样当然不对,后来又发现对于空数据我应该过滤掉,这样发现hit-rate还是蛮高的,所以,don't jump to conclusion too fast。Becky帮助我认识到了我多年以前的一个重大的错误。哈哈

十一月二十八日  天其实已经开始变冷 了

早晨花了好几个小时找到那个stupid bug,原来又是老一套,我总是忘记我的triangle的顶点是要乘以三的,这种白痴错误实在是白痴,因为大部分图片也都在,可是怎么看都不像,而事情变得更加混淆的是,obj文件的顶点是从1开始的,结果我的图形一场神奇让我百思不得其解,一个错误也许很容易发现,但是当两个三个甚至几十个错误放在一起,你能够理解吗?事实上目前很多领域里貌似复杂的问题只不过是多个问题纠缠在一起而已,比如金融,气象,人工智能等等。当人们无法理解的问题出现时候,无非是两种态度,正确的,不正确的,(这种说话的口气是不是很熟悉阿,对了就是伟大领袖的著作里的口吻)不正确的态度包括胡说什么有些现象不可能用科学来解释,最典型的就是在当前医学手段还有局限的情况下一帮江湖骗子会跳出来说什么中医八卦之类的东西。正确的态度则是抽丝剥茧逐步分离,这是唯一的正选方案。月底又要搬家了,哎,越搬越贵越搬越小,现在觉得好像越来越奢侈,比如我现在吃的面包已经没有低于两块钱的了,经常吃三块钱的面包,目前又养成了吃酸奶的坏习惯,还有什么要检讨的呢?整整一个学期没有一天晚上看过一页书!这个学期没有上课生活散漫,不知道年底总结要怎么写?

十一月三十日  天其实已经开始变冷 了

早晨见到了价值4million的cluster,还趁机摸了一把,仿佛那只手就沾了金一样不想再洗了,哈哈。下午搬家又是一番战斗。马上搬家拆网收电脑。

十二月四日  前两天下雪了

早晨去拿护照路上想到mr.Z的说法,其实这个身份对于很多穷人来说可能一辈子也用不上一次,很多时候人们期待的东西其实仅仅是水中月镜中花,你期待仅仅是因为别人都有二你没有,如果你一旦有了你也不觉得有什么了不起,有时候甚至像这种渴望最明显的就是对于一个残疾人羡慕一个大多数人都有而不觉得有什么了不起的东西,这个比喻我感觉有一点不厚道,不过意思如此。搬家以后的感觉真好,感觉就是一个我的天堂了,哈哈我的要求很低的,无非就是像领导一样单独使一个卫生间,办公室而已。早上回来打电话去sympatico抱怨了一桶,他们又像小偷一样偷偷地charge我的钱,每个月多收我十块钱,下午去把预定的微波炉搬了回来,还打算买一个脚踏垫,昨天买的浴帘觉得很满意,当然这一切都要花钱,最近可能花钱如流水一样了。哎,有时候在想一个人如果在物质上得到了满足也许在精神上就是空虚的了,看来我现在是精神空虚到了很高的程度了。

这是一个2v2的战役,战场地形复杂,有丘陵,有山地,有森林,有湖泊。我还是统领着我熟悉的精灵族,我的盟友是矮人族,我的对面是矮人族,盟友的对面是龙族。鉴于地图相当的大,我决定招募两个侦查骑兵一边端占村庄,同时利用他们超远的视野来及早发现敌人,其余的兵种我决定全部为丛林战士,因为从性能价格比来看他们比弓箭手要便宜很多,虽然远程攻击较弱,但是近身格斗的防御却还不错,最主要的是我一向主张群殴,也就是贯彻毛主席的集中五倍甚至六倍的兵力打歼灭战,这样在局部要形成兵力优势只能靠招募便宜的兵种。我的盟友是一个急躁冒进的新手,他招募了很多的狮鹫,这种昂贵的兵种固然有着机动性与攻击性的巨大优势,可是在防御上有着致命的弱点,也就是没有远程攻击,我一向对于这种精兵政策抱怀疑态度,因为其中运气成分太大。在我和盟友的中间地带是一个开阔的平原,这里零零散散地分布着一些村落,属于典型的易攻难守的地区,而我的正前方则是一眼望不到边的大森林,这里才是精灵族的大展手段的地区,可是鉴于盟友的邀请,我不得不把我的主力向中原进发以便配合他夺取这里的资源,本来我是准备我的两队主力一前一后同时进发,以便在中原和敌人遭遇的时候形成兵力优势以多打少给敌人一个下马威,因为根据经验,一般新手容易分兵多路轻率冒进,我集中兵力打他的先头部队可以站到不少便宜。可是,我因为贪图多占两座城池,指挥官回到大本营晚了两个回合,结果前后两队的距离拉大到了两轮的距离,结果导致在初期的遭遇战中没有兵力优势,而两个侦查骑兵又属于非常脆弱的防御部队,首战没有占到太大的便宜,而我的盟友在集中兵力向中原挺进的时候发现她前面的森林冲过来了大群的龙族部队,本来他有主场优势,只要稳守待援以逸待劳很快可以取得兵力优势,可是偏偏他是那种乱冲乱打的莽撞之士,很快不但丢失了河对岸的阵地还被人逼到了家门口。同时我的中原派遣军在山地作战中损失巨大基本陷入了消耗战中,受伤的部队撤不下来,后方的援军迟迟不能赶到,战又战不得,守又守不住,退也退不成,后方部队的补充还低不上前方的消耗,而敌方的部队则不断因为消灭我军战士而得到升级,这样打下去必败无疑了。我这时候果断地决定在中原采取战略防御,主动放弃无法防御的村庄,集中全力从正面的森林向北进攻。战斗在森林边的河岸上展开,这里有几个连环的村庄,可以说是我消敌长的关键所在,也就是所谓兵家必争之地,我决定派我的丛林战士对这里的几个矮人弓箭手发起冲锋,这时候那些在中原战场屠杀了我很多战士的狮鹫部队长着他们惊人的机动里赶来增援了,我进攻部队受到了不小的损失,因为这些狮鹫部队已经升级为二级了,在攻击力上有着巨大的优势,我决定不惜一切代价要消灭这些狮鹫部队,于是我调集我仅存的丛林战士对这群敌人进行了战略包围,因为我的源源不断地后援部队在不停地赶来,只要能够拖住敌人就可以歼灭他们,对方也看到了其中的威胁,拼命地派部队来解围,我那些深入敌后负责阻击的战士腹背受敌死伤惨重,最后依靠一个侦查骑兵的惊人的机动性成功地在付出巨大代价的情况下拖住了敌人的升级后的精锐的狮鹫部队,同时这场局部争夺战也演变成为一个巨大的战役,因为双方不断投入重兵,杀的是天昏地暗,中原战场则变得静悄悄的,我在这一战役中取得了较大的战果,因为第一消灭了敌人精锐的机动部队很多的二级狮鹫部队,第二,这里好似成为一个磨盘,敌人的增援部队不停地投入,不停地被我阻援的部队消耗,而此消彼长的是我有三个丛林战士升级为了丛林英雄,那个光荣的侦察骑兵还意外地升级为了白马骑士,可以说基本上挽回了初期的一些失利。可是,就在同时,对方凭借占据中原的有利态势,派遣大量的爱人战士从中原的平原经过绵绵的山脉向森林边上的河边战场增援过来了,为了挡住这股敌人我被迫派遣少量的战士在山地和爱人交锋,要知道爱人可是山地作战的专家,同时敌人数量占优,我的一个新升级的英雄及其所属的战士大部分战死了。可是,这样的损失也为我赢得了歼灭河边敌人主力的时间,总的来说,我方损失较大,但是占据主动,敌人虽然有部分收益但是失去的主动进攻的时机,应该还是一个势均力敌的态势。

十二月七日  天有一点点冷,不过出太阳了

昨天听同事的论文答辩预演,今天是正式的,很不容易啊。我现在知道做这种理论研究实在是太困难了,我经常没有耐心读简单操作手册就不用说论文了,Dr.G告诉我我们做的大部分都是别人做过的,的确我读得很多paper都是十年以前的,为什么不是呢?很混乱,我也不知道怎么办,有一个算法甚至于xbox都已经做到硬件里啦,我是不是应该多读paper呢?碰到论文里的偏微分方程我的脑子就停止了,curvature等于零的曲线是什么呢?听别人的论文答辩的确像视听天书。这两天开始折腾remote-displayer的之类的软件,我连名字也记不住,还是不明白要怎样用,打印了一百多页的手册然后看了一分钟就人在一边了,这就是concordia学生最典型的特征,因为我们很怕自己的打印quota用不完所以就为了打印而打印。完全hopeless。

十二月八日  天有点冷,不过出太阳了

整天看凤凰卫视,人都快变傻了,当然本来就差不多是这样吧。我这么说的原因是因为我看到还有很多人比我更傻,看看台湾的所谓民主政治就是这样的傻,什么民主?very cheap,大概台南的阿公阿妈早就给出了民主的价格,一千块台币而已,相当于加拿大穷人区chinatown吃顿饭的价钱,所以你可以知道在做官可以有很大回报率,而人民群众很穷的地方,民主只不过是一场闹剧。在加拿大要花钱买票?太贵,而且又投资的意义吗?或者向谁去买?老百姓知道自己纳的税只是交给一个看门狗管理,谁还关心政治?

以前看到一句比较尖刻的话,大意是大多数男人根本谈不上有什么事业,那只不过是在家庭主妇面前摆谱的面子话,所谓的事业就是职业,也许大多数人听了心里都不是滋味,可是这基本上是大实话,说得难听而已。可是如果连职业都没有怎么办?哈哈,这样也许就可以说你有事业了,或者说失业了,反正听上去差不多吧。

十二月十日  天有点冷,还没出太阳了

今天要出行了,去看看西半球唯一的社会主义国家,古巴。当然,我想卡斯特洛不久于人世了,再不去恐怕他撒手一去后后继者肯定会改变古巴的颜色,因为美国人几十年来的梦想就是拔掉这个家门口的钉子,所谓卧榻之侧其容他人喘气?

看国内新闻最感到恶心的几件事就是看所谓的体育金牌的“面子工程”。在我看来那都是些劳民伤财的急功近利的长官意志,在媒体上的东亚病夫的意淫,试想十几亿人口连饭都吃不饱谈什么体育强国?每年投入那么多的潜在国际上烧钱都是冷战时代东欧国家在东西方竞争过程中充门面的面子工程,如今也成为所谓麻痹普通老百姓的精神鸦片,这功能和中央电视台每天晚上八点钟的电视连续剧如出一辙,所谓宣传引导的功能无非是让贫民百姓接受现实生活,在痛苦生活中的一针吗啡。

看到台湾的选举其实慢慢地我开始明白为什么民进党仍然有这么多的选民支持,你不能把所有投票给民进党的人都当作脑筋秀斗的阿公阿妈是的老农民,后来我想明白了这种看法很肤浅,为什么?因为你要知道国民党有多么腐败?你又知道目前的国民党里有多少是权贵子弟?所谓连战士台湾最大的地主家庭出身,所谓现在的台北候选人也有一个当年国民党国防部长的老爸,所以这样看来民进党还是要清廉一些,至少出身清白一些,从这里你就知道谢长亭那句话有多么大的感召力,国民党现在是代表着权贵的第二代!

最近我感觉一个人堕落是非常容易的,一个人四体不勤,头脑不清地活着是世界上最容易的事情。这也是我理解为什么崔永元回环抑郁症,因为你保持一个清醒地头脑,一双始终睁开看现实的双眼那是一件多么痛苦的事?另外一件事也堪称我的“重大发现”,一个人什么都不做这是一个最容易的事,但凡做一件事都是不容易的,这也是为什么绝大多数人总是憧憬着党国家领导人这个位置,因为这是除了非洲部落酋长以外最容易做的位置。

十二月十日  天晴,但是古巴是windy day

从蒙特利尔乘坐air transat的航班飞行三个半小时左右来到了古巴的cayo coco,刚到海关的时候感觉有些紧张因为海关人员都是穿着军绿色的制服好似部队一样,而且一个个面无表情仿佛机器人一样,安全检查的时候听说不得携带电话,步话机等等通讯设备又是紧张了一些,知道乘坐酒店巴士的时候才感觉比较亲切因为酒店导游的美国腔的英语很重也比较风趣,说是这里是古巴最好的旅游点,我们的酒带粘液是最好的酒店,司机是旅行社里最好的司机,我有些将信将疑,但是到了酒店之后我觉得她说得最好的酒店可能是真的,这的确是一个非常好的度假酒店,NH Krystal。大堂虽然不大但是很有特色,几乎是纯木结构,一道苍穹给人古朴自然的亲切感。房间都是一幢幢三层楼的别墅式建筑,房间内的设备很不错,甚至有位残疾人准备的坐便器,一张藤制的小圆桌给人一种写意的感觉。时间是晚上十点多了有一点点饿,就去找饭店,找到一个buffet餐厅,服务员很热情,一个叫做Juan的侍者一见面就和我拍肩膀套磁。因为我买的旅行套餐所有的吃住都包了,所以想吃什么就吃什么,当然这是废话,本来buffet就是你想吃什么就吃什么,当然你还可点一些红酒。吃完了我听到远处传来音乐声就循着声音找去,原来是一个音乐quiz,主持人是一个男扮女装的小丑,他的主持风趣而不粗俗,问题难易搭配,有很多简单的问题是留给儿童的。每答对一个问题可以获得若干小球,最后根据得到的小球的个数来发奖,奖品是一瓶酒。晚会结束我沿着海边的栈道散步,这种木质栈道建在浅浅的海滩上,蜿蜒悠长通向黑漆漆的大海给人无尽的遐想。栈道两旁排列着一抹一样的很多高脚小木屋,房子的基础是建在浅浅的海滩上的水泥墩,故居都是雷同的一屋两户型,一开始我还以为是什么海边游戏的经营场所,后来看到一个个窗户都挂着厚厚的窗帘才明白这也是酒店的客房,因为每个门梁上都有号码的,在栈道的连接处还设有保安值班的小亭子。电视节目大部分是西班牙语,居然有西班牙语版的CNN。第一个晚上由于红酒的催眠作用很快就进入梦想了。

十二月十一日 一睁眼第一件事就是看天气,透过落地窗帘看到风中摇摆的棕榈树

还是一个windy day,看来那个导游是信口开河地说今天会有好天气,当然这也是游客想听到的。看来我把我的NIKE跑鞋带来是对的,总算可以户外jogging了,顺便带上照相机拍下我的双眼看到的。现在白天的时候终于能够比较清晰地看看住的地方了,据说这就是殖民时代的建筑风格,三层小楼很多的房间可以给客人和佣人住,这纯粹是我的想像。气温不高也不低大约25,26度,正好穿一件T恤真舒服。沿着幽静的小路跑步,看着两旁的树丛,一幢幢的小楼不是地从花丛和棕榈树的掩蔽中跃出,沿着海边的栈道跑步更是一种享受,小木屋与小木屋之间的海滩上还长着很多的水生树木正好掩蔽着给人不少的privacy。这里的沙滩实在是太漂亮了,很长很白很平,不像厦门早已退化到没有了,那都是当年挖沙建楼的后果,沿着沙滩跑步那种感觉更加的舒畅,天风海涛仿佛人间仙境。沙滩旁都是大片的灌木与棕榈树来防风同时也把海边的小别墅楼都遮掩住了给人更多的想象。在沙滩上跑了很长的路穿过灌木丛来到了有一片的酒店小楼才明白这里并不是一家酒店,所有的酒店都是在一大片沙滩上,彼此连在一起,其间有蜿蜒在树丛中的小径相连,各家酒店的建筑风格都不太相同,如此看来并没有多少差异,甚至我觉得这些酒店风格更加的吸引人,看来导游确实是夸大其词了。看了看纪念品的价格,实在是不便宜,大约和加拿大的价格一样了,当地的比索价值比美元面值都要大,所以我想著名的哈瓦那雪茄肯定不便宜。我住在一楼朝向游泳池干脆打开落地窗享受海风的同时写我的见闻。

跑步的时候还看到了类似于厦门的白鹭的水鸟,腿长嘴长,只是全身灰褐色,肯定不是火鸡。椰子都金黄了偶然可以看到一两个掉在草地上的,穿过酒店跑到外面的公路上,道路两旁到处是牛粪,是不是有很多人喜欢bullshit啊?想起来做晚上在餐厅里和服务员聊天的时候提到卡斯特罗似乎他们都不倒以为然,甚至还有一个人开玩笑地说卡斯特罗是他爸爸,看来古巴并不是像我们想象的那样的社会主义。看电视里的节目除了语言不通,MTV里的性感女郎并不比加拿大少,或许南美风情的桑巴舞本来如此,我个人认为说西班牙语的女郎都更加的火辣风情,和什么主义没有关系,大凡宗教都是首先从控制性欲入手,共产主义作为一大宗教也无非如此,就比如当年的太平天国洪秀全对人民实行禁欲主义,对己则是荒淫无度到极点,因为禁欲主义本是为了维护他的统治,纵欲极乐则是体现了他的本性,和什么宗教什么主义毫无关系。社会主义本是一个空泛的理想,不同社会的投机分子竞相对他做出自己的解释目的和中世纪的政教合一的封建统治本质上并无两样,无非是给教民描绘一幅美好的前途然后加以利用达到个人穷奢极欲的目的,古巴中国北朝鲜都是如此。

中午吃完自助餐坐在靠窗的座位静静地想用我的冰牛奶,看着窗外来来去去的游客,那种悠闲才让我真正感觉到了什么是度假的感觉。回到房间发现原来电视节目挺多的,CNN也有英文节目说明并没有新闻封锁,至少在这个死刑酒店里没有,当然也没有必要。很快就睡着了。一觉醒来想去游泳就穿上游泳裤来到海滩,风浪还是很大,比厦门的大风的日子还要大一些,所幸这里的风浪岁大但是海滩很平你不会被卷到外海区,可能另一个原因是这里没有落潮吧,不像厦门等地方是半日潮,每天都有一涨一落。另一个有意思的现象是这里仿佛空气中盐分很重,我摸了摸铝制的护栏,总是有一种湿乎乎的仿佛是腐蚀的溶液,这也许是为什么房子大多用木材建造的原因吧。在风浪中挣扎了快一个小时,我决定回到游泳池,池边的人都在晒着看不见的太阳,只有几个小孩子在玩耍,游泳池的尽头是一个水上酒吧,凳子都在水里,你可以边游泳边泡吧,点一杯饮料真是写意。

十二月十二日 一睁眼第一件事就是看天气,透过落地窗帘看到阳光

有些 细节反倒要反过来提起来,第一个晚上checkin的时候总台小姐在每个人的手腕上套上一个软圈,一开始我还怀疑这是古巴政府的高科技技术防止外国游客刺探军情的追踪器呢,当我问这是什么东西的时候,总台小姐面带羞涩地解释说这是识别游客的标志,或者我这个愚蠢的问题embarrass她了?或者我自己?另一个愚蠢的问题就是房间内的safetybox,我虽然在国内用过但是在这里我看不到任何说明不知道如何使用,后来问了总台之后才觉得有时候涉及太人性化了反而让我难以使用,因为在我心里始终认为要启动一个系统需要输入某个特定组合,因为国内的safetybox都是要额外charge的,酒店会设置启动密码,也许目的不同吧,这里的目的是减少麻烦,一旦出现什么东西不见了酒店的名声的损害更大,trouble更多,而国内则是霸王开酒店想尽办法收钱。简单说来就是随便选四个数字再按*,可是世界上的巧事就是多,我自己摸索的时候恰巧选择的一个数字组合总是无效,保险柜总是关而复开,然我很费解,后来听了总台介绍在选择别的任何数字都可以,让我吃惊不小,难道说我的favourite的密码和保险柜的特别组合号码正好重合?这种概率是多少呢?万分之一而已,也就是我们常说的不怕一万就怕万一的万一。早上起床就绕着酒店跑了一大圈,回来看了一部老电影,讲的是六十年代的英国中学教育,为什么我知道是六十年代?因为电影的主题曲和插曲都是六十年代beatles的风格,男主角是一个黑人青年,也就是In the Heat of Night里的年轻警官,fast,intelligent,characteristic的一个桀骜不驯的黑人青年,挑战种族歧视,努力改变人们对于黑人的看法。

另一件让人高兴的事就是在这里吃饭不要钱,大大小的饭店酒吧随处都有,你天天时时可以去几乎所有的餐厅吃吃喝喝,当然有几个正规的有service的饭店你必须预订,也就是比较正式的餐厅,如意大利餐,海鲜餐厅,牛排馆,古巴餐厅,其他的各式各样buffet只要有空位你就去吃,任何酒吧只要你喝得下,你就去喝。可惜我孤身一人也没就没有兴趣去泡酒吧,几乎这么大的一个酒店就我一个东方面孔,这个时间来这里的中国人,来这个四星半酒店的就我一个。哈哈。去吃饭吧。在这里担心的是吃不下,喝不下。这里也有网球场,健身房还可以打乒乓球,方正你想干什么都行吧。当然最容易的就是躺在沙滩椅上晒太阳。

十二月十三日 一睁眼第一件事就是看天气,透过落地窗帘看到阳光也看到摇曳的棕榈

早上起来看电视里介绍联合国秘书长安南在任的事迹,实在是举步维艰,这个世界实在是不平静,从来没有一位秘书长经历过像他这么多的战争和危机,美国看样子是已经开始陷入又一场越南战争,就算占领伊拉克能够获得宝贵的石油资源,可是巨额的军费开始是否能够支撑呢?我没有数字不敢说是否,但是这样的风险十分的大。去跑步吧。

跑完步又去海里面游泳,海浪比较小,沙滩非常的好,很平,很白,很细。晒了一会太阳,回来洗澡再去健身房,感觉现在身上除了赘肉什么都没了,哈哈,惨不忍睹,当然我记忆中几乎没有多少时间是全身有肌肉,连幻象都几乎没有。想想看,大多数女人如果愿意可以去隆胸,男人要长肌肉却实在是不容易,需要长时间地艰苦锻炼,这之间的难易程度好大呀。回来看电视广告又再一次应证了我以前的一个猜想,在北美制药公司的一个很大收入是来自于各种各样的止疼药,这个断言很惊人吧?知道为什么会看到铺天盖地的止疼药的广告?因为这种药不但很少有什么法律纠纷,因为治不死人,当然也不解决什么问题,最大的好处是长期使用会上瘾,产生依赖性,这才是制药公司的生财之道。这两天天天都是吃的撑得受不了,真是应证了那句老话,好像吃方不要钱一样,成天除了吃饭还能干什么呢?运动,晒太阳,看电视,早上突然有一个新奇的想法,这种生活好像动物园里的动物一样,就如同《matrix》里面所说的人类虚拟世界的第一代程序,一切太美好了,结果那些成为电池的人类都觉醒过来了,因为人类认为现实生活应该是悲惨的,一旦发现过于完美就会像在美梦中人们的潜意识会提醒自己这是假的一样。美梦很快就会醒过来的,因为今天已经是星期三了。

下午醒来去游泳池去游泳前预订了明天去镇上一日游。古巴的钱真贵啊!一日游要75比索,换算成加币差不多要将近一百元了,同样这里卖的纪念品等等的价钱都贵得惊人可能比加拿大街头的价格还贵,我记得飞机上的落地签证上有一些住解说的事来古巴的外国游客每天必须花费50比索以上,这样看来古巴的外汇主要来源可能都是这些外国游客吧。看到小孩子喝得好像奶昔一样的饮料很想尝一下,可是又不知道是什么职能假装说给小孩子order的拿回房间一喝原来是椰奶,虽然持buffet的时候到处都有冰淇淋可是我已经一年多没有吃过了,今天终于尝了一下,这种东西对于健康毫无好处也没有什么营养可是心底里还是很馋得。晚上去吃预订的意大利餐,拿到菜单不知道要点什么,只好pizza,pasta都点,还要了一份厨师推荐的东西,据说是牛肉米饭,拿到以后才知道以我现在的饭凉吃完他们真是困难,我吃啊吃啊,拼命增加唾液分泌量希望能够加快消化过程,可是结果pizza是吃完了,味道觉得还不如学校旁边的好,pasta实在是吃不完剩了一点点,正当我暗自庆幸的时候那个不知名的什么牛肉米饭上来了,真好似last straw让我的信心完全崩溃了,这中间服务生非常地殷勤不停地为我添white wine,我刚喝完一点又添一点,最后我实在是感觉不行了,吃也吃不下,喝也喝不完,只好拿着酒杯看饭店的拉丁演唱小组唱歌。吃完了感觉有点轻飘飘破例来到lobby bar坐在吧台上要了一杯冰水,像我这样一个东方面孔又是孤身一人实在是有一点点不合常理,因为看看来度假的几乎没有一个人的,直到现在我在饭店吃饭游泳也没有看到超过一个东方面孔,饭桌上总要问我几个人,我经常不小心把I am alone说成I am single真是有点点那个。今天也总算知道晚上旁边特别吵闹的原因了,原来是传说中的Disco舞厅就在离我不远的地方。明天去Moron镇记得要戴上护照啊,真是难以置信,这个镇的名字绝不是我起的,相信讲西班牙语的人不大理会moron的意思吧。

十二月十四日 今天的天气据说是这个星期最好的天气了

早上要参加一日游,旅行车行驶在一天海堤上,这是专门用来连接这个旅游胜地小岛和大陆的通道,在长达26公里的尽头是一个检查站,所有进入的古巴人必须要有专门的证明或者是在这里工作的人员。首先我们来到一个制糖厂,可惜今年榨季推迟了我们看不到它实际运作了,难以置信的是这个工厂居然有八百工人,一年的产量也就是六万吨粗糖而已,我不知道粗糖的价格,可是精糖业不值钱,就可以想象为什么工厂的机器设备这么陈旧。古巴的街头很少有汽车,而且非常的陈旧,很多古董车都可以在这里找到。镇上的住宅非常的破旧,比福建的乡下还要差很多,商店很少,商品也不多,据说这里一般人的工资只有大约十美元一个月,但是要正常地生活起码要十倍的钱,所以几乎人人都要赚外快,这里的一切都让我想起了二十几年前的中国,那个时候也是这样外国人必须消费外汇券,就像这里的所谓convertable比索,只不过这里的外汇券和本国币的比率多大二十几倍,所以你可以想象当外国游客要求用超过二十几倍的价格购买当地的物品是多么大的不合理了,所以我实在是难以下决心购买那些手工艺品。小镇上可以看得景观实在是没有,当我们坐在马车上,仅仅会这几个英文字的马车夫不停地告诉我们,这里是邮局,这里是电影院,警察局,学校。。。仿佛当地人担心外国游客误解他们还没有进化,导游的介绍里面也有不少这样的情调,当然这也许也是我自己的解读,比如他总是反复强调那个近乎原始的制糖厂是环保的,那个镇中心用从古巴革命时期从富人家里收缴来的股东组成的博物馆是多元文化的代表,当然我可以明显地看到里面的古董代表了西班牙殖民时期的殖民者又多么的富有,你可以看到他们很多外国装饰品,比如日本中国的奢侈品,这在当时应该是非常昂贵的,但是这能代表多元文化的氛围吗?不过,我觉得我越来越习惯与戴着有色眼镜看问题了,比如古巴也有很好的一面,所有的学校一律免费,还提供一支铅笔,可是看看当地的居民住房你就知道这里有多么贫困,可是古巴几乎有着得天独厚的自然条件,气候适宜,土地肥沃,到处都是绿荫,完全没有贫困的理由,除了美国的封锁那就是政治上的制度了。

十二月十六日 今天的天气据说是这个星期最好的天气了

昨天在我的记忆里几乎是空白,我没有去跑步没有游泳,一整天都在wesnoth里战斗,晚上又去吃了一顿所谓海鲜,地点居然和前天的古巴餐厅在一起因为新的餐厅还在建造中,这三天我几乎天天就惦记着那一顿晚餐,一个人每天的生活就是等待晚饭,这让我想起了猪圈里的猪就是这样。今天我决定不去游泳而是去gym,这个简单的gym也比concordia的好,这真是一种凄凉。在gym里的一个工作人员非常主动地和我聊天,从他的介绍中我了解了一些原本就可以猜得到的“真相”,这里的工作人员的一个月工资大约只有18可转换比索折合美元大约二十左右,当然古巴的计划经济体制每个人需要的粮食房租等等在配额内是很便宜的,勉强生活应该是没有问题吧。这里不能有电脑,internet,等等奢侈品,你可以在黑市上买但那是超过一般人的购买力的。这个叫做Alfredo的家伙对于中国非常的熟悉,一开始就在问我是否带着我的笔记本,是否来自门特里尔,是否学计算机,当然他没有想到的是我都这把年纪了还没有结婚还在读书,当然他对于我的年龄的估计也是非常的准,是受过相当教育对象有体制非常不满的所谓知识分子,但是他还是很小心地转换敏感话题,而我是非常的笨拙的阐述我的不合时宜的议论,很明显他对于我的空谈不感兴趣。的确我就算在中国也是一个不合时宜的人,在古巴也一样的不合时宜,我在想这就是我这个人在中国无法生存下去的原因之一吧?

昨天晚上喝了两杯的白葡萄酒,回来的路上脚步虚浮,听着蝉鸣蛙叫心里有种别样的感觉。孤独在大多数时候你可以说是享受,可是总有很多时候你实际上是在忍受。我想起了很多过去国内的人和事,谈不上好与坏因为他们对于我的遥远不亚于古巴和加拿大的差距,很多回忆与思绪如同王朔小说里主人公内心独白一般,仿佛有千军万马从你身旁驶过可是转眼间你却两手空空,这也许就是人到中年的无奈?这种无言的境遇最贴切的形容无过于那句天凉好个秋。不管是否愿意承认这就是一个你无法避免的事实,很多时候人都是无奈地活着,但是不管你有多么的不幸,只要你睁眼看看世界你就知道,借用一起旅行的一位白人来太太的话来说,就是这次旅行It makes us realize how lucky we are!

晚上吃steak,看到隔壁一桌上大概是两个家庭的大人和孩子,其中一个小男孩不知什么原因打了隔壁的小女孩一下,小女孩当然也还击了一下,当时坐在对面的母亲非常严肃,严厉的走到对面拉着小男孩来到墙角严肃地给他讲道理然后让小男孩蹲在地上反省,然后母亲回到餐桌在对对面的小女孩讲道理,过了很久母亲才让小女孩去墙角和小男孩讲和,并且一点都不迁就小男孩的敷衍,又反复地在餐桌下和他讲道理。看到这一幕我非常地感动,我也再次明白我为什么对儿童深恶痛绝,尤其是中国的孩子,因为中国的年轻父母99.99%都是不及格的,只要看看中国的小孩子的恶行就知道按照中国古人的说法就是都是父母之过,推及源头这一代父母之所以无行其根源是他们的父母的无教养,或者他们父母的父母的无教养。培养一个儿童到成人是一个比驯化黑猩猩复杂几百倍的工程,绝大多数的中国父母都没有具备起码的资格来做一个驯化师,这是整个误国误民的错误。

十二月十七日 今天的天气应该是不热也不冷,蒙特利尔就不同了

今天要回家了,早上看CNN感觉美国的媒体是一个严肃的媒体因为他们的观众是严肃的观众,至少CNN的观众是如此,他们的编辑导播时时刻刻在追踪预测时代的发展与走向,其中有很严肃很有深度的辩论,我说有深度是因为经常我听不太懂,哈哈。。。我个人对于音乐的好坏的标准也是多快的速度可以让我入睡。玩笑归玩笑,有一点很有意思,就是一个嘉宾的观点,就是当布什总统责备媒体对于伊拉克暴力连篇累牍的报道误导了美国人民对于形势的判断时候指出这种指责已经是一种所谓的陈词滥调,当然我们有一种所谓的problem并不是problem而是对于problem的关注成为了problem,可使绝大多数的媒体对于伊拉克现实的报道是惊人的准确。我想这是对的,想想看美国要在这样一个小国家投入那么巨大的财力人力物力,这难道不是第二个越南战争吗?在越战并不是什么正式的战争,甚至美军也没有打过什么类似二战的硬仗,可是美国却总是处在一种骑虎难下欲罢不能的泥沼里,不论美军使用多少绝招愿意付出多大代价最终的结果还是撤退,究竟是长痛不如短痛的撤退还是再坚持一下就可以爬上胜利的巅峰?如今的伊拉克战争在这一点上不是一样吗?昨晚CNN第一个揭幕了时代杂志的年度人物的谜底,这真是让所有的预测都始料不及的结果,不是金正日,不是萨达姆,不是拉姆斯菲尔德,也不是胡锦涛,而是你自己,有意思的使者一起的时代杂志的封面是一面镜子能够让你一眼就看到今年的人物是谁?为什么是你呢?想想看今年的youtube的收购就是反映了一种所谓web2.0的趋势,媒体不再是单向的灌输,internet的力量在逐步显现,观众慢慢地成为编辑,看看中国的所谓超女选秀,观众变成了裁判,看看现在的网络商业,大公司的垄断慢慢被打破,而这股力量就是消费者要自己作主,信息的畅通导致很多传统商业模式在迅速的没落,在加拿大可能购买机票,外出旅行已经越来越成为一种网络DIY模式了,难道这一切不是在说明社会的消费个体正在成为当今商业社会的主宰?不论这种潮流在每个国家的发展有多么的不平衡,可是只要你蔑视这种潮流,你注定如同那些漠视全球化而被全球化的大潮所淹没的保守主义者。世界潮流浩浩荡荡,顺之者昌,逆之者亡,卡斯特罗的去世已经是以天来计了,他的继任者还要抗逆世界潮流多久?金正日呢?难道萨达姆的今天就是他们的明天?可是美国在伊拉克的失败是否会延长这个结局的到来呢?

十二月十八日 昨晚上到达蒙特利尔的时候气温居然有5度,飞机上的魁北瓜都惊呼了

mpi的c++编译器叫做mpiCC,当然如果你只用mpicc他好像会根据文件名的后缀名来决定编译器。今天总算可以用remote-graphic-client端了,不过我只能连接一个client端,第二个就没有登陆界面了,我想我以前遇到这样的情况很可能是当时服务器上的没有关闭的server成为了zombie。那个client端需要运行/encs/bin/rgreceiver.sh脚本,我还没有很清楚学校的文件服务器是怎么工作的,一个是nfs,一个是sfs两个好像不搭界的。要正确的关闭remote-graphic的服务器端,要运行squeue来查看pid,然后用scancel pid来关闭,但是有时候不知道什么原因还是有些变成了zombie,就必须手动查看pid来kill了。要运行mpi,需要先module load mpi,今天找到了一个运行的办法但是有安全性的限制不成功,就是类似于wmpi一样写一个文件名列表文件appfile,然后mpirun -f appfile,这个文件里就是-h hostname filename arglist等等,但是n81等等要我登陆密码,然后又deny了permission,不明白怎么办。plu开始了中国星际第一人的争霸赛。准备吃饭了。

十二月十九日 早晨开始下雪了,后来又停了

我应该下定决心取出所有的macro,不然迟早我自己会被这些code害死的!

十二月二十一日 早晨破天荒去跑步,气温居然是2度,真不可思议

我悟出了一个简单的道理,据说很多动物对于静止的物体不能识别,只能发现易懂的物体,这个现象其实很简单,对于一个没有任何物体识别库的智能系统来说,他的视觉系统当然不能识别任何物体,但是它可以对于连续变化的图像进行比较于是就可以识别移动的物体,这时候需要的记忆体是短期记忆,所以,一个致力发展处于幼稚期的系统当然只能识别移动物体了。这一点可以看出生物的进化和智能的进化是一致的,所以我们完全可以假设恐龙是这样的,这也是我所听来的,是符合道理的。

去古巴的时候发现骄傲的古巴人民拒收美元,现在发现伊朗人民也开始抵制美元了,如果全世界人民都不用美元美国肯定就变成了前苏联了。当然这是不可能的。天天看《凤凰资讯》感觉耳目一新,这才是真正的媒体,这才是社会的精英应该做的,精辟的点评,一针见血的论点,高瞻远瞩的眼光不但透视事件还看到新闻的核心,这就是精彩的头脑的给你的思想的洗礼。哈哈我正在看他们的广告就把他们自己宣传自己的话写上去,但是这些并非自我吹嘘,我觉得名至实归。也许有一天中国大陆的独立媒体也可以这样地引导社会的思想,如果这一天到来了中国就有希望了。

十二月二十二日 好像比昨天冷了一点点

凤凰资讯的自身争论评论员阮次山真是言语犀利观点深入,听他那抽丝剥茧似的分析实在是一种享受,这才使资讯节目啊!我从小自从幼儿园就开始阅读《参考消息》也算是资深的国际时事政治观察员了,可是和他老人家比起来真是自叹不如。

十二月二十三日 好像比昨天冷了一点点

程序写不下去了,很多时候直觉不再管用,比如“comparison”这个关系“不”是一个“transitive”的关系,i.e. (A and B) is in; and (B and C) is also in; Then (A and C) may NOT be in. 这个好像没有什么,问题是对于我来说我还需要一个状态来代表每个元素,比如这里面ABC究竟是什么状态呢?都是在comparison对吗?这是正确的答案,而我一开始认为Eliminated比Comparison优先级大,比如(A and B) are in comparison; A<C then A is Eliminated; but A is STILL in Comparison;这就是我后来认识到的,就是说只要给元素和任何一个其它元素处于comparison的状态,他就只能处在comparison状态。Dr.M说这个简单的算法已经被集成在了Xbox里面了,什么时候看一看去吧。别忘了啊,现在总是忘记,或者是懒得做事。

看来世界上的职业里面夸夸其谈是一个比较容易的职业,比如整天没事就对这世界政治关系发表议论。我个人认为朝核刘方会谈是注定会失败的,因为现在看来金正日的决策时有逻辑的,这完全是布什政府自己发出了错误的讯息所致,比如他同意和印度签署核能合作协议,这说明什么?只要拥有了核武器美国就对你另眼看待,这也就是为什么朝鲜反反复复强调自己是有核国家应当受到区别对待的原因,想想看伊朗呢?制裁也许只是限制某些商业行为,对于真正想搞原子弹的国家有多大作用呢?摆明了不过是美国受不了中国和俄罗斯单独和伊朗的石油合作开发,中俄对此有什么办法呢?敢怒不敢言而已。从这点来看,我认为金正日的决定是唯一正确的决定,正如当年老毛的决定,就算是砸锅卖铁也要把原子弹造出来,如果像戈尔巴乔夫或者萨达姆一样自动解除武装,归顺西方的结果就是阶下囚。帝国主义都是纸老虎!

这是一场2v2的战斗,地图是Charge。如同其名,在这片广柔的平原丘陵地带很多玩家都可以采用闪击战的战术。我的同伴是一个在餐馆工作过的小伙子,他不停地和对手谈论各种各样的食物调料,我没有兴趣听就边看《凤凰资讯》便作战,这种回合制的网上战役有时候是很枯燥的,首先每一个回合可能都很长,网络与服务器又经常不稳定,更不稳定的是你的对手,很多人打到一半就逃跑,让你没辙。因为起始资金是300相当的多,我招募了一些侦查骑兵,一则开视野,二则我坚持认为战争是社会资源与智慧运气的对决,其中资源大多数时候是决定性的,因此我坚决地在初期抢占村庄。我的另一个观点是“爆”兵,注意这个“爆”字非常的形象,它说明了一点就是你的部队需要在和敌人对决的时候处于兵力优势,这样子并不需要你在所有的时间里都拥有优势兵力,这在及时战略里更加的明显,所以星际里面很多高手是先造大量兵营然后在极短时间内极限爆兵,突然杀出一大股部队消灭对方。在回合制里面也是如此,每个单位都有消耗,如果你过早地招募部队你可能会白白消耗很多资源,因为资源变负数与零资源时等同的,于是突然爆兵是最节省资源的方法。同时对于一般情况来说敌人的第一波部队之后往往会有一个间隔期,这一方面是因为他们分散部署,另一方面是后续资源消耗还没有及时补充招募不了同等数量的部队,于是我方以逸待劳防守反击。

当然这种设想也有很大的危险性,比如这次战斗中我在初期部队太少,仅仅靠不擅长防守的侦察骑兵死守村庄,并且抽不出兵力互相救援导致一个个被敌人击破;同时另一个更糟糕的事情是我没有办法配合同伴导致敌人两方夹击他的闪电战术,结果我只能眼睁睁地看着他最后功败垂成。当时他告诉我说它是第一次使用龙族,这个种族机动性很好不受地形限制,但是防御上也就没有优势了,同时比较昂贵属于攻强防弱的种族,他在短期内极限爆兵连同主力英雄一直推进到敌人的城门下,这时候我的正面的敌人派出了他的高机动骑兵去援救他的同伴,而那个死守的敌人也利用城门前的护城河依靠人族优秀的人鱼部队非常有效地阻击了龙族的冲击,我的盟友在耗费了几乎所有的精锐部队后终于攻击到了对手的主力英雄,他的两个完整的龙族战士配合主力英雄把敌方的主力英雄杀到只剩下几滴血了,仿佛1941年底进攻莫斯科的德军装甲部队已经可以看到克里姆林宫的金顶一样接近胜利,但是这时候已经是强弩之末势不能穿鲁缟,同时敌人的盟友的骑兵援兵大量地赶到不计代价地冲杀,我的同伴眼看深陷重围也没有可能再狙杀敌方的主力英雄,只好含恨作自杀式地冲锋连同他的随身龙族护卫全部战死在敌人的城楼下。这场惊心动魄的闪击战的失败我应当负有一定的责任,因为我的经济型打法导致初期没有给我的对手以足够的压力,导致它可以把大量的骑兵回援他的盟友,同时对于闪击战我没有派出任何的支援部队,另外就是我的盟友最后一击的运气太差。尽管他在闪击失败之后还有逃生的可能,可是这时候一方面它已经失去了胜利的信心,另一方面它的突击部队又一次地运气不佳没有打开缺口导致他彻底被陷重围,仿佛莫斯科会战时候的救援德军只差几公里就可以会合,却最后被苏联红军紧紧地封住了口袋。此后他的少数残兵败将在护城河附近的湖上打起了游击战,可是这些散兵游勇早已斗志丧尽几次不听我的指挥只是坐以待毙被缓过元气的敌人悉数剿灭了。不过虽然我的盟友失败了,我却在同时依靠大量的精灵族弓箭手强攻对面的地方部队,一个回合内最多歼灭地方六个单位,当时我的盟友在临死前向我统计他的战报说歼敌10个,而我告诉他我的战绩是24个!当两个敌人还沉浸在暂时的胜利庆祝时候,我的精灵族部队长驱直入以排山倒海之势压了过去,我对面的保皇党人在派出大量主力骑兵去援救盟友之后早已兵力空虚了,在被我全歼他的前线兵团之后已经无力防守了,竟然用明码发报向他的盟友求援可见有多么惊慌失措。而此时我的主力英雄在用尽所有金子招募部队后带着部分伤员向我的前盟友的废弃的城堡前进,因为我现在要接收他所有的废弃的村庄并且利用它的资源就地招募部队,而这也是敌方的战略意图,只不过我离得近有地利优势,同时两个敌人都还在喘息中无力排除有力部队来抢夺资源,果然我只发现了一个敌人的受重伤的骑兵在占领村庄,他那里是我的主力英雄和新招募的弓箭手的对手,三下五除二就干掉了。这时候我的前线的部队获得了大量的升级机会,我的部队有两个隐身弓箭手,一个神射手,还有一个精灵族英雄战士,而敌方此时只能各自依托城堡前的有利地形负隅顽抗,完全无法互相救援,而我的主力分为两个进攻集团分别强攻敌方的桥头堡和沼泽地的防御阵地,在付出极小代价的情况下敌方阵地崩溃了,与此同时两个敌人的信心也都垮了,全部退出了战斗,我实在心有不甘只得用AI代替打完了这一场战斗。

当然《凤凰资讯》也是会做一些广告,比如看到一个所谓的“新世界纺织服装城”的地产项目落户在无锡,采访那个土老貌和他那个老婆完全是赤裸裸的骗人的玩意,这简直就是摆明了骗钱的,你听听他说什么狗皮话,他说只要在我们这个服装城里采购的任何东西只要你发现在世界上其他地方找到便宜的价格了,我赔你两倍,这简直片小孩子的伎俩,除了大陆受了回扣的银行信贷科长谁会贷款给他?你可以保证你的商场建筑质量,你卖给了商户店面你还能管到人家的经营?这只有TMD政府领导才相信。还有他说的话简直就是胡说八道,说什么你来采购受了损失我替你报销差旅费,你坐飞机来的我给你报飞机票,你坐火箭来的我给你火箭票,你坐宇宙飞船的我给你飞船票。不要以为我在胡说八道我这可是原话照记下来的!你又听说过这样的混账话吗?我有!是几年前莱蒙特里尔的时候政治魁北克闹独立公投,当地的大公司统统跑到多伦多了,当地商业无比萧条,我的经理去futureshop买摄像机那个推销员简直是疯了看到一个有钱的主就死活要卖给我们,直接就说If you can find a cheaper price, we can beat it.当然现在futureshop也有类似的条款,可是那是第一他们基本上在加拿大处于垄断地位,第二那只局限于个别产品,第三那是因为那时他们自己的商品他们自己定价,大不了损失几个钱买个信誉。可是如今这种地产骗子要在无锡那个小地方搞什么“世界”服装城简直就是那个黄子找银行圈地片贷款!联想起《凤凰资讯》介绍香港索斯比拍卖行里工作人员对中国买家西方人买家那个更有钱的评论,当时这个自身董事说他们在纽约伦敦的同时聊起这个话题说,到底谁更有钱我们不知道,不过我们知道西方的投资家可能只会拿出总资产的5%来买古董,而中国大陆的买家可能会拿出自己资产的50%,甚至100%,200%!哈哈,这个婉转的回答可以说明中国目前的浮靡甚嚣的气氛了吧。比如我本人居然会把自己三个月的TA的收入拿出来去古巴度假,这是很多有房有车有工作的人都不舍得的,看来我和中国的某些“富豪”在这方面是类似的,说的含糊一点,我已经在某种程度上接近富豪的某种特质了。哈哈。bs bc bt.

看《凤凰资讯》的拍卖艺术品的片断才明白为什么富人喜欢这个行当。第一,这个行当赚钱比买房炒股票炒期货还容易,(搞什么实业,商业的那都是长工的活,不在讨论范围。)因为那一类的东西还是挣得一份辛苦钱,时时刻刻都的关心,而且总归你得费心思,而这个艺术品基本上东个大概就可以了,无非就是出的起价钱,熬得过时间,很傻瓜化的;第二这个玩意是露富最快的,想想看西晋富豪斗富的时候还要去对方家里去,还得找一大堆自己的宝贝来炫耀,比如杀两三个漂亮仕女来劝酒,杀一个就少一个多让人心疼啊,(那时我心疼,哈哈)而且每次你只能和一个富豪比富消息传的也不快,人的虚荣心满足得太慢了,可是如果去索斯比拍马行,错了,是拍卖行,那么多富豪来自全世界大家都比一下,多风光,又有品位,咱玩的是艺术,不是布头麻袋片什么的。再者说了别的形式的斗富都会有消耗,就算买一个极品汽车那也是会消耗啊,过几年车子不就没用了,除非是古董车。所以,作为富人要让别人知道咱是真的有钱,那就去索斯比拍卖行,哈哈。。。身份!(你看我每天就捉摸这作为一个富豪应该怎样生活是不是很白吃?可是全世界的小老百姓都喜欢这行当,不信看看中国八点党的电视剧,就知道有多少人在为当皇帝,阿哥,格格的烦恼而烦恼。)作为一个人来说,写程序是最难得,因为只要你有丝毫的头脑不清楚就是错的;写程序也是最容易的,因为你只要老老实实认认真真地区做就行了,什么也不用考虑。我如今发现我原来觉得最容易的事情越来越难了,究竟是我变得聪明了还是笨了?总之,我现在不写程序,只有不停地写这些乱七八糟的东西给自己找借口,forgive me.

十二月二十六日 今天是boxingday结果下起了鹅毛大雪

人生无非是一串串回忆,没有办法留在脑海里就只有记在纸面上,否则人生的长度感觉起来就被缩短了,为了“长寿”就把琐事都记录下了。这两天吃吃喝喝感觉分外的无聊,仿佛热闹过后孤寂的反差特别的大反而更让人感觉到这些活动的不必要。现在我尝试srun -N3 myprog.exe会出现libmpi.so.1找不到的问题,即使我自己在env上加上LD_LIBRARY_PATH =... :/opt/hpmpi/lib/linux_amd64依然不行。还要继续读手册。

今天不行将近三个小时走到了St. Laruance河边去同学家吃饭,当时天下着鹅毛大雪,河水静静地流淌,河面雾气蒙蒙的在远处融合到了天空里仿佛一幅寒江残雪图,河心的一小丛小树灌木影影绰绰仿佛又神仙人家游弋其间给人无限地遐想,难道这就是传说中的蓬莱仙境?向河的上游走去只见河面被河底的礁石刻画出一片片地浪花,仿佛绸缎字上绣出了一丛丛的花边。真是可惜没有带相机。

把去古巴的照片上传到了这里

这是一个四国大战,四个玩家出生在一个环形战场,中央是一个有若干小岛的湖,环形战场的周围是大片的水面。非常快的战争变成了三国演义,原因是其中的那个菜鸟很快被我西边的那个玩家消灭了而他所在的村庄被那个玩家占领后导致它成为最强大的一方,可是这一切因为战争之雾我和我北边的玩家在当时看不到,同时我因为这个玩家在上一场战胜过我,我对此一直耿耿于怀,于是在我的基地两边防御中侧重于向他的进攻,北方万家是一个不死族在对抗我的精灵族时候有相当大的优势,因为那些讨厌的ghost对于刀剑的攻击几乎是免疫的一样,那可恶的山丘鬼在攻击的时候会释放毒素往往交手一个回合就让我的精灵战士丧失战斗力。就在我和北方不死族死拼得时候,西边那个最强大的不死族派出了他的快升级的ghost在中央的湖面上和我的人鱼部队争夺小岛上的那几个村庄,因为我的主力是地面上的精灵战士,所以仅有的两三个人鱼部队根本顶不住西方的不死族的鬼加上吸血蝙蝠的进攻,眼看着湖面上的村庄全部被占领了我的人鱼部队全部阵亡,更可怕的是这些鬼升级为了更加可怕的wrath,这对于精灵族绝对是恶梦一样,我只有招募昂贵而脆弱的法师部队才能对抗他们。我在我的北方前线用三个并排的精灵族战士已妥善地丛林与村庄一字排开组成了第一道防御阵地,在其后部署了同样数量的法师部队和少量的弓箭手,在陆地两侧部署了仅存的两个人鱼部队辅助防御,这几乎是一个难以突破的马奇诺防线,我的北方不死族对手同样用它的骷髅战士,骷髅弓箭手配合鬼和吸血蝙蝠和山丘鬼和我对峙着。终于握在这个方向上的后续部队到达了,我忍不住开始发起进攻,首先用对不死族攻击有特效的法师重逢试图消灭前排的骷髅战士,然后再用我的坚韧的精灵战士占领新阵地防御脆弱的法师等待下一轮的进攻,这样如波浪般的梯次进攻防御在两三个回合后就基本突破了北方的防御,这个时候我看到北方的后院部队已经不再向他的西方防线增兵而是全部向我这个方向杀过来了,同时我的部队因为进攻中的损耗已经没有了当初的锋锐,北方的万家开始抱怨说我和西方的万家同时向他施加压力,并且提醒我说西方已经成为最强大的一方,的确随着我的人鱼部队在中央湖的失利,西方不死族向我发动进攻只是一个时间问题,我想北方玩家解释我为什么不顾一切地向他进攻是因为要为上一场战斗复仇。“复仇?”北方的万家颇感意外地说道,“根据孙子兵法,你绝不应该让情绪控制你得战略!”鉴于我们的老祖宗被这个老外挂在嘴上我决定听从他的劝导和他结成暂时的联盟共同对抗强大的西方,为了表示我的诚意我在我开始的回合里主动撤退所有的部队然后转进增援我的已经被突破的西部防线。西方的部队非常的强大,同时随着它占有大量的村庄,他的优势随着时间变得更大了。因为我可以在北方不设防,因此我可以集中所有的地面部队奔赴西方防御,于是我可以有资源重新招募人鱼部队来夺回中央湖的村庄,哪里是一个此消彼长的地区,同时我想我的北方盟友发出了请求,告诉他为了我们的共同利益在西方万家向我发动进攻的时候尽量在北方给他增加压力,他答应了并且投入了他的有生力量。三国演义似的战斗就是这样,每当胜利的天平向某一个玩家倾斜的时候,另外两个玩家就会结成暂时的同盟来共同对抗他,于是天平有可能又恢复平衡,在wesnoth的战场上生存的唯一保障出了你的实力就是正确的战略。果然,仅仅两个回合形势就发生了变化,我的北方进攻集团边休整边开进,配合原本西方的溃败的残存部队稳定了西方陆定上的防线,我的新增的人鱼部队在付出重大代价之后总算消灭了西方的四个wrath中的一个,这算是一个不小的胜利了,因为这证明面对强大的对手两家联手还是有机会的。

终于搞明白了一点点。系统使用slurm来run的,因为首先必须依靠它来分配运行的资源,以及访问限制等等。比如我现在就要这样来做,第一,load相应的module,这种做法是为了防止不同版本,不同系统之间的冲突,比如module load mpi,这样default的HP-MPI被load了。第二,编译程序,这个和说明文档不太一样,应该是mpicc或者mpiCC,后者是c++版的编译器。第三部署任务,必须要通过srun来做,如果是运行单个人物或者所谓serial appliaction,你可以srun -n# myprog.exe,这里的#代表一个数字,-n是多少个process,如果用-N代表多少个node。如果是运行并行程序,要这样mpirun -srun -N# myprog.exe,可是如果你这样做的话,srun -N# mpirun myprog.exe那么意义就是完全不一样了,恐怕只有我才会这样异想天开地运行#个完全一样的parallel program,这样子完全没有意义。

十二月三十日 昨天晚上散步看到大街上的气温表显示-8度,今天早上下起了鹅毛大雪

萨达姆被处死了,不过我认为没有必要在所谓的穆斯林的“宰牲节”处死他,也许这个决定本身是布什政府内部基督教教义派释放出的信号。我本身对于所谓的穆斯林没有多少好感,比如梵蒂冈的教宗虽然是一个不称职的宗教领袖,但是他所谓的穆斯林是一个暴力的宗教的言论多少是有点道理的,你看看现在这个世界上凡是有暴力恐怖袭击的几乎都有穆斯林的身影,形象地说就是一手握着古兰经,一手握宝剑。在古代,这两样东西是传教的基本工具,如果我不能说服你皈依那就只能从肉体上将你消灭了,所以,我当初和becky讨论那个puzzle的时候说我很高兴可以说服对方,否则。。。哈哈哈。(不过我很担心懂中文的穆斯林读了以上亵渎的言论会向德黑兰的霍梅尼报告,那样他再如对待《撒旦诗篇》的作者一样对付我来一个全球追杀令我可就惨了。但愿穆斯林读古兰经之余不要学汉语了。

现在写程序好像挤牙膏,一天就写几行实在是可笑,我当然知道这主要是算法太复杂心里没有一个明确的图画,每次碰到未预料的问题便很胆怯,不敢继续写下去,因为这种mpi程序的调试实在是困难当初在局域网的windows-mpi还算是容易的,如果到了真正的服务器去脸看都看不到实在是不知道怎么办,所以只能保证正确优先了。下午如果不写程序就写年终总结吧。

一月二日 阳光灿烂,但是挺冷的

萨达姆在《凤凰资讯》资深评论员的评述下让人们深刻地领会了金正日为什么拼着和中国撕破脸皮都要搞原子弹,难道北朝鲜脑袋进水了?错,金正日是这个地球离头脑非常清醒的政治家,就如当年老毛拼死都要搞原子弹一样,在这个星球上只要被美国看着不顺眼你就没有好日子,或者你够强够大,或者你像伊拉克一样被告掉,没有其他出路。所以,我们应该完全理解小金同志下决心搞原子弹的心情。不搞不行啊!

一月三日 阳光灿烂吗?不知道,但是挺冷的

所谓的科学的世界观与方法论的至关重要性就在于它可以帮助你再不理解具体细节的时候就能够得出正确的结论,这中间的威力使很多人难以想象的,尤其对于那些不具备科学的世界观和方法论的人来说。在新的一年刚刚来临的时候我想做一个大胆的预言:人工智能的诞生地不在别的地方,而是在internet。原因在哪里?人工智能的经典理论在上个世纪的走入困境是当初那些乐观者意识到,所谓的智能绝对不可能依靠一个所谓完美的算法来实现,因为只能是这样一个复杂的体系,甚至于当今的所有关于AI的教科书都无法对其作出一个准确的定义,甚至无法找出一个检验的算法,这种尴尬不亚于那些猜测NP-complete问题的尴尬,一个看似触手可得的科学问题居然经历了全世界无数人的努力还不能找到一个有希望的途径。比如,NP-complete问题时说一个non-polynomial的算法可以用polynomial的算法来检验,那么对于一个看似非常困难的课题,即AI,我们是否有一个简单易行的算法或方法来检验?TuringTest看来似乎是一个这样的算法或者说方法,可是他的检验依靠的是一个人,或者说一个无法定义的方法,这实在是一个尴尬的算法,一个问题的定义居然要用这个问题本身来定义或者检验,这和循环定义有什么本质区别吗?这种科学上的尴尬可以让你对于这个问题的复杂性有所了解。对于如此复杂的问题的出路在哪里?我自从开始学习计算机就保持着这样的看法,只有一个方案不依赖于预设的定义,这个方案才可以称得上智能。所谓,道可道,非常道;名可名,非常名。他的实质就是触及机器学习的问题,怎样才算是机器学习,从直觉来说所有人都明白是程序依靠对周围环境的探索来调整自己的看法,方法,方案等等。那么什么是预设的,什么是可变得,这个问题说得简单似乎编程序的人都明白都可以做得到,比如《battle for wesnoth》这个game的按照创始人的访谈里说得就是“随后修改code越来越少,增加configure越来越多”,以至于这个所谓的战略游戏有很多人创造出了类似rpg的玩法。核心代码大约50k应该也不是很多,他的威力在于一个类似于xml的解释器,随后使用者都可以依靠这个解释器来编设自己的脚本,从理论上说,这是无止境的。

也许核心就在于如何增加一个全新的定义,如果能够解决这个问题,那么这个系统的潜力是无穷的。可是这正是最最困难的地方。以前在TAV的时候学到的一句格言时,一个数学家再往墙上钉钉子的时候总是找看有没有旧的洞,这道出了问题的核心,我们人类这种看似无穷的学习能力实际上来源于原本学习到的东西,也就是说我们从来无法学习真正全新的东西,我们的学习不过是“比教与认识”,即comparison&recognition。我常常觉得这就是AI的核心,其余全是浮云。一个系统具有了recognition也就自动具有了memorize&comparison,所以核心的核心还是recognition。只不过为了帮助人类理解我们创造出了这么一对概念。recognition不是简单的也不是人们想象的那么复杂,因为这种最基本的能力如果非常复杂,人类可能永远不可能拥有智慧,毕竟从黑暗中摸索出来的自然智能的门槛不可能太高了。核心的核心的核心问题在于从简单的一对一的比较怎样上升到模糊认知?这本来似乎是一个非常复杂的学术问题,行而上学的信奉者也许会提出一大堆的heuristic的算法,可是在意识的萌芽期哪有什么算法?非常简单的解决方法就是人类这种生物性智能系统的特点:遗忘。在计算机里的对应的解决方法也许就是人为地创造噪音来模糊记忆,即以如果没有模糊,简单的认知也就没有所谓的抽象。我常常为我年轻时候的很强的记忆里而苦恼,因为当你准确地记忆了所有的细节之后,有时候反而导致我很难迅速地识别常人所能迅速做到的认知,毕竟你要处理的数据更加的多了,当然过多的细节记忆导致加速识别的例子也是有的,可是结果也许更多的是“串味”记忆,典型的例子就是“联想”,即依靠局部的识别而形成错误或者模糊认知,(ambiguous recognition)文学上有时候称之为通感,我觉得英文里叫做deja vu。也许通讯上的error-correction可以提供一种反向的解决办法,原本用来除错的算法可以被用来产生“错误”,目的使用自然的方法来提炼数据,lossy compression在多媒体里广泛应用反映了只要正确地抓住数据的特性并保留它,就可以让智慧提再次进行还原,这种容错性是计算机所追求的,想不到确实生物智慧体与生俱来的特性,因为他们本来就不能避免错误与遗漏,只是正确地利用它来服务。error&omission is used for abstraction,so, fault-tolerance is not a problem for human. 

所以,核心就在于后天的训练,就如同一个人如果没有适当的训练其智能看上去也超不过猿猴一样,那么大量的数据与实践的环境是很容易创造的吗?我想不是,人类器官的模拟也许还是一个遥远的将来,因为很多核心部分和智能紧密相关的,甚至于我常常认为只能产生于人类的视觉识别体系,所谓的vision是AI的一部分。因此到哪里去寻找一个人造的环境,一个拥有大量数据,大量不可预知的环境一边检验培养人造的智能呢?互联网也许是的,随之大量的数据,甚至于视频音频数据也被放在网络上,这个环境变得更加象一个原始的丛林适合人造智能去探索了。唯一的问题是我们人类是否有足够的耐心去重新来创造一次生物的进化?或者说需要多少时间原始的“生物汤”才能第一次产生出有机分子?甚至于我们是否能够注意得到?我们相信生物的进化是一种随机的偶然性吗?

对于萨达姆的死,《凤凰资讯》的态度我还是同意的,即便是一个罪无可恕的罪犯在他临死之前是否应该给他一个人的尊严,或者说我们剥夺一个同类的生存权的同时是否还要再千刀万剐似的加以报复?除死无大事,一个人假如连死也无法得到宽恕那就是世界的悲剧,我常常在电影里看到基督教在一个死囚被处死前允许他忏悔,虽然从唯物主义的角度看这些不过是做给活人看的,但是如果能够依靠这种临死前的忏悔达到基督教的所谓forgive&forget不是很好的吗?从这点来看,我内心深处有时候很懊悔没有接受那两个“耶稣见证会”的传道,也许我只是心里觉得有歉意如果她们将来发现在我这个没有希望的矿山上的投资感到后悔,或许这也是虔诚的基督教传教士的典型形态,他们从来不求这种回报。从这点来看,我感觉我在加拿大呆了这几年对于宗教的态度有了显著的变化。宗教更多的只是一种信仰,一个faith,而绝非中国本土释道佛那种受人香火与人消灾的物质精神交换活动,说的不好听就是“精神产品小卖部”!这种恶俗常常让我感到非常bs。如果基督教能够在一个精神文明,科学高度发到的西方生存,他一定有其生存的价值,在这一点上,你可以感受到以布什为代表的美国传统势力的价值观,说到底宗教代表了一种共同的价值观,依靠基督教欧美社会把社会各个阶层团结在一个相对和谐的社会里,这种共同的价值观是中国当前提倡所谓“和谐社会”所缺少的,试问一个没有共同价值观的社会里穷人和富人怎么和谐?这不是一句空话吗?中国的老百姓难道都不明白吗?即使渔夫渔妇不明白或者没有时间明白,难道所谓中国社会的精英阶层也不明白吗?无神论打破了人类内心的精神枷锁,但是也使得人类无所顾忌,除死无大事,还有什么可怕的呢?一个无畏的民族也就是一个亡命徒层出不穷的民族,对付亡命徒死刑也许是无用的如果他们根本就是无神论者。宗教是精神鸦片,可是如果没有鸦片的控制,不知道单单靠死刑是否能够控制得了。何来和谐?

从render的角度来看显示是不需要的,你根本就不需要那个glut,只要把glutmainloop换乘displaycallback的while-loop就行了。今天开学了,我是否可以进入状态呢?我的厨艺现在可以说是我这一年来最大的进步了,对了,忘记些年中总结了,今天我用靠想来烤三文鱼,这真是一个创举,谁说我缺乏创造性?

一月四日 阳光灿烂? 非常灿烂,气温非常高,庆祝蒙城气温超过巴黎。

凤凰卫视实况转播美国新一届参众两院开幕式,让我们了解到了美国民主制度的一些细节。长久以来独裁者为了巩固自己的独裁统治对于美国的民主制度总是语焉不详不让广大劳动人民知道美国的先进之处,反而是用一些民主制度的下次来彻底否定美国的制度的先进。在美国,相当政治家实在是一件枯燥无聊的事,完全不是儒家制度下的所谓学而优则仕的理念,究竟政治家需要的品质是优秀的专业知识还是一片热情服务社会的情操,这就是中西方的差别。比如对于美国的众议员完全就是一个小选区的代表,根本就不需要知道什么国际关系,外交国防之类的大政方针,他所要代表的就是他所在的选区的人民的声音,于是我们就看到了美国纽约市议员的第一位华裔女议员是一个做了22年义工的社会服务角色,这在美国是很难的,除非这个人确实是非常地愿意帮助社会或者非常富有贤得无聊,注意是“贤”不仅仅是“闲”。在中国富有的人不少,闲人也不少,但是愿意无偿服务社会的不多。所以,这样的政治家你会怀疑他的操守吗?在台湾你不会怀疑政治家从政的原因吗?反观中国的所谓人民代表大会,选出的都是所谓各个行业的名人,你以为你是得到了代表还是你认为那只是一个政治橱窗?因为只有橱窗才会陈列光鲜发亮的商品,居家过日子的老百姓需要的是关心他们身边的衣食住行的小议员。这就是中西方民主的差异,也是一个社会发展的两个阶段的代表,从这一点来看中国还是处在封建社会向资本主义社会过渡的初级阶段,没错,就是“初级阶段”。

简单地实现了一个convex-hull的算法,不复杂仅仅是证明我还活着。

一月六日 阳光灿烂?不知道啊,可能没有吧。

折腾了一个早上才又把一个反反复复都要犯的错误又一次地纠正了一遍。在windows里面的vc6的编译器很讨厌地自作聪明地从你的sourcecode的文件的后缀名来选择编译类型,当然这是很好的,可是对于我司空见惯的时候反而不注意了。这个差别在一般情况下没有问题,可是当我写dll的时候,如果用runtime的loadlibrary,getprocaddress来调函数的时候就有差别了,因为c和c++的函数名字的decoration是不一样的,静态链接因为有头文件的帮助编译器可以帮你选择正确的,可是动态链接纯粹是靠名字比对的,所以就出错了。因此,在dll的函数声明中要加上extern "C" {...//function declaration here };这样强制c编译。同时calling convention也是最容易犯的错误,__decl(cdecl)是默认的,比如:extern "C" { __declspec( dllexport) void helloWorld();};

但是对于一般跨语言,跨平台应该用_stdcall,那么getprocaddress是否可以正常使用呢?这简直就是一个所谓的msdn上的oldnewstory。我像先前无数的人重复翻过同样的错误,然后我再来一次。如果你想要别的语言也可以使用你的dll,那么你需要用__stdcall,但是函数的名字不再是他的默认的函数名字,而是变成了"_函数名@#",也就是前面加一个下滑线,后面加上一个@最后的#是一个数字,取决于你的函数的参数个数,这个数字是你的参数个数的四倍,比如你的函数是这样的: void helloWorld(char*, char); 完整的函数名称就是"_helloWorld@8"。这实在是有点麻烦,所以我像还有另一个掉用方法就是用函数的位置来调用,这样可以省却这种古怪的函数名字的写法,在调用getProcAddress时候,你的第二个参数不再是一个指向函数名字的指针,而是一个数字,就是index,比如

typedef void (__stdcall *HelloWorld)(char* , char ch);

HMODULE h;
char* ptr=(char*)0x00000002;
HelloWorld helloWorld;
h=LoadLibrary("myHelloWorld.dll");
helloWorld=(HelloWorld)GetProcAddress(h, ptr);

(helloWorld)("nick", 'c');

在dll的定义是这样的:extern "C" {
__declspec( dllexport) void
helloWorld();
__declspec( dllexport) void __stdcall
helloWorld1(char* why, char ch);
};

注意,函数的index是从1开始的。

晚上无聊之余作了一个简单的改动把前天的convex-hull做一个显示,这简直是非常幼稚的东西,可是我发现我因为每次写openGL的程序都是拷贝粘贴,所以很多固定的套路实际上总是忘记,并且一个人如果不去亲自做一样事情不论他又多么简单都有可能闹笑话,比如,glut这个library其实也是很讨厌的,我一直以为他的很多函数只不过是参数设置没有什么先后顺序之分,比如glutDisplayFunc之类的回调函数设定,glutInitWindowPosition之类的window的属性设定等等,可是其实有一样是不同的,glutCreateWindow一定要在显示模式设定glutInitDisplayMode之后才行,否则window不会自动刷新,这个简单的问题困扰了我一个小时!实在是贻笑大方。想想看很多这类被行家里手所不齿的东西如果一个人从头钻研起来不知道需要多少时间,尤其像这种library完全就是一个黑箱子的东西,知其然而不知其所以然的编程很可能是一个noob级别的白吃在google上拷贝一段然后在两分钟之内写完一个helloworld的东东然后声称他是一个openGL的专家,而你就算把glut的源代码都看一遍偶然之间还是可能发生一个百思不得其解的低级错误,就像上一次我对于glutInitDisplayMode里面GLUT_ALPHA不甚了了,就没有使用结果后来去读colorbuffer的时候总是出一些莫名的错误,后来如果不是sushil的一句点醒我可能要迷惑好多天呢!

一月七日 阳光灿烂?是的,中午决定出行,步行到了河边

再模模糊糊的记忆里我写下了我所能想到的过去的一年

最适合中国国情的民主形式是什么呢?卢卡尔先生认为是开明专制,这可能是当前很多人的想法,专制与民主仿佛计算机算法里面的各种排序算法的优劣一样,专制仿佛是quicksort,在一个英明君主的统治下效率超过了大多数民主制度,可是一旦遇到一个坏君主对于社会的破坏也是惊人的,而民主制度可能是一个比较stable的算法,不论worst case或者best case都和average case差不多,因此总体上来看效率超过了专制制度。

一月八日 阳光灿烂?是的

我自己犯的愚蠢的小错误让我白白浪费了两个小时debugging,因为我自己都忘了我当初的代码的意思了。现在的程序越来越乱了,我自己都记不清楚流程了,再加上以前写的费解的macro更是一个恶梦。

一月九日 阳光灿烂?你以为我能做天气预报吗?

日本的防卫厅升格为防卫省了,小狼犬长大了是否就该unleashed了?其实日本只不过是美丽坚的走狗,人家主人都不担心,你作邻居的要担心吗?

[qingz_hu@n285 ~/mpitest] % mpirun -srun --nodelist=n81,n86,n83 ./mympitest.exe
node 0 say Hello World
node 1 say Hello World
node 2 say Hello World
[qingz_hu@n285 ~/mpitest] % mpirun -srun --nodelist=n78,n81,n86,n83 ./mympitest.exe
srun: error: Unable to allocate resources: Requested nodes not in this partition


一月十一日 阳光灿烂?不是的,因为昨天下雪了

sweep line algorithm费了我两天时间才看懂,改造BST又花了大半天,结果昨天听lecture,发现如果要handle special case还要改造,就是说不应该依赖于key来寻找,而是要依赖于比较的方法,所以就是说传入callback的比较的方法指针要比传入寻找key的方法指针来的灵活,否则你怎么解决一个交叉点有多个segment交叉的问题,你怎么解决一个segment的结束电视另一个segment的开始点的顺序问题,因为这可以说非常的普遍,就是polygon,如果你不是先加入一个segment然后取出另一个segment你就会遗漏这个intersection。这样的顺序你只能依靠传入比较的方法指针来控制BST的结点顺序因为key可能是一样的。就算你没有考虑numeric error同样是错的。(最后一句话是无里头)布什宣布增兵伊拉克,很多人批评不看好,我看了凤凰的评论,觉得主持人说的对,这是没有办法的办法,这正是布什作为一个领导人的品质,虽千万人反对,我亦往矣。美国人的话就是leadership,因为“军有退心则不可战”,要撤军必须先增兵,伊拉克布什越南,因为它背后的大国不是中国苏联这样的大国,一个小小的伊朗成不了什么大气。看到布什在阵亡美军家属的慰问会上流泪,我也很感动,因为布什其实是一个真正的战士,一个对抗穆斯林极端主义的基督战士。

一月十三日 阳光灿烂?是的

sweepline algorithm费了好几天的努力最后暂时放弃了,因为我遇到了一个技术问题,算法中有一个平衡二叉树,当sweepline跨越交叉点的时候交叉的线段要交换位置,可是我要怎样改变二叉树呢?我总不能改变key吧?(刚写到这里我就意识到我有做了一回白痴,实际上大多数时候我几乎就是白痴一样,一个问题如果我能够准确地写下他,就意识到了那是一个极度简单的问题,我完全可以设计一个动态的比较方法,也就是说比较方法指针是带一个参数y,或者就用全局变量好了,实在是一个no big deal的问题,我还写信去问教授真是白痴!)相对来说我的mpi程序的问题实在是令人困惑,我居然无法收到一个message,或者是tag的问题,或者是我的指针乱写了什么东西?后者就是非常困难的问题了,毫无迹象?应该没有那么的lucky吧?又花了半个多小时改以前的不足,在并行处理之前,我的通讯是synchronized,blocking的,但是并行开始的那一个message要用non-blocking的,接受者是收到后才知道开始的,message本身含有数据表明并行开始,那么收到后就检查,所以一定要synchronized,MPI_Issend,(不是MPI_Isend)可是有必要使用non-blocking的synchronized的吗?我忘了我以前为什么这么做。另一个糊涂的地方是不同的source使用同样的tag是没有问题的,我自己糊涂了。

在去年的年终总结里有一点我没有好意思提出来,这过去的一年里我觉得我的天分不在计算机上,也不是游戏,而是在烹饪上,在这方面我总是在创新,哈哈,比如今天我决定把PA的小鱼放在烤箱里烤一下,味道鲜美和油炸的一样香。(借用一句陈凯歌批判胡戈恶搞它的“无聊”大片的话:一个人不能无耻到这种地步!)

一月十四日 阳光灿烂?是的

听说中南海以前的政治学习内容就是关于从十五世纪开始的地理大发现以来崛起的强国之路,于是我也把《大国崛起》下载来学习,紧跟形势嘛。新的有几点。1。大国崛起往往是依靠封建时代的中央集权的加强达成的,在冷兵器时代尤其是人口地域的多寡决定了国家的强盛,所以很多的大国崛起都是伴随着国家的统一,比如西班牙,比如德国。这是不是间接说明老邓老江当初说台湾回归问题是国策的原因,抑或是现在找原因来证明?2。大国的崛起往往是海洋文明的胜利。葡萄牙西班牙荷兰英格兰等等自然是证据,当时的地理大发现可以说是生产力的大促进,在同一个时期中国的地主老财含辛茹苦以至于起五更睡半夜才能提高一点点的劳动生产率来赚一点点简直就是长工的残羹冷饭一样的剩余价值,不信?半夜鸡叫的周扒皮同志起的比长工还早,这样的农业资本家就是长工都不愿意干哪!可是在欧洲你可以直接去美洲检黄金,当地的印第安人对待黄金的态度就是装饰品,要就拿去,这其间的差别当然是天差地别。真是让人感觉要做地主也应该去欧洲作,一个政府的职责不是开疆拓土还交税给他干什么?搞的中国的地主这么辛苦地以至于要运用“大斗进小斗出”这样不得已的办法来增加财富真是悲哀啊。3。间接的另一个潜台词就是大国的崛起肯定要有机遇,马无夜草不肥,人无横财不富!葡萄西班两颗牙是靠咬新大陆和东方贸易这两颗果子富起来的,英格兰,荷兰这两个兰是靠揽上前面两颗牙的生意来暴富的,其他的大国也都是有各种各样的野草,无非就是这些野草的吃法不同而已,有的抢有的夺,有的骗有的拿,中国今天什么草都没有,连槽里的草都不够吃哪里来的夜草?崛起?就是尥蹶子也没用啊!4。重农抑商的儒家治国之道害人哪!从汉朝开始中国的最大的历史糟粕哲学儒学救教导汉文帝汉景帝要重农抑商,结果有了所谓文景之治,于是中国历朝历代都奉若神明。在《文明2》里面初期一定是要重视农业的,商业都是奢侈品,赚的钱还不够买粮食的,就算你要买也没有人会卖给你呀。可是当文明发展到一定阶段,当农业劳动生产率水平达到一个农民可以养活好几个人口的时候,你还不发展商业,你就死定了因为没有钱什么高级的技术科技都不能研发,什么高级的军队装备都不能买,这些浅显的治国道理凡是玩过《文明2》哪怕是小学生都明白可是我们的高级的党和国家的领导人却不一定名白白浪费的几十年,什么摸着石头过河,什么有中国特色的社会主义,买台电脑玩两天游戏不是都明白了吗?什么?以前没有电脑?哦,那么就看几本欧洲文明史就行了。5。和亚洲这些周边国家玩没有前途,只有像日本那样脱亚入欧才能跳跃式发展,中国现在和欧美的差距远远超过当年日本和欧美的差距,现在就算是有日本的勤奋运气能力也是没有可能的,能够养活得了这十几亿人口不挨饿就好了,什么大国崛起就算了吧,那不过是党的宣传机器忽悠劳动人民的精神鸦片,你们都作大国梦,咱们干部抓紧时间争取腐败超越欧美,这方面赶英超美还是很有希望的。

一月十七日 阳光灿烂?忘了,现在天黑了

自从学校的新的健身房开张以来我感觉我的生活终于走上了正轨,一个人如果实在没有什么事情可以做就去健身房去吧。实际上我并非无事可做,而是由时候做不了或者坐不下去,比如读paper实在是痛苦的事情,就算是我研究的领域甚至于是我曾经尝试过的方法还是非常晦涩难懂。看不下去于是就开始对与烹饪发生兴趣,总算领会到了大多数女人为什么愿意去生孩子,因为当她们发现在这个社会上没有立足之地的时候唯一不需要技能的工作那就是专职家庭主妇生孩子了,而作为我呢,唯一不需要既能就能做的就是吃,然后稍微磨练一下就使捣鼓出访德锅碗瓢盆,古人云,君子远庖厨应该是因为君子都是由吃饭做饭以外的技能所以可以不用从事厨艺研究,我看来已经算不上君子了。早上发现昨晚上可把书丢了,赶紧去教室看了一下发现教授捡到了,在黑板上写了字条。放心之余就把丢书的时候法是好好读书的誓言忘记了,下午一觉睡醒决定把fedora6再刻一遍,重新安装系统。

一月十九日 阳光灿烂?忘了,现在天黑了

关于comp444的作业我说了一句大话,trivial,结果我为此付出了整整一天的代价,不过说心里话那都怪我得到了错误的资讯,你知道当别人给你一些错误的信息比不给你信息还要糟糕,当一个人对一个领域几乎一无所知的时候还要去当教授教书那就是对学生的犯罪,我很同情那些无知的羔羊,因为老鸟都不会来的。作为资料保存在这里

老调重弹就是在linux上mount usb的问题,可以先用system tool->hardware browser来看一看harddrive里面有没有发现usb设备,然后就可以在fstab里面去设定mount points,其中的选项可以是auto__defaults,users,noauto_0 0,不过我想vfat也是可以的,至于说要把windows的partition映射过来基本上是类似的,只是不能选择“extended”或者"ntfs"的文件体系,当然你可以设定成auto,以便开机就映射。现在感觉我对与linux的感觉要比以前好很多了,也需时日久生情的原因吧,当你还不了解它的优点的时候总是有很大的敌意,现在虽然还是不熟悉但是因为毕竟是开放源码得咚咚还是有一线希望可以找到原因的,当然现在叫我去看源码还是太早了,不过总有一天我会的。

一月二十日 阳光灿烂?是吧,今天我想记录我看到关于阳光的纪录片

关于全球暖化的理论几乎每个人都听说过,但是大多数人都不以为然,包括我自己也是如此,因为看起来很遥远,今天看到的一个短片却是非常震撼,因为在全球暖化的同时我们还有一个所谓的全球冷化(global dimming),这个翻译不准确,原意是“全球模糊化”,就是说人类产生的灰尘在天空形成了一个类似镜面的效果遮蔽阳光导致全球变冷,这似乎是和全球暖化相矛盾,因此大多数人更加的不相信,包括大多数的科学家,的确我们看到的事global warming的某些征兆,而且至今还不能十分确定,但是绝对没有看到什么变冷的征兆,于是大多数有头脑的人都可以自诩为由科学常识,有唯物主义头脑可以斥之为杞人忧天,捕风捉影。的确,事实上看起来如此。抛开一切遥不可及的气象统计数字不谈,单单扪心自问我们今天的天空是否比我们的祖先更加的混浊了呢?我想大概每个人都不敢否定吧,那么这么多的尘埃在天空中会有什么效果呢?肯定有,阳光是否就暗淡了呢?肯定,不过有多少呢?这才是症结!单单空气尘埃并不能阻挡多少阳光,毕竟很小,可是据说雨滴的形成是需要这些尘埃的,并且有烟尘的云层中雨滴更多更小,这些更多更小雨滴形成了一面镜子反射了大量的阳光形成了全球冷化的效果。可是事实上我们感觉其后在变冷,对不对呢?对,可是这就是更加的可怕,因为如果那些科学家的研究是正确的,准确的,那么我们当今的全球暖化的危险是更大了,因为这几十年来加上了全球暖化的效果我们的地球居然还在变热,那么那个温室效应可能比我们想象计算的还要大得多!也许我们的预测太过保守的了,也学《The Day After Tomorrow》就是tomorrow。

一月二十一日 阳光灿烂?是,先生。

关于我得算法我一直想画一个DFA,可是我这么懒怎么办?在健身房里我想有些事情不是人人都能做到的,一种原因是能力,一种原因是意愿,就比如我现在很多事情做不来可能两个原因都有或者至少有其中之一,看来一个人一生能做一点点事都是很难的。(我这么想应该是给自己找台阶下台吧。)

|家| <---->|健身房|<---->|实验室|<---->|超市|

这个当然是搞笑的,实际上也不算DFA,反正今天找到了长久以来的一个小bug,居然是把赋值等号写成了逻辑等号,晕倒!这种低级错误自从学c/c++以来就只有在初学的时候犯过,没想到现在。。。看到Becky的blog里面自称“煮妇”,我想我辈自己做饭之流就只好称自己做“饭夫煮子”了。

一月二十三日 阳光灿烂?不知道啊,这里要八点以后才天亮

看到英国首相府的高官被苏格兰场逮捕实在是令人吃惊,同时对于民主国家更加敬畏,苏格兰场甚至可以利用黑客进入唐宁街十号的电脑来获得证据,相形之下台湾居然还在为所谓的机密非机密争来争去,司法尊严扫地到家如此谈什么民主政治?没有独立的司法体系所谓的三权分立都是空话,因为议会的立法必须要有一个独立的执行机构才能实施。中国人过去往往认为好的制度仿佛是从天而降不需要深入讨论设计,这也是我所深恶痛绝的,制度的设定培训不是一个孤立的事件,这仿佛是一个game的规则设计,我粗略回想了一下,现在体育中有中国人设计的体育比赛制度好像完全没有,这难道不能说明什么?难道中国古代就没有任何体育比赛吗?体育比赛最讲究的是一个公平与平衡,而很多比赛的精彩之初就在于比赛规则体现了某种平衡的思想,战术技术的相生相克,可是中国古代人没有体育比赛更没有什么体育比赛的制度规则的创立实践,这一点似乎说明了中国人对于一个平衡制度的设定毫无意愿与能力,因为这非常的不容易。《星际争霸》始终是我认为最为平衡的一个游戏,因为三个种族几乎没有相似之初却缔造了这样一个动态平衡是非常非常的困难的一件事情,这完全是超过了艺术的技术。大概中国人对于平衡的概念还停留在《红色警报》阶段,也就是说“所谓公平就是双方拥有完全一样的资源与能力”,这实在是一个乌托邦式的幼稚的理想主义的想法,这的确是最理想的公平,而事实上是最不可能的公平,因为这个世界上达到这样的“克隆”公平是一件几乎不可能的事,而反过来说,如果达到了还要制度设计者做什么呢?岂不是太容易了?所以公平制度的设定是一门很深奥的科学实践,决不是三两个高官拍脑瓜就能实现的轻而易举的小事,这件大事不应该是在酒足饭饱之后的闲谈中,也不应该完全丢给见仁见智的缺乏专业技术知识的普通大众来讨论,这也许是我们这个社会唯一需要精英发挥天才的地方,因为一个社会如果设定了完善的制度(包括制度自我约束,自我更新,自我修正,自我完善等等),我们就可以放心的不社会的运行交给一帮白吃去运作,社会精英可以去享受自己去了。在日本明治维新时代日本现代企业制度的奠基人就是这样一个传奇的做法,他本来是政府主管经济的高官,后来弃官从商实践引入了西方的股份制公司制度,会计制度等等,把日本带入了现代资本主义时代,这种制度的建立至关重要,因为制度的建立不但要理论还要亲自实践并树立榜样与模式。在中国几乎找不到这样的人才,所以虽然人口众多可是可堪大用的人才几乎没有,难怪有人会呼吁天公不拘一格降人才。昨天看到美国的顶尖的企业家自发组织要求政府改变现有的制度来防止气候变化,这样的实践在中国几乎难以想象,因为这样的行动完全是社会责任感的体现,想想看,这种行动很可能使这些大公司每年增加天文数字的开支,中国的民企避之而唯不及怎么会主动呼吁政府采取行动?难道西方人脑子都进水了?饱暖之后不思淫欲反而思公益?同样的地球,不同的天空不同的人中差距是我们难以想象的大。其实,深入向来应该是制度使然,西方的遗产继承税足以让为富不仁的富人发现投资社会公益使他们唯一回报最高的选择,这就是制度的威力。

一月二十四日 阳光灿烂?好像是,今天据说有零下20几度

每当我写中国字超过代码的时候就说明我的头脑空空的,学不下去了。所谓人类的独立思考,性向各异的教育成果在很多人扬中仿佛是一种优势,可是从纯粹的劳动力培养的角度来看却是产品质量不稳定次品率高的托词。

一月二十六日 阳光灿烂?好像是,今天据说有零下20几度

一觉醒来窗外虽然是迟暮的阳光却分外的灿烂,实际上现在才下午三点钟而已,可是你知道加拿大的冬天下午四点钟天就黑了吗?为什么阳光看上去分外的灿烂,因为在零下二十几度的严寒里看到灿烂的阳光会让你从心底里涌出一篇暖意,自然隔着双层玻璃窗看严冬的阳光是有一种格外的亲切。实际上这样的气温在往年来看并不算很冷,可是今年一个冬天就没有冷过,直到现在才让所有的人松了一口气,原来全球变暖还是一个遥远的神话。

睡梦中隐隐约约听着凤凰资讯里赵少康的谈话节目在谈阿扁要求大法官释宪为自己开脱的笑话,想想看这的确是一个笑话,一个堂堂所谓总统之身竟然用小律师打官司的手段来无所不用其极,这可能是制度的漏洞,但更可能是人性道德准绳的意外,也许当初制定法律的人杰考虑说能够当领导人职位的人选应该是道德上不成问题的了,所以对于国家的最高领导不应该再有道德的约束,于是有以色列的总统会去强奸,于是美国的总统会撒谎骗议会,和白宫实习生偷情,凡此种种都忘了所谓的领导人很多时候风云际会黄袍加身屁股就坐在了那里,不要求他一定不是流氓出身,不要求他一定是品行端正,反正全民投票总要选一个,说不定将来脱衣舞女竞选也可以当美国的议员。所以制度的设定者是否要设定一个对领导人的监督体制是历朝历代古今各国的最难的事情,制度的制定者为什么要设定制度约束自己?中国古代大约只有几个开朝皇帝会主动限制自己的权利,其后代子孙大都废弃了。这似乎是一个无解的难题,由此我想到了我和同实验室的印度同学的激烈的辩论。我坚定的信仰质量守恒和能量守恒是宇宙间两大不可变更的基本定律的,而所谓的爱因斯坦的质能转换公式仅仅是表明了能量与质量是宇宙间所有物质的两大基本属性,并且这两个基本属性优质固定的数量关系,就是说一定的质量总是联系着固定的数量的能量,所谓质量是质量,能量归能量,只有联系没有转换一说,原子弹爆炸残骸减少的质量就说明有多少质量的高能粒子被释放到外界,他们所联系的能量就是原子弹的爆炸当量,能量不是质量殁灭生成的而是原子核固有的高能量的释放,能量与质量的载体只能是有形的物质,不论他是基本粒子还是原子分子,能量的传递不可能是超时空的。我想我的这一套理论大概都是我初中高中时候建立起来的所谓的经典理论。可是我的那位印度同学说根据爱因斯坦的狭义相对论这一切都是不对的,而所有的google的资料都显示他是对的,质能的确是可以转换,反物质与正物质的湮灭产生了能量消灭的质量。我所能做的就是坚持说不相信,反正不论你怎么说我都不信,因为这一切本来都是超越我们饭夫煮子的所能观察的事情,你不可能有什么现场的试验,我自然可以否定一切,所谓信者恒信不信者恒不信,看你有什么办法。就像我大学时候从来都不相信微积分一样,我反正不信难道我会死吗?的确,不相信微积分的正确我活了几十年都没有什么问题,还算健康。可是在遥远的时代,在达尔文进化论所描述的进化历程里凡是不相信近亲通婚导致种族退化的物种都湮灭了,凡是愚蠢到认为抗争自然规律的物种都被自然在这个星球上抹去了。这就是信与不信的区别,所谓的台南渔民自然可以选择信与不信,但是世界全球化的分工的规律却不屑于你争辩,他只是指示资本,这双看不见的手去鉴别潮流顺应者与抗争者,几十年后或许后人贤得无聊来研究这一段历史又要发思古之幽情了。这就是古代化石给人的启迪,大多数化石物种可能都是一些执著的斗士,相信自己的直觉胜过客观事实,相信自己原始的感觉胜过科学的计算分析,于是在历史的长河里他们成为化石。我又一次感受到了所谓belief的传递可能是这个世界上最困难的事,这再一次证明了当初穆斯林的祖师一手拿剑,一手拿古兰经传教的传说,在传教者看来对于愚顽不可理喻的异教徒不能精神转化就只有肉体消灭了,只是不知道这里有没有类似爱因斯坦的质能转化公式一样的精神肉体转化公式?如果有的话,宝剑可能要比古兰经好用的多。

实在是无聊了,那么就去健身房吧?闲着就是贤哲。

一月二十九日 阳光灿烂?好像是,今天据说有零下20几度

明月几时有,把酒问青天。没有酒也没有什么月亮,加拿大的冬天只有白雪。很多时候人的灵魂是空虚的,很多时候我觉得我的情绪是低沉的,大概我只有在埋头绞尽脑汁殚精竭虑的写程序的时候才使头脑正常的,可是渐渐地一个人变得懒得动脑子,于是我大部分时间就是这样idle着。偶然地回想起多年以前的理想仿佛越来越远,一个人的信念是否能够支持十年?我不知道,也很表示怀疑,反正我知道我的计划不可能超过两年。我觉得我的算法应该是没有问题了,也许是wmpi的问题,我是否应该先迁移到linux上做测试呢?

《计算几何学》一次作业有九道大题,每个问题又有若干小问题,我花了快一天还没有写完两道题,写了五页纸,还不算写废掉的。大部分的问题其实也不算难,可是并不像看上去的简单,比如没有写过算法的仅仅会纸上谈兵的计算机学生有时候会想当然地认为简单,实际上不是那么回事,其中一个算法是让你旋转一条线记录下所碰到的第一个点,第一眼看过去如果是些伪代码可能就一句话:“旋转”。可是怎么旋转?怎么检测第一个碰到的点?要写好多的,如果不明白的话也就不明白他的计算复杂度了。想当然是不行的。

在电视上看到穆斯林的所谓节日用皮鞭鞭打自己的背,血肉模糊令人发指,实在是对于这种宗教不能苟同,也稍微明白了一点为什么有那么多的自杀炸弹,从本质上看,世界上大多数国家可以把本国内的让别人自杀的宗教称之为邪教,却没有哪个国家敢这样对待伊斯兰教,连小布什这样的斗士都要服软。

《凤凰资讯》的实施辩论会常常辩论一些转制与民主的议题,卢卡尔博士似乎是一个坚定的保皇派,当然我们明白这也是节目的需要。

二月一日 阳光灿烂?好像是

在youtube上浏览南京大屠杀的纪录片,有连带着看了很多评论,和很多在美的日本裔的所“附送”你的日本国内过于这个问题的电视辩论节目,感觉心情非常的沉重。我想人这种动物是最难以对付的动物,最困难的地方无非就是belief的传递,比如一个非常博学睿智的智者如爱因斯坦牛顿之流死了,然后他所想的,所相信的没有任何办法保存传递给别人,靠书本?可是你看看有多少人读同样的一本书的除了完全不同的结论?有多少人接受同样的教育成长为不同的人?人这种动物是hopeless的就在于知识信仰的传递的困难。同样民族内,不同民族种族间,就算背景相似,资质相似依旧无法保证准确地接受相同的信息,或者说即便他们接受相同的信息却进行不同的解读。从这一点来看机械智慧取代人类这种动物是必然的自然规律,如果人类相信进化论就应该相信自己这个种群被机器人取代只是迟早的事情。当然到那个时候我们自然也不用再烦心怎样在不同的个体间传递信仰的问题了。

假如每个人都允许去开创一门学科,我愿意去创立一门compuphylosophy(计算机哲学),所有的学生都讲究顿悟,天天不读书整天空想空谈,主课有三门:观天学(就是如我现在这样天天躲在带天窗的小阁楼里摆一个坐井观天状冥思苦想一些半痴半疯的议题比如machine-learning和automated-proof哪一个更优先?其实我自己都不知道这两者的准确定义。第二门课叫做扪心学,就是天天学孟子一般每日三省吾身,检讨自己的思维逻辑产生过程,扪心自问整理自己的思绪六座资料以便后世的compuarchaeology(计算机考古学)作为历史考据研究二十一世纪的世界。第三门课叫做...

今天是一个值得纪念的日子因为我的天窗可以在中午的时候洒下一绺谈谈的阳光仿佛《绞刑架下的报告》里的主人公所在的牢房在夏天最炎热的日子里能够看的那片短暂的阳光一样可爱,同样中午的土豆牛肉汤虽然已经反复热了n多天了仍然像小说中所说的世界上最美味的土豆牛肉汤。

计算几何学的算法题目我每天只能做那么一两道题,因为描述一个算法的时候往往发现自己的想法太粗了,这种情况我再写程序的时候经常遇到,也就是只有实际到算法的数据结构的设计阶段你会发现你的想法的漏洞,所谓不思则无惑,不行动则无挫折,从来不写程序的人几乎永远无法意识到思维的漏洞,当然这既仅仅限于常人,对预算法大师和数学大师来说,他们的首要任务不是去实现一个大体设计好的算法,因为这可以被一般的庸才如我辈来完成,他们所关注的时能否设计出一个更好的算法,这其中的差别不可以道里计。算法设计这门课我基本上是听个意思,明白了粗浅道里,比如strassen当局真乘法是颠覆历史的革命因为几百年来从来没有人想到过一个算法还可以这样玩,也就是常人认为是不可能的地方玩出了火花。惊叹之余感觉自己真的好好渺小啊。好久没有用笔来写作业了,每天写一两张纸扔进抽屉,然后把写废的反过来当草稿,估计要写个二十几张吧?其实凭良心来说,几何算法属于算法课里比较容易的,因为大多数时候画图就能找出方向,不想那种变态的NP问题的算法折磨头脑,只不过为了表述清楚就不大容易了,尤其是用笔来写。

晚上无聊之际写了一个极其简单的产生simple-polygon的小小算法,只不过证明我还活着,(其实我的确是这个意思,因为我思故我在,而我只有写程序的时候才思考的多一些,所以写程序证明我思考故而证明我存在。)不过意外地发现了一个奇怪的openGL的现象,就是GL_LINE_LOOP的最右边的点总是不清楚,奇怪真奇怪。

二月五日 阳光灿烂?好像是,不过零下二十几度的寒风吹的人想流泪

一个人无所事事的时候干什么呢?这个问题本身就是一个假命题,既然是无所事事又怎么可能干什么?事实上来说根据帕金森定律一个无所事事的人实际上是最忙得人,而一个整天号称很忙得人实际上是很闲的人。那么看英文的肥皂剧是否比看中午的无聊节目更好一点呢?也许吧,至少入乡随俗,不过好象听说现在《friends》之类的东西是国内小资看的。看那些字幕其实有些意思因为我还是不能完全不一来字幕,比如一些特别古怪的笑话你首先不一定能够意识到那是一个笑话,就像《The Thin Blue Line》里的那些英国人的笑话,当然美国的东西要比那些容易不知道几百倍,可是还是忍不住条两个小毛病,翻译字母的人要么是完全不接触英美文学的要么这个字幕是好几年前做的,居然会把<The Lord of Rings〉翻译成拳击比赛之王;当他们将笑话说舔人脸的不是狗而是海豹(seals)的时候,也居然翻译成了印章(seals),因为他们一词多意,所以在看英文笑话的时候也为中文笑话幽了一默。

二月八日 阳光灿烂?好像是,不过零下二十几度的寒风吹的人想流泪

看到我那个同学公务员有滋有味的博客突然让我想起来刚来这里的时候老师听不少人羡慕这里的公务员生活有多好,反正无非就是钱多事少离家近那一套,后来又听他们说羡慕地铁开火车头的,在后来听他们说羡慕收垃圾的因为那也是个好几万的工作,听得多了也就烦了,我很想说我很羡慕蒙特里尔大街上无家可归的人,天天没事干可以晒太阳还可以随地大小便,也不愁吃穿!其实,你如果羡慕公务员,你用不着来加拿大,世界上那里的公务员都是很多人羡慕的职位,当然这中间最值得羡慕的就是咱们伟大祖国的中国的公务员。基本上一个普通中国人的最理想的生活就是这么三句话:“入了他那个党,干了他那个部,为人民那个币服了务。”来这里混得人大概都是在中国没有实现这三大理想的吧?姑妄言之,姑妄听之。

本来为了制作一个定时关机的小程序竟然折腾了一个晚上,确实win32api实在是有点烦人,一大队的函数的名字很难让人想到。不过转念一想,这实在是不得已,因为WINDOWS的东西要比LINUX复杂的多,有一个东西费了我很长时间没有想明白,就是我传入参数用HANDLE*竟然不行,一定要用&HANDLE,这实在是有些想不到。

二月十日 阳光灿烂?好像是,今天零下多少度呢?

尼泊尔的毛派游击队正在成长中,也许有一天这个在野的毛泽东思想战斗队会夺取政权呢。相反的,他的邻居,一个当年走过类似历程的组织在一天天的蜕变成当初他们所反对的敌人,或迟或早地,他们会失去今天的统治。我在被逼迫写出算法的定义与证明过程中深深体会到了这句我创造的名言:Well defined, well designed.

太阳一天天地在长高,现在在中午时分已经可以依稀透过天窗看到杨光了,总有一天我又可以过上我最向往的生活:躺在床上晒太阳了。

二月十一日 阳光灿烂?好像是,今天零下多少度呢?

为什么人是hopeless呢?因为这个世界上的大多数人完全就是不再能够学习,我看到我那个xxxx写来的算法就知道我始终没有办法让他明白问题在哪里,从头到尾来说一个人不去实践就永远不会知道问题在哪里,或者意识到那是一个问题,这当然不过使我第n次重复毛主席的实简论而已,但是难道不对吗?从进化论来看人作为物种来说并没有被要求去适应自然环境,这有一点点耸人听闻实际非常浅显,就是批判用进废退论而已,比如长颈鹿并不是看到树上有树叶想去吃而强迫自己总是伸长脖子的,这完全是很多没有科学常识的贫民老百姓的想当然,进化论里的物竞天择,适者生存是依靠基因变异来实现的,也就是说在当前这一代并不能实现物种的进步,所以说物种适应环境完全是一个被动的行为,基本上不是物种自己主动调整自己来更好地适应环境,而是被动地被环境淘汰掉而已,所以,人也不会主动去学习,因为这不是人这个物种的特性,食色才是人性,怎样多吃多造人才是流传物种的正宗,多思考多学习?对不起如果那不能养活你自己,你还是被淘汰了,所以人这个物种最容易存留下的基因是多吃能睡能多造人的那种,你听说过爱因斯坦或者牛顿的后代很多吗?人种的改造其实人类历史上最积极的一次时间应该是希特勒统治的时期,可惜这种淘汰制被所谓文明人认为不人道,这也是没有办法的事情,毕竟我们现在这个社会比起原始部落时期有了很大的进步了,我们现在已经一致认为我们是文明人在战胜对手之后不应该把他或者她的尸体当食物来吃掉,这一点可以说是文明社会与野蛮部落最大的本质的区别,也许也是唯一的区别,这就是人类社会几千年来进化的最大的成就。

二月十四日 阳光灿烂?好像不是,今天又下雪了

实际上,occlusion-test-extension使用的事监测z-buffer是否产生变化,所以决不是我们想象的区监测颜色的那种,我不知道为什么会想到这个问题,但是这一定是有一个重大的前提就是从前往后的rendering,否则就是没有意义了。

二月二十一日 阳光灿烂?是啊,这是最暖和的冬天

GPU programming有些变态。1。用那个glsldemo可以作为一个平台,不用每次都去编译,除非你要新加入一个uniform,所谓uniform实际上是openGL与GPU通信的一种方式,具体是在runtime调用GLSL的编译器编译成汇编代码还是在openGLprogram编译时候一起编译,我已开始概念很模糊,现在看来应该是前者。 2。vertex processor 和fragment processor之间可以通过varying的变量来传递数据,但是他一定不能是boolean或者integer,这一点我花了好半天才搞明白,语法书上好像没有说啊。3。GLSL已经傻瓜到了纯粹C语言了,不过GPU的内置函数效率其实并不会很高,比如noise函数已经调用就非常的慢了,当然这是我在每一个vertex里面都调用一次自然很慢了。4。意外地发现了用vc2003可以编译的用vc6无法编译,这实在是折磨人,只好升级到vc2003。5。在强调一次,openGL里面的matrix都是column matrix,matrix和vector相乘的嗜好要看作是linear transformation,transformer在左手边。6。并不是所有的lib都是空壳文件,如果是静态库那么确实的binary代码都已经包含了,当然不需要动态库了,同时vc6好像不去检查是否静态库由多个main入口,实在是混乱。

二月二十三日 阳光灿烂?是啊,这是最暖和的冬天

Sushil的解释应该更加的浅显,我会错的Dr.M的意思,实际上应该是一个vertex完成后紧接着就是fragment因为rasterization是一个必然的过程,就是一个动作还没有完,所以对于每一个vertex来说,fragment大都是在作interpolation,不同的interpolation完成了不同的细节,这就是GPU的精义。GLSL的文档里的东西很多都不支持,mat3(mat4)这一类的constructor不行,>=或者<=这也不行,最让我震惊的事我以前居然不知道的最最幼稚的一个细节,在transform时候vertex是由gl_ObjectViewMatrix而normal是有他的transpose of inverse来transform的,这实在是太有些尴尬了,不知道这个简直就是说一个学习c语言不知道指针一样的令人难以想象。所以shading language里专门有一个gl_NormalMatrix,不然你以为这些人吃饱了撑得?当然我还没有想明白为什么,线性代数又要有一队的证明才能明白。而且GLSL的specification上说得很多都compromise了,比如里面强调gl_pointSize必须要写入否则undefined,可是事实上OpenGL总是有default值得,程序员用得着花时间总是写同样的代码吗?编译器不能代劳吗?既然说一定要写的话,既肯定有default的,不然。。。困死了,早上就犯困。GLSL里面定义的light是一个结构体有一队的field,而知道这个什么咚咚编译器直接用LightPosition。

二月二十六日 阳光灿烂?是啊,这是最暖和的冬天

一不小心过了好几天,其间唯一明白的一件大事就是我看书不求甚解,就是说我只能读的东我原来就懂得东西。不过话说回来了,有谁不是这样的呢?以前在TAV的数学老师说的好,数学家钉钉子会首先在墙上找旧的洞,也就是说基本上我们人类的知识体系都是一种在前人基础上堆积的体系,所以我如果不是用我就的知识来解读我读到的东西那才叫做奇怪呢,或者说我就是天才了,哈哈自己给自己找台阶了。说了一通包袱还没有都出来,这就是学习GPU programming的第一步,我想着一步跨出来之后基本上就进到门里面了,夸张一点来说。其实,最大的问题就是对于工具的依赖,我对于那些所谓的软件包装非常的难以理解,因为对于我来说openGL API是我最容易理解的,而且平常用惯了glut,回到win32的framework变得很陌生了,总之,motion-blur是可以实现的,关键我认为应该要能够正确理解什么数据可以做参数传递给shader和怎样传递,也就是uniform的glUnitform*,我还没有办法测试,下午吧。

顺便看到国内所谓的web2.0的网站要完蛋了,我感到很高兴,活该,什么叫做2.0?按照盖茨先生的说法根本就是炒作,完全不是什么技术名词,只是使用模式。为什么这些人的经营模式和古代的老鸨(老板)养妓女(子女)一个样呢?整天给她们的摇钱树(要钱术)梳妆打扮,花钱培训,全部都是投入根本没有打算马上经营,全部的希望就是既希望于给将来有钱的主一次性买断(号称收购),这样的技院(技术学院)不倒闭才怪。

二月二十七日 阳光灿烂?是啊,夏天就要来了,冬天还会远吗?

计算几何学的第一个作业要写二三十页纸的算法和证明,虽然说每一个小问题都不是什么非常非常难得问题,可是几乎没有什么容易的,因为我这样写也都不是什么很clean的proof。我问教授这样的作业数量会不会太多了一些,教授面露笑容说第二次作业会比较少一些因为你没有还有一个很大的project要进行。我听了信以为真心花怒放了一个星期的spring break都没看书,昨天突然看想起来是不是作业已经公布了,看了一下差点晕倒,第一次作业有九个大题,每个大体有几个小问题,第二次延续了这种风格,减少了一道大题,果然是少了一些,我心里只叫苦啊,连问题都看得很吃力就不要说涉及算法了,这真是一个艰难时刻。

三月七日 阳光灿烂?不知道啊。天已经黑了。

人的生命就是这样度过的,在不知不觉中尼突然发现过去了十天之多,这段无记忆的日子其实对于一个人来说有和没有有什么区别?所以,我常觉得生命对于普通人来说就是记忆与回忆,如果你不记得你又做过什么,那么就当作是你没有存在也没有什么不对的。也许这一段没有记忆的日子的原因是因为WOW,这实在是一个害人的东西,我自己只好自己设置parental-control,一个人活到这份上实在是无可奈何。GPU编程说到底还是小儿科的玩意,因为不懂算法,基本上就是瞎玩瞎试,当然这也常常有惊人之作就好像那些云啊,雾啊之类的。

从现在开始我要振作起来写我的project了,不然就太晚了。不过下个星期就要交作业怎么办?

三月九日 阳光灿烂?好像是的。

computational geometry的算法题目很不容易,我花了一天多时间才刚刚想出来一个简单的题目,这个问题让我想起了graphic里面的古老问题,温故而知新,基本就是怎么判断一个point在polygon内部,原本有一个非常nice的O(n)的算法,计算这个point的射线相交polygon的次数,现在题目怎加了一个条件要求达到O(logn)这就让我想了很久,终于在每天头脑最清醒的20分钟里想明白了,一般这个最清醒地时刻是在我早上蹲马桶的时刻,我常常用这样宝贵的时间想一些有关全球变暖,世界和平之类的大事。总

三月十一日 阳光灿烂?好像是的。

有时候真是觉得生不如死,我最后没有办法只好把parentalcontrol的密码发给朋友请他改掉。今天头脑略微清醒了一点开始做computational geometry的作业,感觉还是痛苦不已,关于furthest voronoi diagram的问题始终没有头绪,高阶的range search tree就更是费脑筋了,nested recursion把人的脑子转了几个圈还是有些不清楚,这还不算是多么难的问题。相比较而言,academic的问题大多数情况下难度是很高的。

CreateFileMapping简直就是惊人的快,我做了一个非常简单的试验,用这个api和普通的readFile作比较都去读一个700M的大文件,结果简直就是可怕,普通的ReadFile读了13到15秒,而这个mapping根本就不需要一个tick,为了验证确实是读到了内存,我还特别拷贝了两段数据作比较来验证。实在是威力无穷。

三月十二日 阳光灿烂?好像是的。

折腾了一个晚上我简直就是一直在诅咒,完全是白吃级的问题!第一个简直是搞笑得问题,我下载了那个著名的发电厂的3D数据模型,它明明是标记的给windows和unix不同的两组文件,可是给windows的和给unix的都是用的big-endian的,我对于此总是很模糊,即便google了pc机用的时little-endian还是将信将疑,始终不认为这会是问题,结果我读到的数据就始终是似是而非,有些正确有些离谱,最后我只好用ultraedit去读ascii码,然后和程序度的数据进行比较,借助calculator的十六进制转换,果然这是TNND的big-endian惹得祸,真是够混蛋的,为什么给windows的还要用big-endian呢?难道他不知道只有mainframe采用big-endian吗?这个著名的发电厂的模型不知道有几千几万人在下载了使用,不知道我时不时唯一的白吃犯这种低级错误。要转成little-endian他倒是有一个现成的工具给出了ply文件的转换器的原码,看来我可能是没有看到原来的说明,真是活该。结果是用这个小小的c的程序的时候又花了一个一个多小时解决另外一个更加白吃的问题,这个绝对是超级的白吃问题,我记得我以前就遇到过这个类似的问题但是绕了过去,在vc6里面编译器是根据文件后追名来选择c还是c++的语法的,我因为讨厌使用iostream带来的一大堆的头文件定义,喜欢用纯c的定义,结果语法有随意地使用c++的格式,比如变量可以在函数之后声明,结果编译器始终报错,我明明就知道这一定是c与c++语法的不同带来的却怎么也找不到原因,甚至期望用using namespace std;来强制编译器使用c++语法但是却不明白我应该不出现错误的文件的后缀名改为cpp,最后还是google到了这个变量必须声明在汉书之前的c的严格语法才解决问题,真是白吃级的问题

三月十三日 阳光灿烂?好像还不是的。

问:教授身体安康?08年台湾大选结果如何预测?大选结果对厦门楼市?

答:你小子不会是在炒楼花吧?
但愿不是,因为我的预言十有八九不准,当然所谓占卜问卦之类信则有不信则无,多半是给自己找理由,所以我就不妨大胆预测。

1。台湾大选依旧是民进党主政,因为我觉得民进党代表了台湾大多数的人民的利益,什么是台湾的大多数人民?不是工商界人士,不是所谓中产的白领阶层,因为台湾远没有美国的富裕,中产不时大多数,台湾的大多数是台湾的农民和小商贩等等的lower
class,虽然不是农业社会但是农民在绝对数量上来说应该是多数,这些人需要民进党,因为国民党是什么?谢长亭说的好:权贵的第二代!

2。厦门的楼市,肯定还是涨啊,为什么?
a)供不应求啊,不是要什么农村城镇化,城市大发展吗?农民进城是必然的社会趋势,当然我这里不是单单再说农民工进城就业的问题,我说的是农村新兴资产阶级进入城市发展的问题,你想想看中国的经济发展一定水平产业资本和金融资本融合就成为一个主流,当初的福建乡下的工商业发展的一个方向就是进入大众城市。当然同样的大中城市资本乡下城镇发展也是一个趋势,这里就不谈了。
b)大中城市的房地产热决不是中央几个行政命令能够改变的,你想想看,政府卖地是越卖越贵,官员只知道用卖地的钱解决眼前的财政问题,绝没有去用这笔钱来发展廉租房,欠下的这个天大的债务要多少年来还?现在的很多房地产商都是在“捂地”,巴不得不要立刻建房,因为房地产的涨势还要维持很多年呢。问题仅仅是投资股票与投资房地产哪一个的回报率更高一些?这个问题我觉得我要做一个研究才敢说,我的研究方法很简单就是我们大家再一次一起玩一遍《大富翁2》看看投资股市和房地产哪一个更加的赚钱。哈哈哈。。。
c)中国的投资环境并不见得越来越好,因为政府的行政成本太高了,比加拿大都高,简单的加工工业肯定越来越没有市场。金融环境也不见得好,银行的呆帐太多了,庞大的现有资本要流向哪里?我估计除了古董艺术品就是房地产与股票市场了。

三月十四日 阳光灿烂?好像还不是的。

: > 哎呀,就是想炒楼呀。
> 教授的答案如果综合考虑在2008年台湾大选之前你说楼市的结果会如何?
>
> 民进主政搞台独 * 土老板进城 * 国内投资环境的衰退 = ??

答:

台湾对大陆的影响日益减小,大陆对台湾的影响日益增大,所以,区区一个台湾省不足为虑,重要的是中国国内自己的环境,总的来说,五年内中国的经济还是会继续快速发展,因为:
1)早几年的所谓政府投资拉动基础建设的惯性还在持续。
2)人民币的升值不会一步到位,外资与热钱还会涌入。
3)国内的剩余资本还是无法找到合适的投资渠道,现在中国到海外投资十之八九是迫不得已与交学费。
4)投机之风日盛,工业资本向金融资本转变是一个资本主义发展阶段性的趋势。
5)老百姓的小康需求还远远未满足,购买力在提高,居者有其屋对很多人来说还是梦想,买房子成为最大的消费。
6)普通老百姓除了这个还有什么可以投资的?

花了一个早上时间在画furthest voronoi diagram,画的很高兴,因为这种工作是计算几何题里面最简单的活了,和写算法与证明来比这种工作要求的智商不超过70,最后五颜六色的很好看还以为自己很有成就的样子,就如同大多数报告写的很漂亮有很多花花绿绿的图表,内容却乏善所呈一样,是一种表面文章。第一问的证明farthest voronoi diagram是convex polygon还是毫无头绪。看看买菜回来以后是否有结果。

临走之前还是先把昨天玩createfilemapping的新的记下来。首先这个咚咚非常的快,使用的时候以一定的限制就是你程序自身的内存上限,和系统的内存限制。当然首先是系统的内存了,基本上我还只有很少的机会会用那些内存4G以上的系统吧,cluster里面是这样,现在还太早了。首先,create的时候那个size是指的从文件开始算起的,以后mapping都不能超过这个上限,哪怕你的偏移量很小也不行,其次,create的时候你有可能就破坏了文件,因为你的mapping如果超过文件大小,文件大小就grow了,我把我无数的下载来从来不看得avi文件就这样一个一个给干掉了。对于同一个mapping的handle你可以反复多次的mapping,因为,不这样unmapping,你的内存迟早会耗光的,另外一个不确定的就是会不会你的mapping不会自动释放,我对于这一点不确定,反正我在debug过程中犯了不少错误,为了防止程序debug中没有释放就写了一个atexit的handle去释放,但是还有另一个办法就是给mapping handle起个名字,这样可以用名字来openMapping,甚至别的进程也可以调用,类似于systemV的interprocess communication的key一样,当然会有冲突的可能。在linux里面的对应的函数叫做mmap。同时在mapping的时候有很多参数可以选择,相当的复杂,以后再慢慢地玩吧。

三月十五日 阳光灿烂?好像还不是的。

看王朔的video确实很有嬉笑怒骂的感觉,虽然话糙可是理不糙,总之,王朔还是我的一个偶像级的人物。

三月十八日 阳光灿烂?好像下雪了。

总算完成了预处理部分,还是有些难度的,尤其debug追踪错误对于一个几百兆的输入文件来说是很困难的,尤其其中错误是一个罕见的动态分配数组的问题。

我时常会想起大学里看的一部科幻片《Hybrid》,大意无非是以危言耸听的方式来说教:我们要警惕我们伟大的科学家不负责任地创造了我们所不了解的噩梦,比如基因工程。骗子里面大概是一群学生和老师过暑假,来得宾客里面有不少是老师的试验成果,比如用各种动物的基因和人合成的人也就是hybrid,由章鱼还有其他鱼之类的,所以,你可以看到一个真正意义上的美人鱼叫做Melisa,也就是美杜沙的姐妹,当最后县原型的时候她的腋下市长着腮的。电影里面这个Melisa总说感到painful,其中原因当然有心理上的异类的原因,生理上的合成人的后遗症,据说她是被教授控制着,不定期服药就要现原型,而那重要毫无疑问的是非常得painful的,还有一个有意思的原因是她也如同鱼一样的睡不着觉,所以,她的台词总是I feel painful.于是我也常常想到这个角色。

三月二十三日 阳光灿烂?怎么可能?

世界上有两种人喜欢说写程序很容易,一种人从来都很少写,另一种人一直都不停地写,大多数人都不会觉得容易,因为,计算机是这个世界上唯一不撒谎骗人的东西,小到一只狗有时候说不定也要逗你一下,我讨厌一切宠物所以我只是猜测,大概如此吧。同时我也更讨厌那些为了掩饰尔说写程序很容易的人,基本上些程序不是敲键盘比赛,也不是完全比赛记忆力,有的人重复些同样的东西然后得意洋洋地说我敲键盘很快,为什么不可以把同样的东西重用呢?除非你是有意为了方便编译器优化才故意把程序写成那个样子,比如把循环拆卸方便寄存器的优化,这实在是高级。

白痴级的问题在计算机里比比皆是,我经常犯这样的错,1-1是否等于1?哈哈,在计算机里应该等于1,因为这是我的白痴问题,我计算一块内存占用几个page,居然犯下如此的错误,特别提出来以警候效,page的offset等于0但是占用的page当然还是1,我以前就老是犯类似的低级错误,不过这种错误和其他的错误混在一起非常得难以发现,比如我发现library的文件读写和系统api的文件读写混用的时候会出现莫名其妙的错误,当然前提是我的CreateFile的handle后来又被用来进行fileMapping了,MSDN上对于mapping后的文件读写有些语焉不详,总之以后使用createFile就不要再用fopen来打开文件了。另一个令人生气的是我今天才知道executable的image是不能超过256M的,还有fileMapping好像也有一个上限,大概是2G吧,这还是可以理解的因为2G是user program的limit,另外一半是系统用的,这一点我早就知道,只是测试的时候发现似乎还有什么别的限制,(不确定),已开始始终认为mapping的次数由限制,现在看来是总的size的限制。特别要小心不要超出createFileMapping的设定的上限,我总是犯这样的低级错误,mapping的时候,起始位置必须是64k的整数倍,但是mapping的size却不是的,所以接下来我的数据结构应该是从page起始位置开始,这样内部我就不用再给每一个octree node计算offset了,就是0了。但是哪个我认为“几乎”不可解决的问题还是在那里,就是vertex和triangle不再临近所造成的一些triangle跨越octree node的问题,这实在是头疼,我想了一天才有一个办法,就是不再仅仅是triangle复制在多个node,包括vertex也要负知道多个node,但是这样一来我等于是vertex排序完时候还要再看triangle的分布情况在复制这样triangle的index又要改变,也就是说我原来的vertex的一一对应的所谓hashtable要变成一个linklist,因为一个vertex可能对应多个index在多个octree node,这样还能不能two-pass处理完实在是难说,现在预处理一次就要一个多小时,这样岂不是要更久了?要么就晚上运行吧。还有一个小问题说出来简直就是编译器relative addressing和absolute addressing的问题,我的数据写在一个个page里,当我load一个个独立的page时候,triangle的index只能是本节点的vertex的index,或者说要写他们的相对的index,因为绝对的index没有用了。还有就是初始化,一定要记住。

现存一个临时版本,准备写一个多线程的loader,同时要模仿某些PLP的算法。

青菜萝卜真的各有所好吗?

三月二十六日 阳光灿烂?怎么可能?

中国人的盲目自大就在于盲目,按照当时唯一一个睁眼看世界的大清国民的说法这应该是一种国民的本性,所谓要么妄自尊大,要么妄自菲薄,不断地从一个自信的巅峰跌到谷底又不断地从谷底找到借以爬到巅峰的所谓证据。在一个皇权至高无上的社会离普通黎民百姓生活就算再怎么苦不堪言还要为皇帝要修建一所气派的王宫而感到自豪,仿佛我们的皇帝在接见外国世界面前几分钟的面子能够定得上自己一年的吃糠咽菜。Carlos发来一片据说是小学生的模仿《新闻联播》似的作文,看上去很cute实际上很悲凉,这仿佛是一个伦理学的问题:皇帝的新装究竟说明骗子高明还是皇帝愚蠢或者还是全体国民的愚蠢?我记得我小时候听这个故事的时候总是在前面两个选择上徘徊,等到今天感到自己已经开始不惑的时候才意识到最后一个选择的可怕,不知道是不是一个人只有看得太多想得太多的时候才开始意识到最可悲的事实,也就是一个种族,一个民族,一种国民的劣根性。

以上的空论也不是没有原因,看凤凰资讯的时事辩论会就明白了,在一个国家连温饱都没有解决的时候雄心勃勃要挑战大飞机的制造,难道中国的崛起就是说要在所有的领域都取代美国?这简直就是头脑发热的幻想,难道发达国家把自己不要的低级制造业转移到中国是亲率之举吗?难道一个连手机芯片都涉及不出来的国家能够造得出大飞机?不是说早不出,而是说能否成功商业化,那种早两弹一星的不计成本的国家投入不适合商业模型的。有时候看这种一体的讨论仿佛一个程序员看牙牙学语的小朋友写了一个helloworld就以为编程序不过如此的感觉,实在是懒得议论了。

ppstream上在播放《斯巴达三百勇士》仿佛是在某种程度上给国际时事作背书,究竟布什的伊拉克战争是不是一场新的圣战,究竟美国国会里有没有议员接受伊朗的铜币,究竟布什处心积虑不择手段地发动战争是不是要救世界于水火之中,这些仿佛都是一些没有答案的问题。不过但从CG的角度来看还是很值得一观的,仿佛是advanced rendering and animation课程里的NPR,就是non-photorealistic-rendering,很多的颜色和光影效果很明显的不真实,完全是刻意地模仿漫画效果,在这一点上很成功的,很多的theme让人联想起《gladiator》的场景,这不能不说是一点点地不足,不是说不刻意模仿,而且个人还是很喜欢很多麦田里的镜头,但是让人觉得导演的想象力的不足,但是从总体上来说,东方文化沉积太重的人大都不懂得欣赏,仿佛有人评论说《极品飞车》里的西方性感女郎不如东方娇小女孩来的可爱一样让我受不了,这应该完全是所谓“习惯称为标准”的误区,这一类缺乏逻辑支持的结论就和Dr.M评论NPR类似:缺乏坚实的理论基础越来越沦为artist的玩物。究竟邪恶的波斯蒂国是否应该被消灭应该不只是布什一个人应该考虑的,作为一个被宗教狂人所支配的危险国家如果没有美国这样的正义捍卫者,世界不知道要沦为怎样地混乱,所谓中国的崛起就仿佛是说一头山羊有一天学会了用羊角战胜豺狼一样令人难以置信,世界不需要一极,但是不能没有支配的一极,除了美国还没有一个国家能够担当这个职责。不论从哪个角度来看这都是以不知的收藏的电影,我决定2009年的时候当它的DVD价格降到10块钱左右的时候购买,哈哈这两年的娱乐开支都已经透支了。据我所知,我周围的人都不大懂得欣赏,对于国内的所谓垃圾《黄金甲》津津乐道,简直让我笑破肚皮,那种充满红黄庸俗色调的主体仿佛国内山西煤矿住暴发户刚刚争到第一桶金不知道该玩什么一般。再者说从CG的角度来看也是非常的初级,所以我只是迅速地看了几个镜头就准备删除,事后才想起来是给别人下载的。

三月二十七日 阳光灿烂?怎么可能?

VC++6的template的毛病实在是比较的多,比如在switch-case之间是不能声明变量的,尤其要小心的时使用template函数的时候便一起好像忘记了你的template type variable,报出来的错误比较的莫名其妙,仿佛已经instantiate了回过头来问你:喂,你给我的类型参数是什么?我忘了。比较的搞笑,当然我的代价就是有将近半个小时不知所云。

看到网络上的少林寺烧香要6000元,我觉得一点都不奇怪,只有在发展中国家宗教才会被这么多的老百姓所笃信,因为别无可求,也正因为如此人民才会如此地被宗教蒙蔽。大多数发达国家并非劳动人民完全排斥宗教,而是说大多数人都把它当作一种个人爱好一样宽容,不去那么执著,同样宗教也不敢过分地如同开黑店一样。我去云南旅游的时候这种事情就遇到过,导游啦你去一个什么狗屁庙里面,然后清楚一个所谓的“高僧”,这小子也会察言观色,看来可是布什拖家带属,年龄气质是不是有中年事业小成的样子,然后斟酌着给你开列“购买清单”,比如又让你买香的,又让你开光的,价格不一,随机应变,当然这之前都是要发给你一张小纸贴,但凡在中国社会混过得都应该知道这和导游带你去购物商店里的回扣标志是一回事,我很多年前第一次去香港的时候被那些本地导游带到珠宝店还以为真的就是他们说的安全标志呢。小我这种无产无业的穷人小和尚们也奈何不了我,最多就是想讹诈我几个香钱,我转身就把那些个条子撕掉,我想这种无名的小庙还不太敢欺负人,碰上少林寺这种地方一个愿打一个愿挨,不宰白不宰,反正愿意去的都是准备扔钱的,不多要点我都觉得冤,问题是这样的所谓宗教还是照样有人相信。我给“耶和华见证会”的老太太们谈我对宗教的看法,我讨厌伊斯兰教,因为这真的是一个暴力的宗教,一手拿古兰经一手拿剑逼着你相信,不相信就一剑刺过来;我也讨厌佛教,不仅仅是这个组织的功利色彩,更主要的他仿佛是保险经纪,连哄带片就是要让你交钱,给了钱就说你不用下地狱,否则不出钱出了事情都是你自己的错,什么叫做破财消灾?这仿佛是我经常举例的那个经典的概率笑话,一个人认为同是有两个人不约而同地劫持飞机的可能性几乎为零,于是他坐飞机的时候就总是自己在手提箱里放一个炸弹做准备劫持飞机状,以为这样可以把被劫持的几率降为零,天知道很多受过所谓高等教育的人和无知的文盲没有什么两样。

我几乎可以肯定发现了一个编译器的bug,比如deque<int>::iterator it=myqueue.begin; 这个错误应该在任何地方都发现的,可是在for循环的初始化部分居然不做检查,不知道是怎么通过的,身不知鬼不觉地我的程序走向无穷。花了一个上午多的时间把我的旧的convex hull改造成使用STL,不知道我这么做是否值得,有时候我觉得我现在变得非常的执著,容不得一点点地不同。

一个人不可能两次踏进同一条河流,我却屡屡掉进同样的错误泥塘,我是不是就不算人了?简直是白吃的问题,文件的大小当然可以超过4G但并不等于文件的专用type:__off_t就应该是64位的。事实上windows的long和int是一样的32bit,和linux的long long对应的时__int64,这个我去年在学组和算法的时候已经犯过一次这样的错误了,现在有时这样,记住了LARGE_INTEGER是一个union专门用来算32位高位和32位低位的64位整数,自己用shift毕竟有些罗嗦。Linux device driver编程的时候环境设置其实很简单,因为uname -r会给你当前用的source的版本名字,用这个在/lib/modules/路径下有时现存在那里的source和这个一致的,然后在这里有一个symbolic link叫做build就是指向真正的source file路径的,所以在那里你当然可以用/linux/init.h and module.h这连个文件里的定义基本上就明白怎么做了。只是那个小孩提到linux2.4版本要求module的函数必须定义为static的这一点我表示怀疑。不过进入这一步之后kernelprogramming不会有太复杂的地方,只不过有时候copy到用户的时候居然要用copy_to_user之类的,还有就是多线程重进入函数的问题,不过我想不会比在win98下写汇编程序复杂多少,总之没时间去玩了,就当作自己和白吃教授一样武断地说很容易吧。比较好笑的是我本来居然还怕出错一个链表的查询与添加居然用了两次,算是比较的白吃问题。

三月二十九日 阳光灿烂?当然了。

还是白吃级的问题,两个32位的整数相乘是不可能等于64位的整数的,这是连一年级的小学生都知道的,我居然会很模糊,LARGE_INTEGER应该是可以的,但是前提是你赋值的是一个64位的正确的数,其使用union和你自己做chop&shift有什么区别呢?另一个白吃级的问题使用openGL我把glOrtho2d的-x,x参数为之搞反了,结果坐标变得非常离奇古怪,简直把我给逼疯了,我向世界上很少有我这样的错误吧,最难得的时我做的convexhull,结果还的的确确是convexhull,只不过是类似于镜像,当然我不去对坐标是感觉不出来的。

还有一个白吃级的问题是我居然完全忘记了课堂上教的Minkwaski sum结果把它当成了symmetric difference写信去问教授,这实在是让我无地自容,我不知道班机上有没有另外一个会犯这样的愚蠢的错误。

三月三十日 阳光灿烂?当然了。

凤凰资讯转播《讨论到天亮》是有关中日之间的一次大碰撞,这样难道不好吗?实际上,很少有中国人这样认真地看待两个国家之间的关系的。

我现在看到ICE居然会处变不惊,checkin source safe,从容自若地去实验室改正我的out-of-core-rendering的最后一个bug,然后买了十个肉包子回来吃,睡了一会儿,心情镇定,举重若轻地在google的搜索栏里敲下了"Internal Compiler Error",然后轻描淡写地把一个三级嵌套的static data member的初始化取出掉后,轻而易举地化简了那个穷凶极恶的ICE,我是不是已经快要出神入化了?什么你还不知道ICE?那么你肯定没有玩c++超过三年到五年的经历,或者你太滥了,说错了,是太懒了,像我一样。

我真的饿了,快半夜了我都已经忘记吃饭了,阿伟大来电话我才想起了肚子很饿。我这中间做出了一个痛苦的决定,放弃DCEL,因为他真的对我没有多大帮助,而且实现起来有些问题,不是说指针编程有多么困难,主要是我对预算法不很清楚,我的应用和书本上的算法有出入,同时,使用STL对我来说更容易,并且程序的效率不是主要的因素,复制数据要远比复制指针来的简单,安全。更主要的因素还是时间,Unfortunately time is always against me。吃个pizza,喝杯红酒,不知道今晚能不能完成一个大框架,时间实在是不多了!!!

困死了,总算成功了一部分,明早再改bug吧。

四月二日 阳光灿烂?哈哈,下大雨了。

令人激动地日子过去了生活又变得索然无味,这让我才深深体会到柯南道尔笔下的福尔莫斯的痛苦,在伦敦这个犯罪之都出现偶尔难得的平静的时候,这位犯罪学专家难以忍耐的无所事事的平永生货币的他不得不用吗啡来麻醉自己的神经,当然我只不过是继续我的愚蠢的WOW。有时候我也觉得把computational geometry的算法说给对此无概念的人有一点点跑媚眼给瞎子看的感觉,包括我自己以前看到这些三角形之类的东西会觉得这个有什么特别吗?这个世界上的绝大多数人对于不了解的事物或者把它想象的无比复杂又所谓的高不可攀的感觉,或者不以为然认为很简单,正是所谓的数学上证明两个集合相等的绝妙写真。所谓数学上的证明x=3时这样的,对于x这个未知数我们首先证明x>=3也就是说这个东西绝对比我们目前已知的一个冬冬,比如说数字3来的复杂,来的大;然后我们在证明x<=3也就是说这个未知数x并不比我们所熟悉的数字3来得更加的复杂,更加的大。然后我们去伪存真是地判断说既然这个未知数并不比3来的大也不比3来的小,那么它当然就是3了,难道不是吗?这个世界上所谓的常人所说的误解与错误认识无非是对于一个概念的外延与内涵的不统一,或者把一个概念的外延不适当的扩大了,或者缩小了,只有整整好的一致才算真正的认识。

实际上,我还有一个比project更令人头疼的作业没有完成,computational geometry的作业绝对是我所难以完成的,一个算法题想了一两天也没有头绪,一个证明有一点点地眉目以为有结果了,可是一些下来发现其实不对,所谓Q.E.D.并非那么容易写。突然又想到了我的octree想到了一个问题就是我预处理的leaf-node的邻居实际上并非都是leaf-node,本来想改掉后来又发现不行因为我设定了最多的邻居只有26个,只能在运行期再去搜寻了,当然这会慢那么一点点,可是没有办法呀。糟糕的事我现在看我一个星期前的代码已经全然忘记了,发现了一些全局变量非常的危险,因为如果我一旦命名上有些模糊我自己都会搞错的,这就是软件工程的困局,人的记忆力是那么的有限,对于程序代码的记忆就更加的困难了。当然没有人主张记忆代码可是你能保证你每次看到同样的代码会做同样的判断吗?

四月三日 阳光灿烂?哈哈,阴天。

Linux下的编译device driver的make文件时这样的,你会在/lib/modules/下找到一个源代码的目录,好像也是一个symbol link,但是有可能这里有不同的源代码,比如smp和。。。所以,用系统的shell uname -r可以获得当前的源码的名字,也就是这个目录的名字,然后在源代码的目录里面的/linux/下可以找到真正用于编译module的Makefile,所以你的makefile就是要去call这个真正的makefile当然你的module源码可能还是在你的pwd,所以,在pwd会生成一个wrapper的"源码文件名.mod.c",这个都不重要,重要的事最后的module的可执行码的文件名是“源码.ko”,你然后可以用系统的shell命令insmod xx.ko来install你的module。但是,在Xwindow下你看不到输出结果,所以你要用ctl+alt+F6来开一个console来执行,察看module的命令是lsmod,remove module的命令是rmmod name,但是这并不代表module已经注册为driver了,你要去自己注册,据说是register_chrdev这个返回一个major number,然后你可以向使用普通文件一样在/dev/下创建你自己的device,使用mknod /dev/name -c major minor,不过疑问是minor number起什么作用,没有自己玩过还是不知道,不过实在是没有精力来玩这些有意思的东西了。中午项增加一个“数目数”的函数,不过发现不适几分钟就能解决的问题就放弃了,也没有时间来检查“打劫”和“提劫”的问题了,这些超过了算法几何的范畴了。晚上要考试了,心里实在是没有底,听天由命吧。

四月四日 阳光灿烂?哈哈,阴天。

一个人有了什么期盼,自然就有了失落,仿佛冥冥之中早有决定,我甚至早就为自己找好了台阶,反正不会成功,索性连尝试都省略了。一个人的想法其实是非常的不准确的,set的查找不适合于range-search,至少查询point在triangle内不适合,最多能有一个上界而已,而我本来还把这个作为我的选择的理由,O(logn)是不对的,没有去试验实在是不能下结论。就此为止吧,TrianGO gogogo!

四月五日 阳光灿烂?昨晚下起了鹅毛大雪。

我觉得我现在还太沉不住气了,有些小事情还会睡不着,仿佛80年代的小孩子,有些幼稚可笑,无端端的幻想,心跳得太快浪费了很多能量,缩短很多小时的生命,太不值得了。

真是没用!仿佛九方皋相马把马的公母搞错一半,我想一般人都不会犯的错误。。。我想我需要的是睡眠,为什么总是在这个时候想起那个叫Melisa的美人鱼。

四月六日 阳光灿烂?昨晚下起了鹅毛大雪。

狐狸看着葡萄架上的葡萄说,葡萄太酸了,我的牙受不了。linux-device-driver如果需要让多个用户使用应该每一个进程或者open都有自己的file-pointer。

四月七日 阳光灿烂?昨晚下起了鹅毛大雪吗?

形势不适很好,我的预处理文件可能有很大的bug,需要在测试,这实在是有些像灾难,奋战!!!看到Becky的Edinburg的照片有一点点感触,因为在大英帝国全盛的时候装备的大炮其实和我在厦门海边看到的大清帝国部署的大炮完全没有两样,这说明什么?说明洋务运动可能比现在的共产党引进工作还要好一些,因为当时的确是引进了最先进的武器装备,比如北洋舰队的铁甲船是当时全亚洲最先进的,厦门以及清帝国全部的海防要地的岸防炮也是当时最先进的,可是结果呢?武器的确不是战争胜利的唯一保障,我很难想象今天的PLA不是如同当年的八旗兵一样的腐败,因为腐败并不分文武,正如《说岳全传》里面所谓的“文官爱财,武将怕死”,听说现在解放军所谓的高级干部下基层都不大敢坐直升机,因为不安全,如果一个带兵的人把自己降级到还不如平民阶层这个军队的确是岌岌可危,我敢说中日一旦开战结局可能比甲午海战还要惨烈。所以及早和日本讲和也是迫不得已的,中日之间的冲突的可能性远远大于中美之间,至于台湾只不过是一只会狂吠的哈巴狗而已,不大可能有什么真的作为。所以中日之间如果不在东海油气田有什么实际的让步未来很可能会有一场海上冲突,然后日本右翼借此机会重新武装自卫队争取成为所谓“正常国家”,如果任何一个有头脑的政治家看不到这张路线图那才叫“迂腐”。所谓冲突有时候并非可以避免,相反战争倒是有可能避免,因为国家之间的较量不需要你死我活一般的战争,比如英国和阿根廷之间的马岛战争,点到即止,中日之间的战争冲突应该是这样一种模式。

没有地方存文件了,就把TrianGO的slides放在这里吧

锐气挫钝是否要修整再战?只要我能够在两天之内拿下这个战役的胜利,就可以奠定全局的胜利!决定以牺牲两百万个脑细胞的代价争取在两天之内解决战斗,在第三天的白天写demo的slides。今天晚上发起外围战斗用bunny来做测试,明天发起总攻。在斯巴达的法律中士兵是不允许撤退和投降的!

四月八日 阳光灿烂?好像不是吧,依稀记得天上飘着很细小的雪粒子。

提前完成任务,连我自己也不相信我居然现在可以一次fix bug,这个bug有些教训在里面,我做了一个extensible hashtable,因为一个vertex的index可能会对应于多个index在多个octree node里面,因为1。一个vertex必须要复制到不同的octree node如果他所在的三角形跨越多个octree node的话,因为我的loader不会load所有的octree node的vertex到内存里,所以如果要显示那些三角形只能复制冗余数据;2。为什么index会不同,我已经强调过了,只有相对偏移的index才有意义如果独立的octree node的数据被load的话,因为数据是以单个octreenode为单位的,好像编译器里面的相对地址一样。所以,一个vertex对应于多个不同的index时候,我需要快速转换查找,所以做了一个简单的hashtable,每个hashtable的元素是一个链表,(当然这个hashtable仅仅是proprocessing的时候用的),一个教训就是不要急着把你的index转换,在中间过程尽量使用最原始的数据,因为我们有了hashtable可以随时转换,我就是在转的过程不一致导致了index混乱了,哈哈比较的难以查找,我已开始都有一点点不敢相信能够被我一次性的搞定,毕竟程序的逻辑有些复杂,尤其我比较记忆犹新的是文件的偏移超过signed int的范围的bug让我照得好辛苦,另外一个白痴级的问题是openGL里面所有的东西都有default,比如frustum volume也是一样。也许明天还可以把场景扩大一倍,但是现在保存一个版本还是比较好的,毕竟source-safe用的不是很熟练。out-of-core-rendering。

从故纸堆里挖掘出了我的GPUprogramming的作业,不保存一个版本以后说不定就永远忘了放在哪里了。

四月九日 阳光灿烂?没有大太阳。

挖呀挖,挖出了我一个快要被遗忘的project这是图形课的,当时由于种种原因没有把它贴出来,最近作outofcore-rendering的时候需要一个飞行控制才把它想起来,其实这是一个非常成功的作品,只是我不占主导地位就被打入了冷宫,这是不是太自私了?我对于我负责的飞行控制与射击,碰撞检测部分还是很自豪的。但是数据文件太大了,报告里面也是很多的图片,所以要看到完整的部分就只能去这里下载了

四月十一日 阳光灿烂!为什么我知道?因为下午的阳光从窗玻璃反射到我的脸上。

下午一觉醒来觉得很幸福因为阳光照得室内通明,我可爱的音箱里放着梁咏祺带着磁性的歌声。生活仿佛很美好,我甚至觉得这就是天堂里的又一天,为什么不是呢?一个人整天除了为柴米油盐发愁,为世界气候变暖担心,为中日再战担忧,为世界局势的变迁而困扰之外再没有什么烦恼难道不是很幸福的人吗?《追捕》里面很经典的台词就是一个白痴就是在幸福地生活着,(这是我杜撰)总之,我也不知道为什么有那么多的人为了吃饭而发愁,他们为什么不吃肉糜呢?这些人真笨。

四月十二日 阳光灿烂?下雨了。

真是白痴级的问题!一个简单的view-frustum-culling的算法我用得着用那些RG从网上download的代码呢?那些误人子弟的垃圾代码真是够混蛋的,当然谁让我偷懒呢!其实这个问题是无比的简单!第一,openGL的modelview,projection matrix和起来就是对每一个vertex的linear-transformation,最后这个点必须落在一个-1,1的空间,所以,很简单地你就去算是否这个点的最终位置是否在[-1,1]区间内。所以,优化的算法就是用那些vector去计算。今天又解决了另一个白痴级的问题,任何学过graphic的都知道BSP,可是当初我就没有搞懂究竟要怎样去按照painter's algorithm来画,现在明白了其实很简单,BSP并不是包打天下的实现定下顺序,因为这和眼睛的位置有关你怎么可能预测呢?所以每一次都要用当前的线段和眼睛的位置作比较,所谓线段的front,back根本就是为了数据结构来用的,和顺序无关。

春天来了,窗外淅淅沥沥地下着小雨,日记里也刚刚把雨写了下来,突然之间天窗上滴滴答答的雨声停了,天空飘起了鹅毛大雪,海鸥在浓密的大雪片里艰难地翱翔,气温很高,让人怀疑是不是夏天已经到了。是啊,春天来了,冬天还会远吗?

当Dr.M问我octree的leafnode太大的话有什么问题时候我并没有意识到它的用意,现在才明白他也许故意不像点醒我或者当时没有时间向我解释,总之我花了快一天时间才发现了这个不算是非常白痴的问题,首先我认为我是不太可能第一时间意识到的,所谓view-frustum-culling只有当你的box比view-volume要小很多的时候才行,否则你的box都可以包含view-volume会怎么样呢?其次网上那些所谓game-tutorial的范例code都有毛病,就是没有考虑floating-point-error,这是程序员的通病,包括我到现在也很难养成习惯考虑大整数的问题,现在的数量大约是12M的triangle,将来要用int64又要改,啊,饿死了,不管了。

最近觉得我的视野又有所提高吧,经常有种玩得就是心跳的感觉,那是因为不时的游走在系统的边缘的缘故,这常常需要完全不同的考虑。哈哈。。。自夸自擂一下。

四月十三日 阳光灿烂?做梦呢。

这个问题实在是有些不值一提,我观察到我的depth-func好像不起作用,怎么跳时都不对,后来在我每天最清醒地二十分钟的沉思中想到了使我试验的时候把far-plane,near-plane调到非常大和非常小由此产生了浮点数的错误。DR.M题是我使用Cohen-Sutherland的3D算法来解决boundingBox太大的问题,现在看来似乎不是那么急迫了因为那个原始的view-frustum-culling之所以当初不起作用是因为浮点数计算错误的问题,现在的error-rate似乎不是非常大吧。

四月十五日 阳光灿烂?做梦呢。

肚子饿了,总算完成了

四月十六日 阳光灿烂?好像又下雪了,是昨晚下的吧。

The configure file name is: server-config.wsdd and just add a parameter called: "scope" value "application".

改作业实在是很烦人的事情,尤其是读那些document,我感觉读code有时候还省些事情,至少容易懂一些。当然抱着学习的态度还是会有很多收获的,比如你可以学到很多关于webservice的冬冬,尽管我对于这个毫无兴趣。

我一直以来都认为欧洲人不大会拍电影,似乎除了好莱坞别的国家都没有电影特技,不过<Pan's Labyrnith>也许有一些值得注意的地方。电影的语言我至今不清楚,好像是西班牙语吧,是有一些超现实主义,大概是一个政府军上尉的可爱的女儿的故事,这是一个钟情神话的小精灵,现实实在是太残酷了,他的父亲是一个对待反抗组织毫不留情的残忍的军官,Too much blood has been spilled so easily. 而他的女儿在幻想与现实间的徘徊,当然那个所谓的天国国王的小女儿的砖石投胎只不过是为了让过于血腥的线是有些美好的幻想而已,也当然是为了最后悲剧的结局有一个幻想的圆满而已。小女孩一步步地找回返回天国的道路和他的父亲一步步地追杀革命党人士故事的两个平行的线索,有很多镜头实在是让人非常地震撼,比如树精的造型,帕金充满甲虫的树洞和大蟾蜍的交谈,最后大蟾蜍突出一个硕大的粘粘的液体球上面粘着钥匙,找好像是小公主的第一个拯救枯死树木的任务并取回打开密柜的钥匙,实际上当然是隐喻自然界的生物并不像人类一样彼此杀戮。第二个任务是从恶魔的盛筵旁的小鬼子里面取回神圣匕首,需要用到第一个任务里的金钥匙,那个无眼恶魔专吃婴儿,两个眼珠平常好像假牙一样收藏在盘子里,要用的时候再装在手掌心里,也许这是说战争中最大的受害者是儿童吧,听上去像是大赦国际的口吻。最后一个任务是Innocent Blood,要用第二个任务里拿到的金色匕首来祭祀小精灵的弟弟的,她弟弟的血就是InnocentBlood最后她不忍心用弟弟的血结果被随后赶来的她的父亲开枪打死,于是InnocentBlood就成了她自己的血,任务完成了小公主重新回到了天国功德圆满,其实有谁会信这一套鬼话呢?事实上整个电影中现实中她的父亲亲手杀死的革命党人不计其数,很多镜头要比怪诞的鬼怪造型更加让人可怖,比如她的母亲为了保护小公主把她的父亲嘴角割裂,他的父亲对着镜子自己用针线来缝伤口,以前看<Terminator>使机器人自己把眼珠子抠出来因为是机器人不觉得什么,现在看真人这样做实在是很难忍受。导演的主题是反对战争反对杀戮采用这样超现实的怪诞手法表现自己的感受吧当然主题很简单,大概就两三句话而已,This is a cruel world. There is no magic in this world for you or me or anybody else.

I still don't understand why mutex and thread behaves like this.

四月十七日 人间四月芳菲尽,蒙特利尔雪正急。

Now I see...

这个问题应该不算是非常白吃的问题吧,应该是理解力的问题,人这种动物常常以为自己看到的就是自己明白的,自己读过的就是自己了解的,至少我是这样的,如果我还没有被开除人籍的话,反正中国籍是被开除了,使我自己开除的,应为那个封建专制家买办官僚资本主义社会给我的全部印象就是人压迫人,人剥削人,人吃人。。。回到线程与mutex的议题,一个线程,(不论是主线程还是什么线程)在创建“匿名”mutex的时候可以声明所有权,这句话我读了n多边仿佛跟没有读一样,这就是一个人白吃的地方,什么叫做所有权?无非就是你已经免费不需要再用WaitForSingleObject的一样,同时MS善解人意的地方就是所有者可以连续再次wait这个本来设计的目的是线程自己不会自己死锁,因为你已经有了还想要,要了还想要,要了还想要,要了。。。够了!你有了就不可能有第二个,这就是mutex,如果你还想要,如果没有特别机制就会死(锁),其实,如果MS没有这个可人的设计我会第一时间发现我白吃的地方,但是为什么MS要这样用对待白吃的方法对待准白吃的程序员呢?结果准白吃的人还是犯了和白吃一样的错误,其结果和白吃一样,所以。。。总之这个问题实在是太初级了,我都不好意思用英文解释,否则丢人就丢了我现在祖国的人了,还是丢以前祖国的人比较好。总之要么创建者没有所有权大家一样在同一起跑线,要么你这个拥有者先得了,就是mutex已经non-signal了,这时候你不先release还要再去wait等于wait-counter有多加了一个别人当然永远都得不到,wait之后的release仿佛大贪官说我要还政于民一样无耻的欺骗。

读MSDN才明白我以前化了很多时间做的都是标准的东西,比如RunLengthEncoding应该使用现成的库来做,不是说自己做不好,因为也不是特别复杂,BC的地方时不在本机调试测试却跑到cluster上浪费精力,这就是BC。

在这个世界上只有两种人,一种人玩程序,另一种人被程序玩。如果你喜欢比较粗俗的说法可以向王朔对待文学的态度一样把这个“玩”字换成你喜欢的动词,比如“操”,“程序”换成文学。

很惊险的一幕!我用partitionMagic7区增加一个partition,不小心让他改正了所谓的磁盘文件,因为他说的信誓旦旦我就相信了,结果可能是把Fedora的双操作系统的启动文件破坏了,结果我一个操作系统也进不了了,先尝试恢复Fedora,它比较笨,不答应,后来尝试windowsXP,结果说是找到了旧的windows目录要覆盖,吓得我赶紧退出,正不知所措之际,居然重新启动就回来了,大概是把那个原本的最早的windows的loadstrap恢复了吧。总之那种古老的磁盘工具是千万不要再用了,太可怕了。

四月十八日 人间四月芳菲尽,蒙特利尔花不开。

美国这个社会就是世界的橱窗,VT的枪击案当然是一个惨案,不过仅仅是因为发生在美国的大学里就吸引了全世界的眼光,可是整个星球上无时无刻不在发生着笔者还要多得多,严重得多的惨案,比如据说巴格达今天又死了大约三四百人。以前看到国内网络上说德国人,日本人在丢弃罐头盒之前要清洗,对此国人非常的惊诧于羡慕,其实我现在也是这样,原因很简单说穿了一点不奇怪,这里每个星期只有一天才是回收recycle的,你要自己把这些瓶瓶罐罐纸盒子之类的方在一个大的回收袋里面,如果你不洗干净方一个星期在家里你再看看。这件是很难吗?关键是很多的配套制度,关键是一个社会已经富裕到了每个人天天发愁吃什么的时候,我并不是说我有多富,恰恰相反我是赤贫,可是基本的生活保障已经让我有每天吃什么的烦恼了,当然那些说美国人天天吃垃圾食品的国人也是误会了,因为只有穷人和上班族没时间才没办法吃那些东西,真正有时间有钱的人才不会向国内那样崇拜洋快餐呢。我有时间可是没有钱所以也不吃那些东西。

搞了一个上午才参照着同学们的作业做了一个最简单的mutex,可使用signal做测试的时候发现那个sigaction用的还是不对,还不是safe-signal因为semop会被signal打断,因该在那里屏蔽呢?吃完午饭我就什么都不想干了,这就是human,就凭这一点我就配被称作一个人。

VC6在头文件里面定义的类的成员函数的实现在class的prototype里面时不承认的,这个可能和原来的模板类的问题是一样的。

一般的腐儒又会跳出来倡导在美国社会禁枪,这简直就是天方夜谭,完全是天真幼稚可笑,两亿支枪怎么禁?禁来禁去只会让善良的人更加得没有安全感,伊拉克是不是比美国更应该禁枪?可能吗?

四月十九日 人间四月芳菲尽,蒙特利尔花不开。

我原本认为IPC的key不能冲突,现在看来同样的key对于shm或者sem等不同的对象是可以的,也许就是说不同的IPC类别是不同的队列或者数组吧,因为所谓的id都是类似于file-descriptor之类的index。另一个有意思的发现就是我原来对于semop的操作认识错误,对于正数值,semop总是通过,对于0除非是0否则不通过,对于负数除非相减的结果大于0否则不通过。dreamworks出品必属精品,《硫磺岛家书》还是一部非常不错的电影的,美国人似乎从来就不像中国人一样担心什么人本军国主义死灰复燃,当然这句话是不对的,因为美国人驻扎着军队在日本,应该说美国人比谁都担心吧,不过美国人并不怕因为他们有能力打败日本,只是不希望这么做,中国人的步子心才导致对于日本的恐惧,实际上现在的中国仇恨日本只是内心的恐惧,因为自愧弗如的感觉,一个领土这么小完全无资源得到过能够这么的强大是世界上所有国民都为之敬畏的。

你知道为什么这样的code不对呢?对于semop传入一个sembuf的数组,对于同一个semaphore采用两个动作,一个是0,另一个是-1,这样的code在做什么?是一个pass-and-setback就是说这个是没有用的,因为你不应该把两个动作同时作,你要分别做才能有critical-section,而且,这连个动作的先后顺序决定了是否通过,比如0在前,-1在后就死锁,-1在前0在后总是可以在"release"的一刹那通过。这个问题实在是太不好解释了。总之那些小孩从网上下在这样的code是自欺欺人的。

四月二十日 人间四月芳菲尽,蒙特利尔花不开。

花了好几天时间重新安装Linux目的只有一个就是mount一个fat32的分区以便windows-linux共享,/etc/fstat的配置如下:/dev/hda6\t\t/mnt/exchange\t\tumask=000\t0 0如果你要立即就看到那么就mount /mnt/exchange,当然我assume你已经用windows下工具创建了hda6的fat32partition。找到一片古老的论文关于大meshdata的问题的,觉得我的方法不见得没有可取之处,也许我可以试着写一篇论文什么的?

关于VT惨案我看到很多评论觉得很可笑,因为很多人听到说枪手是韩国人不是当初报道的中国留学生顿时松了一口气,这有必要吗?难道说美国主流社会会这样是非不分地把这件事和一个国家联系起来吗?这是不是以小人之心度君子之腹?难道大家不明白这只不过是一个个例,他个人的问题?难道中国没有精神分裂,没有妄想狂?难道大家不知道中国的残障人口世界第一吗?难道留美学生人人都是心理正常的吗?

四月二十二日 人间四月芳菲尽,蒙特利尔花不开。

乾坤一跃,蒙特利尔一下子从冬天跳进了夏天。现在就是这里的黄金季节。昨天终于把积压了两个月的衣服送到洗衣房了,因为我最后一双干净袜子就在我的脚上了,凭长廊像普通人一样浪费了无数的时间从来没有心疼过,结果在洗衣房的一个小时却要装模作样带一本书去看,带什么书呢?这是一个颇费思量的问题,最后选了一本这个学期几乎没有怎么看的教材《realtime rendering》仿佛是对于一个行将入土地人的最后的追忆,因为我几乎很少再翻我的课本除非遇到了问题,结果我的一个重大发现就是,图形里的任何算法对于我的催眠效果都要好过任何牌子的法国红葡萄酒以及任何无聊的游戏或者电影,以后如果我想睡觉的话就翻一翻我的课本吧。今天为了夏天的到来决定去买一双新跑鞋来鼓励运动,挑了一双最便宜的Nike,原因是NIKE至少可以穿上三年以上,所以80刀还是划算的,再者说了这个价钱和国内是一样的。顺便又买了一袋子日本大米,中国产的大米就是不如日本的好吃。

Ignorance is power! 无知者无畏!你懂得越多你就越不知所措,Knowledge is power!有时候也是对的,可是那都是对于那些真正懂得运用知识的人,也就是真正理解知识的人而言的,所以从概率上讲绝大多数情况还是无知的多,一星半点的知识反而害了你。所以无知者无畏。终于下载了一个paragon-partition-management把我那台电脑分区成功了,现在linux与window共享一个fat32的分区,接下来要用nfs来共享linux文件系统,同时试验是否那个licence可以在linux下使用,但愿成功,否则我也不知道怎么办了。

四月二十三日 人间四月芳菲尽,蒙特利尔花不开。

勤奋是一个人成功的最大保证,我最缺乏的就是这个,从高中毕业以后我就怕辛苦,总是偷懒直到今天也是一样,不论下了多大的决心去读paper,最后总是不了了之。《古钿任三郎》里最漂亮的女杀手是那个牙科医生,也可以说是最有日本女人优雅气质的了,最令人称赞的应该是那个插花学校校长了,长的不算很漂亮但是最有味道,使头脑与意志的完美结合,据说也是观众评选的最佳杀手。

想要自己编译一个现成的jpeg的苦却折腾了快一天实在是白吃级的错误,其中的macro屏蔽了一部分函数我却总以为是自己什么地方搞错了。

四月二十五日 人间四月芳菲尽,蒙特利尔花不开。

花了两三天时间作了一大堆无用功,因为我想玩一下jpeg,所以满世界地找带源码的库,很是出乎我的意料,很难找到,现在才明白jpeg是由专利的,大体上只有这么几种可用的。1。IJG也就是一个类似开源的组织,有源码,但是很不好用因为只能转为文件,我后来想原因是这样的,这个东西很早就出来了,那个时候内存太小只有文件到文件。2。据说intel有一些库可以下载,好不容易才找到,看了一下应该也是从IJG改过来的,所以以前下载没限制,现在改进的就有可能要收钱了,至少给你的原文件总是丢三落四的。3。windows的oleloadpicture可以以流的形式load然后依靠句柄在windows的client-area来画,这个方式我不是特别感兴趣,应为你要用到太多的windows机制。4。CxImage是一个意大利人写的库,实际上我猜想就是把IJG改造成C++用泪来包装,当然这个工作并不容易,因为如果要写的通用是非常不简单的,我在编译dll的时候总是遇到这样那样的macro的问题,现在学了一招,如果要看某个macro是否被define了,就在那里故意声明一个#error。总的来说这个库是你能找到的有源码的最好用的了,但是我觉得还是不方便,IJG虽然也可以编译但是只能是简单的文件到文件。不过我却找不到bmp的数据指针,看来有时被包起来了,折腾了一天最后竟然又回到了bmp,最后发现还是只有glaux这个库可以用,因为从bit转为byte-RGB也是一件啰嗦的事情。所以简论就是白白浪费时间,对了drawpixels的时候要急得先lgPixelStore我也不知道为什么要把unpack的alignment设定为1,反正work。

四月二十六日 人间四月芳菲尽,蒙特利尔花不开。

下载了Carpenter的经典专辑来听,很是怀念从前读大学的岁月虽然那时一生中最痛苦的经历,我可以想象年轻人在那个时候的内心的矛盾,很多人其实都是忍受不了那种青春岁月的煎熬的,一方面内心有很多幻想一方面总是惴惴不安。那个韩国小孩子开枪杀人其实不过是有些极端罢了。那个时候其实我很讨厌的同屋其实应该是我很嫉妒有很无奈,我这种人原本不是学语言的料,却让我学英语,想想看我在厦门待了二十年也没有学会当地的土话,那个小孩其实口语很好,英文歌唱的字正腔圆,我始终很努力大量阅读听音,结果完全不得法,实在是很沮丧,原本也许我去学一些比如电子工程之类的很笨的课程也许更好,最好是去写汇编,那种东西对我来说更合适吧。哈哈,想想看是事实上我总是用常人所谓没做过的总是最好的,实际上我写过的汇编不超过两千行,却始终觉得自己很合适。今天有些无所事事,早上改project,直前躺在床上想我的新的计划,还是写下来吧,不然会忘记的。1。不要在整合为一个大文件作输入,那太傻了,简直是overkill,根本不一定会用到external-sorting,因为现在的输入文件都可以变成一个个的小文件,就算是raw-unindexed的mesh也可以先于处理微笑文件,这样所有的index都可以使相对地址,所以不再有64位整数的要求。2。octree可以不设定中心点为root,为什么一定要呢?这又不是binary-tree为什么要balanced呢?所以我的octree要支持至少split,是否要支持merge要看我是否支持remove,如果从来都不去除对象,只需要添加,那么也不一定要支持merge,这样可以不断地添加新的object到octree里面,唯一麻烦的地方是那些span-across-leaf-node的triangle,他们的vertex如果被拷贝的话,在split的时候应该始终放在所谓repeated vertex部分或者说最后,这样按照那片paper的term可以成为external-vertex,其他的vertex可以成为internal-vertex表示他们的坐标实在leafnode的boundingbox的。3。split的时候,分为octreenode存在于不存在两种情况,不存在的时候好像一个原来简化的external-sorting,(这一点我还在犹豫,是否可以避免)如果octreenode存在的时候我必须用两者的vertex数量之何来决定是否需要split。这里的细节还有待考虑。总之这样octree的数量限制基本上不存在了,用32位局部相对地址的page-system可以表示几乎无限的mesh表达mesh。(我睡着了。)

四月二十八日 人间四月芳菲尽,蒙特利尔花不开。

多线程的错误还是解决不了,动态自增长的octree-array是解决了,这个本来就很简单,一个object如果在调用的同时object自身会relocate的话,你就不能使用它的memberdata,那么这个牵涉到的函数必须是static的,这是一个基本常识,因为c++与c唯一主要的区别就在于那个this指针。看阮次山评论台湾不接受奥运圣火进入台湾的事情很痛快淋漓,who cares?有时候觉得阿拉伯是些憨伯伯,实际上台把子更土得掉渣,真是不知自己有多少斤两,的确吃老本吃不了十年的,迟早有一天人民会清醒地回忆当初是不是比大陆文革还要愚昧,所谓的物极必反,矫枉过正都是有代价的。不过呢,民进党代表了台湾的大多数人口,所以2008还是会继续执政,这就是少数服从多数,代表大多数人利益,代表台湾普遍价值观,代表台湾社会生活的主流,即所谓“三个代表”。

四月三十日 乍暖还寒

又被无理头的问题折磨了一天,最后我快疯了,拿出我的最后的杀手锏--剃头,因为这可以让我剔出头发长见识短的嫌疑,可是这短短一百行不到的code的问题还是解决不了,最后我只有放弃改用整片内存拷贝,实在是不可思议。晚上又第n+1次把一锅牛肉烧成了黑炭,看上去实在可惜,只好在黑炭堆里跳出一些还不是完全碳化的牛肉来吃。chkdsk如果爆出错误说是另一个程序在使用,你或者用dismount的选项/v,或者就是设定下一次执行,然后关机重起。

五月一日 乍暖还寒, 突然变得很冷

给办公室里的印度小毛孩子除了几道智力测验题,其中就有著名的zebra-puzzle,我不是说这个小孩子幼稚,只是很天真很naive,年轻人嘛,不知天高地厚离开了internet就什么都不会了。小孩子居然敢说在连三个小时内解决这个问题,实在是有些夸张,我知道有人能够很快地解决但是运气的成分不少,反正我是离开电脑就不会借这类问题的,花了一个下午写程序“又一次”找出了答案。

五月三日 乍暖还寒, 突然变得很冷

我的project写不大的原因就在于我是典型的中国式建设的风格,边设计边施工边改造。我现在决定采用“相对地址”方式来存储于是原来很多的设想统统作废,比如我最早曾经希望数据能够尽量“连成片”也就是说线性alignment,同时希望render的时候能够尽量把data在内存里面也象文件里面一样alignmnet,但是这已经被否定了,因为和globalindex的道理一样不适合插入。有paper用globalindex但是他们呢必须预留出很多的index-hole,而且用64位整数实在是一个太大的浪费。另一个计划是vertex与face同步分拆进子节点,这个好处或者说不得已的原因是有可能要把原本的子节点包括进去,所以hashtable应该变成每个“分拆函数”内部使用?(这个对吗?我想不清楚才决定写下来。嗯,我想是这样的,hashtable的作用已经变成了一次性的仅仅把face-index作修整然后把修正的faceindex作参数传入。听凤凰卫视结果忘了我要写什么了,好像有个重要问题忘了,是什么呢?好像是我担心递归函数的临时变量声明太多我担心堆栈溢出的问题,这似乎有一点杞人忧天,我想STL内部都是动态分配内存应该不会有什么大问题吧,倒是我现在完全忽略在preprocess过程中的内存考虑了。)>>>>Idiot, check your code and see what you are doing before. Such a simple question!

听“阮次山”评论马英九觉得非常的贴切,一个绣花枕头中看不中用,扭扭捏捏不堪大用,经济是外行最多就是一个只能四平八稳坐办公室的庸吏而已,这一点在台湾除了不通世事的阿公阿妈和少男少女以及头发比较长的一类都明白,所以民进党虽然看上去不好实际上要比国民党好的多,至少台还是代表了台湾的下层阶级的利益,最起码选举的时候还可以给老百姓发少酒肉粽之类的总比国民党空谈什么亚太营运中心的口号强得多,的确这个口号和共产党的三个代表一样是TMD的睁眼说瞎话,什么叫做资金可以开放技术不能开放简直是自欺欺人一样,实际上现在的技术人工成本的差距远大于蓝领工人的工资差距。可见马英九完全是一个庸才,全无主见,更主要的是他的确如同李登辉一针见血的所指出的那样心里总是记挂着权力。当然我更加的讨厌这个老杂毛,不过老辣还是让人不得不佩服,所以不以人废言。

看李小龙的《梦龙过江》甚是好看,而且香港片里的女主角从来没有一个长得这么漂亮的,哈哈。查了一下google原来女演员叫做苗可秀。

五月四日 乍暖还寒, 突然变得很冷

中国换了外交部长不知是不是想要收敛锋芒?我有一个漂亮的钥匙串,这是一个有加拿大的标志和名字的椭圆形牌子,每次看到都会想到他的来历,那是一个冬天的早上我经过Atwater的mall的门口被一个街头漫步老头叫住问我有没有零钱,照理我一般是来者不拒,当然我还做不到满脸堆笑热情洋溢,致使无可奈何的问要多少钱,他说一个quater,我就给了一个,然后她给了我这个钥匙串我当时喜出望外连声道谢,老头则很诚恳地说不要谢,于是我系怀感激地回到家对这个意外的收获抚玩不已。哈哈不知道这是不是人们常说的心存感念的意思。

如果算法确定了编码的确可以做到机械,可是这个前提是你要搞清楚算法。

五月七日 春寒料峭

“惶恐滩前说惶恐,零丁洋里叹零丁。”不知道为什么这两句诗从睡梦里醒来总在我的脑子里萦绕不去,不知道为什么惶恐,也不知道为什么今天感叹零丁?前天买了一个吧台桌子又接着买了一个面包机,不知道是买桌子是为了放面包机,还是买完了桌子才发现没有东西可放再去买面包机,抑或这两件事完全无关,总值在国内着称之为“面子工程”,面子的面和面粉的面是一字。昨天去Mr.W家里吃肉夹馍,天气非常的好,不是lovely就是beautiful,总之走在sherbrook大街上就是如沐春风,其实就是春风不用“如”字了。路上路过一个小书店忍不住又买了一本《达尔文和贝戈尔号》这个题目是我一直想要了解的,电影电视找不到只好买了一本看图识字将来度假的时候看,15个dollar还是蛮合算的。

遇到一个有意思的问题。下载到了寻找多时的千百惠的一张专辑《每一次想你的时候》,不过我记得从前买的CD的标题不是这样,不过anyway,的确很喜欢这张专辑上的很多歌,很难找到的。晚饭前碰到从前同学地太太,被邀请参加家宴,哈哈蹭了一顿饭。

记得昨天在回家的路上常常萦绕的一个问题就是“自由的代价”。年轻的时候并没有多少体会,依稀记得当时买正版游戏做收藏,不少游戏其实不会玩也不太喜欢玩,其中有一部游戏仅仅是喜欢她的名字就买了好像还是一百多块呢,就是《自由的代价》,他的答案叫做:The price of freedom is to keep at alert forever.如今已经再也没有少年不识愁滋味为赋新词强说愁的资本了,只能无奈地对自己说我知道自由的代价,不过我不想告诉你,因为我知道你不会愿意付出这种代价的。

五月九日 天气渐渐地变得暖和了

好累好饿啊。一个无比简单的错误让我费了将近五个小时来追踪,vector如果你越界访问,他居然不报错,我被我的白吃错误折磨得身心疲惫,现在才算正式开始追踪预料中的index错误,之前简直是浪费时间。头晕。。。

温家宝我个人认为原本就是一个看守内阁的角色,这么说是因为这个人全无个性,除了没有明显的优点以外再也想不出来他有什么值得称道的。遇到今天中国金融危机毫无作为,也无任何办法,犹豫不决,胆战心惊,迟早这场股市的灾难要导致中国社会经济的总危机的导火索。难道中国的经济崩溃会在2008奥运会结束之前就到来了?想想看13亿人有一亿股民者还不算是泡沫哪还有什么是泡沫?只不过共产党内忧外患宁可希望撑死也不想饿死,可是两种死法结果有好坏之分吗?

马英九也是一个绣花枕头,明明知道王金平不是好的搭档,那么就明说,难道这点破例都没有还想什么当什么政治领导人?就凭着一点任何一个有头脑的选民都不会投票给这个good-for-nothing。清廉有什么了不起的?除了不贪不渎难道就是一个合格的领袖?真是笑话?在西方制度健全前提下,领导人更像一个守金库看门狗,人民不需要他有什么大的作为,可是在东亚发展中地区领导的作用远远不是这样。

五月十日 天气渐渐地变得暖和了

终于看到了期盼已久的《Mr.Bean's Holiday》,真是funny,看来又要项预算委员会申请一笔funding来购买DVD了,影片中的法国女演员同样的漂亮,好像苏菲玛索一样(我知道这个名字还要感谢Mr.Z的大力推荐,在我唯一看过她的片子中我了解到法国的女演员的魅力在裙子内外是一致的,同样她们对于衣服的遮掩功能有着客观唯物的见解)。不过大多数人知道的Mr.Bean的影片并不包括“Dr.Bean”, 如果你看过《豆豆博士》的话你会知道这是相似的主题,艺术家不过是白吃在及其偶然的情况下的无心之作,这就是艺术的真谛。再借用加拿大著名的Uncle Red的名言,如果艺术是如你我知被所能制作的话那就不是艺术,所谓《围城》里说的精辟,江湖术士,求神卜卦,往往在梦呓之间常常能一语道破天机,所以就请相信我只不过是痴人说梦而已。基本上在这个杂七杂八的博客上想要表达的意思就是这个,如果你buy了我这个theory我就在大度一下免费总送一句江湖警句:天机不可泄漏,日后必有应验。

我始终认为debug的过程和detective办案的过程非常地相似,首先如古钿任三郎一样从极细小的不同寻常处认定可能存在bug,然后从蛛丝马迹中推理拍出一个个的可能,当所有的可能都被排除了,那么要么你遗漏了什么可能,要么你的排除过程出现了错误,以上两种可能至少有一个成立。比较蹩脚的真谈会同时发生两个可能,这也许会让你感到及其的困惑,所以尽量保证唯一性实在computer-science领域生存的首要任务。我可能已经快要发现了我的错误,没有做任何的index变换都会出错这就是我的问题之所在,明天早上解决好吗?我很饿了。

五月十二日 天气渐渐地变得暖和了

OpenGL里面的一些迷惑人的事情实在是让我头疼,我画了两个三角形,一个显示一个不显示,这是怎么回事呢?而且第一遍看不到,只有第二遍才看到。我说给Dr.M听,他一定在心里暗自发笑,这是一定的,你想他说的多明确,OpenGL是一个自动机,你怎么可以看到市井小人的所谓“鬼魅”,凡事都是由原因的,中国人表面上都这么说实际都不这样认为。

春光明媚,我决定爬山去,顺便在一次尝试做面包,这一次看清楚了tablespoon是大的,teaspoon是小的,盐少加1/3,糖业少加1/3,再试验一次。突然想到我可以上皇家上看那本刚买的达尔文的书,然后回来吃自己做的面包。临出门前突然从一个很久没有打开的储藏箱里面找到了久违的凉鞋,又从一个很久没有用的书包里面找到了久违的潜水镜,简直就像RPG游戏里面寻宝的过程。

五月十四日 天气渐渐地变得暖和了

你以为你看到了,实际上你看到的并不是你想象中的。人的视觉系统的复杂远远超过简单的显示系统,因为没有“翻译”的“看”和死人的目光没有多少区别,所以“看”和“看到”之间的差别何止千里?而“看到”与“真的看到”的差别也并非道里可计也。我以为我的问题处在那个相对简单的没有index变换的地方,实际上这种问题是很容易解决的,我拖了两三天时间花了半小时写了一个简单的测试就看到了我的愚蠢,一个人重复犯同样的错误这就是愚蠢,在glDrawElement里面的index-array是以多少个integer来计数的我却屡屡第一多少组来计数,也许是因为前面的indexpointer,colorpointer,normalpointer函数统统是以组来计数的延续吧,这就是思维的惯性,不过聊以安慰的是我的思维有一点点的可靠性,也就是说同样的情况我基本上都会采取同样的对策,甚至变量命名都可能一样,这不好吗?犯的错误当然也是一样。另一个我怀疑的问题是光影的问题,也许那些黑斑是由于光源在极其远的缘故?如果是这样就好了。吃完午饭再追踪index的错误吧,这是一个hardcase。

在魁北克城的停车场里读一读达尔文的简介也是一种享受,作者开宗明义地指出这个伟人的伟大业绩来源于一系列的偶然,这种坚韧和一根链条都处在断与不断的边缘,仿佛《蝴蝶效应》里面任何一个微小的变化都回全盘改变人生的旅途,可是这一切的偶然之间似乎又有着某种必然,仿佛《时间机器》里任何的干涉改变了当事人的某个人生事件却难以令人想象地在另一个相应产生的新事件里的依旧实现,让你不禁与时间穿梭人发出同样的惊叹:难道冥冥之间真有宿命?

看到一个神奇的东西,可以在xp里面强行改变密码,用net user administrator **。这里的**是“shift8”。

五月十六日 天气渐渐地变得暖和了,可是突然下雨了,又变得很冷

花了半个多小时卸载驱动,安装驱动结果才发现我的scanner仅仅是连接线松了,类似的问题以前也有过我还当时以为坏了呢,想想看这就是电脑的问题,或者说人脑的问题,当我绝对执著地反反复复对着那不超过一百行代码进行了将近一天的debug,就是从来也没有想到是显示部分的问题,盲点,实际上是认识的误区。

五月十九日 今天是个好天气

Anthony组织去tremblant的活动还是很成功的,天气非常好,露天烧烤东西仿佛也变成天然的。回来很累但是挺好,不过脚底板居然磨出血泡了,看来缺乏训练,以后要经常徒步旅行。看《李敖有话说》他说他有很多偏见,我同意,图书馆学是一门学问,师范逻辑当然更是学问,他是学文科的有偏见是可以理解的。晚上要想一想计划书了。

五月二十二日 今天是个好天气

面包居然做成了酒酿这简直是天方夜谭,这个面包机的程序真是离谱得很!有人向我索求2-3tree的代码,我有些无言以对,照理说只要我有时间我应该会欣欣然的去写,只是我的Priority现在不允许。下定决心在这个星期内完成所有准备工作,今天完成double-precision的测试工作,不能再拖延了。昨天讨论了一些算法比较有意思,就是在系统内存极少的情况下的极端算法,这是有点另类的问题,就是以时间来换空间,慢不要紧关键是减少内存的分配需求,比如用排序来代替某些hash的算法。

每次去实验室或者图书馆我就会睡着,回到家里我又睡不着。

蒙特利尔的樱花开了,开得那么灿烂以至于我这个对于花草一向不感兴趣的人也为之有些倾倒,樱花是这样一种花,灿烂的日子是那么的短暂,而盛开之时又是那么的全身心投入,枝叶的每一寸都是花簇,仿佛用尽了心力来表达自己的激情,走在低垂的花枝中你的眼前鼻端都是绚烂的花瓣,也不知道是我在花海中徜徉还是花朵在我的心海中荡漾。配合着娓娓动听的西班牙古典吉他你的心弦都会被飘飘洒洒坠落的花瓣轻轻拨动,漂浮的脚步不知道是怕踩着了落英满地还是我的心房被暗暗袭来的花气熏陶成酥酥然,和弦的激越颤动下几片落花的缤纷让你稍嫌惋惜,转瞬间流水般的音律让脚步轻飘着滑过花海。。。

五月二十四日 今天是个好天气

关于VFC的算法我总是忘记,反反复复看啦好几遍都是当时明白了,或者自以为明白了事后又忘记了,的确我现在都甚至忘记了我是否有实现过简化的cohen-sutherland的算法。平面方程是这样的,n(dot)(x-p)=0,这里n是normal,即和平面垂直的向量,p是平面上的一点,则对于人以不同于p的点x如果满足方程就属于平面。变形后n(dot)x - n(dot)p=0就是说n(dot)p是一个常数如果n是Normalized的他就是平面到原点的距离,为什么呢?你把点p当作是从原点出发的向量就明白了。关于transformed view frustum可以这样记忆,首先要获得matrix,然后判断输入的点p是否在frustum内就是判断matrix*v是否在边界在(-1,1)之间的cube,当然这是OpenGL的规定,也就是left: -w'<x' ==>  -v*row4<v*row1 ==> 0< v*(row1+row4) 当然这里的*要理解为dot,这里的row1,row4就是matrix的row。同时因为openGL里面使用的是column matrix所以,这里的row变成了column。(很绕是不是?反正我对于这些问题是想了好久才明白,后来不久又忘记了。比如为什么openGL要使用column,查我以前的笔记吧。)

五月二十五日 今天是个好天气,我的带天窗的小屋和烤箱一样热

混乱了快一天才有了一点点地眉目,其实我已开始就有95%的理由认为这是一个内存不足的问题,但是真正找到证据却不容易,现在我发现了一个线索也就是一个常识,STL对于内存无法分配的错误不做检查,就如同对于越界不检查一样。另一个明天要做的事情就是在和W争论后的想法,exception在c++里面是有人throw才可以捕捉,但是纯粹的c使用另外的机制,微软有__try,这个应该可以捕捉错误吧。

五月二十六日 今天是个好天气,我的带天窗的小屋和烤箱一样热

日本有两棵树,一棵是田中芳树,一棵是春上村树,我都没有看过。

我觉得W的花很有道理,看水平比你高的人的代码你很可能看不太懂,或者不明白其为什么好,看水品比你低的人的代码很可能你大多数时候是以批判的态度来看未必会认同,所以,基本上不用看别人的代码,哈哈。。。你会发现我漏掉了水平相同这一条,在STL里面标准的“相等”使用!<>来实现的。

五月二十七日 今天突然变冷了,提醒你这里不是热带

基本上我对于exception的理解是错误的,SEH的确不同于C++的exception,但并不等于C++的exception不能捕捉exception,比如我想windows的机制就是一个类似于"raise"的抛出错误方法,try-catch(...)可以捕捉任何类型的exception但是怎样获得错误代码就还是要利用SEH做一个wrapper,MSDN里面有这样的例子,不过对我来说用途不大,移植性的问题以后再考虑吧。买了一辆超级的自行车,从此开始进行系统训练。

五月二十八日 今天突然变冷了,提醒你这里不是热带

vector可以使用内部的指针来输出数据,比如begin当作数组头地址,这个不算hacking因为代码就是这样的,和平台无关。不过set之类的还不知道,应该是不可以因为是一个tree的实现代码太复杂了。为什么要关心这些?使用网络传输需要啊。早上再次骑自行车,今天只上山一次,还好回来的时候一锅牛肉还没有变成焦炭。

所谓《TLS》就是三个女人和两个男人的恋爱故事,最后两个女人得到了他们心仪的男人,而另一个女人出走海外不知所终。

所谓日剧就是给资本主义赤裸裸的金钱关系披上一层温情脉脉的外衣。

五月三十日 今天突然变冷了,提醒你这里不是热带

昨天经委员会决定在七月中举行骑车环魁北克行动,因此从现在开始进行系统训练,本周日要进行环蒙特利尔活动。

五月三十一日 今天突然变冷了,提醒你这里不是热带

看到厦门要建设一个所谓的px项目我就感到义愤填膺,这些地方官员肯定又拿了不少的好处答应“陈由豪”这个家伙,我不想说台湾当局通缉的就一定是百分之一百的恶棍,可是商人唯利是图的天性让人相信他绝不什么好东西,至少是一个不择手段的投机家。

问:你彻底成了加拿大人民了? 这是一次国人的绝地反击!

是啊,我在我来到这里的三年后的第一天就义无反顾地递交了公民申请全心全意地把加拿大当作我的祖国了,基本上我对于共产政权是深恶痛绝的,可以说公有制是一切腐败的源头,想想看把大家的财富交给少数人支配不产生腐败天理不容啊。当然私有制也是犯罪的根源,但是犯罪可以让法律去制裁,而公有制的贪腐确实收到制度保护的,这就是作为中国人的悲哀,所以,我坚决地在第一时间就放弃了中国国籍。我常说所谓的“流氓国家”的人民并非流氓,但是流氓政府里面的官员却个个都是流氓,所谓“人民代表大会制度”是一个全世界的民主笑话,把一些所谓的社会名流请来每年装点门面开一个星期的会,这些人都不是职业的政治家,都是一些业余的代表,在不到一个星期内去审议什么议案这不是天大的笑话吗?这不是所谓的民主橱窗是什么?资本主义是金钱政治,所谓的“社会主义民主”则根本就没有,还是封建帝王制度。

美国的民主也不是一蹴而就的也是人民自发起来争取的,人民的权力只能人民自己起来维护,正如“共产国际”所说的“从来没有什么救世主,只有自己起来革命斗争”(杜撰的),现在的所谓共产党根本就是一个挂羊头卖狗肉的封建王朝,当初找了一个注意号召人民起来造反,成为他们改朝换代的工具,然后就继续骑在人民头上作威作福。(这些都是这个政党掌握争取以前形容自己的政敌的术语,今天用在他们自己身上感觉特别贴切。)所谓人权运动在六十年代开始的时候也是从反战环保这些人民最基本的切身利益话题开始的,我相信我们正处在一个变革的门槛,一个革命的大时代,一个风起云涌的年代的开始,请继续奋勇向前。

我继续在这里遥祝革命同志胜利成功,我则继续坚持敌后斗争,加拿大也是一个对敌斗争最前沿,鄙人决定从现在开始努力锻炼身体位长期打游击作物质与身体上的准备。

谨再次祝各位六一儿童节快乐!

加拿大马克思列宁党蒙特利尔支部党外成员(长期拒绝交党费一次也没有参加组织生活,一次也没有参加投票。哈哈。)
MARXIST-LENINIST
PARTY OF CANADA
(请注意不是加拿大共产党http://www.communist-party.ca/ 很有意思地,我看到这个政党的2007的演说只提到世界上仅有古巴,玻利维亚还在继续共产理想。)

http://www.cpcml.ca/

《时效警察》的女主角很可爱,属于那种故意将美丽掩盖的女人。

一个人缺少什么就向往什么,一个社会也是这样吧。日本人喜欢拍侦探片是因为缺少犯罪吗?比如看过英国人拍的《热血神探》把英国的警察挖苦得一塌糊涂是因为英国的警察廉洁高效的让公众都受不了了以至于希望他们能够向中国的警察一样稍微的腐败一些,类似的中国人根本不肯去看这类片子,我们当然是要看什么清官,明君之类的东西,因为我们缺的就是这个。我经常喜欢看《糊涂侦探》《憨豆博士》之类无比傻的东西因为我也缺这个。(哈哈。。。饶了一大圈还是这个自夸的主题。)

六月一日 今天下雨了

meeting中感觉Dr.M的分析真是一针见血入木三分,哎,实际上很多时候我真是滥到家了,研究课题的基本概念总是没有仔细地阅读过。一觉醒来不觉红日西沉,能否尽快完成coding呢?!

看到六一节厦门游行抗议重污染化工投资项目的视频,感觉人民在觉醒,迟早有一天会认识到这个所谓的人民的政党实际上是世界上仅存的几个独裁封建统治而已。

六月二日 今天天气很好,早上去爬山,晚上准备参加环城自行车

晚上骑车回来一路上走过st.Laurant,只见美女如云,蒙特利尔真是一个不夜城。听有一点累得,毕竟早上跑步,晚上骑车20km还是有一点点锻炼效果的。明天还要骑车50km环城呢。睡觉吧。

六月三日 今天天气很好,早上去参加万人环城自行车活动了

骑车50公里还是有一点点累得,至少我的手臂被晒红了,以后一定要擦防晒霜了,虽然我以前一直认为这是女人的专用品,不过将来骑车半个月的话是一定的,索性先买了再说。其中的感受原本是很多的,后来想了想其实反而懒得写了,因为一件事情太好了由时候反而觉得写下了可惜,这实在是一种奇怪的感觉。想想看感觉这个东西就是无形的,当初每个人初恋的时候的感觉一定都是好的不得了,好的以至于心里都是幸福感却说不出对方的好,只是觉得一个模模糊糊地影子,真的要形容却说不出。其实世界上好的东西都是这样一旦被披上了有形的外衣将来一定会被挑出毛病,如果你要永远保持一个事物的好的形象最好从来不去想也不去说他到底好在哪里。可是这样一来这个东西就只属于你个人了,这未免太自私了,尤其对于环城自行车来说。1。全民参与:至少有万人,很可能还不止,我们下午回家的时候还有大批的人才到达。2。全民热爱:魁北克人向往法国文化,自行车运动深入人心,骑车的人都是爱好者,各个功底不凡,否则骑车50公里单单屁股就坐疼了,平常肯定要经常骑的。3。全民支持:沿途每个路口几乎都有志愿的工作人员负责把守路口,不仅如此每个人手里拿着小拨浪鼓呐喊鼓劲,那个热情比骑车的人还高很多,不是真心喜欢绝对做不到,要知道这不是一两个小时的工作是七八个小时啊。每个休息点都有志愿的乐队表演很好看的。4。全民组织:组织工作无懈可击,细致周到,考虑周详,从路线设计,休息点的安排,地铁上自行车的乘坐安排等等。5。全民娱乐:这种活动才真正是健康积极向上,和谐社会的典范,自行车五花八门,突出个性,很多我是见所未见,全家一起出动老少皆有。很多老人骑车完全没有丝毫衰老的样子。6。华人绝少参加:我几乎没有看到一个华人或者亚裔,原因也许很多,吃不了那个苦?觉得报名费太贵?(17块,我是没有报名反正骑车难道有人会阻止你吗?这里的中国人大多数只要听说是免费的都去,只要是要钱的一律不去,我也是差不多,稍微好一点,就是免费的也懒得去。)感觉吃饱了撑得?(我常常觉得自己吃得太多了。)总之,我总是觉得大多数中国人缺乏尚武精神,以至于汉民族是帝国时代里最弱懦的民族,每每被其他游牧民族征服,然后据说这个原因也会变成帝国时代被禁止发行的理由,往往自卑的人和民族对自己的弱点最敏感。

看了田中正和的《Farewell Mr. Primier》感觉是振聋发聩,虽然我一直没有机会欣赏《Yes,Prime Minister》,对于《West Wing》也没有怎么看,可是我敢肯定日本能有这样的政制讽刺时事剧说明日本的民主政治已经完全是欧美的水平了,过去我所看到的听到的都是什么日本政治的丑闻,什么议院在议会打架,贿选,与黑道勾结,自民党把持朝野,总理大臣连轴更换,可是现在反过来想一想,一个政府的总理如果不得不面对民意而被迫辞职的话正说明了政治的民主与清廉,不是吗?只有暴君才会不顾民意,或者漠视民意,一个内阁成员被描述成只会与媒体周旋也未必说明是坏事,因为为民喉舌的媒体就是民意的媒介,可以将民意表达也可以将事实传达给民意接受民意的反馈,难道还有什么更有效的反映民意的媒介了吗?人民代表大会?(不要再开这种玩笑了吧?我觉得一点都不好笑。)把日本的总理大臣描述成一个白字连篇的无能之辈,巴内阁成员描述成宫廷小丑,把总理夫人描述成俗不可耐的贵妇人,把总理女儿描述成考不上大学的普通女孩子,把副总理描述成尸位素餐整天打瞌睡的老头子。。。这一切并不会让国民对于政府失去信心,因为发达国家的人民不是白痴,他们知道总理大臣也是人,谁在这个位置上都不比谁强多少,只要他是一个老师可靠的正常人不把国家拖进不可理喻的选我就行了,反正政府本来就应该是人民金库的看门狗,需要的忠诚胜过智慧。

OpenGL: gluLookAt的使用每次要清零,因为我的做法是移动camera。另外,所有config里面的常数都要使用unsigned省得遇到0xFFFFFFFF变成-1的笑话。(常数怎么会变呢?因为我用常数去计算常数,这就会有问题的。)终于找到了一个当初百思不解的问题的办法,这也是我当初怀疑肯定有的,因为这是一个非常普遍的问题。colorBuffer里面读取小方块然后要发送在networkbuffer里面很讨厌不是线性的,所以当初就应当把跳跃的row读成线性的,这个是在pixelStorage里面定义的。

六月四日 今天天气很阴沉好像还下了雨

I need passion and I need goal.

很多年前的这一天我从徐家汇步行二十几公里到公平路码头乘船回厦门,因为那个时候公共汽车已经没有了,看到youtube当年的一些片断可以想象当时很多人在另一个城市死掉了,正如同中国几千年的封建统治中不断死去的人一样很快就被大多数生存的人忘记了,如果鲁迅还活着或许会写一篇《为了忘却的回忆》作为埋葬一些记忆的悼词。这个世界上的生物按照进化论的规则活着,唯一的目的就是为了生存,这是自然规律,其他都不重要,only this matters。所以,其他一切影响你的这个唯一目的的任何想法都应该抛弃掉,因为这不符合自然规律,除非你并不打算理性地活着。

六月六日 今天天气很阴沉好像还下了雨

很多年前学习c++的第一课教过继承有三种方式,现在都快忘光了,因为我从来就没有使用过public以外的方式。java里面的final方式可以这样实现,把constructor声明在private里面,这好像又成为了经典的面试题目,让我有点哭笑不得。

六月八日 今天天气很好,剃头明志,骑车上山
 
我觉得像你这样能有耐心看我那些垃圾的人才了不起呢,实际上很多时候这种东西都是一种个人情绪思想的宣泄,并不一定是考虑读者的感受的,就好像国人喜欢唱卡拉OK,实际上对于听众来说大多是一种折磨,我是最讨厌这种娱乐了,当然大多数男人不一定是主要为了去唱歌的,哈哈。。。

很难想象国内有这么多人都是学计算机却没有从事这种相关的工作,也许是在中国计算机的应用被廉价的劳动力所阻碍了,但是总有一天资本家会发现雇用工人是一件很麻烦的事。比如我常常和朋友说起一个古老的故事,在美国二三十年代,煤矿工人不比今天的中国的煤矿工人好多少,每年死的人也是上千的,工人不断地争取自己的权利,那时候美国煤矿主很强大,象洛柯菲勒之类的美国大家族都是开煤矿的,他们甚至雇用打手扛着机关枪镇压工人,死了不少人,最后联邦政府不得不派军队镇压。后来石油成了主要能源,资本家发现采油比采煤方便,雇用工人也少,同时采煤尽量采用机械化减少工人,当然就减少伤亡事故了。所以西方的资本家也是一样当他们发现雇用工人不合算他们一定就会多花钱使用机器,中国的工人权益完全没有保障,很多打工妹仅仅是糊口,老了根本不可能攒下一分钱,这个局面老百姓是肯定不会长久接受的,所以,在不久的将来中国的人工成本会大幅度上升。

 
人民币升值带来了通货膨胀的副产品,这本来应该是中国经济学家应该考虑的问题,结果这些人因为没有吃饱饭都去炒股票做顾问赚钱去了,最终这些关系国计民生的大事落到了发改委的几个工农兵大学毕业的领导头上,领导吃饱了喝足了拍了一下肚子,旁边的三个刚从人民大学经济管理专业毕业的所谓硕士研究生听出了肚子里面的回音不同寻常,于是定出了一个头疼医头脚疼医脚的行政法规,第二天,老百姓听出了昨晚唱卡拉OK时候长官走调里的玄机,即时地抛售自己的股票,晚上家宝听到凤凰卫视的时事辩论会的话题打电话给证监会,结果长官的指示在一次地演变成一轮新的行政法规的矫枉过正。这就是中国式的经济模式,难怪美国的经济学家看不大懂。
 
星期六跑步皇家山,星期天骑车去西岛。

有的时候一个人的脑筋就像是浆糊,因为我一次性把整个colorbuffer都读出来了结果分块读写变得很困难,可是如果我当初就是分块读写的话,还会有这个问题吗?rasterPos只是对于写buffer有用,对于读buffer毫无用处,因为使用的是windows坐标,这个是从左下角开始的,小于零的话是不可知的,而openGL标准的原点经过transfer是在screen中心。如果你用glOrtho的话就可以像读写2D一样,(这是废话,因为ortho本来就是2D),写的时候openGL会检查rasterPos如果超出范围自动取消所有的写,可是读的时候并不报错,但是你可能会读到垃圾。奇怪的现象是不可预测的。所谓的perspective,orthogal并不神秘我以前脑子就是一团浆糊是中不明白这只不过是一个projection的matrix的不同而已,如果ortho的参数区的事screen的宽度当然你就可以用实际坐标来定义rasterPos,否则就是一个ratio。

六月九日 今天天气很好,剃头明志,骑车上山

 
我觉得我绝不应该低估自己,别人认为做不到的事情并非我就做不到,因为有些事情并非很难只是聪明人都不去做,因为他们认为不值得做,这不是能力问题这是价值观的不同。比如愚公要移山,智叟认为不智或者不值,编程序常常被人说是手熟而已,无他。相反很多根本就不明白软件工程真谛的人却在夸夸其谈什么pattern什么framework,连走路都不大熟练的人去谈什么空中体操,真有一点点痴人说梦。我一定要在这个星期内完成coding,实际上这不是什么困难的事情,困难的是什么质量的完成。

铃木保奈美饰演一个超级庸俗的总理夫人,一个饱食终日,低俗无聊,朝三暮四,耐不住寂寞的贵妇人,对于她所代表的这一类型刻画的淋漓尽致,一个typical的女人。

六月十日 今天天气很好,骑自行车去西岛

 
一不小心骑到了Cavendish结果一看地图中间隔着机场去不了西岛,只好折回来,一路上走走停停花了四个小时才骑到了长征家。晚上回来的时候幸亏按照长征的指点沿着河岸的自行车专用车道走否则恐怕后半夜也会不到家了,结果又是一不小心骑到了修女岛,看看广告牌上的电话都是450开头的只好掉头回去,终于经过近三个小时的征途回到了家,感觉好像有一点点地累了,哈哈可能有来回50公里吧。

街道厦门来信,国内对于新闻媒体的封锁可以说是变本加厉,让人义愤填膺,特此破例在鄙人的这块自留地转贴出来,咱们且看看中国的网络警察什么时候会把我的这个自留地过滤掉。那个时候本人算不算持不同政见者了(dissident)?

六月十一日 今天天气很

加拿大的冬天有多冷我的小阁楼夏天就有多热,哈哈,矛盾?

带着无限的怅惘与恋恋不舍和田中正和饰演的“总理大臣”说声再见,实在是太棒了,这么结束实在是太可惜了。

六月十四日 今天天气很

实在受不了酷热就去买了一台空调,从此意志开始被消磨,其实我并不怕热,因为最多就是睡得晚一点罢了,已经不能再晚了,主要是担心电脑会被热坏了,三十几度连鼠标左右健都回颠倒的。忘了说明一下什么是memory-hole,我查了一下这是因为电脑外设如网卡等作统一寻址时候所设定的虚拟地址,当然这个所谓“虚拟”是说他们被系统设定为如同内存一样的地址,这样访问硬件可以用统一的地址访问汇编指令,因此可以减少汇编的指令集大小,隐藏硬件编程的复杂性。但是这些地址被映射到32位地址空间就会和实际内存地址重叠,因此一般都是放到4G开始的高位地址,在远古时代内存只有几百M当然没有人担心什么,可是一旦实际内存较大接近4G就会丢失一部分内存,于是称作“memory-hole”。

今天,待到下午筋疲力尽,读color-buffer总是不太对,当然再次强调一下little-endian是把integer的低位映射到开始,就是从低到高,记住了!windows里面dos里面就有ftp的命令,mput,mget什么时候玩一下。

六月十五日 今天天气很

陈由豪的简介。

常常看《凤凰资讯》的有关台湾的消息,总的感觉是有些不可理喻,比如选举中每个人的选票都是自己决定的为什么要看民调,别人怎么选是别人的选择跟自己有什么关系,为什么会有影响?除了所谓“桩脚”绑票卖选票没有什么其他理由,总之一个感觉就是愚蠢。然而,经常看大陆的新闻唯一的一个感觉就是可怜,有的省整个省都是奴隶制的黑砖窑,你如果相信当地的共产党官员没有参与那就改姓白吧,就是白痴的白字,如果你还向水浒传里的宋江的所谓官员腐败皇帝还是清明的傻话你干脆不要再改姓了,因为你hopeless了,难道当时的宋神宗仅仅是喜欢业余时间嫖一嫖李师师这样吗?老江也许是真的喜欢宋祖英,但是小宝和小涛是真的不明白地方官员的作为吗?政治永远比老百姓想象得更加黑暗,这是一个定律。厦门的游行是一个和平的请愿行为,当地的小老百姓无非是为了最基本的生存权提出自己的疑问,当地的地方官员居然出动这样大批的军警,士兵警察比示威者还多,这有必要吗?是市政府的办公在节假日被干扰了吗?星期天示威一下有什么关系?连这个都要限制是不是太过于惧怕民意的反映?

说了很多其实只是想跑出一个长久以来的经典的黑色笑话。一个老头老得连路都走不动的孤独的老头经常在阳光灿烂的日子里拿着一把雨伞散步,毫无疑问总是被一些好心人提醒老人家要多看天气预报,最起码出门的时候看看天别做傻事。你认为老人会怎么回答?他会说我宁可被人误解为愚蠢也不愿意被人来可怜,因为我的雨伞是我的拐杖。在愚蠢与可怜之间,我们都回毫不犹豫地选择前者。

实验室的印度小孩居然拿这个小孩子的玩意来考察我的IQ,哈哈,难道我不能在十分钟内解答这个小孩子的玩意吗?要知道在这个世界上只有最顶尖的人才能去研究AI因为那是研究智慧的智慧研究,我虽然没有资格去做但是难道会比普通人还笨吗?绝对不会的,Bill Gates能做到的大多数人也都可以做到的,只要你有能力在拥有全世界最大的个人财富的时候把他们全都捐出来,你能做得到吗?如果不行,就不要说你比他强了,因为这一点才是世界上绝大多数所谓聪明人做不到的,对于多数人来说如果把享受财富抛开了追求财富还有什么意义呢?

昨天动用今年度假的预算购买《是的,大臣》,现在的小孩子大都没有听说过这些,他们只知道NBA和prison-break之类的,实在是没有什么共同语言,拿到了再作评论吧。

六月十七日 今天天气很好吗?明明下了一场大雨。

有时候拨开云雾就看到太阳,昨天的谜团在今天看起来就是那么的清晰,我几乎可以肯定文提出在WMPI的资源限制上。你怎样读出来的,你就怎样写回去,读的时候是条块,写的时候当然也要是条块,这就是readPixel和drawPixel的关系,那么drawPixel的z坐标应当怎样呢?比如你用glOrtho的2D来定义projection,z的near一定要是0才行,否则就看不到了。我要把键盘事件写成一个类似事件queue的模式,因为网络中的每一个电脑都要达到exact-once的键盘事件。

我喜欢《围城》的说法,套用到现实社会就是这样子的,政治原本就是一棵树,政治家都是一个个争先恐后爬树的猴子,当他们还没有开始往上爬的时候和我们普通人平起平坐,你是看不到他的红屁股的,当他爬到一定高度的时候为别人所关注的时候,普通人都会看到他的红屁股,其实人人都有红屁股,并非我们没有,只不过自己看不到自己的以及和自己面对面平等的人的红屁股我们通常也难以看到罢了。可是对于这些爬树的猴子的红屁股,西方民主政治是观众也理解,仿佛看戏一样剧情大体都猜得出来的,大家都知道这是演戏不会过于挑剔,当然也是会对于不同的红屁股的红的程度挑三拣四而已,可是同样的事情到了中国,爬树的猴子们却非要让观众闭上眼睛想象那些高高在上的猴子们并没有如普通人一样的红屁股,还要如皇帝的新装一样建立一个社会共识就是谁敢说出来谁就是傻瓜。这就是政治和政治家的故事。

六月十八日 今天天气很

我在昨天给春明的电话里自夸我还没有让deadline打破过,当然这对于我的不长的coding的念头来说还是容易做到的,难就难在你能否一辈子都这样做。1。谁来定deadline?2。有多少非个人可控制的因素?大多数情况我都是独立作业,自己一个人单打独斗这相对teamworking来说容易得多,自己定的deadline大多是针对自己的能力与时间充裕程度因此是比较准确的,很少有mission-impossible的情况。(那都是小孩子不知天高地厚的年代多。)所用的工具或者软件包对于开发有多大的影响呢?因此对于个人所能做的project,这些因素小的多,说到底一个人干上一个月的project能有多复杂,会用多少library,所以,我能这么说也不是吹牛,只不过有些为行家所不齿。

其实写blog有很多时候不知道是给谁看的,给自己的成分多一些,回过头来看自己的脚步大多数时候都是一种欣慰,因为一般来说一个人的各项能力都是在衰退的,只有经验是在积累的。如果你从前做到了的现在做不到的,你可以自我安慰自己说毕竟我以前做过这些。如果有些依靠经验你今天做得比以前更好了,你可以更加自豪地感觉自己在成长。总之,不论怎样你看自己的blog都是感到高兴的,不用考虑别人的感受。(这一点就好像有个朋友总是给我发“芙蓉姐姐”的照片,有时候我感觉这是一种对于男同胞很不尊重的态度。开玩笑了,我不是认真的,其实我挺喜欢芙蓉姐姐的,真的,她是那么的质朴,仿佛和打工妹一样纯洁。什么?原来就是,啊,那么它就是质朴,质朴难道有什么错吗?)

再一个写blog千万不要担心写的都是垃圾,反正你不是什么名人,别人看了吹胡子瞪眼也不管你的事,经常发现没有什么可写的时候你就写垃圾,千万不要为了读者考虑去转贴,你不要以为你找了一些自以为很好的文章可以给读者知识和营养他们就会感激你并继续读你的blog,读者想看的是你的思想裸体才不管什么知识性趣味性呢。(赫赫,个人观点不代表普遍情况。)总之,不管什么都往上写,这样就可以坚持下去,因为当你连那样的垃圾都写过了,当你偶然的下到什么佳词妙语就更会迫不及待地向与人分享了,这道理就是所谓的“抛砖引玉”,这也就是所谓的活学活用。

写blog一定要有闲情逸致,天天无所事事,既没有拖家带口的负担也没有一个横眉冷对天天催你为去挣钱而早点睡觉的老婆在背后狂吼,同时你这个人既要胸无大志有时候又要志大才疏,一方面从来没有想着去多挣钱,成为社会主流精英,并且要冷脸面对世人的耻笑,同时你又有一颗不甘寂寞的雄心保持着铁肩担道义妙手著文章的豪情,如果你同时做到这两样你就成为一个社会的边缘人士,广大人民群众对你采取敬而远之的态度,你也常常横眉冷对峙,说到底这个世界谁怕谁,离开谁地球都照样转。

写blog一定还要有一个原因,或者说动力,否则你很难坚持下来。比如我现在这样啰里啰唆的写垃圾那也是有原因的,因为我再等UPS的delivery,上个星期来的时候我在实验室就错过了,今天只好在家里死等,不能去实验室,没有别的事好做只好写这些东西消磨时间,这就是一个充分的写blog的理由,不够吗?说曹操,曹操到,门铃响了。收到了在tiger-direct上订购的千兆网卡去实验室了。

六月十九日 今天天气很

NFS折腾了半天还是有问题:1。server:/etc/exports里面设置共享/mnt/exchange  host(rw)。2。client: /etc/fstab里面设置host:/directory  /mounted-directory  nfs   rw  0 0   或者直接命令行mount -t nfs  host:/dir  /dir  不过我还是没有成功。

郁闷,Clueless! Insane! 很多时候仿佛是鬼魅一般无法令人理解,一个简单得不能简单的knapsack似的greedy的partition函数居然会引发异常,当然这之前我是第一次意识到integer-alignment的问题,比如char array[100]; int*ptr=(int*)(array+1);这样危险不危险?如果硬件架构是把integer总是取sizeof(int)的整数倍的地址这样会不会有问题?所以,我最后就在我的structure里面夹了一些垃圾byte以便struct的size是4的整数倍,这些乱七八糟的解决办法到了64位机器又会是一场大灾难。不过一切的一切,我好像忘记记录下来昨天我已经胜利地完成了windows版本的程序,除了WMPI对于request的数量上的bug以外一切工作正常,就是说只要是小数量的屏幕分割都是一切ok的,接下来实际上更加的困难,因为windows下不管千难万难我总还有信心解决,因为微软的文档很多很好查找,linux这些geek各个都是不肯像微软对待傻瓜一样地对待程序元,他们当然都期待着你是一个中级linux的programmer.讨论的问题都是不再是低级的howto。

晚上回来懒得做饭就着面包吃午餐肉,一杯牛奶和着凤凰资讯下肚。看着大学同学的email实在是有趣,因为你很难想象当初的这些人是怎样选择自己的人生轨迹的,想想看,22171,22172居然有这么多人都在北美,很多人在讲述他们在美国这个巨大国度里偶然遇到某个人,这实在是概率论所难以解释的,两三亿分之60吧?可能发生吗?小概率事件不应该发生,但是如果小概率事件经常发生就应该回过头来重新审视这个所谓的小概率事件了,也就是说未必是小概率事件,不是让现实来fit理论,而是应该修正理论来体现现实。什么是现实?顺应时事聪明人的选择大概都是相似的,所以他们相遇,所以他们的轨迹交叉。看来我偏居一隅说明是不识时务说明我的无可救药的愚不可及,鉴于此确实是没有什么可交流的,就偶尔看看得了。

不过话说回来了,我即使和MR.Zh相比还有两到三年的差距,至少在87工贸这些人中算是最好的程序员了,哈哈这个实在没有可比性,因为他们都是一些businessman。

Alterac Valey成了联盟的伤心峡谷,对部落的胜率可能连20%都没有。作为一个小兵我几乎总是冲锋在前死而后已,无奈人微言轻于大局无补。半夜看到朋友发来的中国各级政府的豪华办公楼也只能跟着一声叹息而已,这种穷奢极欲已经超过了封建时代的挥霍无度,你能想象在封建时代地方官最多就是盘剥百姓巧取豪夺还不大敢把国库的钱借出来透支吧,可是现在的县长市长敢于超支好几年的财政收入盖世界级的豪华办公楼,我在蒙特利尔的繁华的downtown也找不出几栋这样外装修如此奢华的大楼,看来朱镕基当初所谓的内需拉动等于是给地方官挥霍开出了绿灯。总之国富则民穷,国穷泽民富,(是江泽民富。哈哈)

动用特别度假基金买了一套《yes,prime minister》,非常的经典,但是英国腔的晦涩难懂也是登峰造极了,原本政治讽刺剧就不是一般小老百姓能够欣赏的来的,对于第二语言来说就更困难了,催眠的效果一流。

六月二十日 今天天气很好吗?好像是阴天哦。

《是的,总理》实在是令人称快叫绝,在那个使用莎士比亚创造的语言的国度里代表着文明的最高境界,和那种高雅高尚连珠妙语比起来美国人简直就是乡巴佬在学说城里话,尤其对于现代最高境界的政治权术的淋漓尽致的刨析让人在大笑之余回味无穷。可以说能够欣赏这一类的政治喜剧的人少只有少,首先要对于国际国内政治有足够的背景与兴趣,其次对于英国英语的要求高很多,(注意使英国英语不是美国英语,这是两种不同的语言,仿佛北京话和上海话的区别一样。)在此这个人要是大闲人,就是肯花几十块钱去买一些没人看得东西孤芳自赏。一句话,而且完全不可能翻译成中文。当然要全不听懂那时几乎不可能的,但是有的时候可能比《The Thin Blue Line》的绕口令要好懂一点点,毕竟这个政治剧是有现实意义的剧情的。最后mention一点就是每一集都是以Yes,prime minister.结束的。

关于virtual fuctnion的争议可以用朋友的这样一句来结束:If compiler during compiling time can decide which function to call, then it will call that function instead of using virtual function table. 这完全合情合理polymorphism只是存在于函数指针,对于对象变量从来就不存在这个可能性。

昨天在跟踪时候遇到的无理头应该是VC6的tracer不能正确再多线程下正常工作的缘故,尤其是F11步进函数救出异常。今天改进了两个问题,一个就是为了防止将来big-endian与small-endian在整数读取的差别,如果我的rgb换乘rgba成为4个byte那么读于写只要是在同样的平台就不会有什么问题了,不然3个byte你总是有问题,要改代码用macro重定义。另一个想法是减少预处理时候内存占用,比如递归函数是大量的数组或者vector时候,仅仅用new防止stack溢出还是不够的,改用文件的handle来传递减少内存占用。不过现在还有bug,争取今明天解决。

国内的黑帮居然已经开始装备军用装甲车了,牛!

六月二十一日 今天天气很好吗?好像是阴天哦。

很多无理头的事情都是有原因的,我当初百思不得其解的runtime-debugger的问题居然是我自己输出的一行注释,简直是让我哑口无言,就是说_try_except机制是可以捕捉任何异常,这是毫无疑问的,只是在_except(arg)里面的arg要提示怎样处理,-1,0,1。另一个百思不得其解的问题实际上是数据文件里面的三角形的两个定点非常非常地靠近,以至于我一分为二就变成重合了。c++里面不支持virual-constructor并不等于OOP的其他语言也不支持,比如delphi,java,另外java的人和函数都是默认为virtual的,除非是final。讨论static的全局变量怎样编译,结论是这样的,猜想编译起就在生成obj的时候不把它放在simbol-table,或者作特别标记,防止在linking的时候报重定义的错。一个变量在声明的时候初始化为一个字串应该就把它转变为const指针了吧。char*a="const";

六月二十二日 今天天气很好吗?好像是阴天哦。

我不惧怕编程因为但凡有一点点逻辑的人都可以胜任,但是系统环境的设置就并非是我能解决的,这仿佛是所谓的“知识”,有时候,“智慧”并不能替代“知识”,仿佛“算法”再先进也不能替代“数据”一般。要想把学校的user-managed的linux的root的passwd照会,可以在启动时候按"e"进入grub的编辑状态,在“kernel”那一列继续编辑,在末尾加一个single这样可以passwd输入新的passwd,但是这个是因为grubconf设置的,我不知道还有什么其他设置,那个参数我也不明白。

六月二十三日 今天天气很好吗?好像是阴天哦。

windows的GetTempFileName非常的ridiculous的,因为它不仅仅创建一个unique的临时文件名,同时还帮你生成文件了再把它关闭掉,所以,你要打开他的时候必须用open_existing,仔细一想,其实这也是没有办法的办法,因为,多个进程都要创建unique的文件名除非你访问的是同一个函数的同一个buffer,我想linux的tempfilnam大概是这样吧,用一下就知道了。要把windows和linux的API统一起来真的不太容易,单单文件一级实际上就很困难,就不要说别的了,根本就是风马牛不相及的。

现在在网上下载免费软件都是疑神疑鬼的,一定要现在我的“副机”上试验一下才敢安装。什么时候把服务器架起来呢?

六月二十四日 今天天气很好吗?是的。

今天骑车何处?杨柳岸和风烈日。出atwater,过运河,跨champlain大桥,骑到了修女岛,这才知道什么是真正的资产阶级生活方式,国内的所谓高尚住宅充其量就是这里平民的townhouse,或者都市劳动人民的condo,修女岛这里才真的是人间的理想居住环境(至少这里住的都是有钱人吧,反正想找麦当劳之类的快餐是找不到)。沿着一条专用的自行车公路骑啊骑,真是累啊,很宽阔纯粹的骑车人的理想的环境,不用考虑交叉路口不用考虑一切,以你的最大能力最大潜力相前骑,这才是真正考验你的体力与力量的地方,没有任何可以投机取巧的地方,最公平的竞争地,我和王林森的差距在半公里以上,毕竟我的力量太差了,虽然后来我并不觉得累还可以再骑几十公里但是我没有速度与力量。这对于超长距离履行应该没有太大的影响吧,希望如此。

互联网真是一个好东西,早上无意中想看看大学的同学现在在干什么,一搜索果然找到了22171的那头猪现在在ctrip,哈哈看照片倒是没有什么变化,因为它原本就是那么胖的,难得就是他的体型能够几十年如一日的保持不变。

六月二十五日 今天天气很好吗?可能吧。

说道Linux你如果google一下大多数得到的都是些shell一级应用的信息,对于syscall级的讨论就比较少,这也许是有利有的,总共的api就是不到两百个难道有什么掌握上的困难吗?不过话说回来了,如果简单为什么还要用shell呢?方便自然是一个主要原因,我想还不是那么想象的简单吧。比如Alex说lseek支持64bit的off_t的大文件,我当时就信以为真了,今天又怀疑了,是否linux支持呢?难道我看错了lseek64是unix不是linux?今明天一定要去看header-file,linux里面我想有一个很讨厌的问题就是使用文件的时候都使用file-descriptor,但是当你要删除文件的时候,你却不能使用这个file-descriptor,因为唯一可用的api是unlink需要的参数是文件名,我长久以来的问题就是你能够从file-descriptor获得文件名吗?我印象中我一直有这个疑惑,难道没有人又和我一样的困惑吗?难道这是一个别人没有遇到的问题吗?unlink也很麻烦,一个inode可以对应无数个文件名,对吧?你如果建立和很多的hardlink,你删除的时候你要把所有的文件名都unlink吗?你能不能直接对inode操作删除文件?(想象看是不行的,因为inode里面有引用计数,只有linkcount为零才可以删除,这是正确的操作系统的设计,所以我这么一想就理解了从file-descriptor来删除文件的思路是错误的,应当把文件名一个都删除或者说unlink然后操作系统自动进行磁盘资源回收的动作。)所以,这是一个没办法解决的问题,在windows下删除文件只需要用handle,linux下必须要用文件名,我的api统一的工作就没办法做到那样的无缝统一,尤其linux下面的临时文件的获得是依靠一个string的library的static buffer,在library级你很难保证多线程同步吧,当然我相信一个合格的library肯定是经过同步了,但是windows的临时文件生成机制应该是api级得比切保证文件的创建而不是仅仅返回一个文件名,这当然是好的解决方案,但有一点点越俎代庖的意思,想象看如果什么都是OS帮你做你能保证只有190个syscall吗?总之这个地方的统一很讨厌。对于mmap和mapviewoffile的统一就更烦人了,windows很无聊地摇你专门为map产生一个handle而不是如linux的同样的file-descriptor,我要包装这个是有点麻烦。对于page-size的问题就更烦人了,听说linux可以不一定是64k这不是又让我去读系统信息吗?烦死人了。大文件的支持就是更加混乱了,究竟fat32支持不支持大于2g的文件呢?linux呢?

这个世界上,大多数人生活在无知无识的幸福中。无知就是力量!Ignorance is power!

看《凤凰资讯》你知道我最烦的是什么节目,不是那些肤浅的广告,不是那些付钱的企业家介绍,不是那些俗不可耐的古董市场介绍,而是有关奥运会的节目。每次看到那些所谓的运动员为国争光的节目我就觉得浑身起鸡皮疙瘩,什么是体育精神?什么是奥运精神?什么是体育的初衷?什么样的体育才是人民需要的体育?对于一个很多人一辈子都无法亲眼看到更不用说参与的体育在国际上大把洒钱有什么实质的意义?金牌体育是谁的需要?用一块金牌好几亿的代价值得吗?多建一座体育馆不好吗?这种政治橱窗除了给当权者粉饰太平以外还有什么实质的好处,对于运动员本身也未必是什么好事,金牌的金字塔顶上只能容纳一个人,大多数金字塔底的运动员未必有什么好的出路。远的不说就说前东欧的那些国家体育金牌注意的牺牲品就可以知道这都是communist dictatorship的玩具而已,如果人民有权决定财政预算我想就不会有这么多的金牌体育了。看看蒙特利尔的四通八达的自行车道,究竟谁受益?olympic gold medal?who cares?

看国内的新闻让我最感到可笑可悲的就是一个根本的共产主义理论框架的错误,这个主义的基石完全建立在人性的自觉自愿,比如劳动者自觉自愿地参加劳动,自觉自愿地只领取自己应得到的报酬,自觉自愿地不去欺压或者take advantage自己的同胞,领导者自觉自愿地履行自己的职责为被领导者服务而不是依靠手中的权力危机谋私,并且这个主义的核心认为人性本善,人性本自觉。对于这个人本善的论断这个主义既不去做实践来证明也不阐明怎样保证,所以所有的方针实践都是以此为基础。难道不是吗?什么叫做“各级领导应当自觉抵制腐败”?这简直是与虎谋皮!什么是人性?食色性也,难道所谓的腐败不是人性?不是人类的本性?怎么抵制?纯粹是开玩笑,简直是弥天大谎,仿佛是皇帝的新装只以为别人都不长眼睛,不长脑子。

今朝骑车何处?圣劳伦斯河岸水清风漫。惜泰晤士河畔略输风采,塞纳河滨稍逊生机,黄浦江口,一片混浊,怎可白帆水上漂?Jean Drapeau岛上风景秀,F1赛道坦而阔,古堡要塞锁大河,炮台风笛惹人连,两座铁桥肩并肩,一条通途四里多,跨江转赴修女岛,杨柳依依曲径肠,十一公里公路赛,一去一回长又长,江上游艇随处见,划艇冲浪更悠闲,日暮天光仍灿烂,一身疲惫把家还,人生快意莫如此,荣华富贵都不求。

六月二十七日 今天天气很好吗?好像是的。

我在实验室里大声地诅咒glut。这实在是无理头的事,你如果编译的时候仅仅用-lglut那么ld报出莫名其妙的错误lglut找不到,你在ldconfig -p|grep glut看到libglut.so.3-->libglut.so.3.8xxx等等,就是说library安装是正确的,折磨了我一个小时之后我才想到应该要-lGL -lGLU因为也许library里面也有什么dependency,这实在是没有道理的事情。

听惯了网络上骂微软的就很少有人骂Linux的,至少程序员不敢骂吧,怕被别人笑话外行,反正我是不怕,linux照样骂,居然一个文件系统的设计在根本上不支持大文件,linux是什么时候开始的,会有windows16位操错系统兼容的负担吗?为什么lseek不直接支持64位文件偏移却另搞一个lseek64,同样mmap也是一样的不彻底,当然你可以argue说32位操作系统的理论内存上限怎么可以map到超过4g或者2g以上呢?可是文件毕竟和内存不一样的,你并不需要把所有的文件部分都同时映射到内存吧?这有点扯远了,但毕竟说明了设计者的前瞻性不够吧,一个linux毫无兼容性的负担,而且新内核的撰写也不过是近几年以内的事情却还是这样的不彻底?这一点让我怎么也不能接受!至少win32这一点上要好一些。从图书馆借的一本gnu开发指南之类的书看了之后就独自不舒服,在国内看惯了滥竽充数到了这里偶然看到类似的很是气愤,当然跟人水平不一见解不同很难强求,只是不说不快,反正我看到把一大堆的syscall和librarycall并列混合使用实在是由误人子弟之嫌,当然这种挑选变成代码最少化的做法对于计算机专业以外的用户如物理化学生物数学商课等等是有速成的好处,但对于真正开发者来说有误导的弊端。甚至本人私下揣测作者原本可能就是这么干的,所以当作新的写下来,致使冠以GNU开发恐怕是玷污了这个金字招牌。当然说句公道话并不是一味地使用syscall就是最高效率,比如我至今还记得那个字串操作的经典例子,在编译器重scanner逐个字符处理这时候难道你每次都去call-read(linux)或者ReadFile(windows)?这简直是就是迂腐了,这个时候要么自己内部设缓存,一次读入,要么还是用library的fgetc因为它内部就是做了缓存的。但这个例子并不时要反正应该混合使用syscall和library,一般来说在最紧要的部位应该完全使用syscall。这样说我觉得是由理由的因为很多人根本不重视这个问题,比如今天随便google就发现有人出的cheap点子,什么GetTickCount对应的linux为times,请注意这个是有带s的time而不是那个syscall的time,总之我觉得很多人对于这两者的区别并不以为然。关于g++我也是早有微词的,借用Dr.Grogono的话说就是很多时候实在是nuisance!比如我应为效率的关系作了一点点地hacking,就是把vector的begin当作数组的头指针来用,这样当然是危险的因为vector的设计着从来没有保证这样可以,可是我看了源码应该是可以的,而且stl从来就使用源码的也就是说公开的不存在说实现可以遮掩的问题,所以移植也不成问题,在vc6编译器不喜欢但是也不干预我的强制转换,可是g++就非常的鸡婆直接报错,连申诉的机会都不给,我想设个什么开关能够放宽语法检查的尺度,可是g++的manpage是在是如天书一般难懂。另一个无法解决的问题就是std namespace总是有很多的冲突,我居然连string都不能正确编译,实在是太夸张了,明天最好把using namespace std;曲调全部使用std::xx这样应该可以屏蔽掉一些nuisance吧?晚上步行去春明家吃饭,饭后闲谈说道中国的未来,我很赞同一点就是中国不可能走日本成功的道路,因为13亿人不可能达到人均GDP3万美元的水平,在过两百年也不可能,所以从这点来看中国的所谓经济学家说的也对,所谓共同富裕那时蒙人的,中国只能用大多数人的贫困早就少数人的富裕,所谓“让一小部分人先富裕起来”。中国的穷苦百姓应该自觉意识到自己的贫困受剥削是对社会的巨大贡献,鞠躬尽瘁死而后已,饿死千万家才能幸福某一个。酒足饭饱之后步行一个半小时几乎绕行downtown半周才回到家,路上不小心发现蒙特利尔的国际焰火节正在如火如荼的进行中,火树银花不夜天,万家欢庆也平常,所谓幸福和谐本来就是平淡得如同一汪死水一般少有波澜,否则又怎么说得上和谐稳定,难道说天天惊心动魄的提心吊胆使人人所追求的幸福?晚上再读自己前年夏天回国写的随感,感慨颇多,时过境迁再也难以有同样的文字与激情,所谓人生就如希腊先哲的那句话一般,一个人永远不可能两次踏进同一条河,可是一个人却可能在两条不同的河里翻下同样的错误,不是吗?所谓人生就是一系列的偶然与必然的交织。转眼间我来到蒙特利尔已经快要整整五年了,这五年的经历我想使我一生最充实的日子,就算一生结束的时候也可以安慰自己我的一生并没有全部虚度。屋顶的天窗凑趣地响起了密集的雨滴声,家事国事天下事,风声雨声键盘声。

六月二十八日 今天天气很好吗?好像是阴天的。

昨天无意中谈到编译器改变stack的大小,我argue说用bineit都可以这不是编译器的特权,为什么stack大小可以在可执行文件级进行修改?问题很简单想一下就知道,声称代码的时候几乎不会用到stack的大小,所有的函数代码都是相对于stackbottom的相对偏移,也就是相对地址,而一般的系统都是把stack放在高位内存,总之编译器99%的情况不会用到stack的大小,stackoverflow的错误99%试运行期的错误,在编译期能够遇到的几乎为零,当然尼古意在函数里面声明一个超大数组让编译器抓到除外,基本上我猜想stacksize就是可执行码里面的一个初始化寄存器的变量而已,所以当然可以是对可执行码修改而不需重编译,所谓stackoverflow都是间接寻址时候把相对地址变为绝对地址的时候让OS发现异常的pagefault的。

什么叫做乌龙?在linux下使用STL的string,你的头文件是什么?我以前很模糊,vc6帮你做了很多工作,结果你就变成了sheep,在linux下你也重新恢复野性才行!要#include<string>注意没有.h也不是cstring。另外要休整一下昨天的妄言,linux的确支持大文件,你只要定义一个macro,__USING_LARGEFILE就可以了。

今天在实验室里干了多少个小时呢?我想有十二个吧?总算有些成果,linux算是胜利成功了,唯一现在不清楚地就是64位机器是否有问题以及大文件处理是否还会有问题,明后天解决MPI部分和远程图形部分,应该问题不大吧。

伟大的Mokhov极其迅速地解决了我的难题,实在是佩服的不行!!!

六月二十九日 今天天气很好吗?好像是。

创建文件的时候居然忘记给自己读写的权利,结果我自己创建的文件我自己不允许打开,实在是可笑,但是我却可以删除,mv的时候报出的错误是我不能打开?记住open的第三个参数射程类似660之类的,当然就是S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH. 此外都是老调重弹,libxxx.so.xxx必须要建立一个soft-link比如libxxxx.so否则你就只有-lxxxx.so.xxx之类的吧,(没试过应该是这样。)先用module load mpi才能正确进行编译,我猜想是设置了什么临时的环境变量,mpiCC否则找不到mpi.h吧。运行srun你可以自己指定运行的节点,比如mpiexec -srun -N4 --nodelist=n81,n82,n83,n84 ./renderBox.exe不过我现在居然不能正常地运行graphic程序,找以前的mail出来看也找不到了,看来一定要记录下来。

六月三十日 今天天气很好吗?好像是。

一个人对于承诺的态度是什么反映了人生的态度,我想我应该算是完成了当初的计划吧,现在一切的一切都不在我的掌控范围了。任何一个job你都可以用srun来进行分配,典型的是指定多少个node和多少个process(-N#),加上--nodelist=n34,n32是指定运行的节点。而你运行的时mpirun,而不要运行mpiexec,这个mpirun所带的参数本身就是-srun。squeue,scancel可以让你停止背后运行的任务。登陆到cirrus之后运行sva_remote.sh这是在opt/xx下的HP的一个脚本,这时候如果你是在学校的linux上你可以直接访问那个安装在/encs/bin/rgreceiver.sh,他会启动remote-graphic-client,注意不是在登陆cirrus后。不过我总是连接不上好想有什么安全验证的问题。此外你编译之前module load mpi,退出module unload mpi。我想我已经重复这些破烂玩意几十遍了,说到底都是AITS那帮人设定的迷宫,完全无意义,不过话说回来这种复杂的网络管理也只能这样,否则软件冲突实在是个大问题。

每天每顿都只吃盒装虾是在是乏味了,今天决定蒸鸡蛋吃,结果变成了海绵状,真是烦人。

精彩绝伦的评论!这是<Yes,Prime Minister>里面关于英国新闻报纸的概述。

七月一日 今天天气很好吗?好像不是。

看到网络上的中央电视台的《东方时空》新闻报道里面的山西黑窑工,其实文字的报道要更加的耸人听闻一些,耳听是虚眼见为实其实也不然,实际上使用童工有罪吗?窑主犯罪了吗?我看未必,因为这些基本上都是当地政府努力发展乡镇经济的一项政策,要在激烈的市场竞争中脱颖而出不靠奇招狠招能行吗?都说中国的劳动力价值低廉,可是再低廉也还要付工资呀,和越南比起来还是太贵了,所以在全球化的今天我们应该鼓励农民工不要工资全心全意为建设社会主义作奉献,老一辈的工人阶级都已经奉献一辈子了任劳任怨,为什么年轻人不可以继承老一辈的无产阶级光荣传统继续发扬一不怕苦二不怕死的精神舍生忘死为建设小康社会和谐社会奉献青春苦了我一个幸福千万家让一部分窑主先富起来逐步走共同富裕的道路?为什么现在的年轻一代觉悟这么低应该向他们的父辈们学习时刻准备着为共产主义献身(女孩子)出力(男孩子)!应该理解当地各级政府为早日改变农村的落后面貌而做出的努力方法上也许粗糙了一点但是出发点还是好的当地的主要领导还是好的广大基层公安干警还是尽职尽责的各级检察机关法院劳动用工部门还是恪尽职守的奴隶制在社会主义中国还是一个并不普遍的现象是某些人对社会主义初级阶段的错误认识,应该看主流应该看到全体共产党员并不是100%都赞成奴隶制的,比如中央政治局就从来没有说过工人应当不给工资我们的宪法法律有那一条说农民应当被奴役?当然如果那些农民工他们自觉自愿不领工资不远千里从河南来到山西热情支持山西当地的经济建设当地的各级政府自然不能打击这种社会主义大家庭里人与人之间互相帮助互相支持的阶级情谊,不但不能打击还要给于那些主动热情介绍这些响应当年上山下乡从城市里面来帮助农村脱贫致富的河南籍同胞一些精神和物质上的鼓励希望他们能够介绍更多的有志青年来到广阔天地实现大有作为的理想,各级政府特别是劳动用工单位一定要尽最大努力保护和支持广大社会青年积极参与建设社会主义新农村的伟大实践尤其要贯彻多快好省的方针树立一切以经济建设为中心的原则为发展有中国特色的社会主义市场经济保驾护航齐抓共管大力整顿少数扰乱市场原则哄抬农民工工资水平打击农民工无私奉献的热情的现象坚决铲除少数破坏当地市场经济秩序的害群之马坚决刹住农民工工资乱涨价的歪风大力营造良好的投资环境牢固树立只有发展才是硬道理的观念坚定不移地走以经济建设为中心的道路走有中国特色的发展道路走自己的路让媒体他们自己去说吧。

七月二日 今天天气很好吗?好像是。

看到网络上一片所谓嫁给日本人的校花的悲惨生活的文章觉得很好笑也很幼稚,非常疑惑是否这种类似于刚解放的时候“新旧社会对比式的控诉会模式”的教育方式会有国人相信,转念一想岂止会有人相信可能还大有人相信的,比如我来加拿大看到的最平常最朴素的道理在国内天天看《新闻联播》之类的节目是一辈子也想不明白的,这就是“教育”。在古代是用剥夺教育权的方式来愚民,近代是用八股取仕之类的仕途教育来愚民,现代就是用媒体过滤信息轰炸的方式来愚民的。什么是媒体过滤,就是孔夫子并不骗人但是孔夫子“笔删春秋”却可以把自己的观点强加给读者,也就是我只挑选特定的新闻信息来给你。这样的例子还少吗?中学学历史的时候我敢说课本里面基本上说的都是事实,以至于中国古代文明的伟大深深烙印在每个人的心底里,教材骗你了吗?教材里面说假话了吗?不一定,也不用,因为它不会告诉你同时期甚至更早的时候其他文明的发展情况,或者就是告诉你也是一笔带过轻描淡写,这就是笔删春秋你看到的是我希望你看到的,我没有说谎但是我也没有告诉你我所知道的全部。在英语里面这个叫做Omission and Commission一个是有意识编造的另一个是有意识隐瞒,平常人大都在意的是一个人是否说谎,对于不说谎但是并不主动告诉你全部信息却是宽容的,所以没有人说孔夫子道德沦丧欺世盗名,可是从信息的角度来看这两中心为本质上都是相似的欺骗。所谓信息轰炸最典型的就是希特勒手下的宣传部长葛佩尔的名言“谎言说过一千遍就成为真理”,在中国古代最典型的例子就是“三人成虎”的成语来由,一个人也许原本有着自己的观点看法与判断,但是在一个众志成城的社会是不可能生存下来的,比如文革刚结束的时候有一部《苦恼人的笑》的电影讲的是一个记者每天在四人帮的爪牙威逼下在报纸上瞎编很苦恼总想能说真话,后来被洗脑,作为普通人则很可能被无休止的《新闻联播》轰炸的思想麻痹,渐渐的你会有一种定势有一种习惯把新闻当作现实把谎言称作真理。我和W讲述西方对社会主义制度认识最深刻的两本小说《动物庄园》和《1984》,这是乔治奥维尔的著作,基本上对于中国的读者来说是一本禁书或者从来不敢宣扬的恐怖的作品,因为揭露的是那样的深刻以至于统治者甚至不敢称之为禁书而招致国人趋之若鹜,反而采取不闻不问的低调以便只让最少的人群发现。《1984》对于媒体轰炸的描写是深刻的,一个人的思想是很容易受外界所左右的,尤其在由国家及其配合下的媒体洗脑食无往而不胜的。小说中的“思想警察”头子有一个经典的说法就是,单单从肉体上消灭持不同政见者是简单的也不是这个政党所愿意做的,从思想上改造使之从内心深处由衷地抒发对老大哥的爱戴之情那才是教育的最高目的,为达到这个境界思想警察的手段是非常犀利的,首先从人格上摧毁你的信仰,男主人公最害怕的是黑暗中的老鼠,当思想警察威胁他的时候他不自觉地要求把自己的恋人也就是一另一个女性持不同政见者替代自己进黑暗中的老鼠笼子,这个摧毁了主人公对自己人格的自信从此再无什么信仰得以依赖,乖乖地顺从然后是内心由衷地感激思想警察对自己的灵魂的拯救,在小说的结尾男女主人公都从“教育部”的特别教育室里放出来在路边咖啡馆里如行尸走肉般耗费生命,彼此完全没有任何的超过路人的感觉,在这一刻主人公面对电视画面上庄严神圣的党的领袖“老大哥”同志的画面在内心心底里自发地发出了比鲁迅的《呐喊》还要高亢的呼唤“我是真心爱戴老大哥的”(I love big brother)。这就是“教育”的威力。西方政治著作里常常引用的经典的名言“Big brother is watching you!”就是来自于这本小说。

七月三日 今天天气很好吗?好像是。

问:你是已经参加工作了还是现在还在读书呢?
 

是啊现在还在读书,在中国这是不可思议的事情,反正在加拿大这个无所谓,你爱干什么事你自己的事,政府给的助学金加上贷款刚好够我生活,偶尔的还可以去些便宜的地方度假,总之加拿大穷人的生活就是你并不知道你确实有多少钱,但是你一定知道你没有多少钱。haha

问:七一有没有看香港回归啊,是否应该发表一下回归感想啊,十年,对香港来说应该只是一个开始,希望香港的未来更加的好。

 
七一香港回归?哈哈。我觉得比较funny而已,中央为了证明自己所谓的一国两制是一个好的方案在香港投下了不少的血本,金融中心繁荣有多少不是中资公司的钱堆起来的?所谓的中资公司有多少又不是各个国营单位小金库,贪污腐败的需要?我在国营外贸公司待过知道大陆的公司在国外开办事处子公司是什么名堂,无非是当官的转钱方便,在国外华钱方便,反正那里一般财务处那很多都是一个人兼职的,先期头的钱花光了就回国吧。这就是香港当初繁荣的一个原因。
什么叫做领导者的亲民作风?有什么理由不应该是亲民的?那个现代社会的领袖会高高在上摆官架子?只有中国一个当官的近了一点本分被说成是廉洁,对普通人的起码的尊重被说成平易近人,这些都是渔民政策教育下的良民的反应,只能让鲁迅之类的人感到悲伤,因为国民的素质就是如此。
香港回归十年有什么可值得夸耀的地方呢?香港的繁荣是那些香港人拼命工作的努力,是大陆十几亿的人的辛勤劳动成果在不平等的社会制度下不公平的倾斜,是中国政府官员腐败的副产品,是一个殖民地社会当初遗留下来的良好制度的基础,除此之外有什么呢?
香港的未来?一个五六百万人的城市当一个有十几亿人口的大国政府不合理的倾斜政策的时候怎么着都会繁荣的,花钱推也推得出来,作为中国政府所谓一国两制橱窗的香港相邀他繁荣自然就繁荣,问题是谁来买单?加拿大议会里议员们每年争来争去的就是联邦政府因该返还给各个省的税金应该多少,每个省的议员代表向着的就是本省的纳税人的利益,联邦是大家养着的,总理也不过就是协调关系的一个行政首脑而已,这才是所谓的人民代表。不然什么是人民?不要跟我说什么抽象的名词,人民就是你我,就是这些普通人,没有所谓的全体人民利益,因为它是由各个分子所组成的,没有你我的利益拿来的人民的利益。那种到谁家里做客就带一台大彩电然后听人说好话的工作让谁敢都感的一样好,用得着什么主席总理来干嘛?花钱买漂亮话会不会啊?

在加拿大生活最满意的地方就是你有沿街乞讨的权利,因为这是你的生活方式,你觉得饿了就去救济站领吃的,然后你可以在太阳地李白探讨一些烟酒的钱,过往的人要给你钱的话还要摆出一幅尊重的样子弯腰小心地把钱放在你的盒子里以便不伤害你的自尊心。其次你可以开怀痛快地骂政府,我对加拿大政府除了感激没有什么可以表达的就只好骂远在天边的GCD,注意不是(greatest common divisor)。

七月四日 今天天气很好吗?好像是。 

诚如你所说这就是核心:

我始终认为大陆之所以用钱来堆砌香港之是为了做给台湾看而已,所制造的繁荣景象也是做给全世界的人看。
 
这也就是我讨厌的共产党的作风,当初骗农民加入人民公社,片资本家公私合营,骗人民支持他们那套封建统治,统统是卸磨杀驴的伎俩。

wmpi要下载后24小时才把license_key发过来。今天看能不能把NFS设置好,这实在是一个大笑话,这么多天这个简单的东西没有解决。linux下所谓的library的设置大约和windows类似,不同的是系统目录一般是/lib或者/usr/lib,/usr/local/lib,不存在lib和dll的区别,因为没有所谓的stub链接就是头文件+可执行码,静态库一般命名为libxxx.so,动态库命名为libxxx.sa,这样链接时候可以不写全名只写-lxxx,哈哈,这是超级基本的常识,如果你要解决lib版本的冲突,就用symbolic-link,如果你的library不放在默认目录,要自己设置环境变量LD_LIBRARY_PATH,bash下这么写LD_LIBRARY_PATH=....;export LD_LIBRARY_PATH。我想这些超级简单的东西还是去记一下,使用任何的工具都不如这个来的直接,那个什么ldconfig之类的也不过就是一个小工具去读ld的一个类似cache的文件,这个工具本身都不一定有安装,而且我经常被unix和linux的不同命令所混淆。

/opt/hp下面有我所需要的所有hp的文件,包括mpi,remote-graphic,一下是那个穷鬼slurm的命令:

scontrol show partition显示了当前的partition。sinfo显示了当前的up的partition猜想如此。

scontrol show configure显示所有配置。

squeue -u qingz_hu -t all显示我的任务的状况。

srun hostname我在哪?man slurm.conf帮助文件

PA买的sunkist橙子有问题,怀疑不是美国加州生产的,看来又要重新吃苹果了。
在网络上向找一找王朔的个人博客,看看这可我认为当代中国最伟大的文学家的活思想,可惜找到的并不太像,好像一个小孩子伪造的博取小女孩欢心的淫巧。

我总想反复地告诫国内的无知的小孩子一个简单的道理,对于如何处置俘虏是胜利者的特权,期望战胜者的宽容是很幼稚的,所以对于南京大屠杀之类的事情要客观地看,并不是什么日本侵略者特别地残忍,而是这是战胜者的选择,换作其他国家也有可能做出类似的行为,作为胜利者以任何方式惩办失败者是你的权利,中国放弃自己所谓的胜利者的审判权本身就是一个问题,有可能是信心不足的表现,换言之中国是否是二次大战中的真正的战胜者?这种事情在第一次世界大战结束的时候就发生过,当时北洋政府押宝押对了,一战结束本是所谓的战胜国,结果对于所谓的战败国德国在中国的殖民地居然没有权利去索回反而被另一个真正的战胜国日本接管了山东,二战结束和一战结束何其相似,不是自己真切感受到的胜利不懂得战胜国的心态,仿佛一辈子当奴仆别人把你放在主人的位子上也摆不起主人的架子,所谓扶不起的阿斗而已。所以,放弃战胜国对于战败国的惩办就不要再回过头来说什么,这点骨气都没有只会让真正的胜利者看扁,所以不要总是喋喋不休地谈什么反省战争之类的妇道之见,真正的日本人根本就看不起这种幼稚的想法,只有战胜国的声音会留在历史的记忆中。 每次看到国内一帮人津津乐道地跟人本人争辩南京事件中究竟日本人杀了多少中国人,强奸了多少妇女,究竟你证明了不是三万而是三十万又能怎样?为了什么?so what?仿佛再说一句潜台词:作为一个正常的侵略中国的国家拟在一个城市可以屠杀的额度应该是三万,结果你超过了十倍,这样不对,你应该反省,如果你不反省就有可能下一次侵略的时候再次犯超过配额的错误,如果你认真反省承认你超过杀人配额的话我们就既往不咎同意你有可能在将来的侵略战争中不至于在犯超过配额的错误。

七月五日 今天天气很好吗?好像是。 

今天实在是一个混乱的一天。早上出门命名就在向是否应该把牛肉墩上,结果一走神就忘了,在实验室突然有同学来说你家着火了这才想起来往机关炉子了,跑到家一看连救火车都来了,屋子里面还好无大碍,不过有些狼藉。

1。有的成需要运行时候必须在我的home-directory执行,所以RGS不能正确显示的原因是我的directory没有chmod o+x。

2。sftp可以直接作文件的读取,暂时把nfs设置放一放,注意防火墙的设置,在system-setting/security-level里面把ssh加入。

3。在ssh窗口里面不能正常运行图形程序的原因可能是x-window的问题,比如你用ssh -X登陆就可以解决这个问题了,joel给了一个hack的办法就是先用srun -N1 --nodelist=n81 cat运行一个程序让我们随后的ssh可以自由登陆n81部需要密码验证,这个时候ssh n81.cirrus.private -X就可以正确运行OpenGL的程序了。

4。现在在RGS里面我运行mpi程序还是不行,程序就PD(pending)等待资源分派。比如mpirun -srun -N4 --nodelist=n81,n82,n83,n84 myProgram.exe;如果我当前的RGS登陆的是n81程序pending,如果登陆的node不再nodelist内则立刻出错和x-window的错误类似。

头疼啊,头疼了。

七月六日 今天天气很好吗?好像是。 

RGS是可以允许多个连接的吗?试验一下吧。目前发现的问题是mpirun设定的nodelist如果包含了RGS正在访问的节点系统就会pending等待resource分配。现在还未触及图形的问题,如果能够在每个节点运行x-server也许就可以解决吧,太复杂了。

NFS有防火墙的问题,如果iptables没有允许nfs:tcp的话爆出unable to route的错误。但是service iptables stop依然有permission denied的问题。正常在system-setting/service里面可以开启nfs服务,但是手动起动也可以吧,portmap,rpc.mountd,rpc.nfsd,rpc.statd,rpc.lockd,rpc.rquotad,但是我看到一个问题就是这样其懂得daemon的用户名是rpcuser,不知道这是不是问题的症结。设定完/etc/exports之后可以用exportfs -ra刷新,如果用dirname   ip1/ip2(rw)格式说明ip1到ip2之间。

这个问题讨论了很久依然没有结论:两台linux,A,B,我在A上用ssh -X登陆B运行一个B上的图形程序,比如openGL的程序,在A上会有图形窗口,那么用ps看到的这个图形进程确实是在B上运行的,但是它是否是使用了B的显卡,还是说简单把B的pixel发送给A的window?我认为是使用A的显卡,因为B的window根本看不见操作系统压根就不会把它发送到显存,应该是X-window的client端发送给在A的X-window的server端(正好和ssh的client-server颠倒了),但是具体是怎样的呢?

看泰国的《拳霸》感觉中国武术花架子太多,作为健身的成分大于攻击的成分,比如用脚来共计有攻击距离长的有点但是力度肯定小于膝盖,泰拳里面膝盖的大量使用非常的凶狠经常可以是致命的。

<Yes, Prime Minister>可以是我最有价值的收藏,物超所值,amazon明码标价要一百多,我从amazon的网上商店买的,一个laval的小零售商差不多只有一半多一点的价格。

七月七日 今天天气很好吗?好像是。 

从小到大都接受的一个教育让我丧失了真正认识一个事实的机会,比如我从出生就被灌输的人民军队鱼水情的观念,仿佛这是人民军队的特权,仿佛一切反动派的军队都是鱼肉乡里的土匪流氓,平常没有人去怀疑因为在中国的历史上历朝历代的军队从来就是像土匪一样。但是有多少人会认真向想一想这种所谓的军民鱼水情真的就是所谓“人民军队”所独有的吗?任何正常国家的军队不都是来自于人民吗?有雇佣军吗?对于国防军来说几乎没有。那么单单所谓的“人民”军队的人民二字就是一个幌子,美国日本欧洲发洪水,火灾等等重大自然灾害的时候哪个国家的军队不是身先士卒救民于水火之中?因为这些士兵是纳税人的钱养着的,当然有义务就老板,这个很难做到吗?在厦门看到的兵痞子不应该仅仅是PLA的个别现象,部队的腐败决不是什么一朝一夕的事情,清帝国的腐朽与灭亡决不是仅仅是慈禧一个妇道人家的责任,帝国的军队是最先体现王国迹象的地方。看《凤凰资讯》里PLA参加亚太军事论坛实在是一个让人哭笑不得的时刻,参加这样一个高规格的国际论坛相信PLA肯定是精英尽出在国际橱窗上展示一下,可是我看到的依然是一个三四十年前的停滞不前的样子,仅仅从一些浮光掠影里看到的,(原本就只有这么几个镜头)从一个细节就看到一个高级的现场传译简直还不如一个外语学院毕业生的水平,我可以猜想这其中的原因,这个军队的体制决定了他不可能吸引选拔最优秀的人才,军事院校历来是高考落榜生的汇集地,参军是农村青年和城市失业者无奈的选择,部队里面假大空形式主义政治挂帅帮派林立是一个彻头彻尾的大染缸,难怪复转军人常常会觉得脸中国军队这种地方都带过了没有什么困难不能克服的,美国日本的军队虽然不是绝对的精英荟萃的地方,但是绝对是吸引到不少的优秀人才,日本自卫队是十几个大学生竞争一个,美国西点军校不是随便都能报考的,需要本州的国会议员写信推荐,环顾世界哪个国家不使用最优秀的人才打造军队?和世界上最优秀的精英对抗八旗子弟掉这三个代表的大烟枪能和谁对抗?一个翻译的英语水平原本不能代表什么,但是如果两一个像样的翻译在军队系统都找不到你就制导这个系统的问题有多严重了,我们可以大胆的断言很多所谓的高科技的武器在中国根本就不会用,当官的怕咏怀也不敢担责任,这就是中国空军飞行时数远远小于美日的一个重要原因,战场上没有什么可以向在中国官场上投机取巧的地方,可以蒙共产党的干部可是你蒙不过美国飞行员的导弹,迟早有一天中美或者中日要有一场较量,那个时候共产党政权垮掉没什么只是如果中国没有尽早建立第二种政治力量那就是老百姓的灾难了,所谓为天下苍生计不得不为也。

读HP的HPC的文档实在是有些头疼。

看马英九的宣传实在是觉得这是一个小官吏竞选的架子,所谓的政治家引导民意,政客操弄民意,只有像马英九这样脑子缺乏主见的官吏会被民意所左右,比如布什就算是一个介于政治家与政客间的人物可以冒天下之大不韪坚持自己的理念,人民不需要一个彻底的政治家,如果普通群众觉得你跟他们没什么两样干吗还要选你做?自己就当总统好了!你要用自己的信念震撼普通的渔夫渔妇,所谓《围城》里所说的政治家与医生一样都是要以谎言来对待平民的,这不叫欺骗这是手腕,人类社会里超过80%的人都是在多数方面无知无识的需要专业人员的“引导”,换言之“欺骗”。政治也是一样,有些东西怎么可以明说?怎么可以明做?一个连自己的主张都不确定的人能当领袖?天天摇摆不定希望左右都能逢圆?稍有主见的人都不会将国家的领导权交给这样不可靠的人,马英九的落败是必然的。

我发现了一个办法,用RGS连接到所有我想要运行程序的节点,然后不要再用“srun”而是直接用mpirun -hostlist "n81 n82 n83" ./mympiprog.exe这是因为运行sva_remote.sh以后应该就是用srun分配了资源,只不过它只分配一个节点而已,不过这个做法太笨了,同时我还是无法运行图行程序,远程的图形还是失败,相信是x-server的问题,还要读HP的文档才行。此外在hp的sva目录下有每一个进程的设置文档,这应该是关键,可是我就是找不到sva_remote.sh在哪里?一时火起花了几分钟自己写一个小小的find,可是linux有点白痴,命令行参数不能带*这让我很郁闷。

七月九日 今天天气很好吗?好像不是 ,下雨了。 

很久很久以前,就是大约半年多前,我曾经追踪过glut发现了从远程窗口创建新窗口不能立刻获得显示(准确地说是从icon变成窗口)的问题,改了一个参数然后号称自己hack了glut,现在我已经找不到我在那里做得因为没有加注解,花了半天才从source-safe里面找到,是这样的:

the file I hacked in glut is "glut_win.c" and what I did is like this:

//////////////////////////////////////////////////////////////////
  //here is what is hacked by nick//
  //The original WS_XXX doesn't include WS_VISIBLE and I added so that child window
  //by default is visible.
  window->win = CreateWindow("GLUT", "GLUT",
    //WS_CLIPSIBLINGS | WS_CLIPCHILDREN | style,//modified by nick
WS_CLIPSIBLINGS | WS_CLIPCHILDREN |WS_VISIBLE | style,
//////////////////////////////////////////////////////////////////
//end of hack by nick//
    x, y, width, height, parent ? parent->win : __glutRoot,
    NULL, GetModuleHandle(NULL), 0);

教训就是要登记留念否则就化为乌有了。花了将近两个星期断断续续地没有解决的NFS问题终于获得了解决,原来都是防火墙在作怪,(我想还有别的干扰因素吧,才会有时可以又是不可移,有的可以有的不可以。)那么启动nfs服务最稳妥地还是用shell的service nfs start不然那些daemon谁知道有没有顺序,并且要把service iptables stop先执行来关闭防火墙。/etc/exports下面最好用ip地址,改变后用exportfs -ra来刷新,但是不同linux版本又会有不同的参数设置,什么sync,async,我没时间考虑这些了,ignore warning。

我自己写的那个小小的find有不少问题,哈哈贻笑大方了,第一,linux有一个独一无二的目录参数就是根目录“/”这个很讨厌,你不要在他的后面加"/"了,因为所有其他目录都可以约定说目录候补根"/"而是由程序自己加"/",唯独linux的这个不行,这恐怕也是windows必须要加drive名的一个小原因吧,最严重的是我opendir却忘记了closedir,压根没有一个意识,结果系统因为你开的文件太多就报错了,我想编程序以来很少会意识到实际上opendir就是用open来做了一些复杂烦人的事情,今年做comp444的TA明白了opendir是怎么回事。那个读取的过程很烦的。

我都快饿晕了。搏斗了一天,终于完成了wmpi的linux下的配置与 程序运行。 期间真有如西天取经一般的困难,发现了不少的稀奇古怪的东西,比如我的linux mount 一个fat32的windows partition作为平台间的交换区,同时网络里每一台linux都把所有其他linux的文件mount到本地,结果那些在nfs下mount的远程电脑的文件系统中的fat32的mount是看不到的,就是失败了。文件拷贝的时候有一个错误就是拷贝到远程文件中的文件的owner成为乱码,只能在本地拷贝远程文件到本地才行。wmpi的配置文件有两类,一个是所谓的license配置文件,这个linux的配置文件是和windows不同的,在/etc/wmpi2/wmpi2ls.conf指明了license服务器的名字或者ip,所有的workstation都要的,其次,在可执行文件的wmpi2.conf实际上是告诉运行期的workstation的名称,对于program.pg2则是包含更多运行信息,如程序路径,运行的process个数,运行机器名,同样的master名字可以而且必须省略。linux的graphic driver现在看来是个大问题,据说要重编译内核,这是在有些恐惧。另一个令人不安的是我原本认为后台运行的daemon不能正确产生在前端运行的window程序,因为我认为子进程是依靠父进程进行消息循环的,如果父进程根本不可见有怎么能够行呢?可是现在wmpi的linux版本否定了这个想法。一定要和hp的技术支持直接联系才方便。

此外把那个贻笑大方的simpleFind的正确的linux版本贴出来。(TNNDemail发错了,明天吧。)

七月十日 今天天气很好吗?好像不是 ,阴天了。 

正确的simple-find贴出来,很简单但是everyone can contribute a word.花了一个早上安装linux的显卡驱动,Nvidia稍微麻烦一点但是很有效,可是ATI的安装程序很简单却没有效果。安装显卡的时候Nvidia需要关闭x-server,用telinit 3并不太行,最好是该/etc/inittab里面的默认runlevel为3重新启动安装sh driver。

copy or reference?

在洗衣房等待的时间是我唯一能够静下心来读书的两个时间,另一个当然是每天早上起来后进行得新陈代谢的活动时候。唯一得到的一点知识就是x-server靠的事网络通讯协议来交互的,比如TCP的异步传输,所以他的所谓的display就是一个hostname:displayIndex:screennumber,所以,前两天的那个疑团得到了一个最终的答案,实际的显示设备是由这个所谓的display指定的,当然这个前提就是你要在这个host上运行有一个X-server,这就是Dr.M所谓的client-sever正好相反的意思。因此显示设备和render的运行时可以逻辑上分开的,完美的设计完全给予网络化的设计。

Linux设置局域网连接实际上很简单,使用Internet connection wizard或者直接改system-setting/network里面的设置,可能主要是我的router设定成只接受一个固定ip地址范围,所以还是不要用dhcp,局域网连接设定完毕之后一定要设定dns server,最好查isp的现在值,这个总是在变的,没有什么好办法,时时更新吧。

连一个简单的tar的参数都需要记忆真是麻烦,因为看manpage根本就不明白什么叫做过滤,tar -pzxvf file.tar.gz,有些说明根本不是对于一个完全没有压缩常识的我来写的,这就是烦人的地方。看到一个什么"equivalence"的设置就是在/home下的.rhosts里面列出不需要密码登陆的host。但是我现在连linux的hostname都设不对,openGL压根没有安装居然没发现确去安装glut难怪有错。

七月十一日 今天天气很好吗?好像不是 ,阴天了。 

linux下运行的mpi的daemon是无法写文件的,因为是daemon,只有用syslog,像lam-mpi那样可以把节点的输出导入master节点绝非自然而然的,是一个extra-effort的实现。记住,syslog存在/var/log/messages内,一般以文件名为entry,我想如果能够调用opensyslog就可以创建一个文件名了吧。试一试喽。cat file1 file2 > grep "key1 key2" > result.txt

七月十二日 今天天气很好吗?好像是 。 

大概一个人开始接受linux需要在使用计算机大约五年以后,至少这是我的case,当你希望不花钱就安装所有的网络应用的时候,当你想要diy所有的事情的时候就知道GNU的伟大。设定ftp是这样的,在/etc/init.d/vsftpd start,你如果想要改变配置文件,/etc/vsftp.conf,如果想让什么用户访问的话,改动vsftp.ftpuser和vsftp.user_list,因为里面默认是deny的,所以要comment掉。今天印度小孩又在网上面试作题,看到一个很好的东西,就是#ifndef  xxx #define DEBUG(X) 这个是非常危险的,因为如果那种懒惰的程序元写的代码就会有问题,比如if (!a) DEBUG("GOGO")因为这个if会爬到下一行的。另一个很有意思的是汇编伪代码,比如一个架构的机器有两个register A,B; two memory location 0,1;two instruction: store reg mem: stores contents of reg to mem in memory. sub mem reg; subtract contents of reg in register from contents of mem in memory. Now question is to design a instrctution to copy reg to anther reg. Is it trivial? I don't think so. Think about it and can you optimize it?

今天去kayak,忘了怎么拼了,反正是独木舟,很好玩,这就是加拿大人最喜欢的运动之一。

七月十五日 今天天气很好吗?好像是 。 

不知道改动了什么linux的eth0又无法连接来,mii-tool显示no link这是什么原因呢?会不会使我删除过nic之后的问题呢?今天又尝试了另一个办法,就是sva_remote.sh脚本里面有分配render,compute的参数,道理可能和srun之类的一样,但是问题是否是x-server的问题嫩,好像脚本里面有启动所有的node的x-server,(不很确定,因为对于脚本参数判断语句不甚了了。)尝试sva_launch_x_server结果本地结束,远程由hold在那了。但是不管怎么说sva_remote.sh -r n -c m -I给了一个途径,现在需要看glut_init的linux源码到底是否是x-init的错误。

下午去chinatown给手表换电池,顺便测试帐篷,晚上和王林森研究camping的路线,yahoo的map比google-earth好多了,加拿大的信息化程度非常的高,基本上什么都可以在网上找到。

七月十七日 今天天气很好吗?好像是 。 

我曾经发誓拒绝学习脚本语言,可是今天不得不学因为要读懂HP的脚本。$n代表命令行参数变量,$#参数个数,$*或者$@全体参数,$?代表执行结果0或者非零,>重定向输出到文件创建新文件,>>添加到旧文件结尾,-n str  mean not NULL and exsit; -z str means is NULL and exist.
-s file    Non empty file
-f file    Is File exist or normal file and not a directory 
-d dir     Is Directory exist and not a file
-w file   Is writeable file
-r file    Is read-only file
-x file    Is file is executable
string1 = string2 string1 is equal to string2
string1 != string2 string1 is NOT equal to string2
string1 string1 is NOT NULL or not defined 
-n string1 string1 is NOT NULL and does exist
-z string1 string1 is NULL and does exist

花了快一个小时才找到一个合适的地方放照片,yahoo相片倒闭了,163从来就是故意做成有bug让你知难而退,而且慢得一塌糊涂。微软看样子几年内不会倒闭,放在这比较保险吧

实际上sva_remote.sh是一个综合的任务部署器,它可以直接部署执行远程的图形任务,首先初始化显示节点,并且运行render和diaplay节点的x-server,然后执行后面命令行的任务,如果是interactive模式则等待用户输入。比如sva_remote.sh -r 2 mpirun -np 3 -hostlist "n81 n82 n83" ./myMPItest.exe问题是我在执行mpi程序前必须先设置mpi运行环境module load mpi,但是在远程运行则无法这样,是不是呢?再去实验室试验一下吧。

一切都是在疑惑中,

sva_remote.sh mpirun -srun --nodelist=n81 /sfs/backup/all/qingz_hu/mytest/myMPIGraphic.exe是可以的但是这个等同于单机运行,如果加入一个render node比如-r1就不行了,现在不是资源分配或者X-server的问题,因为他们是正确了,甚至我的display节点都成功进行了glut的初始化等等,但是没有窗口的产生。运行例子paraview的时候需要正确设置env,我的shell可能是c-shell,用bash的export不行,所以我就只好/bin/bash直接运行bash,export PATH=$PATH:/opt/paraview/bin,或者就是永久性的改我的~/.cshrc文件里的setenv了,要source ~/.cshrc

空间不够了,能删的都删光了,想升级一下,可是一年多花几十块钱买到的不过是多了10M而已,不划算,决定不从前引以为豪的一个project的可执行文件及其数据放在这里

七月十八日 今天天气很好吗?好像是 。 

的确csh用的是setenv。对于shell我总是抱有抵触态度,因为我的记忆力不好对于浩大的命令及参数有点力不从心,不过说到底这不过是别人写好的工具你拿过来用,no big deal。

早晨醒来觉得无事可做,第一眼看到北京奥运的消息非常令我鄙视,因此我决定个人抵制这个政治橱窗展示会,当然这个地球多我一个不多少我一个不少,但是抵制奥运从我做起。

一个人早晨刚起床没有刷牙(我从来晚上刷牙的),没有洗脸,突然开始思考一个严肃的问题是非常让人措手不及的,我为什么活着?说得清楚一点我凭什么生活着?很多人出卖自己的劳动时间,甚至出卖自身某些器官的使用权,我有什么器官可以出卖呢?出卖头脑?我天性疏懒不到万不得已决不愿做这种事,怎么办?怎么继续生存呢?一个人早晨刚起床没有刷牙(我从来晚上刷牙的),没有洗脸,突然开始思考这样一个严肃的人生问题是非常让人措手不及的。

凤凰资讯讨论是否应该由大陆出钱收购台湾农民的香蕉,这是典型的伪命题,孔老二的以德报怨被人误解了,这是我最近听到的,什么以德报怨?那么拿什么报德呢?

七月十九日 今天天气很好吗?才怪,下大雨了 。 

意志消沉情绪低落仿佛女人一般地多愁善感,一个简单的refine-3D-mesh我不知道是不是我的头脑在不多的退化,无非就是把递归改为循环用一个队列来做的,这种东西为什么我总是搞错呢?我仅仅为了一个数学上的特例牺牲了代码的可读性,比如任何输得0次幂为1这纯粹是数学家的投机取巧究竟有无客观世界的意义呢?碰巧我要使用这个数列,1,4,16,64,256。。

星期天要出发了,昨天在自行车后袋子里放了两个小哑铃来模拟重量,结果迷路了在运河边骑来骑去,实际上我是严格按照算法里面的原则作的,首先想做走距离n,如果无结果回到原处向右走距离2n,如果无结果再向左走距离3n,如此循环不已。有另一种argument就是左右随便挑一边一条路走到底,其实这些都是没有学过计算机科学的人的愚见,计算科学一般不考虑best-case连average-case都不一定考虑,我们考虑得是在worst-case下的问题的解决方案,想想看当luck is not a factor你应该怎样做?哪种做法是最正确的。(不过这些都是文过饰非的说辞,实际情况是我总是在决定之后摇摆不定在四周昏黑的运河边我只是想没头的苍蝇东冲西撞而已。最后不小心看到了downtown的灯塔才找到了回家的方向。)

七月二十日 今天天气很好吗?才怪,下大雨了 。 

HP的Glenn给我了一个解决办法,其实很简单,就是照样先用sva_remote.sh -r 5 -I县分配好显示节点,用RGS连如以后原本srun重新分配资源pending的问题是这样解决的,就是定义SLURM_JOBID为当前的jobid,他搬来用一个脚本获得,squeue -h -n $HOSTNAME -o %i但是看起来在c-sh里面用setenv不行,bash的export可以在脚本里面执行脚本。这样在执行module load mpi, mpirun -srun ./myprogram.exe,也还可以决定需要多少节点,比如-N 3。结果一切正常但是fps并不高,这能怪谁呢?显示10m的triangle只有5fps左右,而单机运行也有2fps,不过我只有8个节点,真正rendering的节点不过3,4个,线性是不可能的。从早上6点半到中午12点半整整六个小时仿佛像梦境一样,怎么说呢?你做一件事是你一直想做但又不知道的,可是当你突然可以做的时候发现你要做的其实是另一件更重要的是,这不过是你的一个前奏而已。

七月二十一日 今天天气很好吗?才怪,下大雨了 。 

明天一大早我就要出发骑自行车去魁北克了,一路上必定有着风风雨雨,好像人生的浓缩版。

七月二十九日 今天天气很好吗?才怪,下大雨了 。 

其实前天下午就回来了但是到今天才提起精神来,怎么说呢?感觉是有一点点地身心疲惫,简单地记录一下吧photo1, photo2, clip1, clip2.

google实在是太强大了,有时候把你心里所想的赎金去搜索一下,看到意想不到的结果一颗心仿佛突然都不想跳了。

七月三十一日 今天天气很好吗?是的 。 

我不知道这样的错误是怎么来的,linux的临时文件名长度只有20,我却用windows的max_path来等同,真是无理头,导致buffer-overwrite错误实在低级。整个代码都忘光了,我的master时不再读octreeLoader的东东了,因为是分布式嘛。

八月五日 今天天气很好吗?是的 。 

什么叫无聊?就是没有什么可聊的。为什么我最近总是穿短袖衬衣呢?因为旅行回来没有洗衣服没有的换了。昨天终于洗衣服去了,像往常一样这时我平常仅有的两个读书的时间之一,看了没有一分钟就睡着了,为什么平常睡不着一看算法书就立刻睡着呢?这就是我总在床头摆上基本算法书的原因,备而不用也好。只明白了一个道理,在KMP之类的基于prefix的搜索方法中prefix里面的suffix可能是其他的prefix,找到了这样的边界就是pattern预处理的要做的事。比如,pattern=atatatt;那么目标字串atatat.....就包含了三个prefix。

八月七日 今天天气很好吗?是的 。 

生命的长短是依靠记忆的多寡来衡量,记忆的单位就是信息的单位,namely bytes。在无所回忆的日子里我觉得我只是行尸走肉,因为我并不记得我做了什么也不敢承认那些名义的岁月是我生命的一部分,似乎我的人生必须要用有意义的byte来表达,不是吗?在三河镇的河边宿营的那个傍晚我们看到了生命中可能是最美丽的黄昏,天空是粉红的,河水也是粉红的,那梦幻般的天空仿佛WOW里的outland的Honour Hold的天空一样。记忆全都变得支离破碎全部都是一些场景的片断,在那个巨大的Sancruary戴皇冠的圣母玛丽亚也是在那夕阳下显得格外高贵神圣。

GB2312和unicode毫无关系,所以非unicode的语言当然是gb2312了。我发现在sva-node里面一个slurm的job往往产生若干个slurm.xxxx的demaen,这里的xxx好像就是x-server的log里错误信息的client-xxx。前两天翻了一个傻,我想扩展模型但是不愿意重新处理数据就拷贝数据但是这样按照octree的原则我必须把尺寸扩展一倍,这样效果不是太好,模型太远了,不过看不见的东西未必就不去render,所以我觉得这仅仅是使觉得问题。

八月八日 今天天气很好吗?是的 。 

痛苦的一天!1。我发现了我以前的问题,路径名hardcoding的问题提前反击了,我每次一处理都是对同一个文件操作,当然文件就corrrupted了。2。在sva_remote分配的slurm-job内在进行任何的srun都是一个任务,相当于srun带jobid的参数,所以我一旦关闭RGS自然观比我的任务,这大概就是支前任务不能继续的原因之一吧?3。srun -O是允许多个process运行在一个node上,但是问题很多,首先显卡的读写好像没有同步.4。我注意到RGS的显示丢桢很严重,联想x-window非即时的特性更要小心。5。readPixels,drawPixels,如果类型是float也一样要rgb各自对应一个float,我怎么总是忘记呢?6。运行mpi在rgs里面要记住用-srun --nodelist=n86,n87来吧displaynode放到当前,不然又要像一两个小时不明白为什么window没有创建。7。drawpixels的rasterpos还是讨厌的恨,最好还是用ortho先把偏移作掉,省得-1.0,-1.0的讨厌坐标。(这个问题我至少已经反反复复五六次以上了还是不明白怎么回事,实在是够笨得了。8。终于证实了wmpi实在是太滥了,HPMPI即使是上万个request朝阳没有问题,当然曼的几乎停滞了,可是至少没有错误。

八月九日 今天天气很好吗?是的 。 

完全是无理头,或者说超级白吃,我想读写显存,结果却在clearcolor里面完全刷新,这当然是白吃,正确的做法或者是在clearcolor之后作就是在displaycallback里面,或者是在keyboard里关闭clearcolor再读写。至此我才回过头来看我究竟要干什么或者说这一切的一切是为了什么?一开始时想证明HPMPI的现存读写不同步,结果跑到了这个地方。

八月十二日 今天天气很好吗?是的 。 

中午郁闷不已,决定骑车出去散心,蒙特利尔的美丽在皇家山,在运河,在圣劳伦斯河。回来后才发现也许事情并没有那么糟糕,因为任务继续在运行,没有看到临时文件是因为还没有生成呢。读了一篇关于甲午海战的分析文章非常的详尽,很有见地,所谓战败非战之罪,乃是那个政权的腐朽,不论多好的武备都是注定要失败,所谓覆巢之下焉有完卵?今天的PLA估计和当时的北洋舰队差不多,一样是注定失败的,因为就算比清军腐败少一点,要知道当年的敌人却是一个还没有发育健全的日本,一个仅仅经过三十年维新而已,根本没有什么家底,所以今天的PLA恐怕败得更惨。兵者,国之大事也,死生之地,存亡之道,其有不查之理?可惜GCD抱残守缺仅仅想维持政权而已,哪有什么心思理会这些。

八月十五日 今天天气很好吗?是的 。 

我的小实验还是有很多发现的。1。bitmap的格式其实挺复杂的,16bit一下都使用palette,就是子代的colortable。2。我的机器上的opengl已经是2.0的了,但是我的头文件gl.h还是1.1就是wind95时代的,所以我居然不能使用GL_BGRA,为什么要呢?你读bitmap的时候colortable的格式就是这样的,网络上的小孩子们写的粒子都是要再读文件的时候翻转,但是在1.2以后有了这个就不用该文件数据了,可是我找遍internet也找不到下在gl.h的地方,真是郁闷。3。opengl可以有至少四种不同的实现,就是根据superbible的说法,有所谓generic,mini-client等等,opengl32.dll就算是generic不讲效率的。4。extension还是一个老问题,ATI根本就不支持多少extension,所以colortable根本就没办法试验,那么opengl是怎样用colorindex的呢?我始终不明吧,好像OpenGL不支持palette的创见,你要自己做。5。glGetString一定要在初始化之后才行,我图省事就用glut来做,最基本的就是创建了window,设定了displaycallback。

八月十六日 今天天气很好吗?是的 。 

白吃级的问题就是word是连个byte的,dword才是4个byte,gl_byte=signed char,24bit的bmp朝阳市在每一行都align,同时bitimage长度可能设为0,所以要自己去算,算得时候要考虑行尾补齐的问题。别忘了还是bgr,wglGetProcAddress其实就是getPocAddress的wrapper,但是我在dumpbin里面看不到,为什么?我想原因很简单,因为extension原本就不是generic的实现,所以肯定不在opengl32.dll,要到显卡的驱动力去找。今天去找Dr.G又一次佩服的五体投地,就是说我如果能够看一公里远,他早已看到了上百公里,我今天想到的东西他可能早就想过了。我一直担心displaywall扩大解析度导致scalability不足的问题,在他看来这是完全无关的一个问题,甚至于可以采用sort-first来结合解决。这是我所没有想到的。glColorTable似乎不起作用,不过我想可能是我用了glut来初始化为rgb的原因,而我也认为可能glut在color-index上有bug因为我没有办法初始化为color-index模式,trace的结果是读到glut的注释说如果buffer-bit超过24以上就不行,这是很难理解的,不过总之glut有源代码至少还是可以追踪的,实在不行就用windows的PDF(pixel-format-descriptor)。不过这实在是有些insane,为了一个简单的目的转了非常大的一大圈,以至于块忘记了当初的原因了。不过至少玩过了bitmap以后可以至少不胆怯了。

很多时候我都翻一些最基本的错误,比如函数指针这个说法就有欠考虑,首先函数本身是不是指针呢?当然是,那么你声明的函数指针和普通函数类型有什么不一样呢?我就犯了这样的错误,openGL extension里面的函数类型在glext.h里面都声明称了函数指针类型,那么你用wglGetProcAddress之后的得到就是函数指针,不要把glext.h里面声明的类型再声名成指针了,我为此付出了几个小时的时间,白痴。typedef void (*FuncType)(int param1, float param2);extern void myFunc(int int1, float float2);FuncType myFuncPtr=myFunc;

myFuncPtr(123, 12.5);

八月十七日 今天天气很好吗?是的 。 

windows下长文件名的限制可以用加前缀“\\?\”来解决,但是好像还是会有些问题,比如文件名里面出现特殊字符之类的,可能我需要使用widechar的类型函数吧。16bit的颜色有些不可理解,color-table里面三个dword型mask究竟要移位多少呢?是555还是565呢?还是自定义?这简直不可能,我想我应该使用BITMAPV5HEADER而不是普通的BITMAPINFOHEADER,不过我找不到shift数,并且不明白sRGB是什么,再找找吧。 我想所谓的sRGB无非是一种特别的gamma增强机制,比如人眼对亮度的敏感超过对于颜色的敏感,这是人所皆知的常识,但是亮度的变化不是线性的,所以。。。

《凤凰卫视》的“军情观察室”是我觉得最有价值的节目。如果日本采购一百架的F22那么它就继续保持它的世界第三大军事大国的地位。

八月二十日 今天天气很好吗?是的 。 

一晚上喝了好几种的酒精,当然我现在根本就不能抵御酒精折磨自然是浅尝而已,可是遮还是一个致命的问题,在酒精的作用下你的思想总是有着非同寻常的运行,这共证明了我的所谓思想是一种普通生物化学反应的理论。年轻的时候我常常说酒精无非是麻木一些兴奋的神经,兴奋一些麻木的神经,可如今我却完全没有多少神经去麻木,也没有多少神经去兴奋。昨天于今天都在做一个小小的工具,算了,明天再说吧。实在觉得没有什么可以说的。完善了一下我的小工具。

八月二十二日 今天天气很好吗? 不是,阴天。 

如果我能够坚持去健身房,我想到圣诞节的时候我就可以在肚皮上刻一个王字或者田字了(纯属想象)

GlobalAlloc分配的内存对象(memory object)很可能是一个结构,就是说不能直接当作指针使用,要用GlobalLock返回的指针。 再重复一遍,如果你的source-code文件用cpp后缀,vc6会把它当作c++来编译,直接的后果就是dll里面的函数名会变成c++的decoration,比如又连个@@,所以,要用extern "C"来裹起来,cdecl函数名字不变,stdcall应该会加上_,这个问题我已经说过了可是我是忘记,当初使用ordinal来避免调用函数名字的问题,现在又忘了。注册windowhook的时候的handle我始终吃不准,使用GetModuleHandle得到的不知道是否正确,更重要的问题是在hookfunc里面我能做什么?我试图输出文件,甚至postmessage都不成功,实在是不明白。

八月二十四日 今天天气很好吗? 不是,阴天。 

大概是明白了,hook实际上依赖于消息循环,如果我的loader程序本身不是一个带有消息循环的win32程序可能就有问题了,所以用console做的loader有问题,此外lowlevelkeyboard只能在win2k才行这也是比较郁闷的,xp之类的使得你的hook只能看不能抹。在vc6里面创建多个project在一个workspace里面很好,但是要注意默认的debug信息文件都是写在墨人的debug目录下,vc6.p**这个文件是重名的所以互相覆盖,如果要跟踪就要改道不同的目录下。看到一个高手写的injectdll的方法,钦佩了半天还不能十分理解,我怀疑像是kernel32.dll里面是否会有消息循环机制,inject到哪里是否有用,好像loadlibrary和filemapping似乎是等价的,还是我理解上的错误?#pragma data_seg("SharedBlock") ...#pragma data_seg()是否也可以用globalalloc来等同呢?当然我觉得好像风马牛不相及,一个是静态数据一个是globalheap,问题是dllmain并不代表时第一次运行,(难道不是吗?应该是。为什么不是呢?所以应该可以吧?无非都是非相对地址吧?不确定。)感觉中级程序员的全部工夫都集中在dll的相关的东西上,不过话说回来了,难道有什么不可以做成dll呢?win32的WM_COMMAND就是菜单之类的事件,我一直没有玩过win32app实在是一个丢人的事情,原因是我懒,难道一个人懒有错吗?难道没有吗?你要原谅我说废话,因为一个人晚上三点睡觉七点半起床难免脑子有短路的嫌疑。
更正:以上说法大部分都有问题,windows里面任何的窗口都是有消息循环的,这是少有头脑的人都可以想得到的,如果没有那么window怎么管理这个窗口,怎么重画窗口?所以刚才的想法就是白吃级的想法!唯一应该的原因就是console也许把某些i/o阻断了,所以才没有办法显示结果,这也包括文件和messagebox。实际上什么类型的loader都是无关的,你call的是一个dll里面的函数有什么区别了?不同的事如果使用win32的入口函数winmain如果你不画窗口,在console里面执行仿佛createprocess声明no-window一样的效果。dll不能独立运行,他只是一个函数库而已,这个基本概念在这里重复都是多余,但是我当初却总有错误的想法,以为loadlibrary就算运行,实际上map一个file到内存里和运行一个process是天差地别的。所以才会有人要把dll注射inject到别的进程中去。

八月二十五日 今天天气很好吗?是,不是,阴晴不定。 

It is a sunny day. No, it is a rainy day. Yeah, it is a windy day. I am not sure.中午被王林森这小子给诳了出来,刚到运河边就说车子坏了,我只好自己一个人沿着运河向西岛进发。风光旖旎,风和日丽,风雨交加,风风火火,风马牛不相及的我就骑到了西岛的尽头,为什么说是尽头因为我已经骑到了出岛的大桥上了。打道回府吧,顺风下坡别提有多爽,几乎使用的全速在前进,回来查了一下地图大概来回有七八十公里吧,还是有一点点累的。沿途的风景有多美丽呢?实在是语言难以表达的,每次这么写我总是在检讨,这种说法有点像共产党领导作报告的套话,比如形势一片大好,究竟怎么好就是说不出来,那么让我来分析一下为什么语言无法形容圣劳伦斯河边的旖旎风光吧,首先,语言文字的信息量在多媒体历史最少的,图像多于声音,声音多于文字,我要把每个细节的感受都描述下来几千字都不够,用计算机的话来说就是一幅图画的信息量就是几千个字节,何况几个小时的电影不知道有几十万幅图画,连嗅觉的描述可能都比文字的描述来得多,那么这么大的信息怎么组织怎么阅读?所以当然语言难以描述。然则文字往往又是最有效的信息压缩形式,往往我画龙点睛的一个字就能引发读者无穷的想象,比几十幅图画都要传神,不是吗?那么就让我厂是画龙点睛,蜻蜓点水地给你一些想象的空间里抛几块板砖吧。

河边婀娜多姿的柳树在阵风里摇曳着长发,平坦蜿蜒的自行车道就穿行在这绿色的长发里,有时候我都不自禁地伸手撩一撩绿美人的清汤挂面似的秀发,理由是她要碰到我的脸了。

运河边的小桥并不如江南水乡的多,但是运河的水绝对不是那苏杭小镇里主妇淘米刷马桶的水可比,圣劳伦斯河水有多清澈呢?打个比方,就好像加拿大的自来水一样的清澈,不要笑,加拿大的自来水都是饮用水,还有什么水笔饮用水更清澈呢?河边处处是漂亮的草坪,精心设计的雕塑,因相比较深的有这么几个,一个是阿基米德的杠杆雕塑,造得仿佛是一个灯塔,朴实无华,伟大的自然科学发现也许都是向这些设计平实简单的雕塑一样经得起时间的考验,而不必担心如北京奥运会某些贴近时装展览似的繁复弄巧,一时高潮之后就被人弃置如蔽履。Lashine河边的雕塑尤其多,但我只记得教会我一个法文词的那个,flour是河水的意思,在铁板上镂空的文字也如何水般荡漾,非常的传神,工业时代的材料透着现代艺术的气息远比中国式的总是挖掘故纸堆的沉闷来得让人舒心畅快。

河里停满了私人游艇,只有这个时候你才知道蒙特利尔的富裕人口有多少,河边的餐馆咖啡厅都很有情趣很让你有一种进去坐一坐的感觉。天边的白云阳光配合着荡漾的水面那是一种难以名状的闲暇,在这个夏天从来不会有酷热感觉的城市里,你可以尽情地享受阳光。

但是美丽仅仅是风景吗?不,美丽是如花般风景里的健康的人,流汗的女人最美丽,这是我从健身房的语录里看来的,对此我也深表同意,每次我看到加拿大妇女矫健的骑车慢跑溜旱冰的样子就有着无限的赞赏,圣劳伦斯河边运动的人们是比风景还美丽的图画。

八月二十七日 今天天气很好吗?是 。 

HPMPI本身就有很好的profile,完全不用自己加那些非常笨拙的计时小函数,我以前在那个土法上马的wmpi里工作实在是很土的事情,回过头来感觉那个完全就是大学计算机本科二年级的学生写的tcp/ip分布式程序,我想给我几个月时间应该也能实现得了,当然写成完全win/linux都有效率的可能要一点点技术,但是对于一个稍有网络通讯开发经验的人来说不是什么很难的事情,我对于他们的通讯效率始终不是非常的信服,去年我曾经做过测试他的mpi_send远比我用普通socket快,但是问题在于mpi没有规定同步传输返回时在接受方接收完毕还是在接受方开始接收,这个差别可是不小的。profile很简单,mpirun -i profileFilePrefix[:off] -srun ./mpiprog.exe,其中的:off是一个hp的开关,你可以在代码里插入一个非标准的HPMPI_Trace_on(),HPMPI_Trace_off()一边定向profile某一段代码。不过问题是怎么翻译分析profile文件的含义。

我的价值35元的DVD机在我的残酷折磨下终于含恨而终了,怎么残酷?又一次我大概有将近一个月往机关机了,平常彻夜播放更是家常便饭,总之到了这里就知道点七是最便宜的家居生活品。今天去买了一个新的,贵了一点,39块,有29的胆识没有写MP3播放就没有买,结果回来就看到粗制滥造的一面,DVD托盘打开就轰隆隆地响,有时候还关不了,换!还好新的没有噪音了,我想制造业在中国并不完全是什么工艺与技术的落后,而是质量检验的问题,这种明显的毛病为什么检验不出来?因为工厂连这个成本都承担不起,因为是极低的买断价格根本没有检验的成本。这样的工厂很难有什么积累,所以说中国要是来一场经济危机就是倾家荡产的,大多数工厂企业根本没有这方面的准备金,大部分的穷人也没有这方面的积累,国库也没有这方面的积累,就像当初国营外贸公司做生意后来连基本的风险金都不计算,赚的每一分钱都是今天用的钱。经济危机迟早要来的,这是经济规律,问题是什么时候?问题是有多大规模?问题是有多少人要跳楼跳海?

八月二十八日 今天天气很好吗?是 。 

感觉windgi实在是比较复杂的,断断续续地学习恐怕要一两年,就算是intensive也要几个月时间才行,不过呢现在回过头来看比几年前要清楚多了,也许就是所谓武功里的内功有了底子再学各门各派的武功就会比较容易了。中日必有一战,起因不是政治是经济,所谓生存空间,当然战中都是危机的产物,所谓危机可能是政治经济等等,大概有了经济危机就会有战争的可能,内需拉不动经济,就用外需吧。

阮次山建议在联合国提案明确台湾属于中国,我始终觉得现在的政治局成员没有什么人敢做敢当,遇大事总是迟疑不决,为求平安度日,这有一点点摊派的意味,美国不愿意,大陆不敢干,阿扁看准了这一把,赌下去有可能翻身成英雄,马英九嘛,一介庸吏不足挂齿。

九月一日 今天天气很好吗?是 。 

昨天还是比较郁闷的,问题在于说我始终不愿意使用,甚至不愿意查询怎样使用mpi的跟踪器,当然这实在是太困难了,已开始在mpi里面建立一个线程然后调用opengl就出错,我想不出问题在那里,也许pthread本身在smp上就不安全,也许opengl本来就是线程不安全,也许更加可能的就是在mpi里面必须用mpi的方法创建线程,抑或是我程序初始化的低级错误,总之,混乱。HPMPI的profile也许也有bug,或者是profile的翻译程序的小bug,总之,混乱。我之前一直坚信我没有犯低级的错误,因为linux的syscall里面是没有精确的毫秒级或者微秒级的函数,反而使library去实现了,难道是nanosleep之类的实现的?因为我似乎看到过系统不提供的,当然看manpage是一团混乱,clock_gettime之类的实际上却不能用,似乎linux的系统改过很多,混乱。其实这些都不是什么烦恼的源头,因为他们都是可以解决的问题,最要命的是某些问题是没有解决办法的,比如我现在又回到了一年前的同样境地,开始在几个节点之间的bottleneck问题上打转转。

人们常说中国学生的英语很差,有的时候是有着别的原因的,每个单词都听懂了却不见得明白说的是什么,比如politic science,从大陆来的学生就听得不知其所以然,难道政治也算科学?在我们的教育体系里,我们得到一个深深的印象就是每个人,尤其每个中国人天生都是政治家,尔虞我诈,两面三刀,黑脸红脸,计谋手段等等我们从小就是必修课,根本就没把政治当作是一门自然科学来对待,GCD的所谓政治学说白了变成了政策学,politics!=policy,社会发展史也不是政治的全部,有些问题实际上是历史学家关心的,政治学其实应该更加的贴近政府运作的机制研究。中国当今的很多问题就是因为现今的civil servant也就是公务员大都是很多不相干的专业学生,比如中文,比如历史,比如工程,比如法律,恰恰缺少的是研习政治的人才。究竟有什么是政治应该研习的呢?比如政府机构的设置,比如权利责任的划分,比如政策研拟的流程,比如事后监督的机制,你可以说这些都是实践出真知,不需要学习,长官拍脑门秘书拟草稿,饭桌酒席私下商议,密室里面讨价还价确定的,可是这些真正是要研究的,世界各国古今中外大家都有各自的方式方法,优劣得失,不研究比较你能完全foresee其中的利弊得失吗?这些正是一个科学学科的研究课题,当然采不采用哪是另一回事,但如果你连研究都不做就算民主社会人民有权决定政府的架构的时候却发现并不知道应该采用什么,这才是尴尬的事情。在中国现今的社会大多数人迷信工程师治国,我觉得这才是一个糟糕的事情,仿佛把优秀的战士当作优秀的厨师来使用一样的糟糕,学工程的人如果最后都不务正业回归仕途谁还愿意老老实实地造桥铺路?怪不得中国的桥梁三天两头坍塌,结果专家鉴定居然斩钉截铁地说设计超越国家标准,难道是天灾不是人祸?

九月四日 今天天气很好吗?是 。 

昨天,不,是前天,骑车到西岛同事家蹭了一顿饭,好辛苦,今天打腿都酸得不得了,蒙特利尔的朋友越来越少了,可以蹭饭的地方越来越少了。昨天还是头疼,我用了一个简单的run-length,数据是小了很多,可是速度没有什么体现,这真是头疼。看到HP说明文当上说怎样用debug,还真是复杂。每次在这样难眠的夜晚总是想起那只腋下长满腮的美人鱼melisa,的确是painful。

看陈文茜的节目就是让人听得难受的时间,她的那口哑嗓子仿佛咽喉里面一口痰吐不出来一样的难听,当然此女孩是有些才情的,否则也不会被讥讽为“北港香炉人人插”了。赵少康呢?有些太过偏激,不过他和李傲是同一代的人物是很有才华的人物。最近台湾铺天盖地的就是要公投入联合国,想想看这是很聪明的一招,是很聪明的自保的招数,所谓北京对台湾动武有一个基本的因素要考虑,就是台湾的民意,比如诸葛武侯南征三分军事,七分政治,必须以争取民心为要,这个问题是显而易见的,比如打完了仗怎么统治,如果民心不服等于是接下了一个烫手的热山芋,这样的例子屡见不鲜,比如俄罗斯的车臣,英国的北爱尔兰,所以北京最乐意的情况是所谓台湾内部大多数民意主动邀请北京,所谓“吊民伐罪”,现在阿扁等于要堵死这条路,向北京宣示台湾的主流民意就是反对北京,你北京来台湾就是强奸民意,你看着办吧。不过这一招也是所谓的进攻性防御,就是打着进攻的名义实际上仅仅是自保,如果坐过火了就成了让本来进攻的北京变成彻底的防御,现在效果已经达到了,如果还要继续痛打落水狗就是不给北京台阶下,是否逼得过紧了反而成就了北京的策略。不过,台湾的策略就是吃定北京的决策者没胆打破坛坛罐罐,仿佛街头泼皮流氓比狠看谁比谁更狠,头脑越正常的人越早退出。那么我们就看看谁的头脑不正常吧。

九月七日 今天天气很好吗? 现在还不知道。 

学到一句法语:fait accompli。相信很多学英语的人还不懂。calling convention是放在括号内的,比如typedef void(__stdcall *FuncType)(int,float);另一个有趣的问题时,为什么c语言不支持overloading,从函数名称来看,函数的参数类型是被忽略的,在dll里面只有参数个数,比如stdcall里面的@后的数字,这样单单用类型是无法区分的,当然如果你在VC++里面用.cpp文件来编译编译器根本就忽略了所谓的stdcall之类而是直接用c++的thiscall来编译,这个name-decoration是不公开的,比如是以?开头,函数名字后跟两个@@一大队字母代表类型,再跟一个@随后可能跟的是类的标记吧,后面这个不确定,不过是可以以GetProcAddress来调用的,所以,一定要用所谓的extern"C"来强制采用C编译。

九月九日 今天天气很好吗?稍微有点冷。 

Alex给我的一些启发和建议,1。Tester模块里面应该要采用类似于binary-tree的交换方式,我现在这个方法还是类似于naive的集中方式。2。不应该惧怕Tester数目的地增加,因为如果cluster是纯粹的点到点通讯那么增加的工作实际上可以被增加的Tester分担,(是不是呢?)比如Renderer数目增加一倍,通讯量就增加一倍,但是如果Tester数目也增加一倍的话,增加的通讯量工作实际上被增加的Tester分担了,因为每个Renderer实际上接受的bytemap是一样的。

tar并不是压缩文件而是创建一个目录一样的东西,gzip才是压缩,tar -cf target source. gzip tar-file如果想要知道文件夹的大小,du。这些linux的命令其失去哪里都查得到,不过写一遍加深记忆吧,我现在总是忘记很多事情。比如tester模块内的压缩实际上不可能提高很多的,因为bytemap总共只有五分之一的大小,depthbuffer才是大头。

犯了一个愚蠢的错误,用tar -cjf --recursion targetfile sourcefile结果创建了一个文件名叫作--recursion,主要是manpage像田鼠一样费解,然后你就没办法删除这个文件了,Alex告诉我rm -- --recursion这实在是有点诡异。

九月十日 今天天气很好吗?稍微有点冷。 

内存的错误还是容易发现的,至少有几可循吧。DAMAGE: after normal block(#???)其中???为一个数字,google了一下明白了原来VC的debug在做debug_free之前作这么一件事检查你的程序是否曾经越界写heap内存,当你分配内存时候,new给你n+8bytes,其中4个放在最前端,4个放在最后,这8个字节写成0xFD而你的内存初始化为0xCD,在delete的时候dbg检查看有无改写来断定是否越界写内存。1。这办法是没有办法的办法,你在自己分配的heap里面错误读写原本就是没有办法检查的事情,debug这么帮你做是迫不得已,不敢说100%准确,但是绝大多数情况都可以,除非你正好写0xFD在前后端,那就是你人品的问题了。2。运行起你如果敢月初你自己的heap自然有操作系统捕捉别想有什么机会。3。如果你希望尽早发现问题而不是等到delete的时候才又,那么请使用_ASSERTE( _CrtCheckMemory( ) );因为这个_CrtCheckMemory你都可以想象得到他在干什么,用它在你的函数前后监视。4。这个问题和内存泄漏无关,你使用_CrtDumpMemoryLeaks未必有什么发现,比如你new了几个数组,其实他们应该都会在OS分配的一个heap里面,也许都是前后相接的,数组越界和内存泄漏完全是无关的事情。(我不知道为什么我会把两个无关的事情想到一起,也许在我当初的印象里所有的内存错误就是内存泄漏比较严重,实际上现在看来,内存泄漏只不过是高级程序员念在心里初级程序员挂在嘴边中级程序员不停地改在手边的时髦名次。这个问题很难完全避免,因为像java那样让系统管理内存基本上是效率的坟墓了,我想但凡是人做的工作总是会出错的。)这里面还有一个小插曲,我google了一下找到了一个小孩子写的使用intel jpg library的例子,基本上我就拷贝了一下,当时看到他写得code里面没有考虑paddedbyte的计算觉得很奇怪就姑且相信他了,结果看上去挺好,其实现在看来是因为大多数jpg照片都是标准尺寸,比如4的整数倍,你的paddedbyte当然是0了,所以程序常常是正确运行的,可是当我改变图片大小存储的时候有时候再读图片的时候就出错了,(写的时候是因为我自己写得code因为从opengl的colorbuffer里面读出来的当然bgr是padded0了,因为我定义pixelStore的pack_alianment为0,所以不会出错)(不过jpg与bmp一样是沿用以前的习惯就是每一行和整数长度对齐,(align with size of integer,depending on the size of integer of current OS)这是格式没法改变,在DIB里面要给出正确的paddedbytes,和所谓“channel”应该是component个数,(这个是ijl注解里面写的)其中DIBHeight可以是负数代表上下颠倒,这个曾经困扰我又一两天之久,因为我尝试了在glOrtho定义上下颠倒,可是因为我用writePixel直接写colorbuffer完全无用,用什么transformation都不解决问题,因为这完全是数据的格式问题,后来改为负数就行了。当那种奇怪内存错误出现的时候我曾经自以为是地认为opengl也许对于数据使用是某种“独占”方式,比如你送一个buffer数据进去,opengl直接在数据上操作,使用某种内存防毒些机制,这当然是无稽之谈,可是当时我信以为真居然费了不少力气去做了一个类似于double-buffer的冬冬,就是用两个buffer来读写,不对当前显示的buffer操作直到它变成back-buffer,结果当错误已就出现的时候我才开始意识到问题不在opengl上,尽管opengl不支持多线乘客也不至于有直接该用户数举止无稽之谈吧,当时实在是无理头,我好像大多数时候完全是无理性的思维,这是多么可怕的事情!

有些问题现在回过头来用脚趾头思考也明白不可能的事情,我却在当时想不明白,也许人就是在碰到一些违背自己基本信念的现象的时候的一种panic的寻找救命稻草的盲目吧。不过呢,为自己美言一句就是引用一下那本讲述破译密码的《battle of wit》的前言,decoding不需要你疯狂,但是如果你是的话总是有帮助的。debug十有八九是在反复检验自己对自己的基本信念的相信程度,如果你对一个事实或者定律坚信不移,你也许不会犯一些不该凡的错误,但是你也许失去了检验其他相关的信念的机会,而往往bug寄生在你认为不应该发生错误的地方。说到底,你是否真地掌握了所谓的真理呢?世界上愚蠢的错误大多是在你坚信你是正确的时候犯下的,有多少人是明知故犯呢?

补充一句,图形里面困难的一个地方就是如果仅仅是很小的数据出错,你还真的很难看出来。

那么就把这个小东西贴上去吧,原本想用win32作一个漂亮点的界面,后来就懒得动了,我对于界面设计从来就不太热心,这些东西费时费力并且我也做不好。至于Intel的jpg-library我存在了这里,和这里

九月十二日 今天天气很好吗?天气已经变得很冷了。 

蒙特利尔仿佛嬗变的女人一过八月立刻变得冷若冰霜了,听上去酸酸的,可是实际上就是这样,从上个星期开始就突然从穿体恤山还热的夏天进入了穿夹克还觉得冷风嗖嗖的秋天了,这个秋天的生命比短命的夏天还要短,因为加拿大的红叶仿佛就是道路上的红灯一样预告冬天的来临。冬天就要来了,夏天已经变成了回忆,秋天正在变成回忆,冬天即将让你的生活充满了对明年夏天的渴望。 冰箱里桌子上没有任何可以当作早餐的东西了,正好可以尝一尝美军标准ration-pack的麦片早餐,tea,coffee,ketchup,salt,sugar,pepper,match,tooth-picker,应有尽有,感觉美军和加拿大军队的后勤采购系统效率还是很高的,任何国家的军事采购都是肥差,但是在商业运作下完全符合市场竞争机制的效率还是远远高于黑盒子的操作,我常常想PLA的腐败也许只能透过一场战争来显示,中国历史上的封建帝国的军队无一不是这样。

安倍近三辞职了,其间的所有风云仿佛就是《Farewell Mr. Primier》的现实版,其间的讽刺成分要低于《Yes,Primier Minister》,有更多的期许与鼓励,甚至有不少的同情,也许英国人普遍对于政治家没有什么不放心的,因为政治家仅仅是舆论指挥棒的指挥下起舞,实质起作用的是公务员系统,而日本的民主政治是在美国大兵的枪口下扶植起来的,有着太多的封建宪政的痕迹,政治家主导国家的作用太大了。所谓民主,按照yes primier minister的说法就是,首相并不是管事的人,只不过是领导有共识的参与者而已。

九月十四日 今天天气很好吗?天气已经变得很冷了。 

在AITS作了两天的volunteer,在轰轰作响的cluster机房里面做了一些最最简单的工作,update一些firmware&bios,据说HP的XC并不是纯粹的linux,应该在bios里面做了一些手脚比如一些identity之类的,也许吧,应该是有一些硬件的certify机制吧?cluster上附着的kvm看上去好像laptop一样,哈哈,显卡,鼠标键盘三位一体通过一条rj45线实在是方便,但但这个咚咚应该就是有些小玩意在里面,比如怎样把并口线串口线信号转成eithernet的信号,应该是用芯片做的,应该是有现成的,不过我没有见过,少见多怪,不奇怪。mpi的broadcast我一直都没有仔细看过,突然发现必须接受方事先知道buffersize,看来这个要求implies其中可能又是有什么快速的protocol。

不妨作一些大胆的想象,也许安倍进医院检查肠胃是因为安眠药吃多了,此公有点官宦子弟的骄气,一旦受挫很有可能承受不起。也许台湾问题会用一种手术刀似的解决方法,斩首不太可能,因为那时大打,所谓不伤筋动骨的手术刀式方案就是空战,所谓“机不可失”的“机”就是飞机,失去了空中屏障的台湾就是待宰的羔羊,而空战结束就是战争的结束,登陆战巷战?免了吧,而空战决胜既不会拖的很久,也不会对经济政治甚至对于大多数民众生活也没有多少影响,这也是典型的美国式的解决方法,不过好虽好,PLA现在还学不来,但是不能够变通一下吗?原则上就是这样。

九月十五日 今天天气很好吗?天气已经变得很冷了 ,刚刚骑车出门就下大雨。 

在小雨中骑车也许在别的国家是一种享受,在秋天的蒙特利尔却有些刺骨的寒冷,生活在高纬度地区的人才能真正体会阳光的重要,离开了太阳这里会变得冰窖一样寒冷。我的头脑的麻木并不是冷风冷遇造成的,因为它原本就麻木了,我居然没有想到过我要做的工作其实有六件事,从文件到内存的压缩,从内存到内存的压缩,从内存到文件的压缩,反过来,从文件到内存的解压缩,从内存到内存的解压缩,从内存到文件的解压缩。这就是我不敢破坏ijg的结构的结果,我想我想做的无非就是ijl的类似的东西,只是我有必要这样做吗?ijg可爱的地方就是大量的回调函数,烦人的也正是这些回调函数,改造起来至少要好几天,首先我刚刚发现了自己的一个无知之处,jpeg的压缩是one-pass,因为用的是所谓DCT(Discrete Cosine Transform)据说和傅里叶变换(DFT)差不多,sigh,computer science的学生没有学过这些还能叫做信息学的学生吗?我真希望我能够多学一些数学,否则总是想井底之蛙一样伴着脚趾头靠直觉思考问题。说出来真是丢人的恨,我当初以为jpeg是huffman-code加上run-length压缩,这简直是白吃都能想到的朴素,说得不好听就是对人类信息科学的污辱,以后一定要小心谨慎!也正是因为此我才一直以为jpeg需要至少two-pass来建立字典,因为心理上我始终认为所有的压缩都是建立在字典的基础上的,quantization是lossy的源泉这一点很好理解,就算我不知道有DCT我也没有错,只不过我实在不理解DCT,高等数学绝非任何有着正常智力的没有接受过正规教育的人所能够无师自通的,这就是真理。

所谓民主国家就是国家领导仅仅是一个杂货铺打工的收银员一样,主人没空管的事情交给你去做而已,虽然财务经营都放给你表示对你信任,其实你只能操作收银机一切都有记录不怕你搞鬼,随时都可以叫你走人。民主国家的领导人仿佛娱乐圈的明星表面上光鲜照人出入镜头焦点之间,实际上时时刻刻一举一动都在幕后经纪人的指导安排下,时时刻刻留意自己的收视率。

九月十七日 今天天气很好吗?天气已经变得很冷了

加拿大的冬天就要来了,好日子到头了。作为美国现在做的最正确的事情就是平衡台海两岸的军事力量,所谓增大PLA动武的地成本,不鼓励北京进行任何的军事冒险,昨天看凤凰的军情观察时才了解到一个基本的军事常识,一次军演如果动员的部队达到十万以上那就是非常的超级的事件了,对于向我满这样毫无军事常识的人确实没有这样的敏感度,想想看中国有几百万的军队,可是历史上的最大的演习不过就是动员了十几万人的所谓“华北大演习”,正好是十六年前的今天,当时的化肥据说是全军全年军费的十六分之一,所以,你应该知道演习的代价,军演的成本。回过头来再看看所谓的八月份的台湾“汉光”军演,一开始据说动员了二十几万人,后来军方出来辟谣说是只有一半,可是现在的军演是海陆空导弹信息战,这期间的成本要比当初的以陆军为主的传统军演成本要高的多,现在我开始有了一个更加清晰的概念,战争是政治家手中的指挥棒,决定开战的因素有时候仅仅取决于北京是否觉得口袋里的钱够打一场战争,比如美国是否愿意和伊朗开战?按照布什的想法当然是的,所谓扬汤止沸不如釜底抽薪,只不过国会掣肘让他施展不开手脚,十几万的美国大兵在伊拉克当巡逻兵实在是浪费,既做不好也不划算。打不打伊朗并不是一个简单的问题但是恫吓一下是有好处的,所谓以战止战。
今天居然花了将近三百块买了一大堆的衣服杂物,感觉现在越来越没有勤俭解决的概念了,也许是钱太多了话不完?哈哈才怪。程序基本上处于停顿阶段,理由是cluster在升级,可实际上是我没有想清楚,到底是一个主线程加上两个子线程还是两个平等的线程?Dr.M的想法不能说完全没有可能,可是我总是有些将信将疑,总觉得有违背常识的地方,又是Dr.G的异想天开,就如同他上一次跟我辩论hierarchical的算法一样,除了天真我没有什么别的此可以来形容。买了一个高级的“热水袋”就是微波炉里面可以加热的那个袋子,因为膝盖疼得厉害,还有就是我从来都不相信吃药的,今天破例买了一瓶试试看。也许冬天真的来了。

youtube上有日本NHK的纪录片《激流中国》非常的入木三分,欧美加拿大之类的电视台播放的有关中国的东西大都不着边际因为他们根本不了解中国也根本没有什么兴趣关心这个国家,倒是日本人看中国的问题非常的犀利,中国还是一个农民为主的国家,刚刚经过两天的工业化资本的原始积累刚刚完成第一步,很多人的奢侈超过了大多数欧美普通人的想象,更多的人的穷困也超过了大多数欧美普通人的想象。

一个人的思想的堕落是从物质生活的堕落开始的。

windows很离谱的,用createFileMapping打开的handle也是一个类似于CreateFile打开的handle,意思就是说当我准备改变文件大小,用setFilePointer移动文件指针,在调用SetEndOfFile的时候如果不把这个mapping的handle也关掉就会失败。实在是麻烦因为linux应该没有这个吧,到时候也要小心。我终于想了一个比较好的办法就是我只负责实现内存到内存的方法,写文件让用户去使用fileMapping好了。这不是很好吗?

九月十九日 今天天气很好吗?天气已经变得很冷了

Karen给我上了一堂极精彩的电子工程如门课,就是discrete signal processing,总结一下有几个基本的概念,首先我们针对的是所谓的连续信号,理论上连续信号是无法进行处理的,因为无限多,所以,必须进行AD转换,但这不是全部,因为所谓的AD转换仅仅是amplitude的转换,作为时间domain里面的无限时间电视需要理论的指导来做sampling的,比如要怎样sampling呢?比如实际上我们只能在有限的频度进行短暂的peek,那么这样可否得到全貌呢?Nyquist的定理告诉我们了理论的频度下限,但是究竟傅里叶变换的本质是什么?从结果来看是把时间domain的数据转换为频率domain的数据,这里面的数学本质非常的深奥,比如用级数来表达函数,(这个说法太土了,我看了看wiki的Eula Formula,泰勒级数就感觉力不从心了。)总之,各种各样的DCT实质上是FT的一种变种,据说图形多媒体等等的压缩都是基于此。

大陆的主流媒体实际上都在绕开台湾入联公投的真实目的,回忆一下香港当年的7.1五十万人大游行的后果,北京非常震惊因为当时的信息渠道从来没有真实地反映香港的主体民意以至于北京并无法预计到这个结果,同样北京看到高雄并没有预计的五十万人大游行也算是送了一口气,假如台湾的主流民意都是主张加入联合国的画北京恐怕连动武都不敢想了,因为就算打下来了怎么管?所以陈水扁这样做的目的就是给台湾加上一层比爱国者还要有效的保护罩,因为台海两岸的军力是不平衡的,只有靠所谓的肉盾,这正是北京最不愿看到最不愿意大多数民众意识到的,所以媒体绝对不会提醒这一点,至少不应该让大多数大陆同胞意识到,否则将来的武力解决的正当性又会是一个问题。

九月二十日 今天天气很好吗? 是的,很好,早上骑车去皇家山遛了一圈

其实冬天还没有来只是我的心理上已经感觉到了冬天的来临,绝对的气温还是很高的,我甚至可以半赤裸地坐在电脑前打字,哈哈,天气好得不得了。差不多一个星期时间都在一点点地剥离ijg,其实说出来实在不值一提无非是把原来的缓存部分去除,原本这是他最耀眼的部分也是最麻烦的,说起来简单可要是看动源码我还是感觉吃力,主要是原来的程序好像一部自动状态机定义了很多的状态,我的改动不敢涉及我不明白的地方。这就是programming最困难的地方,对于源程序的原理不清楚的时候是否能够进行再开发?仿佛很多人对于所谓的破解源代码津津乐道,拼命要微软开源,实际上有多少程序员能够读懂源代码呢?我想只能是方便了一部分专业公司和少数黑客吧?枉自猜测,恐为天下英雄齿冷,甚为惶恐。那么留一个半成品因为接下来我想摒弃一部分源码结构了。(备份一个在这里。)

九月二十一日 今天天气很好吗?是的,很好,早上骑车去 圣劳伦斯河遛了一圈

其是并不是所有的白吃都是一样的,我犯了一个高级的错误。怎样在没有c++的年代生存?struct common{...}; struct compress{ struct common comm; int comID}; struct decompress{struct common comm; int decomID};这样的两个结构我想把它们合并,这真是一个奇怪的应用,我想再还没有想明白我为什么要这样做!struct super{struct comm;int comID; int decomID};然后我宣称我的super和compress和decompress兼容,这就犯了一个致命的错误,虽然super具有compress和decompress里面都有的field名字,可是他们的意义完全不同了。比如aCompress.comID和aSuper.comID恰好是符合的,可是aDecompress.decomID和aSuper.decomID就是驴唇不对马嘴了,因为decompress的decomID就是在comm之后的,而super的decomID却是在comm和comID的。这个奇怪的应用引发的奇怪的错误是一个教训,首先为什么我像这样做,而原作者为什么不这样做?这个问题没有想明白之前还是先吃饭吧。更深层次的是我实际上心理上总认为这是一个继承的问题,实际上和继承有关系吗?用多重继承也不解决问题呀,我实际上为了使用原来的代码全部把他们cast回了他们的老祖宗,这样继承来的东西在父亲或者叔叔那里根本就不能用,(想不清楚。)

九月二十二日 今天天气很好吗?是的,很好 。

终于完成了这么一个“伟大”的可笑的“小”project,我一直都羞于张贴出来,说到底我做了什么?把一些回调函数改成空?再合适的地方加上合适的代码?这个好像听上去很难听的样子,不过要看懂别人的代码本来就是一个程序员功底的体现,这个能力我还很差,不过假以时间终究会提高的,这个急不得。下午骑车去王林森夹蹭了一小顿饭,味道很好吃,使她妈妈做的豆腐鱼汤,我不喜欢吃鱼只喜欢吃豆腐。大米饭很好吃,看来长粒的大米更好吃,为什么我当初盲从支脉圆粒的呢?下一次买长的来吃。

九月二十三日 今天天气很好吗?是的,很好 ,下午去皇家山溜了三圈。

绕了三圈因为mr.W夫妇及朋友花了n个小时才到达,where n>=2。本来爬山从concordia这一遍只需要大约三十分钟,当然从公墓那边要久一点,下次我走走看吧。花了将近一个早上作了一个小小的测试比较ijg和ijl的效率,有些想不到的结果,比如ijg的压缩玉洁压缩大约需要50-60ms,而intel的ijl15大概要快三倍,我重复左侧是就是说从jpeg到bitmap然后再从bitmap回到jpeg,结果ijl过了几次之后就失真了,已开始还以为自己发现了什么bug,后来和mr.W讨论了一下才想起来这就是lossy的压缩的特性呀,很奇怪吗?真是好笑简直就是白吃的问题。奇怪的是问题的来源是因为ijg因为同样的实验几百次也不失真,难道jpeg不是一个lossy的压缩?我看到过一个简单的介绍说jpeg仅仅在quantization部分会失真否则也是可以lossless的,难道ijg是这样的?或者我的实验有什么问题?在山上,人山人海因为天气好的出奇,我居然感觉肚子有些饿,花了两块钱买了一个热狗很好吃,这种东西就是在野外才好吃。

晚上闲了没事干,喝了一小杯红酒,把以前最晦涩难懂的电视剧翻出来看《black adder》,这是mr.Bean演过的不多的几部喜剧,(听上去很别扭,难道他演过悲剧吗?)非常非常难懂,因为讲的是英语,这又是有语病的说法,难道我听不懂英语吗?当然是的,当然不是,depends是什么英语,比如莎士比亚的戏剧也讲英语难道你听得懂吗?仿佛中国的电视剧如果三国演义西游记统统讲原文估计有不少的“中国人”听不大懂,外国人当然就更不懂了。我发现这两者的组合“红酒+blackadder”又神奇的催眠效果,比《yes,prime minister》好太多了,相比之下后者的英文还是浅显易懂的,当然我想对于大多数以英语为第二语言的人能够听得懂其中的幽默是非常不容易的,很多小孩子以为看懂流行电视剧比如《friends》之类的就表示她英语可以了,其实那是给普通labour阶层或者家庭妇女设计的,基本上用的词语不超过日常范围,所谓情景剧,这些鄙人一般是没兴趣的。我宁可去看《redgreen show》,uncle red要比那个有趣的多。最后,偶尔地扫了一下“amazon.ca”上的评论你可以想象与我同好的人多了去了,当然肯定是极少数,在这个社会,哈哈。看得懂书评的人就很不简单了,当然你要先看过DVD了。

九月二十四日 今天天气很好吗?是的。

color-space实际上就是vector-space,实际上RGB是所谓长波段R,中波段G,短波段B的线性叠加,其实Nyquist的定理里面原本就是这样一个sampling的公式,难道不是吗?所以所有的一切都很清楚了,所谓常人所说的红绿黄实际上是艺术家所喜欢的方式,把“加法”变成了“减法”。jpeg的压缩是一种朔本还原的算法,因为原本这种长中短波段的分法就是一种习惯,或者近似,真正的原因是Nyquist那个数列里面的基本波元素。所以回过头来看color-space一定是三维的吗?也许就是一种习惯而已,只要你能够找到一个space足够大来mapping这些可见光的组成。Shannon的information entropy实在是一个惊人的概念,直译过来就是随机变量的倒数的对数的数学期望,这个只是一个measurement来衡量信息“规整度”的,这个词是我自己发明的,比较好理解,比如越是所谓无规律就是随机度越高的信息越没有办法来表达,比如中国的渔夫渔妇热衷于炒股票,究竟这个行为原本需要不需要人的干预,在成熟的市场经济里面这是没有意义的,因为有规律可寻不需要人的干预,就好像股票价格可以预测那么还要人来投机干什么?可是假如无规律可循,比如这个社会上占人口大约50%的那种性别的人群的思想,这个entropy是最大化了,因为没有规律,我常常直觉上认为encoding与encryption与compression有着深刻的内在联系,encryption希望通常的encoding被map到某种特殊的encoding之后他的entropy最大化,而compression期望利用某种encoding里的entropy

九月二十五日 今天天气很好吗?是的。

看《yes,prime minister》你简直就是佩服的五体投地,世界上怎么会有这样的天才,不愧是莎士比亚创造的语言,不愧是女王统治的国度,你会由衷地希望中国当初不是被日本侵路而是被英国统治,加入中国直接就是被英国变成了殖民地,日本和英国的碰撞就不会等到太平洋战争的爆发,不要以为这是什么匪夷所思,这在当时是中国很多人能够看得到的唯一的出路。至于最近出现的新西兰的那个杀妻弃女中的小女孩子的事情这在其中的花费几十万英镑拯救一条牧羊犬的剧情比较相似,我个人是否同情事件是一个无关的话题,问题的核心是民选政治人物和非民选的公务员在很多方面有着不同的利益,作为一个政治人物它可以大把的纳纳税人的钱去购买一个cheap popularity.

今天据说是中秋节,王辉和我打赌如果我晚上能够把outlook express的邮件读出一封来他就把我家的键盘或者显示器蘸酱油吃下去,这个事情我一定要公布出来防止他赖账,当然他的另一个选项是请我吃十天的烤羊或者烤鸭,上一次他已经为了一个什么东西打赌要吃我家的键盘后来被我宽宏大量绕过,这次绝不放过,一定要让全世界人民都知道!对于他的问题我也在今天晚上找到了一个可能的解决办法,那就是不用做什么逆向工程去分析OE的文件存储结构而使用改换文件名的办法来读写,因为原本MAPI就是不管本地读写的,这一点微软没有错,MAPIReadMail原本就是读写incoming mailbox。

再说一遍,记住了,否则就真实和大多数人一样变成白吃了:typedef ReturnType (CallingConvention * FunctionType)(ParamType ParamName...);

现在我开始玩platformSDK感觉自己进入了又一个境界。

九月二十六日 今天天气很好吗?是的。

Big brother is watching you!感觉GCD的统治已经完完全全渗入到互联网了,而原本internet的精神就是自由无政府的特征被彻底颠倒了,你在国内任何一个网站搜索“盘古乐队”直接就导致错误,因为不是搜索引擎找不到,而是不能也不敢显示,只好给你一个错误,大不了就是几个街头愤怒青年唱两首抒发情绪的摇滚,至于吗?要搞到这个地步?就算说了什么唱了什么难道世界上那个统治者能够阻止得了?就算在封建王朝统治着禁止人民的言论却也无法禁止所谓的民歌童谣,可是今天的统治者可以借助现代科技完全地做到这一点,而这也就是所谓的matrix里面那种反抗组织的诞生的原因,有人反对就有人赞成,世界上永远不可能只有一种声音。我现在实际上经常用wiki在学习,而这个网络百科全书将会改变世界,如果连这个东西也予以禁止的话,这个政府基本上就是在组织历史的发展了,也该检讨一下自己的生存的基础了,因为从来没有什么组织或者政府能够长期阻碍压抑科学文明与生产力的发展要求,最终的结果和恐龙的结局没有两样。

微软不愧是苦口婆心,同样的mapi函数照样做了一份给VB用,前面全部加上一个"B",其实原本vb应该去调用com接口的,可是微软体贴哪一类开发者的辛苦给他们开了后门。 如果你在mount之前在那个directory存了什么文件,那么你把它mount成一个设备以后当然是看不到那个文件了,但并不等于丢失,umount之后那个文件还在,linux的设计你不得不佩服。pthread_cond_wait的含义其实挺复杂的,就在于这个东西防止了busy-waiting,但是为什么一定要在mutex_unlock之前去signal呢?在我的原来的想法里面是你先unlock_mutex然后再signal_cond_variable这样那个wait condition variable的线成也就不用再去获得mutex了的竞争了不是更好吗?看来一定是实现上的困难才有这个要求,否则用一个mutex就可以了何必要condition variable?

果然我的直觉是对的,实际上关键不在于signal而是在于cond_wait,一般的系统mutex都是一个binary-mutex,就是非counting-semaphore的东西,(只懂java的人不太会明白他们有多么幸福,当然也就不知道自己有多么的不幸,counting这个东西要远比binary复杂。)这个东西会有问题就是说如果两个thread都是去减少计数,最后谁也醒不来了。(大概就是这个感觉吧,具体的我也懒得想了,以前做个不少的例子。)也就是说signal多少次都无所谓,甚至于不相关的thread去signal也可以的,这是合乎常理的,但是cond_wait必须要保证只有一个thread。。。(hmmm...就是说。。。头疼。。。我感觉这个cond_variable的使命并不是为了保护predictive的atomic access的,而是为了保护那个计数器的)效果就是每时每刻只能有一个thread去evaluate那个predictive,当然程序员要保证这个判断条件互斥...

我做了一个简单的比较试验来比较conditionalwait与普通的mutex,结果简直是惊人的

九月二十七日 今天天气很好吗? 下雨了。

花巨资购买的《black adder》终于到了,当然有不少我已经下载看过了,不过那感受是不同的,一个是整版的一个是盗版的。今天模拟我的程序作了一个多线程的两组类似producer-consumer的东西,明天调试吧。学到了一句台词,比如写程序挑战自己的头脑是我生命的一部分,Life without it is like a broken pencil, pointless!

完成了一个模拟,就在心满意足之际突然开始怀疑整个测试的基础,究竟在什么前提下我们需要多线程?大多数kids总以为使用多线程会自动增加效率,可是假如原本的工作就是顺序执行的,难道我们需要多线程吗?核心的问题是io与compute是否并行而不是什么其他。

九月二十八日 今天天气很好吗? 下雨了。

One of the dirty joke of "Black Adder" is that the flying corps officer gave training lesson for new pilots. He asked them to treat planes the way they treat women. That is to say, get into them at least five time a day and bring them to heaven within ten minutes.

九月三十日 今天天气很好吗? 很好。

昨天起自行车去同学家帮助搬家,感觉需要加强力量训练。我的想法其实很简单,当初使用non-blocking的mpi函数的好处就是应该为多线程服务的,昨天的实验证实了一个东西,就是cond_wait并不能保证至少有一个线程运行,我的意思是说假如进程里面所有的线程都被block了是否有可能至少有一个线程在当前进程运行时被唤醒?不过我的实验不充分,结论暂时使cond_wait的条件一定要保证任何情况下至少有一个为false,也就是说至少有一个线程可以运行,否则deadlock。回到刚才的问题,假如mpi的thread在post了Isend或者Irecv之后我把它的cond_wait条建设为true让他block,然后当其他线成空闲时候在唤醒他并检查testall或者testany之类是否这样可以提高效率?刚才我突然怀疑这样做是否有效,因为归根结底socket通讯这一层不是晚全部依赖于cpu的io,比如磁盘就有可能晚全部依赖于cpu,或者dma之类的也部依赖于cpu所以是可以做并行的,可是多半socket通讯还是在os的driver一层实现的,缺了cpu根本就不行,所以我把它block了等于不接收不发送了,完全无意义。看来这条路也走不通,对于filemapping是否做成多线程我始终不敢确定,因为看起来它的机制和普通的文件读写不太一样,也许在os一层已经作了某种优化了吧?(不敢说,不清楚。)所以现在回过头来看所谓的使用non-blocking的好处仅仅在于从多个源头接受可以并发,当然发送也是一样,但是现在又强调使用broadcast的优化好处就没有必要non-blocking了,不过还是有些情况不可能使用broadcast的,只有使用non-blocking的发送接收。

照着com的一步步实现非常的繁琐,不过这本书很好,从最原始的用dll来模仿com做起,一步步来说明,只不过让我感到在某些情况下addRef和release的使用比delete来的更加头疼,因为自己的代码来控制delete毕竟是一个个人的事情,相对来说容易得多,让别人遵守release实在是太难了。classfactory也是一个头疼的事情,包裹了好几层我头都晕了,的确,com至少需要五年以上c++的开发经验以上,这里不包括那种纯粹使用wizard写应用界面的所谓“开发”,那种纯逻辑的东西大概不需要计算机专业毕业的学生去做吧。c++的interface不支持多重继承?当然对于实现的class是可以继承与多个接口的,就是多重继承纯虚类。

以上说法也对也不对,c++支持多重继承,只是在默认的继承时候如果两个父类都有某个函数的时候子类默认继承时会让编译器不知所措,但是如果你override那个virtual的方法也没有关系了,不过如果不是virtual呢?也是一样。至于是接口那就更加无所谓了,因为连代码都没有产生有什么关系呢?

我单身,我碍着谁了?碍着我妈了,因为我成了她社交生活的面子,我成了她晚年不幸福生活的罪魁祸首,我在地球表面上离中国最远的地方还是妨碍了这么多人的生活!

十月二日 今天天气很好吗?很好。

main-thread:opengl;thread1:mpi;all mpi call is in thread1;all opengl call is in main-thread;main-thread has events buffer;(This is very important because HPMPI doesn't support other than "single-threaded" mode and OpenGL is not thread-safe!) thread1 has communication buffer;thread1 uses condition-wait;main-thread lock mutex in "keyboard-callback", but doesn't call cond_wait, instead calls cond_signal. main-thread in display-callback only updates with newest communication buffer to output framebuffer;Both producer and consumer should be responsible to check buffer availability before writing. As main-thread, OpenGL will call thread_join and MPI-thread must guarantee "quit" message is sent before it exits thread_proc.  

The expected improvement:OpenGL doesn't get lock-step with MPI thread. It will have better refreshing rate. MPI_thread becomes smarter because it won't send useless data for rendering when there is no change of rendering context.

这就是plan,花一天时间应该差不多,唯一要小心的是deadlock&livelock.main-thread cond: (graphicIndex+1)%MaxBufferNumber==mpiIndex; mpi-thread cond:mpiIndex==graphicIndex;初始化条件是mpiIndex==graphicIndex.

十月三日 今天天气很好吗?很好。

我决定在做成多线程之前先做一个过渡的版本。 当年粟裕向毛泽东立下军令状不过长江而是在将被消灭新五军,老毛同意了但是把陈毅调到了中原局让粟裕度掌大权,看上去是提拔实际上也是大大的压力,如果仗打不好了不用让陈毅来顶缸,粟裕可能就直接要受处分了。

我想解释一下什么叫做“国富民强”,很多人实际上不明白这个成语。说白了就是国家富裕了人民身体就强壮了,但是为什么呢?因为国家收人民的税太多自然就富了,钱多了却又不用在老百姓的医疗教育上当然就国富了,可是人民的钱包却瘪下去了,没钱看病就只好猛练身体,于是就民强了,身体不强不行啊!因为生不起病了。

十月四日 今天天气很好吗?很好。

google desktop是非常地强大,不经意之间从电脑里搜索出一段尘封的记忆,那是一份搞笑似的合作协议,当事人现在并不知道在天涯还是海角,这就是最典型的不可计算的问题,你想一台计算机或者一个通讯器输入一个东西,机器仿佛是一直在运行,但是始终没有出结果,或者你向一个通讯器喊了一句“你听到了吗?听到了请回答yes。”结果你一直没有等到任何回答,究竟是通讯器坏了还是通讯线路坏了?这是不可计算的。比较搞笑的是假如你接受到了一个回答是"no!"那么你要做何解释?

#import "path\\com_server_file_name" no_namespace实际上就是去读取typelibrary并生成c/c++头文件,当然一要先运行编译一下,可是visual也会锁定那个com,很麻烦,如果你的com是dll,用regsvr32.exe进行注册,当然visual在编译过程就帮你注册了。(exe怎么注册还没有学到。)从client端来看,你最好用oleview这个工具来看typelibrary,当然大多数时候并不知其所以然。创建com可以用smart pointer,但是一定要小心,import已经帮你声明了smart-pointer的模板类,就是interfacePtr的变量类型,他有很多的constructor,比如createInstance,但是我被他fool了好久浪费了快一个小时才意识到操作符“->”被重载了使用的都是被代表的接口指针的方法,而真正的smart pointer的方法却使用操作符".",哈哈。。。你fool了我,I服了you!如果不用smartpointer也许更容易但是引用计数实在是一个恶梦,一定要很小心。大体上你可以调用CoCreateInstance或者Ex版本,记住第一个是classID这里的意义就是说一个方法可能有很多coclass支持,你要告诉com你要拿一个地实现,返回类型是你的接口指针的,当然你要传入接口指针的guid,我这一点又犯了低级错误,我把Iclassfactor的接口guid传了进去,这是典型的把CoGetClassObject和他的wrapper函数cocreateinstance弄混了,实际上iclassfactory不是所有的接口都需要支持,相反所有的com都需要另外做一个实现这个接口的com所以创建instance实际上包含了两步,第一先创建那个com的classfactory并获得指针,然后调用IClassFactory的createInstance方法,这样做是有很深的原因的,在学习CORBA及其其他分布式的时候就会制导系统对于创建实例是不负责的是要com的提供者来实现的,在CoCreateInstance方法要传入接口的uuid是因为一个coclass支持很多接口,大体上创建了com事例后首先返回的是一个与最原始接口IUnknown兼容的接口指针,在调用queryInterface方法来获取用户需要的接口指针。所以,你就应该明白如果获得的是IDespatch接口,你可以放心地把它cast成dual接口中的另一个接口。(这一点我还是不很确认,但是应该是对的,至少我的例子是这样。)使用com最好用exception机制来处理错误,因为也许引用计数是比较容易控制吧,_com_issue_error(hr),catch(_com_error e)。BSTR本身就是双字节指针。CoCreateInstanceEx的最后一个参数是一个MULTI_QI的数组,哈哈。。。

十月九日 今天天气很好吗? 不知道。

一个简单的不能再简单的试验,一个普通的不能再普通的理念,有谁会做这种无聊的验证?比如1+1是否等于2?

1。文件I/O是blocking的,正如期待的,ReadFile这样的API会导致线程调度。2。文件handle不可以在不同线程之间共享。3。如果在CreateThread里面输出threadID,我不知道怎样防止程序结束之前的异常,是不是因为我的变量没有初始化?或者是因为stack variable的缘故?3。白吃一样的问题:TCP之类的网络传输是否算是I/O一样的,或者说一个伪命题:TCP是在那里实现的?是network adaptor吗?我不相信,也无法证实,不过我觉得肯定不是,所以大部分的工作是CPU的工作,但是真正的底层传输工作在network adaptor层里的工作要慢的多,所以,socket通讯实际上和文件一样会引发线程调度,(这听上去是废话,那一个学计算机的一年级学生会不知道?)4。问题是pthread仅仅是一个Linux的library为什么是真线程?Linux的syscall里面并没有相关的API为什么你可以操纵调度?同样的问题是syscall里面没有精确时钟,为什么gettimeofday之类的library可以有微秒级的时钟?Alex的解释也许有道理,就是128syscall不够用,所以有些功能是靠读取参数实现的,linux核心有一个不开放的时钟数,我忘了名字很古怪的,很多kernel编程的人都在用。5。socket编程我几乎没有在linux上试验过,发现了一个和我一样的noob做什么linux socket tutorial结果一个基本的概念都没有搞清楚,UDP是不能够listen的,那是对connected的,这个白吃引得我犯了白吃级的错误,想了好久才明白过来,网络上的kids有几个是可靠的?讲老实话,我觉得我并不是唯一一个看不懂manpage的人。(这样安慰自己了。)

中国政府才是一辈子的凯子外交,援助一个国家被一个国家耍一通,每年节衣缩食(当然是老百姓了,官僚的钱一分都不会少)援助接济朝鲜,付出几十万人的生命,今天人家谈停战协定连让你参加都不让,一个国家做到这份上实在失败,看到这一点我也不再感到自卑了。想想看吧,早年援助阿尔巴尼亚,后来是什么赞比亚刚果修什么铁路死的人又是无数,结果呢?那些非洲土著连维护都不愿意维护,铁路现在好像都不大能用了,在后来是越南,还不得不都刀枪来保卫边境,现在连这么一个自古就是附属国的朝鲜一方面拿着你的钱粮一方面却想甩开你和美国人眉来眼去,这一切都是为什么?因为那个混账主义,看看美国就知道什么是聪明人的主张,一切的一切以美国国家利益为最高追求,什么国际主义什么人权什么白吃主义都是放那个什么的,问题是这句话每个国家都会说都会做为什么我们做得这么差?因为我们的这个政府不是一个真正的民选政府当家的都还是封建时代的老爷,看看真正民选政府的官员,因为那谁认识国家的老爷这些官员好像打工仔一样整天提心吊胆如履薄冰一样地小心翼翼伺候人民老爷,只要是媒体上反映出来的民意不高兴官员立刻就要辞职下台,想想看整天喊着人民当家作主的口号实际上是最大的谎言,在他们眼里人民就是牛羊一样的。

十月十日 今天天气很好吗? 不知道。

在c/c++程序里面如何显示中文?1。你的main最好用_tmain(int argc, _TCHAR **argv, _TCHAR **envp)因为_TCHAR是一个兼容ansi和wchar_t的宏,会根据系统来定义,当然你确定无疑地用wmain也好了。2。字串必须使用wchar_t,他的literal比如字串要加一个L这个应该会把unsigned char*变成unsigned short*,配合使用wprintf,wcnstr等等。3。然而最重要的是要设置正确的locale,要include<locale.h>然后是setlocale(LC_CTYPE, ".936");在网络上搜到一个不错的小孩子,不过在不少方面我看来是有些望尘莫及的,唉。。。我一直想不明白的就是他给的一个例子里怎样把某些核心加密代码“反汇编再加密”?用masm32吗?

十月十一日 今天天气很好吗?不知道。

想找一下去年的试验,结果breca也当机了,那么就重写一下,凭印象来说是比那时候好很多了,当时对于index总是混乱。 其实我最喜欢的是“黑豹”的《无是无非》,激越仓劲又充满柔情,荡气回肠非常的富于想象力,尤其是长长的电子乐器的过门非常好听。

十月十三日 今天天气很好吗? 天好冷啊。

所谓自由就是根本不需要对除了自己以外的任何人负责,有些人称之为自私,甚至斥责为怯懦,但是不管怎样我就是只愿意享受这种自由。基本上什么时间睡觉什么时间吃饭做什么干什么想什么都是你自己的决定,有的时候你的行为在“正常人”看来是属于脑子进水的行为,比如作为一个比街头乞丐强不到哪里去的赤贫阶层,贪图“享受”几年来大约花了两千多块钱买正版的DVD和教科书,很多所谓的正版DVD实际上我都有盗版了可是作为兴趣爱好还是决定买正版来看,也许很多时候仅仅是因为不能忍受盗版品质上的小小的瑕疵。平常省吃俭用,除了基本的温饱以外没有什么开销,但是却一心想要去出国旅游住几天四星五星宾馆享受一下,我想这种远虑近忧都没有的生活状态全部来自于这种“自由”,但凡舍得一身剐连皇帝老儿也能拉下马。MapiReadMail里面有一两个问题,第一文件的类型似乎是取决于邮件客户端和操作系统的策略,总之我发祥总是NULL,第二临时文件我好像没有看到真正的拷贝,是不是说mapi仅仅给你一个输出的文件名实际上还没有真正拷贝?

看到新闻里说中国当代艺术品拍卖屡屡创新高,实在是莫名其妙,那些个垃圾玩意居然有人画上几百万上千万实在是不可思议。以前我认为那是一种新型的洗钱工具,就比如MR.W介绍早年为什么香港的电影会繁荣,就是因为香港的黑钱太多。所以根据大胆假设小心求证的原则,我也可以大胆的断定,中国的所谓艺术品拍卖市场繁荣是因为洗钱的需要,比如你现在要给某个贪官行贿,如果拿大笔的现金有时候非常的不方便,第一国内公司 现金的管理越来越严格,放都没地方放,你总不能还像当年我老家那些农民拿麻袋背人民币吧?可是如果给你一幅画让你的在海外留学的孩子到美国拍卖行去拍卖一下,不是省去了过关带现金的麻烦吗?很多时候如果你给咱们敬爱的领导送一幅名画,谁会说你是送礼行贿?

世界上根本没有什么真正的艺术品,至少在现代艺术领域,所谓艺术品在买家眼里只是投机的代名词,或者是一个象征性的标地物。在西方国家艺术品是减税的法宝,因为那些国家为了标榜对艺术的支持大都有所谓艺术品投资免税的政策,所以,我认为这些垃圾也许也是一些所谓外资进入中国的合法桥梁而已。早年外资进入中国投资的时候大都通过贸易渠道,因为当时中国有所谓出口退税政策鼓励出口,因此,通过贸易渠道一块美元换成人民币比正常的汇率1:8.3要高出将近十个百分点,中国每年都有大笔的外资要进入来投资,在鼓励外资的政策越来越消退的今天,投资形式是美元还是人民币可能都无关紧要了,外资据说进入中国井喷的股票房地产市场有限制,可是我想透过其他渠道比如这些艺术品可能是没有限制的吧?
姑妄言之,姑妄听之,大胆假设,小心求证。

天冷了,床头的法国葡萄酒喝光了,收集一下桌下墙角的易拉罐竟有两大袋子,去provigo卖了换酒喝吧。(听上去很别扭,可能是看《武林外传》看多了,语不惊人死不休。)

晚上认真阅读1944年盟军发动的开辟第二战场的诺曼底登陆作战及其详细地介绍,实在是令人无比的佩服,当时的盟军的工作实在是细致周到,巨大的工业能力超凡的想象力无比的人力物力资源,作为对手的德军也是让人肃然起敬的可怕的敌人,我其实现在明白德军不在滩头阵地配置过多的兵力而在纵深集结实施防守反击其实是一种更加积极有效的防御,在法国前线并不一定要配备太多的兵力,因为欧洲大陆发达的交通线即便是在波兰境内的德国精锐东县与被部队也可以在三天之内增援,所谓大陆登陆战与美军在太平洋的岛屿登陆战完全不同,因为广阔的纵深以及强大的后援可以在登陆的两个星期内都形成3比1的巨大优势,主要原因是登陆一方在没有占领大港口之前无法将超过10个师的部队送上大陆并保证两弹燃油等等的补给,而且最多只能有一到两个装甲师,因此,隆德施泰德与隆美尔相比实际上是一个战略家与战术家的区别,如果按照前者的判断而没有隆美尔的干扰也许盟军就不可能在1944年登陆成功了。当时盟军的空中力量和德军的对比是30比1,海军是绝对的优势,陆军也是占据很大的优势,在这种前提下依然坐了大量的充分的准备,甚至煞费苦心地进行战略级的欺骗,注意不是战术级的,全英国整个国家的战略情报封锁,上下齐心,即便如此在诺曼底登陆依然遭遇了相当大的损失,甚至可以说成功失败也在一线之间。反观PLA与现役的台军在实力对比上远远达不到压倒优势,甚至可以说在很多方面还处于劣势,根本没有做任何的具体的战略准备,甚至连战术级的准备部队的基本训练都没有,怎么可能进行军一级的作战?集团军级作战根本就免谈,空军海军多兵种协同完全是天方夜谭,所以说最多就是若干特种大队的突击行动,这样大规模的作战在和平年代没有周密完备的准备一年以上根本就不可能。所以,台湾现在就算独立了,PLA绝不可能在3年内做出任何的应对,唯一可行的方案就是潜艇封锁海港,但是这是绞杀绝对不能长久,而且是会双方都受损失。总而言之,台湾并不是不能独立,实际上问题是独立了以后怎么办的问题,而且本来就是独立的,何必要再提什么独立呢?

十月十六日 今天天气很好吗?天好冷啊。

天真的冷了,可是公寓的管理层可能是轻信了世界气候变暖的谣言居然认为加拿大的冬天可能已经不是那么冷了到现在也不开暖气,我只好把我自己的电暖风扇24小时开着,反正电钱不用我出。高速网的合约到期了,像换一家带有线电视的,结果可能要等上一个多星期吧,因为我这个屋子以前没有人接cable,于是现在开始体验一种没有internet的日子,其实也差不多。到底德军把有生力量配备在海岸还是纵深这的确是一个难以决策的问题。不过看过《硫磺岛家书》就明白隆德施泰因是对的,当防守力量与进攻方旗鼓相当的时候当然是靠前配属有便宜可占,在海滩上给敌人一重大杀伤,并等待援兵把登陆者赶下海甚至全歼,这在1942年对付英国当时一支师级突击部队还是很有效的,当时丘吉尔因为斯大林的强烈要求不得不试探性地向法国派出了一支突击队结果全军覆没,以至于英美联军后来转而在北非登陆,或者去意大利小打小闹,第二战场的开辟一支推迟到了1944年,因为当时苏联红军已经取得了压倒性的优势如果再不开辟第二战场整个欧洲大陆就要沦为共产党的天下了,所以,大的背景是1944年和1942年是大大的不同,这个时候德军已经捉襟见肘不要说北非,欧洲大陆的防守都感到兵力不足,因此,在登陆一方占据绝对优势的情况下在海滩与敌人硬碰硬未必是一个好的对策,隆美尔是一个优秀的统帅但是他的眼光有时候却不准,就在于它对形势的判断尤其是大环境的判断还欠缺。机动防御对于防守北自挪威瑞带,南到西班牙意大利的广阔的欧洲海岸线也许是一个更好的选择,处处防御等于处处不设防,(当然这样浅显的道理德军统帅不会不懂,因为在没有海空优势的情况下一旦让盟军上陆德军根本没有办法抵抗,所以隆美尔才坚决主张在海滩防御。)问题是单单靠海滩上的单薄的兵力在盟军海空配合的活力杀伤下能否有效阻止盟军登陆?答案是否定的,一定需要纵深的装甲部队实施反击,因为登陆场没有码头设备不可能迅速运送重装甲部队上岸,所以初期的盟军一定是轻步兵为主,反击不是以消灭盟军为目标,因为这不太可能,而是为了给援军争取时间以便从东线抽调兵力回防,因此反击的目标很值得商讨,也许可以选择一些能够给与重大杀伤的目标以便延缓盟军的推进速度。当然这一切都是建立在德军认为自己已经没有可能赢得战争胜利的前提下,可是当时的德国还有很多的可能性与希望,战场上的秘密武器的威力非常的惊人,德军的一辆虎式坦克就是在这里曾经单枪匹马消灭了几十辆的盟军坦克装甲车,如果V1导弹,me-260喷气飞机在诺曼底登陆前研制成功,那么战场的形势有很难说了。

qsort如果输入的数组是长度为一的话会出错,设立条件debug就是ctrl-b。

我最后终于耐着性子把我的project贴出来,一则因为原本就像做成开源(当然是前提有人有兴趣,不过很多paper发表之后实际上没有附带源码让想验证的人没有头绪。)二则因为要改动不少我已经有些糊涂了,又很懒不想用什么版本控制的工具(主要是学不会,除了source-safe用了几天,其他的都太复杂了。)加上简单的说明文件大小大概不到400k,其中很多东西很可能是过时的,或者不一致的,现在让我自己重新想一下很多时候我常常突然想起什么然后发现我原来早已经作了,只是我忘记了。基本上作为个人纪念而已,代表着一年多来我也不是完完全全的无所事事。

十月十七日 今天天气很好吗?天好冷啊。

忘性太大了,全忘了怎么解压缩了,实际上我是混合了tar和gzip,如果单个文件可能直接用gzip -d filename就行了。

matching, matching, matching...

十月十九日 今天天气很好吗?天,突然变得好暖和。

No strategy is the best strategy!如果你伴着脚趾头想问题你一定可以明白这个简单的道,linux怎样解决版本向下兼容的,使用softlink从下指向上,比如1指向2,2指向3。。。这样加入软件提供商充分保证向下兼容的话,早期的lib在linking的时候link libxxx.1就实际上link libxxx.n这里n就是当前版本,这在windows下兼治没办法,通常大家只好用名字的不同来代表文件的版本,但是对于早期版本的运行就没办法,除非你覆盖原文件,这一点我想在com里面是用version来解决的,但是这个对于sysadmin来说太复杂麻烦了,相比之下linux的办法好得多,当然这些对于linux稍有常识的人都是在普通不过的道理,只不过我想把他写下来。今天就是这样一个问题,fedora5的一个library被RGS调用,libXft.so.1但是学校的linux全部升级为fedora6了,只有libXft.so.2但是有没有设softlink就出现了这样的问题。我今天在lonin cirrus的时候ssh提示说密码不对,建议我删除.ssh/known_hosts文件里面的东西,我就这么做了,结果他不再要求密码了,这实在是好笑,肯定是AITS弄错了。

我比较喜欢《武林外传》里郭芙蓉的一句经典台词:我也是无意中走上文学这条不归路的。

十月二十日 今天天气很好吗?天,不冷但是很阴沉,还下雨了。

University Tennessee的一位教授的slides对于这个问题有非常好的说明:为什么需要多线成?这样MPI的app开发者可以简单地使用blocking call,而不需要non-blocking再去polling,同时,这个多线程有两层的含义,实现层和应用层,比如non-blocking的实现就可以简单地使用多线程,甚至这样的实现不支持应用层的多线程,(这当然比较silly,不过你只要看看很多的石先是把多线程lib和但线程的lib分开就知道这里面有很大的performance的因素。),总之让app开发者自己在单线城里是用mutex之类的同步工具来避免deadlock绝对不是和大多数的开发者,一般来说app的开发者都是比较弱的。MPI_Init和MPI_Finalize必须都是main-thread来call,并且只能是main-thread!!!这就是说只能调用exactly once。MPI实际上对用户隐藏了signal,比如用一个单独的线程去cache所有的signal,在用户MPIthread初始化阶段sigmask掉所有signal,这就是一个简单的解决方案。老教授的例子非常的好,看得出来他是一个身经百战的老手,我也突然明白了一些道理,比如我非要创立多个receiving吗?比如一个MPI_Recv带一个any_source的参数,事后查询request的source和tag不就行了吗?这样coding不是简单一些吗?(当然效率是否高就是实现层的细节了。)总之,给人耳目一新的感觉,虽然看起来都是很初级的东西,应当这样说,我还是太初级了。读他的讲义给人很多启发,我一定要认真学习!这一次I really mean it.

十月二十一日 今天天气很好吗?很好,阳光灿烂。

一个问题是否存在并行的算法可以看作是一个“类似”NPC的问题,我说类似只是说形式类似,好像一个猜想,为了读懂这个问题,还是先复习一下NPC吧。《Introduction To Algorithms》实在是计算机学生的葵花宝典,只不过我觉得在不同时期的体会见解是不一样的,现在再来读的话就容易很多了,本科的时候能够了解各大概就很不错了。“optimization”应该是比“decision”困难得多,比如Dijakstra问题我影响很深刻,教授反复强调算法原本并不告诉你路径,只是长度,你必须改进一下才能获得路径,虽然不会很难但是反映了你需要更多的计算与存储。P,NP,NPC都是以“decision problem”的形式出现的,所以你要把一些optimization换换形式。P<=NP是显而易见的,因为从NP的定义就知道这个,既然我直接就能找到polynomial的解决方案,验证自然也就完成了,难道不是吗?但是反过来呢?这就是问题了。这些浅显的问题其实在第一次学算法的时候就应该牢牢记住,可实际上我是过了一年以后才明白的,所谓人的聪明才智是有差别的。

让我们记录下这个经典的并行算法例子,这是《Limits To Parallel Computation》开头的一个入门的例子,假如你有一个并行系统,比如cluster,你能够设计一个时间复杂度为O(logn)的排序算法呢?Recall排序的理论下限是O(nlogn)。Given n*(n-1)台电脑组成一个所谓计算矩阵M分别计算这样的结果,假设要排序的鼠族元素分别为n1,n2,...nn。M[1,1]计算n1和n2的差值,如果n1<n2则结果为0,否则为1,M[1,2]计算n1和n3,M[1,3]计算n1和n4。。。这样我们就有了关于n1的一个n-1的0或者1结果,他们的和就是n1的rank,就是最终排序的位置。同理n2,n3...nn都有这样的结果,所以排序变成把这些结果加总的过程因为我们的计算矩阵是独立的电脑这些计算是并行的,又因为比较大小是一个常数时间,所以核心变成加总的时间了,(在早期的并行计算很多讨论时关于数据怎样部署到各个电脑,现在几乎没有人关心这个问题,在sort-first,sort-middle,sort-last你都可以看到这些concern的阴影,这在十几年前是不能回避的问题,现在nfs之类的共享文件系统让人们几乎可以忽略这些问题。)对于n-1个结果的加总可以用经典的类似binary-tree的方式来并行处理,两两加总,最后归一,所以时间复杂度是O(logn),对于n个元素,每个都是可以同时进行的,所以总的还是O(logn)。当然这里我们忽略了最后的数组排序的结果部分,这可以简单地在O(1)时间内完成,因为rank就是元素的最后的index。这个例子得惊人之处在于他给出了一个并行处理的基本结果:(best of sequential time)/(number of processor)<=(parallel time),看上去好像没有什么仿佛你伴着脚趾头都想得出来,可是反过来想象它的意义,翻译作者的论述就是假如你想让你的并行系统有着“高效并行”效率(这里可以理解为O(logn)),你可能至少要投资数量为问题大小n的指数大小的处理器(polynomial number of processors)。这个结论让你很兴奋吗?我觉得是很沮丧的,这也正是作者想要引出的问题核心所在,是否冥冥之中有某种更加深奥的limits?

十月二十三日 今天天气很好吗?下雨了。

英国的《太阳报》据说是一个专登下流新闻的小报,《notting hill》是这么说的。花费巨资申请了一个cableTV, BBC新闻的伦敦播音员小姐的伦敦土音实在是太土了。

物质不灭定律好像在我家失效了,我的DVD《四个婚礼与一个葬礼》找不到了,我的壁橱的挂钩掉在地上就找不到了。只好把《Notting Hill》找出来看了看。

十月二十四日 今天天气很好吗?下雨了。

如果你在一个函数里面声明数组(即便是main)那么如果越界写操作很可能把栈里的返回地址覆盖,当然如果这个数组声明在data区(全局)你很可能以为你的程序很正常因为没有异常,可是错误隐藏的也越深。

看到PLA第124机械化旅的训练照片觉得太做作,因为作为一个普通全训连队按照美军特种训练的样子做给美军参观团看实在是有些虚张声势,现代的士兵你不可能要求他们像继十年前一样的不折不扣执行长官的命令,今天的当兵的不可能不把从军当作是一种职业的选择,如果是职业就应该是有所求。

十月二十五日 今天天气很好吗? 太好了,背了几十公斤的背包去爬山。

今天据说是某人的生日。cluster总算升级完成,测试结果还好了,31个节点speedup大概是4倍,当然还有很多改进的余地。sva_remote.sh -d SVA_DS_1_3 -r 30 -I因为我必须让n120作为display surface,这个原因实在是很无聊,因为我用mpirun -srun --nodelist=n89,...n98的时候slurm并不按照我的list分配,也许是n[89-96]的weight是1,n[97-120]的weight是2的缘故吧,总之我没有办法用list来指定节点,唯一就是让display来自最后一个节点。那么我是怎么知道display-surface的呢?在/opt/sva/hpremote/bin下面有一个svadisplaysurface.pl的从那里可以找到。

十月二十六日 今天天气很好吗?太好了 。

计算机科学是一个关于所有科学的科学,他研究的对象是所有的人类的知识的获得,处理,分析的过程,这样的科学只有超越普通人的人才适合研究。关于美国的司法制度的优越性可以用一个计算机科学的理论来解释,有一个所谓的NP问题,这一类的问题说的是这样一类问题,问题本身的求解过程非常的复杂,但是假如你得到了答案想要验证它的正确性却有很容易的办法。比如拼图游戏品的过程很不容易但是拼好了,随便一看就知道对部队。司法公正的一个重要保证是陪审员制度,陪审员都不是什么司法制度的专业人士,然而如果一个审判是公正和充分的话即便是街头的普通人应该也能认识到,这就是说组织证据证明有罪是一个非常困难需要专业知识的工作,并且非常的复杂困难,但是审判却是一个可以显而易见的工作,正因为有了陪审员制度法官的至高无上的“青天大老爷”假面具被撤掉了,人民可以运用自己的常识道德观来决定司法的实践,这就是民主的精神,妥协的精神,独立的精神,可以说没有司法的民主就没有行政制度的民主,没有司法的独立就没有行政的独立,民主的司法制度是民主制度的基石,空谈什么政治民主完全没有意义,一个国家应该从司法独立民主作起,这是唯一的民主道路。再比如议会制度,在很大程度上议会是行政的监督机制,不管行政过程比如预算的制定法令的产生有多么复杂,衡量他的利弊往往并没有那么复杂,这也正是想出一个办法由时候很难,但是验证它是否可行有时候并不需要那么多的创造性反而是一个普通人都能够做的工作,根据这个原则,议会检讨行政专业人士的专业性很强的工作是一个合理的办法。所有的这一切都是遵循着NP这类问题的特征,也许NP问题是人类最重要的研究课题,因为他们往往都很重要也很困难。

Yes, I am a bit wrong with iterator. list<int>::iterator it2=lst.begin();

(*it2+=3)=100;//what is *it2 now?

十月二十七日 今天天气很好吗? 下雨了 。

冒雨骑自行车去同学家吃螃蟹。看到一则新闻说台湾的农产品太贵了大陆根本吃不起,这简直就是观念的错误,放眼世界发达国家的农业那一个不是享受政府大量的补贴,农业是产业中最难有竞争力的不靠政府欧洲的农民怎么生活下去,虽然台湾不富裕但是他的农业劳动力成本已经太高了,政府不补贴一定很难生存,所以抱怨本身就反映出一个政府的观念的错误,就是说这个农业必须政府扶持,产品太贵缺乏竞争力不是农业本身的错是政府的错。或早或晚中国的农民劳动力会被证明缺乏竞争力而需要政府的补贴,不过那都是50年以后的事情了。

Joel昨天给我的的建议我觉得我比较能够接受,相比G的提法其实是一样的,只不过Joel给我看了SMP中四个cpu的占用率非常的有震撼力,如果我能够纯粹地把计算限制在CPU而不是GPU那么这就可以让cluster overcommitted去运行多个process,如果MPI又能够充分利用本地进程间通信绕过network这是一个很好的方案,也许需要使用OpenMPI而不是HPMPI.

十月二十七日 今天天气很好吗? 天气很好,但是还是有些冷 。

去皇家山跑步,现在已经没有办法跑上山顶了,唉。如果你想连接实验室的电脑,现在还有唯一的一个途径,用ssh客户端连接login.encs.concordia.ca然后从那里用ssh paush.encs.concordia.ca这个事我发现唯一的server允许我用ssh的了,Alex说的对,学校封掉了几乎所有的server访问局域网的漏洞。当然前提是我的实验室的机器运行sshd,如果是windows我觉得最好是下载一个freeSSHd,当然最好是去他的网站去下载了,注意要把windows的防火墙设置exception允许它运行,至于linux则要简单得多,sshd可能是默认运行的,至于防火墙的设置嘛,我忘了。运行sftp的时候我的localpath还是NFS的path,所以用lls,get,put等。

十月三十日 今天天气很好吗? 还是有些冷 。

花了一晚上时间总算明白哪些最基本的message的作用

十月三十一日 今天天气很好吗? 还是有些冷 。

花了1.5刀增加了一个military channel,现在电视好看多了,增加一个频道很方便的,只要一个电话就行了。 美英的特种兵训练要严格贴近实战的多,不像PLA都是些作秀的东动作给上级领导看的,这是一个退休的SAS的模拟逃生训练,他在当年的海湾战争期间空降到伊拉克后方结果他的同事都被俘了,只有他在上千名士兵的追击下没有食物很少的水灾伊拉克的沙漠走了8天280多公里逃了回来,这成为SAS历史上最长的逃生纪录。这次演习进行在非洲博茨瓦纳的沼泽地里,四个追踪这都是英美的退休特种兵,有SAS,seal,他们又所有的资源,四驱车,汽艇,卫星,地面部队,当地老百姓的协助等等。而我们的主角chris只有一点点地水完全没有食物,已开始在沼泽地跋涉,在泥水里挣扎,纳税都是有毒的,所以在非洲的烈日下是非常的渴的。演习的真实在于很多时候chris都会有可能有生命危险,比如非洲的大象曾经把他的一个战友撞死,有好几次实际上追击者就在离他机密的地方,当然它也有反击的办法,一路上他做了好几个陷阱,如果追击这不是经验丰富小心翼翼也早就伤亡了。在夜晚chris要生火取暖因为蚊子很多,还有很多的猛兽在丛林徘徊,当然他要在太阳落山以后不能让烟暴露行踪,他要把周围20米的遮蔽火光。甚至为了完成任务他还偷了当地人的一匹马,这实际上也是很危险的赌博,而他的mission不仅仅是逃生而且要去拯救一个受伤的飞行员和他一起驾驶滑翔机逃跑。但是在空降地附近追击者凭借卫星先找到了受伤的飞行员的藏身地点,但是他们并不急于抓飞行员反而用它作为诱饵来等待chris营救的时候一网打尽,chris躲在山洞里洞察了陷阱最后冷静地决定放弃任务独自逃生,这让人很难过但是这是没有办法的办法。在整个过程中,chris不断地用自带的小摄像机拍摄逃生过程,从他的自述可以知道英国特种部队在训练中经常在世界各地的常人难以忍受的环境逃生,还免不了有些伤亡,从这一点让我觉得现在的PLA过于注重表面,很多时候军官还怕出事故,训练成了表演,最大的目标成了追求无训练事故,对比美军要贴近实战的多。

下一段的逃生训练在西伯利亚的冻土带,温度是零下32度,加上wind effect实际你会感到零下46度,这种严寒完全不可能忍受,我是非常清楚这种温度意味着什么。chris在晚上出现了幻觉,指挥部决定中止演习派出搜索队寻找它,chris太冷了手脚不能正常行动无法接通救生无线电,这场逃生训练很可能要了他得命。 终于搜索队找到了他,他已经在雪地里呆了九个小时,他身体产生的热量还不足以补充失去的热量,令人惊奇的是当他在急救室里呆了一晚上后居然在第二天又继续演习,事实上搜索队甚至在晚上都放弃了巡逻准备回城了,他们视作装甲车,chris却是完全徒步靠着一个雪橇可是雪深到膝盖,每走一步都是多么艰难。chris要严图到达一个个的联络点,每一个地点存有下一个联络点的路线,所以他不到达联络点就不知道下一个点,有一个联络点在河对岸,搜索队在河边布防用夜视仪监视结冰的河面,你根本不可能躲过监视,幸好有很多人车过河,chris的机会就是混在人里面躲过监视,他做到了。下一站是在城里面躲过监视,chris伪装成本地人,后来发现时间上chris和搜索队就只有几步路经过了监视队的卡车。chris找到了本地的联络人获得了一辆雪地车向目的地出发,同时搜索队得到了指挥中心透露的情报,又一场追击开始了。最后时刻直升机来接chris,搜索队只差几秒钟就抓住了chris。

着一个演习发生在洪都拉斯的蚊子海岸,你可以想象有多么热的热带丛林,chris在丛林河流间穿梭设下一个个假象迷惑追踪者,他涉过河然后制造假象进入丛林,实际上又涉过河。这给他一些时间但是代价是他的脚完全被浸泡的水泡软了,他也失去大量的水,开始脱水,他在藏宝地点埋下了一个手榴弹一边当搜索队发现他的故意留下的假宝物时候爆炸,后来果然搜索队掉到了陷阱里。虽然搜索队有直升机还有总部的情报支援,结果一个队员还是中暑脱水了。chris的日子也不好过,原本计划4天的逃生计划有了变化直升机不来了,chris要多呆一天半赶到海边去和接应的船会合。

《Looking for Comedian in India》实在是非常的funny,这是一个搞笑的电影,美国政府向修补和穆斯林世界的关系于是派出一个comedian去印度和巴基斯坦寻找当地的comedian并且了解怎样才能让穆斯林发笑,并提交一分五百页的报告。在印度你看到了很多滑稽的东西当然这个mel gibson的那些笑话根本不能让印度人发笑,在巴基斯坦他的运气好多了,因为他秘密地和塔利班战士见面并表演了同样的笑话给恐怖分子让他们哈哈大笑尽管他们完全不懂英文,可是却比说英文的印度人更能欣赏他的笑话。不过说老实话我是一点都不觉的那些笑话好笑。因为他的到来巴基斯坦和印度中断了好几年的和平又开始武装冲突了。

十一月一日 今天天气很好吗?还是有些冷 。

sympatico为了拉拢我居然真得给我寄来了一个四口modem,非常的漂亮软件也做得非常的好,让人觉得产品是台湾造的二步向大陆厂商做得那么粗糙。仔细一看是马来西亚制造的,牌子叫做2wire质量不错,我差不多会因为这个router-modem继续和sympatico签internet的接入合同。花了半个早上之证明了一个问题,我的snapshot算法应该没有问题,那么问题会在哪里呢?应该是binary-tree-like的数据交换吧?只能说是like因为实际上和binary-tree毫无关系,晚上想要在测试结果发现joel可能把一些设置改了问题一大堆,很郁闷。HP的技术支持很糟糕反正没有人理会我,也许都转移到了印度去了,反正outsourcing基本就意味着质量下降。rgsender的ip地址完全没有意义,hp-remote应该使用域名来访问的,比如n120.cirrus.private,那么除非你在学校局域网内这个域名的解析没有办法在校园网以外做到,这实在是离谱,应该使有办法的。郁闷。

瓜岛之战日本还是占上风的,至少当时地面部队人数占优,海空占优,号称“东京快车”的日本驱逐舰对每天晚上准时向美军发动进攻同时卸下陆战队,但是问题是海岛有时候会成为坟墓如果没有充分的补给的情况下,单单疟疾就让8000名美军失去战斗力,而日本方面要糟的多,日均甚至连起码的食物都保障不了就不要说药品了,整个战役大约损失了两万多人。

十一月二日 今天天气很好吗?还是有些冷 。

看到了一份真正中肯的技术评价才明白了一些主战坦克的实战优劣对比,比如很多时候一直以为99式是一种技术非常领先的第三代主战坦克,比如炮管口径125mm加上炮射导弹这些看上去很显眼的东西,可实际上因为瞄准系统的不足实际发现目标距离大大小与西方主战坦克使得这个意义不大,这让我联想到了当年的震源舰号称把岸防炮搬到了铁甲舰上以追求大口径,可是为什么当时的海上霸主英国人自己不这样使用呢?肯定是有原因的,结果甲午海战吃了亏这也是一个因素,从细节上看99式在传动系统上,比如原地转向倒车等等都还有很大的差距,很多时候这种小的机动的细节会要了命,所以好大喜功实在是致命的危险。

十一月三日 今天天气很好吗?还是有些冷 。

重看了一遍《I, Robot》有些场景还是非常的funny,比如当机器人开始宣布宵禁拍着整齐的方阵要求手持棍棒刀枪的“和平”市民回家时候,这个时候其实你会问当地谁是暴徒,机器人都是赤手空拳并且尽一切力量减少人员的伤亡,但是普通市民则是全副武装起来大开杀戒。

十一月四日 今天天气很好吗? 很有些冷 。

在国内被查禁的《盘古乐队》有一句歌词叫做“奥了TMD运”,虽然比较粗鄙但是未必完全错误,所谓奥运与卫星上天嫦娥奔月一样和普通人没有多少直接的关系,有时候至多是心理上有些安慰作用。花了快一天时间也没有完成《东归》,这个据说是取自蒙古的一个什么汗摆脱沙俄女皇的统治起义成功的地图,首先要打下保加利亚建立一个大后方在反攻莫斯科,彼得堡,然后渡河进入中亚,最后和大清的左宗棠决战,进入中亚的大陆很曲折,第一次是试探性的开地图时的摸索因为主英雄不能逃跑,结果发现对方的主力英雄都是思想基本属性四十多的,我的那个什么汗只有二十几,赶紧逃,在渡口上船,造船厂只有我这一侧的河边有,还专门派了好几个人不断招船毁船封锁河道,打了一个下午才攻下中亚,结果那个传送们有点机巧,船不能靠岸,必须要用水上漂得法术才能打开封印,我打开地图编辑器看到再过封印之后地图作者留下的“哈哈终于还是让你想到了祝贺过关”才确认地图没有错,着实费了我半个多小时。接下去就容易不少了,我的主力英雄思想属性居然有七八十,比最后的左宗棠都高,不过他的部队质量就比我强多了,我的主力是大天使,泰坦,比蒙,以及二级兵种比如骑兵,独眼,蛇妖等,左宗棠居然有大量的圣龙,硫磺龙之类的,哈哈。。。不过我在进入地下地图不久就获得了入城术,在将近二十几个城堡间穿梭调兵遣将还有赠送的五千游牧骑兵加上一千多的mana和复活术在大战之后还有两百大天使和两百的泰坦生存了下来,惨烈啊。作者在一个关口留下一个message让玩家发mail告诉他到达那里花了多少时间,嗬嗬,那时好几年前的地图恐怕早就物是人非了,如果哪一天作者能看到这里他就知道我花了快整整一天才达到大清帝国的边疆。没有作弊只是不断存盘取盘。

美国海军水兵中居然有15%为女兵,这的确让人比较吃惊,不过仔细一想也不奇怪,因为海军多位技术兵种,雷达通讯电子技术等等男女比例差别当然没有陆军那么大,不过我一直认为美军应该会在二十年内实现无人化,遥控化,到那个时候战争真的要成为电子游戏了,这样美国民众比较会接受这种地伤亡率的战争形式。看到国内拍的一个什么《井冈山》的电视剧,实在是比较搞笑,毛泽东别演绎成类似诸葛亮一样的角色,居然会多在城楼里叼了根香烟冲着国民党的骑马的师长说“杨汝渲你还不下马受降更待何时?”这实在是夸张的离谱。

与此同时,我在military channel上看到了美军一直在推崇的新世纪数字化步兵系统,"land warrior",主要包括的还是更好的资讯,士兵的头盔基本上是一个信息平台,指挥官的命令其他士兵的视频都集成在里面,而且士兵的步枪瞄准系统也集成进来当你把枪伸到头顶你也可以瞄准射击,而且指挥官也可以看到你的影像。此外耳机系统也可以成为你的电子耳因为它不仅仅是耳机还可以成为拾音器放大机让你成为耳聪目明的猎手。这个系统结合另一个美军的杀手锏--stryker步兵战车系统,这款步兵战车在2002年展示给美国国防部后大为好评,当即订购了2000套。时速65英里,有指挥车,火力支援车配备155毫米自走跑,普通型也可配备大口径迫击炮,还有医护型,整车可以空运非常时候在伊拉克的轻步兵使用。我想依靠这些新型装备美军在伊拉克的局势最终会得到改善,现在需要的仅仅是时间。相形之下,PLA大概现在刚刚达到美军二战后期的水平。另一种令人惊异的武器是mk19手榴弹发射机的改进型xm307,它可以发射航空爆弹达到400发/分,更令人惊异的是他对付snapper的手段,瞄准后榴弹会自动定制引信延迟时间正好在你射到目标的时候爆炸这样多在建筑物的枪眼里的狙击手就被炸死了而不用摧毁整个建筑物。

据说美军的M777是世界上最好的自走炮系统,德国的panzerhaubitzer2000也可能是当前最好的,他的自动装弹系统使得它相当于旧系统的三倍。他最强的地方还是机动性,发射完之后三十秒内炮管归位然后开动,这点时间有时炮弹还没有落地呢!据说他还可以发射不同的弹道射击同一个目标这样五个炮弹分别发射同时击中目标让你跑都没有得跑。德国人就是墙。

肩扛式标枪反坦克导弹非常的impressive,重约50磅,红外线自导,打了就跑,从上而下攻击坦克最薄弱的顶装甲,对付反应装甲也有办法,它可以有两次爆炸让坦克内温度达到8000度,为了掩护发射者使用一种所谓"soft-launch",就是发射的时候使用较小功率的发射器只是把导弹射到三十码以外,然后导弹上的主发动机点火向上飞行从上方攻击坦克,这样防止了很多肩扛式导弹的毛病就是坦克进入凹地消失在地平线一下导弹就失去目标,真是无处可逃啊。

十一月五日 今天天气很好吗?很有些冷 。

某人给我发了一个消息说google要推出手机操作系统,我给他回了一篇毫不相关的23岁博士请美女吃饭不付钱的消息,此人说我hopeless,的确,我也觉得是,不过我也觉得google有些这种味道。当时Z回国前我们聊天时,他说到google是一个危机四伏的公司,我深以为然,仿佛一个被世人赞誉为未来的武林接班人的莫小贝居然连剑法都没有练过,(武林外传)比喻不当不过意思大概就是,除了搜索引擎之外google还有什么生存的手段?Z当时讲了另外一个东西我也深以为然,你google出来几百万的结果有谁会一一去验证?使用这只看前面几个,这里面有着潜在的软件的错误问题,另外所谓的相关性本身就是一个未准确定义的标准,这就和当初人们根本没有关于“人工智能”的准确定义的情况下期望在一二十年内实现一样,这也就是为什么像baidu这样的公司可以用人力去调整,这也就是为什么有人推出来ask.com靠人来去为人服务,wikipedia这样一个人人都是编辑的百科全书,严格的说来很多新事物并不是计算机科学的进步只不过是现有internet的一种新应用而已。那么google如果在可预见的将来被yahoo超过了怎么办?是不是要关门了?微软如果windows被linux取代了还可以卖office,server,最不及卖一下xbox也还能维持一个软件公司的架子,可是google呢?如果我因为昨天晚上四点钟睡觉头脑比较混乱而作了一个大胆的假设的话,那么互联万的又一次低谷很可能来自于google的崩溃,不是搜索引擎技术的过时而是搜索引擎的普及,就是说众多的引擎并存,众多的搜索方式的并存,然后google仅仅是一个领先者而并非垄断者,这个时候nasdaq高估的股价的回落导致连锁的反应。

google正如张凯林说得那样有些饥不择食,危机四伏,从来没有一家软件公司赢得了那么多投资人的青睐但又是那么的不确定,我说不确定是指的google真正赚钱的产品就只有一个搜索引擎但是这个东西直接的客户并不是主要收入来源,很多是靠连带的广告收入,一个公司拼命招人一方面是生产扩大,另一方面是情势所迫,和微软相比起来google的危机感非常之大,比如微软的windows垮了,但至少还有office,server,xbox支撑着成为一个大软件公司,可是如果google的搜索引擎被yahoo超过了就什么都没有了。
很多it公司和很多普通人一样认为自己有了优秀的人才和足够的资源就可以开发出任何软件,实际上却不一定,因为这也取决于决策者的决心和毅力。比如你现在认为手机操作系统会成为下一代的个人资讯中心于是就不遗余力地投入,发誓作出最好的平台,但是这里面有很多因素在起作用而不仅仅是研发团队,比如硬件厂商的支持,市场推广的支持,用户体验的支持,甚至取决于公司决策者要花多少资源多长时间来投入,以及公司股东对于回报的期待。
 
google作为一个纯软件公司而且在这方面毫无基础能否比别的公司做得更好基本是一个大大的问号,就算软件设计的好也未必被硬件厂商接受,就算被硬件厂商接受也未必被市场接受,就算被市场接受也未必被股东接受,就算被股东接受也未必被公司决策方接受,到头来还是会通专心作搜索。Intel有一段时间号称要成为软件加硬件公司,后来不了了之了因为穷于应付amd的追赶都不及拿来的闲钱玩噱头?公司如此,人也是如此。

我喜欢看网络上愤青的火爆言论,有时候觉得自己也是牢骚满腹郁郁不得志的样子,其实不过是这两天偷懒没有去健身房的后遗症而已,一个人运动消耗掉过剩的心理能量就不会抱怨了。不过有一句话我觉得那个愤青说得很道地,国内现在很多人是咬紧牙关在硬撑着买房因为现在不买将来就更买不起,而且还有涨价的增益,问题是虚报收入最后的风险还是自己,从全国范围来看所谓的放贷严格控制来抑制购买投机而不从房地产建造的源头来解决无异于扬汤止沸于釜底抽薪的差别,需求从来不可能被抑制如果那是必需的,比如牛奶的价格上涨了是否就不喝了?加拿大肯定是不行的,在中国大米上涨了难道就不买了吗?

十一月七日 今天天气很好吗?很冷 。

改动了一下bell的modem的设置网速突然就快了很多,还是使用DHCP,但是在router有直接给每台电脑指定IP地址,另一种设置是让电脑允许所有的app成为DMZ,似乎这样可以使用emule的一些功能提高速度。

看《亮剑》看得高兴得忘了时间,可惜啊,可惜,没有造看这部片子。日本当时的两线作战的确是兵家大忌,这一点那个日本特战大队大队长说得没有错,可是凡是看过《虎,虎,虎》就知道日美太平洋战争的爆发是不可避免的,日美贸易协定里面日本向美国进口废钢材和石油,罗斯福有意抑制轴心国的势力拒绝续签协定,日本占领中国可以获得煤和铁但是橡胶和石油却没有,所以日美开战是有些不得已,

十一月八日 今天天气很好吗?很冷 。

《亮剑》有这么几个地方值得关注。1。日本在战前作了大量的准备工作,民国部队师团级军官的资料全部都收集,据说当年日本情报部门在中国实地绘制过地图,军用级的。2。日本在当时重视特种战和英美德如出一辙,这一点应该是实情,当时德军突击英法联军的马奇诺防线时候就是伞兵突击队乘滑翔机抢占运河要塞,日本组建特种部队专门突击八路军总部应该是真实的。3。片子中彭德怀的暴躁与陈赓的急躁应该是实情,对于百团大战的看法也比较客观,所谓暴露实力引来日军报复的结果也是实情,在当时八路军主要方针是发展实力而不是与日军正面决战。4。要求每一个被俘人员都宁死不屈是不现实的,英美军队一般不限制被俘人员坦白自己的部队番号及职务,因为这无多大意义。在一点就是当时中国军队和日本的巨大差距。

对于特种部队的使用上,那个日本大佐说得没有错,是战略级得高价值目标,本身特种作战就是不得已的对策,是在资源有限的情况下的集中有限资源期待更高回报的策略。北朝鲜号称全军特种兵化,这简直是荒谬,首先如果全军都是特种军那么还有什么特种?其次这也不可能,本身特种兵在很多人眼里成了擒拿格斗的代名词,可是看看英美的特种兵就知道了里面的种类很多,比如英国有一个pathfinding的旅专门进行搜索跟踪,其中有一项基本功就是追踪对手的足迹,美军特种兵里面有很多的所谓weapon specialist专门精通各种武器,特种作战也不可能是真正的十项全能训练,人的素质特点都不一样能成为十项全能的冠军的人很多方面并不是非常突出,我以前看过一个报道说径赛项目要提高成绩体重要降低,田赛项目要提高体重要增加,这两个是很矛盾的,你怎么能够希望一个人两样都占全呢?所以,特种战士并不是仅仅拳脚功夫加上射击飞车等等表演性很强的项目,而是根据作战目的特点又针对的训练,长期不打仗的部队最大的毛病就是训练无针对性,假大空中看不中用。朝鲜战争期间PLA之所以在某些方面能和美军在距不打成平局有一个重要原因就是当时的部队特别是中下级军官都是打了几年十几年的仗磨练出来的,所谓实战中大浪淘沙那些凡是做事假大空的早就被淘汰了不知道多少遍了,和平时期没有战争的检验仿佛学生只听课不考试,听懂没听懂根本看不出来。

《亮剑》和国内以前的共产党宣传片一个显著的不同在于强调军人的勇敢精神,这在以前被说成是愚蠢的,有时候对于田横五百壮士的忠诚被看作是无畏的牺牲,实际上有信仰的人在大多数时候都是看上去愚蠢的,执著的贬义词就是顽固,当时的日军如果没有武士道精神绝对不可能依靠十万派遣军扫荡整个中原,也不敢挑战当时国力雄厚的美国。以前关于日本轻武器的缺陷有不少人笑话日本军队缺乏火力强大的自动武器,这在二战后期和美军作战时候明显的吃亏,这实际上不了解美日的差别,日本的给养保障根本不能和美国相提并论,尤其是在中国大陆作战的日军,交通不便就算有给养也补充不上,所以每次作战都是所谓的清乡扫荡不能持久,自动火器子弹消耗根本不是日本步兵所能携带的了得,所以三八式是最好的选择,日本士兵一向重视射击精准,拚刺刀也是因为子弹消耗无法补充的一个手段,当然对于士兵的勇敢精神是更加的有效。不过问题是射击技术的训练过程很漫长,日军后期补充的兵员质量远远不如早期的派遣军,后来的关东军在苏联红军的进攻小摧枯拉朽固然是苏军的火力强大,也是由于士兵素质很差兵无斗志。虽然日本军部认为哪怕失去本土固守满洲依然可以支撑,但实际上人人都知道失去本土军火兵员补给的满洲仅仅是苟延残喘而已。

新买了一瓶法国红葡萄的确味道和放了一个月的不一样,虽然一直封着盖子,但是葡萄酒的烈性去了一大半,看来《笑傲江湖》里面讨论葡萄酒的年份也不完全是夸张。

实际上战争的结果有时候是99%的运气加上1%的勇气与能力,这似乎有些耸人听闻,可是只要想想看从士兵冲锋陷阵来看你就是在有本事也只能祈求运气。但是话说回来了战争的胜利者大都是善于谋略的结果。这里说一个反例,《亮剑》里面伏击服部直臣率领的华北占地观摩团是做了戏剧化的处理,我看完后向了半天才明白前因后果。历史的巧合是与此同时阎锡山也派出了一批高级军官来八路军总部交流,李云龙为了给来观摩的国军将官露一手设计了一个小把戏,就是故意派一个班的小部队到一个小村庄向当地的维持会长要白面,其实这是一个简单的钓鱼把戏是为了诱出附近据点的鬼子来伏击,当然他是想打一个反伏击,当地据点的鬼子也不傻害怕其中有诈,就上报了日军第一军军部,日军的山本特种作战分队的指挥官敏锐地判断出了其中的端倪,在这么近的地区要玩这么一个钓鱼的把戏作秀的成分要大于实际的意义,从日军在阎锡山的内线报来的一批军官去八路军参观的情报来看这后有可能是为了做给这批观摩军官看的,那么能够接待这么一批高级军官的八路军机关不是八路军总部又是什么?于是山本又设计了一个将计就计,假装上当来咬鱼钩,实际却率领特战队千伏接近八路军总部。好大喜功的日军第一军军长又想加上戏剧效果让战地观摩团靠前观战,没想到李云龙的小把戏引起的日军调动又让八路军总部怀疑日军的企图命令他取消伏击行动,赶回去护卫总部,没想到李云龙这种而冷子偏不信邪又让自己的一个应改变伏击地点在另一个地方伏击潜伏一整天终于等到了战地观摩团的卡车,结果服部直臣亲身观摩了华北战争战死了。历史上是他切腹自尽,电视剧为了增加戏剧效果改为最后决斗而死。不管怎么说这倒是有八分真实地改编,山本特战队偷袭总部原本就是要作秀给关展团看的,如今没有了观众也无心恋战,因为偷袭改为强攻不符合精锐突击部队的作战原则,既然对方有了防备就该撤退了。《亮剑》里面李云龙的原形是王近山我google了一下看到了一些它的生平,比较有特点的就是他后来爱上了他老婆的小姨子,是个女大学生,并且为此丢了党籍军籍下放到农场当场长,这个事情非常符合他的外号“王疯子”,因为当时他原配老婆给毛泽东写信喊冤,他的部下纷纷劝他认错,但是他死活不肯直到老毛发话让刘少奇去处理一下也不低头。

看到了一篇评论说李云龙像土匪不像所谓革命宣传片里反映的高大全形象,是什么诋毁革命军队等等。我看了直想笑,这是典型的腐乳,想想看毛泽东在井冈山上就是山大王,当年的所谓革命武装能够生存就不错了还管得了那么许多?往往是那些迂腐不懂军事的政治委员严格把关严格执行纪律最后长征过草地的时候害的士兵饿死吃皮带,难道你就不敢抢粮食?只要给钱了就不算抢,对不对?没有钱咱就打张白条,难道你没有看到过老解放区的那些百姓攒下来的白条吗?你以为共产党的军队就不抢粮食吗?打白条不算抢,对吗?当年在东北发展东北民主联军的时候部队大都是伪军和土匪,难道这些人就不抢吗?只能说共产党的部队纪律比国民党的好一些,本质上军队的补给都来自当地农民,那么你怎么能够不去抢呢?那种相信从前电影里的高大全形象的认识不动脑筋,只要想想每天部队要吃掉的米粮有多少你就知道事实了。

不过我看过一个凤凰卫视拍的尼泊尔毛派武装的纪录片,其中的部队倒真的是吃糠咽菜,因为所有的米粮都是从总部分来的,勉强能吃饱。

十一月十日 今天天气很好吗?现在还不知道。

午夜之后的电影频道的一个主题就是sex&horror,这当然原本也是加拿大电影的一大特征。《graveyard alive:zombie nurse》的一个主题思想当然是医生和护士的奸情,当然作为医生护士这种所谓的职业杀手经常在业余的时候把病人的死尸当午餐吃掉,这当然是当护士成为zombie之后的事情,zombie的传染方式和vampire类似,这当然是比较搞笑的,医院里最后所有的医生护士都成为了食人魔。不过这一切都是从一个被送进疯人院的护士眼里看到的,所以你也知道到底谁疯了,这种风格我总觉得是法国人的特长,因为主题歌好像是法语。

十一月十一日 今天天气很好吗?还好。

今日无语。

十一月十二日 今天天气很好吗?还好。

看《亮剑》里面的丁伟在五十年代就能预见到中苏的战略冲突实在是不错!所谓国无外患常亡。

十一月十四日 今天天气很好吗? 阴天。

n89,n98,n109有问题,n104,n106,n117根本连不上,所以我用单个连接堵住后者,运行mpirun的时候除去前者。SVA可以给每个node设置state=drained这样系统不会再分配了,我想我的问题很可能是哪个account的问题,此外,sva_remote.sh死掉后哪个进程很可能无法轻易kill,要用kill -9 pid。重启系统用的是一个pdsh的脚本。在sva/sva.conf里面有设置,可以用nokvm去掉kvm降低resolution的毛病。

十一月十五日 今天天气很好吗? 下雨了。

n89和其他的有问题的nodes上有一个zombie我却无法kill他,alex说应该用SIGCHLD发给他的parent,可是成为zombie就是因为他早年丧父,我又怎么能够发给他的父亲呢?init成了他的继父,可是我发给1的时候却犯了权限的错误,然后我只好把0到63的signal都发了一遍给那个僵尸,没有任何错误但是僵尸就是不死,我想这是不是HP的hpremote制造的呢?因为我的后续连接总是遭遇问题,sva_wait_for_X总是在等待,真是奇怪。

和普通人谈并行渲染基本是浪费时间,因为明白并行运算的人本来就不多,并行渲染就更少了,nvidia的所谓的sli技术说到底大概可以算作sort-first的变形吧,但是这个方案有很大的问题就是load-balancing的问题,两个显卡分别负责奇数偶数扫描线也许要比另一种块分割来的好一些,但是并不能彻底解决load-balance。

十一月十七日 今天天气很好吗? 很好。

看《凤凰卫视》阮次山专访以色列的新任女外交部长丽芙尼,感觉相当的有气魄,应该是将来的总理吧。今天试验了一下,所谓uid就是一个integer,那么你怎么获得别人的uid呢?比如你要setuid,这个是单向的,就是高等级可以set成低等级,不过对于effective uid还是不太明白,看manpage大概的意思是posix和早期的setuid不一样只能seteuid,就是说non-previliage的user只能set effective uid,只有root之类的用户才能改变real uid,而且只有在很少的情况下才需要真正改变uid,大多数时候仅仅是运行一个程序需要临时改变一下effective uid,这样虽然可以运行但是遇到权限的问题还是要检查。总之我是似懂非懂,这些东西在学习os的时候都学过,让我说概念也大概明白,可是是否者的理解那就是两回事了,世界上最困难的事情是真正理解一些道理,如果你没有机会去时间的话很可能你一辈子都不会真的明白。我现在再想为什么我的那个zombie的父亲是root,可能的情况很简单,比如一个root的demeon在每个node运行,接到了ssh的请求login成功后就load了一个process然后再把那个process改称我的uid,这样仿佛我自己在远程创建了进程,可是我的这个进程的父亲并不会结束,照理说他应该wait我才对,不过更可能是root的demeon创建了我的process1 under my uid,然后process1有创建了process2,系统的demaon当然不会白痴肯定会wait process1,但是process1可能有缺陷没有wait process2,结果process1死得早,丢下了process2,init在process1死得时候把它的遗孤转到了demaon名下,当然托孤不是demaon原来应该做的,自然不会去wait了。

十一月二十日 今天天气很好吗? 昨天还是阳光灿烂醒来一看大地白茫茫一片。

冬天的脚步从来没有这样温柔过,仿佛一个冷酷无情的杀手突然蒙上了神秘的面纱让你难以捉摸他下一个狙击的对象,在他无声地无影无踪的前行中突然在大地洒上了一层白雪,今年冬天的第一场雪就是这样来的,没有疾风冷雨的前奏,也没有雨雪交加的缠绵,更没有转向鹅毛大雪的热烈,一场悄无声息的淡淡的雪悄悄地来了,挥挥手又默默地走了。并行计算里最困难的是机器之间的有效的通讯,所谓有效很难定义,首先是尽量避免通讯,但实际上并行计算原本就是因为需要通讯才应运而生的,这本来就是一个矛盾。同样地,人和人之间最困难的也莫过于通讯,将近两年中我写的memo和计划大概有好几兆,这还不算电子邮件,可是G大概从来没有花超过一分钟去浏览,我始终以为我是世界上少有的惫懒之人毫无耐心之人,但是总体看来这位老兄绝对超过我很多倍,不愧是superior excuse-maker,不过我几乎不想去抱怨因为在concordia这样的三流大学我经历过笔者更糟糕的,我想这大概是老天爷对我当初惫懒的惩罚,总而言之I deserve it。话虽然是这么说,但是假如一个人要花超过半年或者一年以上也不能理解他所从事的研究活动中最基本的问题,那根本谈不上解决了,一个如此没有耐心的人而又偏偏很天真地以为很多东西很容易这就不能不让人思索其中的道理了。一个人认为一件事很容易大概屋外乎有两种情况,首先,这个人确实有能力因为在大多数人眼中很困难的事在他看来轻而易举,其次,这个人是一个白痴因为它对于问题没有最起码的了解如果他还不是一个真正的白痴的话。这样的人其实在我们身边比比皆是,因为每个人都可以在别人眼里看作白痴,有趣的是在白痴眼里几乎所有人都是白痴。

我觉得我基本上是一个悲观主义者,对于那个binary-swap得近乎完美的constant的并行时间复杂度始终表示审慎的悲观态度,很多理论上很完美的算法在实时并行计算中被众多噪音所掩盖最终并不一定能够表现出应有的预期的结果,因为系统过于复杂了,就好像天气预报中影响天气的因子太多了你无法用一个单一简单的公式直接得出结果一样,但这并不等于理论的算法就没有实际意义,只是你需要正确的评价,分析,我觉得在这一点上很难达成一致,因为M说的很明白,所谓的学术圈时被一些少数凶残无比的mafia所把持着,他们对于所有外来的企图进入那个圈子的请求都作出最严厉的最挑剔的并且是降低到少到不能再少的关注,如果你的理论或者表达中有一丝一毫的漏洞或者模糊那么你很有可能就被枪毙了,所以,他们不愿意冒险因为思想是很容易被人偷窃的,当我们同时又谈到思想的交流是多么困难的时候。也许窃贼更容易接受别人的新想法因为他们是专业的搜寻者。几乎两年了,G的唯一的一个想法就是大概称作interlace的东西,我当时那种嗤之以鼻的态度一定被M感到不太高兴,因为这是他唯一首肯G的一件事,当然称作interlace是错的,真正的interlace是Nvidia的双显卡的sli之类的技术,G的想法我大概一年以前头脑发昏提出来的时候就被他们笑话了一遍,现在又提出来类似的确实出乎我的想象所以我当时才抑制不住地笑,这样非常的不礼貌,我想人们对于时间概念的理解困难导致了对于并行同步异步等等概念的理解困难,基本上pipeline的概念是号称学过计算机的人都不敢说不知道的概念,可是那伟人胸从来就不真正理解pipeline。

十一月二十三日 今天天气很好吗? 昨天下的是雪和雨的混合物。

冬天的第二场雪来得很匆忙走的也急促,什么叫做屋漏偏逢连阴雨,屋子真的漏了,害得我用储藏盒接了一晚上的雪水,真是一种传奇的经历,晚上电影台在放我的我的一个favourite的007《The Living Daylight》,所有的007里面提摩西达尔顿是我喜欢的一个,虽然没有皮尔斯南来的年轻英俊但是却却刚毅果敢,当然更主要的是当时大学时代看这部片子喜欢上了女主角marria Da'bao,当时隔壁班级有一个女生气质有些相似,结果爱屋及乌就暗恋上了,当然是完全的单相思,嗬嗬,恐怕现在没有说出来永远没有机会说了。总的来说,当时苏联入侵阿富汗时遭到全世界的谴责,邦德帮助阿富汗反苏联盟让人觉得大英帝国的间谍起码作了些有益的工作。早晨出门去实验室的路上在想我现在写这些blog为什么,从前有一段时间是由一些showoff的意思,现在更多的是一种习惯,基本上生活的内容没有被记录下来仿佛生命就是在无意义的空转,或者更糟糕的事情是你觉得你的生命被缩短了,因为空白的人生和被缩减的生命并没有什么区别。所以,延续生命的一种手段就是记录下来你的人生,不为别人,只为了我自己。

MPIHP_Trace_on()这个名字我记错了害得我找了很久,我发现了zombie实际上是xclient的化身,我决定以后先关闭RGS client的连接,然后再scancel,基本上我这两天都在做一些地基重复的工作。

十一月二十四日 今天天气很好吗? 昨天下的是雪和雨的混合物。

终于明白了一个以前困惑我的问题,在使用mmap的时候,如果超过文件的size会爆出来一个bus-error我以前还以为是系统的文件io超过什么限制了哪,当然后来我也意识到应该是mmap的问题,只不过今天看到manpage上这么说的才确定无疑了,对于windows的setfilepointer来说实在是太别扭了,因为我当初考虑太多的兼容性,对于offset仿照lseek定义成为signed,可是现在才意识到如果windows的low,high都是signed的话,我对于2g-4g的文件偏移就没办法了,哈哈真是奇怪的想法。我的错误几乎全部是unsigned的integer和32,64整数的问题,在文件大小没有超过2g的时候,一般的小程序都无所谓,但是2g是一个门槛,很多问题都出在随手定义的整数类型。 还有一个搞笑的就是我想用try-catch去拦截memcpy的错误,这个是os的底层错误,直接用signal返回,只能用signal来handle,try-catch撒了一张网什么也没有扑到也返回了一个错。 总之,这个expand的bug耗费了我整整一个上午的时间,连午饭都没吃,因为大文件的错误是在很难定位,trace也很难基本上我也不用,幸好我觉得我的算法没有问题,否则还不知道怎么找,最后的一个定位还是比较幸运的,就是在文件刚刚超过2g的时候的错误,哈哈。之前出了很多debug自己犯的错误,真是错上加错。

十一月二十五日 今天天气很好吗? 天看上去不错。

Uma Thurman的<prime〉实在是比较的难以形容,一个37岁刚刚离婚的事业型白领女性“意外地”和一个23岁的学艺术的小男孩约会,Uma只能给她母亲说她和27岁的男孩子约会,小男孩出身犹太家庭非常传统,第一首先是父母要她和犹太女孩结婚,更不要提和一个超过14岁的离婚女人了,所以他也只能说女孩是27岁,这真正是不约而同,双方都很自然地选取了一个magic number, 27这仿佛是一个分水岭,真算是心灵相通了。在中国人们选取的数字式82和28。

昨天晚上看电视的《planet of apes》看到两三点,还是第一次看得那样感慨,人类的进化是一种偶然的随机事件还是某种超越自然的法则的约束的结果,这听上去缺乏科学精神,但是我想很多人并不能否认他们对于进化论的疑虑。我们的堂兄猿猴无论在身体力量与敏捷上都超越当时的类人猿很多,但是结果猿猴始终没有进化成智能生物的事实说明了什么?难道说明了一个简单的事实,someone never learns a lesson。

<jarhead>这部战争片的震撼力可能不亚于<deerhunter>(猎鹿人)<modern revelation>(现代启示录),这两部片子我基本上都没有看过全部,主要这类题材不适合那个二十岁在大学读书的我, 大概一个人只有到一定年龄才会开始明白生命的价值与意义。所谓jarhead大概是那些在美军海军陆战队里当过兵的人自己称呼自己的头衔,你第一天到营房报道如果你看到你的队友正在欺负新兵,然后把你捆绑起来用烙铁给你烫上marine的印记,在伊拉克海湾战争期间你天天在沙漠训练,在烈日下穿着防化服打橄榄球,我想你流的汗绝对超过橄榄球的重量,掌管用喝水来作为一种惩罚,想想看这是合法的,因为你每天必须和定量的水谁敢说这不是对的,CNN记者来采访,士兵被事先警告什么可以说什么不可以说,这是全世界军队都会做的,但是你被逼签生死状就不同了,因为萨达姆释放生化武器可能让你终生残废,所以你要吃药,所以这一切会逼得你发疯,这些marine在CNN女记者采访的时候会所谓的field-fuck,哈哈女记者赶紧背长官送走,然后士兵就通宵地在大雨中把沙袋堆成金字塔在拆掉再堆再拆。。。当然基本上后方的妻子和女朋友出墙变心的比比皆是,有一次士兵们看新到的A片发现床上的女人是一个人的妻子,这当然是一种奇特的经历。海湾战争基本上没有多少地面战争,一个经过了长期艰苦训练的狙击手被剥夺了唯一一次开枪的机会就发疯了,七十二小时的战争接着是遮天蔽日的油田的大火,如果全世界的民众多想一想萨达姆的疯狂也就会对美国人在伊拉克的战争又一个更加可观的评价。如同几十年前几十万美国青年投入到东南业的热带雨林进行丛林作战一样,美国人在全世界实现着他们认为最正确的主义与价值,毫无疑问地这触及到了当地统治者的统治利益,于是美国人的战争被贴上了侵略殖民霸权的标签,可是美国人在哪里建立了殖民地?有这样把人民从独裁暴政下解放出来的征服者吗?是解放还是征服?

十一月二十六日 今天天气很好吗? 下雪了

《Borat:culture learning》你从来就不会看到这么白吃的人和事,这部喜剧对哈萨克斯坦进行了惨无人道的讽刺,这个白吃国家没有抽水马桶,电梯,汽车用驴来拉,满街都是强奸犯和弱智人群,犹太人被丑化成了恐怖分子,这个国家突然异想天开派了两个人来到美国学习文化,洙九点没见过电梯以为到了房间,把抽水马桶当作洗脸盆,不会用电视遥控器,他们国家的电视大概没有女人所以看了一部电影就爱上女主角要去加利福尼亚和女主角结婚,这个国家的男人互相亲吻但是却不亲吻女人,不知道怎样使用厕所于是在餐桌上去了一趟厕所就把大便包在袋子里回来问女主人要放在哪里,看到美国的同性恋游行很新奇就把两个对他很友善的人领回旅馆,如同他们国家一样男人一起上厕所互相看对方的隐私处,费尽千辛万苦从纽约来到了洛杉矶找到了准备签名售书的女主角于是就用哈萨克斯坦的传统方式要和她结婚,什么叫做传统,就是抢新娘了,用一个袋子把女人一装扛走。啊,对了,忘记说了这位老兄来纽约的时候行李没有什么东西大概就是一条内裤,所以到了旅馆就只好光屁股拿着内裤到河边洗内裤,在马路边大小便,行李袋子里还有他们家里养的一只公鸡,大概是怕出国的时候被人偷走或者是把它当作最好的朋友形影不离,或者平常靠这只母鸡下蛋吃?见面就给人吃家酿的奶酪,当然不忘了告诉对方这是他老婆的奶做的。。。简直酷憋了。这个国家的国歌就更加神奇了,我简直都要笑破肚皮了。

十一月二十七日 今天天气很好吗? 下雪了

偶然看到牛津的美女出的编程题,哈哈,还是有长进的,检验是否一个数为2的幂我始终就是差了一点,另一个找单个数的我觉得我的方法还是对的,不过还想听听有没有更好的。怎样寻找链表中的环

十一月二十八日 今天天气很好吗? 干冷干冷的

大概我的感觉总是对的,《007》在皮尔斯南之后差不多就算是结束了,《royale house》可以说是一种狗尾续貂,完全不对版的拙劣,首先,演员形象就没有,气质根本不想一个受过高等教育的贵族,倒好像是一个干苦力的出身,所以说那句“shake,not stirred”根本就是个笑话,看上去个头还没有女主角高,刚出道的脸就比辛康纳里还苍老,康纳利其实是老而弥坚更加得有城府并不让人觉得老态龙钟,可是这位新007简直是一无是处,随便去健身房都能找到这样一身肌肉和必要找他?首先,一个间谍从来不应该在女人身上动真情,原本007并不一定是playboy但是他明白对待女人的态度应该是医生对待病人,要有一种专业精神,怎么能够这样容易陷入圈套?而且,007除了为朋友要两肋插刀以辞职为手段公报私仇从来不会为了追求所谓个人生活而辞职,这实在不想一个以间谍为职业的专业人士的做派,女主角长得很漂亮也有气质是不假,可是不能那样单纯的傻瓜以为要对强盗守约,或者为了拯救一个男朋友而去为另一个男朋友献出生命,实在是太女人化的无逻辑,显得英国MI6都是一帮白痴。总而言之,寿终正寝吧,double O seven。

十一月三十日 今天天气很好吗? 又下雪了

大概当年日本敢和美国开战的一个重要原因是对美利坚合众国的不了解,山本五十六等少数海军派虽然比陆军派了解美国明白日本绝对不可能取胜,但是因为是少数派无法改变日本军部的决定,作为军人只能执行政治的决策而不能干预决策,也正因为如此当山本意识到美日对抗不可避免的时候才一再强调必须采用偷袭以便确定日本海空军暂时的优势,在美国这个巨人觉醒之前争取和谈的条件,所谓和平是依靠战争来实现的。我并不是为日本的战争罪犯翻案,仅仅是从战略角度来分析一下,现在很糟糕的就是某些PLA的实权人物也许在某一天也许也会犯和日本军部相似的错误,美军的训练可以是全球最全面最实用的,因为美军随时随地都在作战,50年代朝鲜战争,60-70年代越战,80年代的海湾战争,90年代也许只有小打但从来没有停止过,世界上最强大的军队不一定是装备最强的,但一定是长年累月在实战中学习的军队。military-channel里面美国军事学院的学生训练让人非常的震惊,军队的作战实力很大程度在于下级军官的素质,抛开武器不谈很重要的是连排级指挥官的心理素质,因为士兵的战斗能力在于第一线指挥官的督导,我最感兴趣的不是他们在暑假期间操作M1A1坦克,或者在导弹驱逐舰上当实习指挥,或者是各类部战术训练等等,最吸引人的是心理素质的训练,让学员从缆索滑下,或者走那种会摇晃的十米高的独木桥,据说这个是最让人害怕的高度,团队训练比如一个小组要依靠一些简单的工具把一个重物抬上山,这里面有一些圈套,因为有些看似可行的方法并不一定有用,如果在无效的争论中浪费时间很可能会分裂一个团队,又比如大家一起抬弹药箱上山,如果有的人体力不支弹药箱落地一起爆炸剩下的人还要把伤员抬上山,这是一个不折不扣地集体行动,你不但要自己完成任务还要保证你的组员尽量一起完成,否则他们反倒成为你的负担,同样抬那个几百公斤的重物实在是要求协调一致,团队精神和彼此的心人非常重要。这些心理素质非常的宝贵,并非单单的莽撞与不怕死就够当连长的,这是全世界任何军队都必须有的要素,美军强就强在把普通人训练出这些素质。

十二月二日 今天天气很好吗?又下雪了

古德里安的装甲集团的组成部分包括两到三个重型坦克师,至少一个轻型坦克师(侦查),一个轰炸机师,一个战斗机师,一个机械化步兵师,一到两个炮兵师,一个防空兵师

大概地看了一下志愿军在朝鲜的伤亡情况,一次战役东线九兵团和陆战一师的战斗阵亡为1.5万,另外有将近一万人冻死,冻伤大约四万,美军阵亡失踪大约2500人。四次战役邸平里战斗阵亡至少五千人,铁原战役63军进幸存1500人,估计伤亡不下两万。上甘岭战役15军伤亡两万多人。这还是比较主要的战役,所以总共朝鲜战争伤亡百万是一个不争的事实,大概阵亡人数应该是38万左右。美军全部阵亡加上失踪病死事故死亡等等为五万多一点,在纽约的一个广场上有一个纪念碑上面都刻着名字。二战,朝鲜战争,甚至越战都不过是比赛钢铁和弹药,美军很强也不过是和别国军队由线性的差别,也就是一个比较大的常数,海湾战争代表美军和其他国家的军队有了指数级的差别,C3I的数字化让传统的战术根本没有腾挪的地方,原本你还可以依靠军事部署来欺骗,现在美国人看你是明棋,你却是在下暗棋,哪里还有取胜的机会?美国共和党候选人辩论会上反复说美军并没有输掉越战,的确美军没有输过一个战役,但是最后却承认输了,因为输在不能完胜,海湾战争就代表了一种美国人认定的赢得战争的标准,完胜,胜利并且没有代价。

十二月三日 今天天气很好吗?又下雪了 ,是暴风雪

谁说全球气候在变暖?下了半尺多厚的雪,仿佛这才是真正的蒙特利尔,一个冰天雪地的世界,之前那都是假象。头发长了,见识短了,原来我不能使用bsub之类是我的.cshrc文件有问题,改名之后又系统自动创建我就可以使用vis和lsf了,可是我却找不到了.cshrc,我到底用的是什么shell?Joel说是大家共享同一个.cshrc可是在哪里呢?用我自己的myFind找一下吧。setenv HOST `hostname`那个标点符号是波浪号~下面的那个,(有时候我觉得我太土了,被任何一个稍懂linux的人都要笑破肚皮了,可是没有办法,linux的shell实在是太烦人了任何一个简单的不能简单的东西如果窗户纸没捅破就是没有一点办法。)学了一点点地vi感觉比nano强大多了,超级白吃的comment,不过我的要求很简单,nano大概都够用了。 在.cshrc文件里设定路径set path=( path1 path2 path3 ...)用空格隔开。我的.cshrc路径必须包含hp的那些东西。

《武林外传》经典台词:本判官有些口渴想上趟厕所。我确定一定以及肯定。

bsub -n 3 -ext "SLURM[nodes=3;nodelist=n[39-41]]" -I mpirun -srun ./hello.exe

十二月四日 今天天气很好吗?又下雪了?废话。

我简直要发疯了,到底是我的理解力有问题还是怎样?IEEE754说的是exponent-127就是mantisa,可是费了快一个上午我才明白exponent必须是126(7E)比如,一个float number 1是0x3F7FFFFF,所以我的理解就是一个浮点数载0至1之间应该是exponent=0,fraction部分为23bit的整数(实际上是24位,因为任何一个二进制书都是从1开始的,那么第一个1根本不用表示了,所以省掉了一位,用23位表达24位。)哈哈到这里我才明白我的错误,exponent应该是-1,因为2^0=1,所以应该是2^-1=0所以,126-127=-1就是exponent的值,这里我始终被困扰的事情就是我对于little endian,big endian只是一知半解,在高级语言如c/c++这一层根本看不见,只有用ultra-editor之类的才能看到,因为编译器已经把这层的区别掩盖了,真是ignorance is power,知识越多越反动,如果我根本没有这方面的一点点概念反而不会遐想,所以,半桶水不如没有水,要么全知道,要么牙根不知道,最糟糕的就是似懂非懂。所以,opengl里面的depthvalue真正只会用到3bytes,这就是0-1的好处。

以上是不全对的,exponent如果等于0就相当于2^(-127),所以如果要1就是exponent=127,fraction=0。当exponent=126的时候,相当于2^(-1)=0.5,这个地方是我不明白的地方,因为fraction=0,这个数就是0.5?为什么?我猜想应该是exponent+fraction,而不是相乘。我感到疑惑的是这种组合有可能多种相同的数字,比如0。(???)

闪击战的精义在于:1)已达成战役目标为座高优先,不惜付出重大牺牲。2)坦克为闪击战种装甲部队的灵魂但是绝对不可以单独行动,必须和诸兵种配合,比如炮兵,机械化步兵,防空兵,反坦克兵,侦察兵,空军等等,这就要求机动力不如坦克的部队如炮兵步兵跟上坦克的行进速度。3)必须高度重视空中支援与防空,如果没有制空权至少也要有足够的防空力量,同时应该尽量利用战斗机的空中侦察能力,与地面的侦查坦克共同做好侦查。情报是制胜的关键。4)进攻时尤其是进攻有步兵设防的城市必须要有炮兵和航空兵的火力支援,绝对不应该用坦克强攻坚固防守的步兵。5)对于伞兵的运用有时候可以达到扭转乾坤的作用,伞兵应该作为一个杀手锏留在最关键的时刻和关键的地点,比如在装甲部队进攻刀锋顿挫的时刻。6)步兵在近战时候有时候可以成为坦克杀手,防御的时候依靠战壕的帮助可以到达固守战略要点的目的。7)反坦克部队最大的优势在于隐蔽埋伏伏击高速前进的地方坦克部队,二战中突击炮在很大程度上是德军的无奈之举,比如当坦克底盘和坦克炮的产量不配套的时候为了前线救急只好拼凑出来,把自行火炮当作坦克来进攻中使用是对资源的一种巨大的浪费,往往会被隐蔽的苏军反坦克武器击毁。8)火炮在防御中的火力支援和进攻同样重要,如果有两支炮兵分别部署在前后纵深在配合一支防空兵几乎可以达成一个完美的防御体系,两支炮兵互相支援,火炮同时支援其他的防御部队,防空兵防止敌军航空兵攻击纵深的炮兵。

十二月四日 今天天气很好吗?又下雪了?雪停了。

bsub -g queueName ...此外,lshosts,如果bstop不能消除job,可以用bkill来删除。

/bin/tcsh myscript.bat

mpirun -prot -T ...gives you protocol and running time.

setenv SLURM_JOBID `squeue -h -n $HOSTNAME -o %i`

证实了一件事情,mr.bean在《never say never》里面出演那个滑稽的英国外交官。

在我的home目录里的.cshrc里面加上/etc/profile.d就是为什么我不能再tcsh里面设定module load mpi的原因,那个modules.sh应该是负责module文件的,#!/bin/tcsh会重新开一个session所以一定要在我自己的profile文件里加上目录。mpirun的HPMPI版本在/opt/hpmpi/bin目录下,但是还是应该把这个目录加到path里,不过我还是不知道为什么setenv PATH $PATH:/mypath为什么不行。如果是processes在同一个node上,protocol是SHM应该是sharememory.这个就是我当初问HP,结果那些人胡说什么HPMPI没有做任何的优化,这些technique support的话几乎不能相信。那个印度家伙一直强调zombie是由于gnome造成的,一定要我用KDE,我对此还是半信半疑的,现在也没有下文了。今天写了一个超级无敌的脚本生成程序,结果我所有的profiling都是自动进行了,我终于可以早点回家吃饭了。

十二月七日 今天天气很好吗?又下雪了?雪停了。

几十年前的今天日本联合舰队偷袭珍珠港,太平洋战争爆发,所谓统一台湾的三个条件之一是台湾内部发生重大突发事件,这是否包括戒严?狼来了的喊话只有郎没有来的时候才有用,狼真的来了喊话有什么用?The price of freedom is eternal vigilance.--Tomas Jefferson

A bad peace is even worse than war.--Tacitus第一句是一个游戏的slogan,第二居室我从quotedb.com抄来的,现在发现互联网的好处,什么都能够找得到。这一句也很有意思,There are two things which a democratic people will always find very difficult--to begin a war and to end it.这一句仿佛是说给美国人听的,二次大战美国人民并不愿参战,是被日本拖入战争的,但是一旦开战美国全国上下没有一个在动摇的,就是按照罗斯福的说法要获得和平不仅仅要彻底打败日本还要包括德国。伊拉克战争似乎在应验很难结束这一条,什么时候才能有和平?

十二月八日 今天天气很好吗?又下雪了?雪停了 ,天晴了。

我觉得PLA非常的不重视步兵战车,这也许是一支军队到了一定的装备程度时候才会被列上议事日程,基本上机械化之后才有全面的装甲化,美军在伊拉克的遭遇就说明了步兵只有机动在现在战争中的上网是任何军队和政府都不能接受的,即便入中国这样的人口大国也不行。一直不洗衣服总不能总买新的吧?什么时候洗衣服呢?

一枚硬币总有两面,一起事件总有两种理解,问题在于你自己是否有正确的判断,或者说你的判断基于什么可以检验和证实的基础,这就是人类的正确认识,在古代这种能力仅仅需要少数统治者掌握,今天大多数社会成员都应该具备才能配的上人这个称号。很多人相信只为了相信,很多人相信只为了不相信,还有很多人不相信只因为相信,还有很多人不相信只因为不相信。(为了凑字数,一下删除一百二十万字。。。)military channel的说法是1996年共军在台湾是射导弹的时候美军拍了两艘航母示威,最后共军知难而退主动降低了导弹试射的等级偃旗息鼓。这和网上很多粪青的意淫说法有很大出入,国内盛传的谣言是美国航母因为共军的潜艇的威胁而主动撤退,不过我更加倾向于美军的说法,因为实力是最好的宣言,敢于展示自己的人是因为有自信的人,一个国家敢于向国民显示自己的军事技术的是因为他们相信即便敌人知道了也没办法,根本无法对抗知道了又怎样。只有弱国才需要保密来稍稍地改善自己不利的地位。60,70年代仿佛西方领导人很重视中共领导人的讲话一样,其实不是因为中国那个时候强大,而是因为如古代君王一样的高的神秘,看看金正日就知道了整天穷兵黩武国立已经衰微到了几点,可是世界反而很怕这个比南韩国力小很多的北韩,为什么?只不过神秘保密制造出了不确定,你根本不能何疯子或者白吃决斗,因为他们不可预测,打赢了是应当的,打输了实在不服气(不是真的输,赢得不彻底就算数。)

今天中国成了石油消费大国,看到Militarychannel回忆海湾战争,我的问题时如果是今天伊拉克侵略了科威特,中国会不会派部队参加多国部队?应该回吧。

美国人参加一次大战可能更多的是心理上的意义,参战的时机正是欧洲大陆交战的焦灼时刻,德国两线作战筋疲力尽,英法也是强弩之末,美国在天平的一侧是literally last straw。不过年轻的marine还停留在独立战争时候的队列前进,第一次参加进攻总共费了六次损失一万人才攻占了一片小树林,当然这对于当时的德军心理上是致命的,因为德军认识到他们赢不了战争。

十二月九日 今天天气很好吗?又下雪了?雪停了 ,天晴了。

<Cleopatra〉居然有这么多的故事,可惜的是这样一部史诗巨作居然被活生生地从六个小时剪辑到了三个小时,有一点大家是认同的,那就是这是一部谁也不会重拍的史诗。这个仿佛是那句老话,男人征服世界,女人靠征服男人来统治世界,不过连神勇智谋如凯撒也逃不了一个悲剧结局,正应证了另一句老话,红彦祸水。起初和凯撒的利益交换是王位因为当时她和她的兄弟正在争夺埃及的统治权,为了巩固自己的王位她需要凯撒整个政治纽带,凯撒需要的是一个征战一生的政治继承人,他自己的儿子。然后她鼓动凯撒谋取罗马皇帝的地位以便建立一个大帝国而自己成为实际的统治者,当凯撒被谋杀之后,她的政治盟友就是被他的眉毛所迷惑的安色尼,这是一个不堪大用的一勇之夫,在海战失利之后失去了利用价值的原本应该被抛弃,但是,Cleopatra毕竟是个女流,完全不懂得战争,却被女人的野心驱使,他会操弄男人但是并不懂得战士,作为战士的antony离开了军队就是nothing,没有死在战场上他就成了行尸走肉再也不能号令军队了。这就是一个追求权利与生存的女人的故事,埃及艳后。

我看的这个版本是一开始的那个四小时零三分的长版本,看完之后我突然想起来大学的时候学新概念的时候好像就学过这个伊丽莎白泰勒,好像嫁过六七个男人吧,让人想起罗马人对他的称呼,quote, egyptian whore,end quote.

十二月十一日 今天天气很好吗?天晴了。

1967年的《casino royale》要比现在这一个好看多了,从头到尾都是exotic的美女,实际上这个搞笑版的007还没有现在这个来的搞笑,我的意思是现在这个007实在是太可笑了。这个1967年版的007是我看到的最好的间谍片,very amusing.

一个小小的改进效果就是非常的显著,现在移动视点的时候画面不再会因为file-mapping新的节点而jerky,因为我在初始化之后每次都优先把原有的节点分配给原来的render。

十二月十二日 今天天气很好吗? 阳光灿烂。

很经典的问题是这样的,问:Do you speak English? 答:No.

忽然间仿佛翻到了书的末尾略一凝思发现这本书的章节竟然没有一点印象,这就是生活。我平常不做homework的后果就是犯了严重的路线错误,大方向错了,这个教训太大了。M曾经对我说过,If you worry, then I won't worry.现实是I should have worried more than he could.所有的一切都是基于一些错误的假说的基础上,所以,所有的结论都是错误的,有一些基本的概念和认识的缺乏导致了大的方向的错误,是否pixel-merge是系统的瓶颈?在pc-cluster上的确是,可是在peer2peer的cluster上是可以做到近似常数的,在另一方面我们总是认为加了光影效果的rendering是很慢的,但是前提是复杂的光影效果,flat-shading,smooth-shading说到底都是很快的。

十二月十四日 今天天气很好吗? 有下雪了。

明天要去旅行了,订票的过程十分的仓促,就像我一生中很多的重大决定一样,匆匆忙忙漫不经心,等到除了结果才发现我想要去14天却订成了11天,唉,就这样吧,就这样吧。第一件事情是把我几个月的衣服洗一下,实在是没有衣服穿了。然后。。。打了个电话确定了我的免费保险确实存在。

亚历山大的战术非常的有效,他的长矛兵几乎所向披靡,这是他的砧板,他的骑兵绕到波斯步兵的侧后冲击,这就是他的铁锤。

十二月十六日 今天天气很好吗?蒙特利尔是否还在下雪?古巴今天下雨了。 (第一天)

凌晨2:30到达古巴,四点钟我还在看CNN关于穆斯林的新闻综述,这是一个很难解的问题,人和人的像法师这样的不同你实在很难理解那些穆斯林极端主义分子的想法,同样回到我很久以前的感慨,子非鱼焉知鱼之乐?这同样的话也可以理解为子非鱼焉知鱼之哀?

《windows核心编程》实在是一本武林秘籍,任何一个号称中级程序员的人如果没有明白熟悉其中80%的issue那就是吹牛了,我觉得我大概只接触过50%到60%的议题,真正感到没有问题的大概只有30%左右,很多都是一鳞半爪知之不详,可惜我看得是中文版总要打个折扣。VC6里面可以设一个@err,hrz这样就省的我每次都去查错误代码,实在是很方便一定要用呀。以前总是听说win2k使用unicode编码的但是这意味着什么我并不明白,现在才意识到其中的API的A版本和W版本并不等同,实际上只有W版本,A版本不过是把ansi参数转为wchar的参数再去call那个W版本,这当然是慢了。而且我还是第一次意识到字串处理的library除了你用CRT的那个还有操作系统和信用的另一套,这当然是一个我一直忽略的问题,是否所有的客户电脑都一定有CRT的dll,我问过W的意见,他总是坚定不移的肯定,这让我心底里怀疑,不过如果用kernel的那一套就根本不用操心这个细小的问题了,当然我还没有去试验到底需要那个头文件,那个lib。对于handle我想任何在windows上编程的人都不会陌生,但是实质意义是什么我想不会人人都知道,至少我不甚了了,以前也仅仅是靠linux的file-descriptor来理解,就是系统创建的数据结构的array的index,反正是个不透明的东西让你看得见摸不着而且系统怎么扩展都不会影响你,但是window应该是有更加多的内涵,因为所有的系统对象都可以有一个handle,这当然好象linux所有的东西都是文件一样的道理,但是访问权限结合起来window和linux的差别就比较大了,我现在能够理解的就是系统对象的意真实地只得在映射表里面另一栏是一个flag里面定义了访问权限可否继承等(不准确),实际上真正有使用价值的是windows里面父子进程的权限共享的模式,linux经过fork自然就clone了所有的资源句柄,但是windows只有exec没办法这样,而exec虽然有父子关系但却没有父子进程的实质管理意义这一点比linux差多了,当然windows也不会有linux的zombie的问题,有利有弊吧。但问题是怎样传递句柄?命令行?环境变量?消息?消息当然是万能的而且没有时刻的限制,不象另外两样有通知的问题,比如只能在开始的时候做,如果子进程开始运行了你就难办了。再接着看吧,看有没有类似IPC的进程间通讯工具。

看美国总统竞选我总有很多感受,比如最简单一个党派竞选人的提名机制问题,和台湾今天的模式比较一下你就看出一些问题了,比如民主党有一大堆的竞选人怎么决定呢?台湾的民进党要什么党主席协调等等这些稀奇古怪的黑盒子办法,美国民主党怎样做呢?民调是不足信的比如台湾连电视的收视率的民调都是作弊的,美国我想肯定也经历过类似的困扰,最简单有效的办法就是让选民掏钱出来,什么口头表示都不如让普通选民掏钱包出来支持他们的候选人,所以希拉里,奥巴马才要拼命的筹款,这才是铁杆的选票,用钱去买票?在台湾是这么做的,但是前提是钱从哪里出?小国可以向美国这样的大国谁买的起呀?总而言之所有的美好多东西都要有实质有效的制度来支撑否则都是空谈,很多中国历史上的改革都是因为缺乏一些有效的具体办法而失败的,所谓有效的一个标准就是操作性,另一个就是钱的支持。美国竞选是很花钱的工作,钱从哪里出是个大问题,现在美国总统竞选越来越像一个风险投资了,谁来承担竞选失败的后果?换言之,谁来买单?消费者,就是选民,这才是良性体制。

如果所有的问题可以描述给计算机,那么问题最终就是一个计算问题,计算问题的最终解决方案就是并行计算。所以不管怎么说我都是得益非浅的。

早晨跑步,吃完早饭看看书看看电视睡一觉,在起来游泳在沙滩跑步,回来幸福地躺在床上听海风,这就是度假的生活。

大师举了一个例子是关于多线程执行dll的问题,这个领域可以说是我的空白,我所能理解的就是DllMain这个入口函数是一个特殊的东西,如果用createThread来创建线程如果县城用到什么dll,那么createThread应该会创建一个mutex,(或者这个东西原本就是进程创建的)目的是保证dllmain的执行是synchronized,因为在DllMain里面有很多初始化的东西,(还有可能是嵌套的比如dll用到其他的dll)总之这个应该和java的那个synchronized很像,我原来有写过一个非常简单的例子说明这种死锁问题,就是在这种synchronized的function中不能去做同步的等待。大师的例子是在dllmain里面创建线程并等待它运行结束,结果创建线程的线呈霸占了dllmain创建的线程当然连初始化都不幸更别说结束了。原理并不复杂,而且是大师的现身说法更加得令人印象深刻,不过呢,我花了一小会时间去体会最后还是要用自己的方式来理解,我想有一个原因是因为中文译文的关系,总觉得隔了一层很别扭。(这是借口,我现在的英文远没有到中文的程度,但是因为所有的概念都是从英文学来的看中文翻译的总有些吃不准,比如什么叫做“作业”?也许英文的term我也没有接触过吧?win2k的很多东西还是比较陌生的。

在海滩上散步实在是一种享受,相比之下厦门的海滩简直就是垃圾堆。加勒比海真是海上的明珠啊。

CNN有很多很出色的新闻报道,今天晚上的新闻报道是一个在阿富汗的记者报道阿富汗妇女的生活在塔利班被美军打垮前后的变化,之所以CNN能被大多数政权接受比如连古巴都允许就是因为它的客观真实,说句良心话,伊斯兰的教义实际上就是让占人口一半的妇女三是劳动技能这样可以解决一部分就业问题,当然也可以建立一种稳定的家庭因为妇女离开丈夫根本无法生存,所以从这一点来看很多国家的男人也许都向往这种宗教制度,尤其是一夫四妻制。节目中很多阿富汗妇女无法生存只好自焚,有时被婆婆虐待,有的是七岁就被卖做童养媳。在这之前还有一个阿富汗农民种植鸦片的报道,当地农民也是走投无路只有毒贩子和塔利班能够帮助他们,贷款种鸦片。另一个在当地成功的女性,一个即便在塔利班统治时代秘密组织妇女研究文学,进而成为一个popular的女诗人被他的极度的丈夫谋杀了,原因看起来仅仅是因为当地的男权社会让他丈夫感到无法做人。几乎伊斯兰极端主义大都是在最贫穷落后的地区兴旺的,巴勒斯坦的女性人肉炸弹很多也是因为生活所迫,求生不能求死还可以让家人获得所谓的荣誉和一笔安家费,那么为什么不去做呢?我觉得我对于伊斯兰这种宗教的感觉越来越接近基督教国家的主流了,事实上宗教的冲突是这个世纪的最重要的议题之一了。阿富汗的老师还要冒生命危险如果他们教女学生的话,即便是受过教育的阿富汗青年也不能把他们的妻子让他们的朋友看到,连照片都不行,这的确是防止通奸的最好的办法,哈哈。。。伊斯兰教的通俗说法就是男人家里如果有四个老婆肯定不可能有什么精力去通奸嫖妓了,这也不能说完全没有道理。不管怎么说阿富汗还是有改善的女孩子至少有法律上上学受教育的权利了,这一切没有美军的入侵是不可能发生的,这个地球上除了美军能推翻塔利班还有谁能去做会去做?苏联?中国?英国?法国?欧盟?只有美国!我们的地球不能没有美国来当地球警察。

《God's Warriors》开始播放第二集,基督徒版。美国的基督教教义派至少比伊斯兰极端主义来得好的地方是他们尊重生命,当然这并不表示我支持他们反对堕胎的主张,自杀炸弹,反对堕胎这实在是两个极端,这个星球上最不需要的动物就是人了,跺就剁吧,多一个少一个。这个极端教义派还有一个大学“liberty university”,什么现代科学进化论等等都受到抵制,他们应该还有研究生院吧,law school,居然有一万多的学生,在80年代里根对卡特时候发动了上百万的选民,搬倒了一大堆的民主党参议员。这些law school的毕业生要做的就是成为律师维护上帝的主张,甚至还要把《十戒》写到美国的宪法里,还有美国宪法的五条个人基本权利也要和圣经联系起来,总之现在的美国最高法院对于美国传统基督教义派有很多的同情票,最忌一次大法官投票表决时4:5,差一点就通过了这些God's warriors的主张,如果2008共和党当政估计大法官的任命可以起到至关重要的影响,很可能通过堕胎非法的裁决。吉米卡特连任失败的一个原因是因为他反对“southern baptism convention”的一个更加极端教义的主张,其中有很多限制妇女角色的条例。1976年那些支持他上台的基本教义派在1980年转向支持里根,原来卡特是一个标准的基督徒,父亲就是牧师,现在他又成为家乡的Sunday school的牧师了。美国的基督徒的力量相当的大。居然还有God's foreign policy statement。上帝在圣经里就眷顾犹太人,所以美国的对外政策应该保护以色列。这些听上去如同天方夜谭,不过这是我在CNN看到的。另一个基督教激进教义派的牧师走遍全美国讲演,他说美国有五千万基督徒只要有30%投票就能赢得选举,他在interview里介绍这一切的起源来自于他旁听他女儿中学课堂的一堂性教育课,他说学校教导孩子只要使用避孕套口交等等都挺好的,他主张自由派害了美国应该由conservative来改正这个错。据说美国有超过50%不相信进化论,1/3美国人主张学校应该停止教授进化论改为教授所谓“创造论”。这是令人吃惊的数字,那个教授说得好,genesis《创世纪》实际上就是一个指标,如果这个不对那么所有都不对,所以基督徒必须维护这个基础性的章节。旧金山举行了一个“战歌”集会,这是一个所谓“上帝军”的组织这是一个中学生的基本教义派,当然他们有他们的理由,最小的学生才十一岁因为她说和她年龄相仿的女孩堕胎吸毒,而他们是purified。

十二月十七日 今天天气很好吗? 天终于放晴了。(第二天)

昨晚下雨我的房间居然漏水,哈哈这是今年第二次我遇到这种事情了。终于完全明白volatile的意义了,毕竟是大师,写了一小段汇编我立刻就明白了,比很多似是而非的解说不知道明确几百倍。这完全是编译器的优化问题,普通程序的顺序执行时可以进行优化的,比如你检查一个变量,变量的值必须读到寄存器,如果你是单线程程序,编译器就座优化始终用寄存器的值来做一个while比较,(这种while(x=0);)是非常的常见,可是如果是多线程你是期待x被另一个线程修改的,我因为从来不用优化选项所以对此感受不深,今天也算是上了一课。以前朱春明讲的嵌入式的例子却是其它设备修改,归根结底都是编译器优化的问题,否则绝对不应该去怀疑这是什么操作系统的缺陷,绝对不应该认为这是什么cache与main memory的不一致,这一层完全是操作系统设计的问题,根本不是应用程序元看得见的层面。我以前强调过一次,现在再重复一遍。windows里面的InterLockedIncrement等等一大堆的InterLockedXXX函数应该是最快的同步工具,有可能用的都是硬件实现,比如早期CPU甚至有相对应的指令,现代的CPU应该为了SMP而设计了总线或者标志寄存器等等总之非常得快。不过这一类的函数和EnterCriticalSection相比到底哪个快呢?这种比较完全无意义,两者使用不同,后者是一个同步工具可以用前者来实现,后者应该是比较高级的东西因为前者包含了具体的操作比如改动了一个值。

我这几天始终感叹地是,这本武林秘籍对我来说获益匪浅,很多百思不得其解或者始终似懂非懂的东西听大师系统的解说犹如拨云见日,仿佛开辟了一片新天地,还有更多的是我从来没有接触过的仿佛醍醐灌顶,又仿佛脱胎换骨的感觉让我如痴如醉,只想说为什么没有早一天看这一本武功秘籍?可是仔细一想这实在是一厢情愿,如果是哪怕一两年前看这本书我肯定很多完全不明其所以然,正所谓功力不到高级武功学之有害无益。这实在是有一个鸡生蛋蛋生鸡的难题,究竟你早看早受益少收很多弯路折磨还是从一开始就看缺陷如不懂装懂胡思乱想的歧途呢?对于这种两难问题我的回答是最近才形成的,不要去争论,去做吧,鸡也先,蛋也先,实践也先,理论指导也要先,应该是一个不断的循环,所谓圣贤之书常温常习才对,不可能一次就能读懂的。

对于cache-alignment的问题以前理解不深,现在听大师解说才意识到在SMP这个问题更加的至关重要,有一个编译器开关很有用的__declspec(align(32))。刚刚读到大师的解说,entercriticalsection是相当高级的,可以把阻断线程至于等待状态,同时要记住他不防止同一个线程两次进入,这一点非常重要,这让我想起了linux下的系统semaphore,不是那个IPC的semaphore,是系统级的那个,很裸很丑陋的,好像会有这种问题吧?忘了,也许没有,总之有的同步工具有这种问题,你两次获得是不行的,(我在哪里读到的?还是早期的问题?)不过这的确曾经困扰过我,当时我不明白mutex属于创建者,没有释放两次结果别的线程总是拿不到。InitializeCriticalSectionAndSpinCount可以让你看到是否创建Critical_Section成功与否,大师说微软当初也没有考虑到创建时内存不足会失败的问题,所以除了SEH你还真没有办法知道,用上面这个超长名字的函数要可靠,我想起我看的另一本windows-system-programming的书里好像提过SMP要用这个spincount才行。大师的另一个tip是关于一些insight的,这一类东西其实很占资源,所以在第一次运行使用之前系统并不创建相关联的资源,可是如果运行期遇到内存不足在创建又会失败,所以spincount参数的高位置1可以强制立刻飞配资源,这些真正是非常高级的经验之谈,没有经历过这些极端境地的程序员是难以体会的,我想我还没有到这一层,唯一的经历是创建octree的预处理用光内存导致vector的push_back出错的问题,我找这个问题非了好几天,因为怎么也想不到vector会出问题,而且是push_back,所以有这种意识比有必要的具体解决有时还重要,因为你可以想得到问题可能出在哪里,不然向我始终怀疑自己的代码问题想破了头也想不出来。

我讨厌中文书的一个主要原因是中国人的懒散与含糊其辞,这表现在很多书都不见index栏目,一个名词的定义对理解的至关重要的,那么一个名词在哪里定义的是一个重要的问题,而且很多参考书不能指望读者从头到尾一章不差地读,跳过很多章节突然看到一大堆名词不知道在哪里定义的真实一个头疼的事情,为什么中文书不加一个index呢?这就是中文丑陋的东西人人都可以定义一个名词而且好像每个人都可以望文生义,曾经有人拿这个说事说这是中文的优势,一个普通人掌握两千个常用词就可以看懂科技文章,不像英文没有几万单词而且是相关领域的专有名词你根本就看不下去,问题是看懂的定义,“火箭”真的是带“火”的“箭”吗?“流星”是从哪里“流”过来的“星”?中国人的读中文的望文生义导致了很多的恶果。

谁说CNN没有政治倾向?那个女播音员评论布什总统的讲话就用了一个stuffed with etc.我不明白为什么她这么说,不是当年宣布减税政策并没有什么不对,是市长面对克林顿政府遗留下来的这么大一笔财政盈余布减税的政府除了中国共产党之外很难找到,发动伊拉克战争阿富汗战争难道有什么错吗?换了不是任何一个美国总统不可能做出什么别的选择,比如珍珠港偷袭之后美国人民还会拒绝参加二战吗?如果一旦参战不彻底消灭德意日轴心国同盟能罢休吗?美国的问题是布什的政策造成的吗?美国从伊拉克一走了之就行了吗?日过在发生一次911是否美军要再打一次伊拉克吗?美国以后历届政府能够每一节都来一次战争行吗?很多自以为是的民主党的中产精英阶级总喜欢那布什取乐实际上这些人都是误国误民的三国时代吴国的张昭之流,说起来一套一套真正需要他们出主意的时候连大方向都弄错,妄故了孙坚托孤的所谓内事不决问张昭,实际上这种人只会沽名钓誉实属无用之腐儒。布什讲话时候明显的苍老了很多。早上跑步大概四五公里吧,然后去无比简陋的健身房活动了半个多小时。结论是我这一次度假的选择有问题,古巴的酒店一定要挑选,这个酒店一定有它的黄金时代,不过那应该是很久以前的了,不过就当作闭关修炼吧。

CNN谈论的另一个话题就是法国总统萨克奇的花边新闻,oh lala,刚离婚的总统和超级名模约会了。可是我在想这个基本上没有什么稀奇,既然老婆跟他离婚了为什么不能呢?可是问题在于以一个刚当选的总统他的妻子居然要放弃第一夫人的位置离婚却让所有东方价值观的人难以想象,其一,这个第一夫人位置一定没有多少吸引力,没有多少特权没有多少利益否则为什么不再竞选前就放弃呢?其二,作为总统敢于做出这种决定国民并不把它看作始乱终弃的坏榜样说明政治在普通公民的成熟,其三,作为总统的花边新闻并不奇怪全体国民都知道,要知道就算是前苏联总书记有几个情妇普通老百姓也是知道的,比如江核心和祖英的关系全国人民不知道吗?我是比较倾向于相信政治“谣言”的,在新闻管制体制下“谣言”要比人民日报和新闻联播可信的多,因为这一类话题绝对不会空穴来风,也不会是纯粹的小人物能够想象出来的,这种东西不是身边的亲信不可能透露出来,问题是这种让普通人侧目的领导人的秘密让现在这个社会生活的人保守秘密也比几十年前困难多了,所以没有不透风的墙。但是话说回来了,就算有又有什么关系?克林顿执政有什么问题吗?领导人的私生活从来都不是国家的问题,国家的问题恰恰是连领导人的私生活都成为问题的问题,核心的那个拿不出台面的原配全国人民都看不过去,那就离了吧,不行吗?全国人民不答应吗?可能唯一不答应的是原配本人。我有例可证,当初刚到延安的时候老毛抛弃贺子珍了吗?不是,是贺子珍要离开老毛,老猫当然无所谓延安那个时候有的是从蒋管区来得找机会的青年女学生,仿佛那个时代有理想的女人的好莱坞,充满了机会,哈哈。所以只要原配愿意离婚,我们的领导人不用 背喜新厌旧的罪名绝对不会犹豫的,可是恰恰是因为东方的政治制度的第一夫人的红利让这么多原配死活就是不离不弃,成为国母风范。 所以,说句笑话,什么时候中国领导人的私生活可以被普通市民当作花边新闻评头论足的时候中国共产党就实现了自己为人民服务的诺言了,因为你不从神坛上走下来怎么可能为被你顶礼膜拜的人服务?喝了两杯红葡萄酒吃了两块牛排我感觉飘飘然的,海边散散步,风大浪急,白浪层层,有人在wind-surfing,就是身上绑一个降落伞脚上绑着冲浪板。

一觉醒来本想去其自行车结果发现没有人车子都锁起来了,肚子又感到饿了向起来昨天吃的cheesebuger很好吃就又去snackbar点了一个,好吃,我觉得我现在越来越能够接受西式饮食了,游泳池边音乐大作正在教授当地舞蹈,大概是恰恰和伦巴之类的吧,反正不懂,想起昨天晚上看的表演我不由得惊叹加勒比海人的舞蹈天赋,他们的音乐和舞蹈有着天然的融合充满韵律和感染力,而且这些舞蹈者在表演的时候充满了创造力,仿佛jazz一样的即兴创作,经常仿佛有神来之笔,结合音乐与节奏用身体写作了一首首美妙的诗篇。CNN的另一个新闻是关于沙特的,当地一个女人被轮奸但是伊斯兰法律却要追究她和无关男人接触的错,所谓无关男人我想大概就是除了她的丈夫家人之外的人吧,基本上这种伊斯兰法律和奴隶制没有两样,很难想象在二十一世纪这种制度还有这么大的市场,沙特在国际舆论的压力下免除了这个女人监禁6个月和鞭刑200下的惩罚。CNN的评论是这只是一个特例很难说沙特的法律就会因此改变,只不过现在每个国家都是在全世界的“显微镜”下运作,这是原话,作为地球村的成员你不得不考虑你的邻居对你的看法,这影响到整个国家的形象。确实如此,大概这就是全球化的另一重意义,基本上我想在中国这样的人多地少的国家发生什么革命是不太可能的事,相反因为全球化的缘故世界去通道是一个不可阻挡的趋势,所谓顺之者昌,逆之者亡。因为全球化的一个基本结果是资讯的全球化,这个世界最大的力量就是“比较”,来自不同背景的人民在比较,不同的制度的效率的比较,来自不同来源的资源在比较,这个资源当然包括人力资源,劳动力技能成本效率的比较,这就是生存竞争,人类社会的进化也遵循生物界的普遍原则。

waitformultiobject有64个上限,这使得我想起当时wmpi那个技术支持和弄我的时候也是拿这个说理由,当然我并不认为他完全在骗我,我只是觉得他可能根本接触不到源代码,这只是猜测没有多少理由,总之这透露了一个信息,在windows里面你可以同时操作的线程的一个上线,超过64同步很可能就不容易做了,尤其是类似于waitforall这一类的操作。

十二月十八日 今天天气很好吗? 阳光非常灿烂,不过风浪较大不能游泳。(第三天)

差不多已早上都被资源文件所困扰,最后放弃了寻找VC6现成的资源编辑器,只有用文本编辑照抄代码,1。资源文件可以有include 2。资源实际上最大的一个问题是定义一些资源索引,比如你在代码里面refer什么资源,实际上都是传递一个常数,windows的很多dialog函数依靠这个常数来load资源,所谓资源大概就是一个config参数,比如resource_id  DIALOG l,t,r,b STYLE DS_MODALFRAME|WS_SYSMENU|WS_CAPTION CAPTION "CAPTION NAME"

BEGIN

   EDITTEXT ITEM_ID l,t,r,b

   DEFPUSHBUTTON "OK",ID_OK, l,t,r,b

END

我被两件小事折磨了好久,资源编译器很傻的,如果另其一行就会让她迷惑,第二就是ID_OK是资源ID,和MessageBox返回值无关的,(这本来不是问题,不过我因为参考了一下MFC的做法,看到很多与定义的stringtable的常数反而糊涂了。)3。一个dialog的创建大部分都使用一些所谓的macro做的,你需要给它一个消息处理程序,那个宏就把当前windows的消息处理函数转到这个dialog了,结束的时候你在call enddialog,所有的所谓dialog函数归根结底都是call dialogBoxparam,并且把那个lparam参数用0传递,当然像所有的api一样这个有ansi和unicode版本,你不需要操心这个了。也就是因为macro这个参数类型比较讨厌,DLGPROC得定义是BOOL (CALLBACK*DLGPROC)(HWND,UINT,WPARAM,LPARAM);CALLBACK是一个宏,基本上就是__stdcall。4。WM_INITDIALOG这个消息应该是windows的一个流程,你应该捕捉这个消息进行初始化。enddialog是结束dialog的唯一途径。

居然断电两三次,一怒之下我就跑步去了。烈日下挥汗如雨,(夸张)就跑了两公里左右吧?反正是因为没有路了。菜单算是明白了一点,以前找着MFC的tutorial根本不能真正理解怎么回事,现在知道了菜单(包括系统菜单,不对,系统菜单应该是发送wm_destroy)都只不过在WM_COMMAND项下的wparam的一个常数,静态的建立菜单的办法是在resource脚本里面设定menuname MENU

BEGIN   POPUP "&Animal", IDM_ANIMALS   BEGIN MENUITEM "&MAMMAL", IDM_MAMMALS END END...

一句话,就是VC6那个给你做成了可视化。并且一个工程只能有一个资源脚本。动态创建的menu一大堆函数我现在还不想看过多细节。

看CNN的那些时事评论感触良多,一方面新闻目光非常的尖锐可以说明察秋毫,克林顿的每一句话都要被他们抓小辫子,比如他暗示奥巴马泰年轻不如他老婆经验丰富,立刻奥巴马就以其人之道还制其身用克林顿当年竞选参议员的原话来说明有志不在年高,后来克林顿要在辩白,反而因出更多的议论,真是唇枪舌剑,思想和思想的交锋甚是好看。另一方面,采访者评论者反应很快精力充沛,这样的国家节奏非常的快,这反映了国家的竞争力与效率,实在是让人羡慕不已。 其实我也不是不明白什么民主自由都是太空泛的口号,但是有一点是毋庸置疑的,那就是社会生活的进步,什么是进步?更公正,更平等,更有效率,更合理,更加考虑更广泛的社会成员的利益和感受,如果这个是各种社会都想追求的目标那么美国社会是一个最好的典范之一,世界上有很多做得更好的国家可是他们都太小了有一定的特殊性,大国里面只有美国是唯一一个合格的解决方案。美国的事情很有意思,一个十岁的小女孩上学的时候带了一把牛排 刀中午在餐厅切自己带的牛排,结果她的老师打911叫警察把她逮捕送到了少年犯管教所。这是反应过度还是超级白吃?美国德州一个叫Horne的拿枪杀了两个没有武器的入室窃贼,有人称他为英雄,有人不以为然认为那两个人没有武器而且是在逃跑的时候从背后被开枪打死的,CNN的主持人问一个官员,他的话有些让人无法反驳但是总有一点点冷酷,他的意思是既然那两个要做入室行窃的工作自然知道这是很危险的工作,这是他们要付出的代价,如果他们找一个正当的工作做就不会有这种事发生了,说的是没有错,只是这么说总让人感到有些怪怪的味道。另一个美国监狱的骚乱,狱警对闹事的囚徒使用我认为过分的暴力,当然那是个刺头领头闹事挑衅警察,可是就如同那个坏小子的妈妈在访谈中说的,她生活的辛辛那提县就算是杀一只 狗你都不能开枪折磨它如果它已经被绑的牢牢的话,但是他儿子却被绑着然后用三万伏高压枪在胸前折磨。墨西哥的农民的生活很穷困但是贫穷的标准也不过是每个星期19美元,原因是美国农民得到美国政府的补贴于是墨西哥农民的玉米再也不能竞争了,这是北美自由贸易协定NAFTA的问题吗?美国今天最主要的一个议题就是所谓的invasion of aliens,这里的异型不是那种以浓酸作血吃人不眨眼的外太空怪兽,而是来自于墨西哥的大量非法移民,这个问题究竟有多严重我没去美国不知道但是我知道美国人现在在讨论的事是是否应该把英语当作国语这一点写进法律,你明白问题有多严重吗?美国建国两百多年从来没有人怀疑过英语是美国人的语言,You are American. Speak English!可是现在开始有人质问,有人开始担心,于是为了预防万一这一条要写进法律以防将来变天。西班牙语现在是美国的第二大语言,这就是美国人的问题。美国总统选举很有意思的,全国支持率并没有什么用,因为要看你赢多少个州,虽然有些州很小可是他们的票并不少多少。(这一点我不确定,选举人票是按人口计算的吗?还是按行政区算?)卡斯特罗是否会退位?应该不会,像同时代的毛泽东一样到死也不能丧失权利,连太上皇都不行,CNN的评论员的评论是cosmetic humbleness as usual。所谓的不应该cling to office, not to obstacle to growth of younger people之类的都是骗人的。 美国国会也有糊弄人的,民主共和两党互斗预算案,结果一方提出了一份三千多页的预算案,你读得完吗?据说就算不是总统死了你也不一定读得完,我相信,因为几百页的教科书我没有一本读完过。

十二月十九日 今天天气很好吗? 阳光非常灿烂,早上游泳去了。(第四天)

不仅游泳我还玩了一会儿kayak,就是那种独木舟了,在montreal的时候滑过一次很好玩的,在海里面不太容易保持平衡,哈哈。CNN比较funny的广告是这样的,在踐蔃有力的西班牙古典吉他的节奏中一个身形健壮的妇女走进厨房顺手摘下一个苹果抛向空中,一个箭步跳上案板一个倒立用脚接住空中的苹果,然后苹果在她两只脚之间玩味良久,然后他一只手撑着倒立另一只手捧着苹果送到嘴边。你猜这是什么广告?同样产品的另一个广告是这样的,在一段悲伤欲绝的音乐声中一个满面愁容的妇女走进房间,宽衣解带,在凄厉的音乐中她把自己用天花板垂下的红绸子绑起来,然后开始做一系列高难度的空中杂技,两只腿绑着倒掉空中荡秋千。同样的产品,同样的问题,这是什么产品的广告?CNN的一则新闻是大量的外国投资在拯救美国破产的银行,这意味着什么?评论员回答说,他们钱太多了没地方用了,的确你手中的美元部投资到美国能干什么?中午饭吃得太饱了,我总是这样,每顿都吃得走不动路,My eyes are bigger than my stomach. 撑得走不动路也要走,就索性走到城里去,这个地区明显要比我去年去的caya coco来的富裕,路上的车子虽然还有不少旧的lada但是还有一些新车,还有不少摩托车,路边的住宅当然也比我以前看到的好一些,不过不要忘了caya coco是一个农业省,我看到的是农村,而城市总是要比农村好得多。不管怎样旅游业改善了当地人的生活是毋庸置疑的。 晚上吃饭的时候忽然有些感伤,因为我觉得我一个人度假有些过份的引人注目了,吃晚饭望着天上的新月心情在两杯红葡萄酒的催情下更加的有些凄凉,我总有一千个理由思念我的故乡我却总有一千零一个理由不能回去,想起来又一个年头的终了这一年来的总结又要临近了,这一年来有多少来不及叹息的叹息呢?这个酒店的表演的确要好很多,别出心裁的东西还真不少,比如一种现代的类似皮影戏的表演,说皮影戏实在是太不准确了,因为这是一个真人的表演运用灯光服装和新材料,类似迪斯科舞厅里很多女孩子穿的发光的衣服那种,表演情趣多变很有意思很可惜我有没有带相机,不过这种不可传神的独享的记忆更有吸引力,就如这些表演一样,一旦完全曝光在灯光与眼光下就失去了神秘的魅力。是不是windows的逻辑画板只有十六个呢?我说的是LOGPALETTE我觉得有些不能理解,明天再看吧,我觉得酒精是一个人正常思考的天敌,可是我怎么也想不通国内的人天天都浸泡在酒精里究竟在想什么?

十二月二十日 今天天气很好吗?阳光非常灿烂 。(第五天)

迷题解决了,原来palette和其他的GDI不一样不能用selectobject,而是要用selectPalette,微软搞得这一套真复杂,当初是怎么设计的,除非说palette是因为客户端的物件才需要另一个API否则干嘛要用不同的函数?这似乎是唯一的解释。但是我还是有疑问就是在同一个wm_paint消息下的beginpaint是否互相覆盖?是第一个吗?果不其然,beginPaint不能多个!VC6的资源编辑器不知道加了些什么东西,也许是什么discardable吧,总之我用resourceID去loadicon,loadcursor都失败了,我重新编辑.rc去掉所有微软生成的东西,只保留CURSOR_NAME CURSOR CURSOR_FILENAME.CUR就可以了,注意这里的resourceid和以前消息循环里面菜单的那些id有所不同,因为这只是refer资源文件里的资源名字,所以用字串就可以了,不需要单独用头文件定义常数,而在前一次我用的时候用的是资源id,是数字id,(我觉得比较的混乱,上一次的菜单也应该可以用字串的资源名字来传参数,不过问题是GetDlgItemText需要传递的是一个对象的id,这个必须先定义让资源文件编辑器进行编译,然后sourcecode再去引用,所以在资源文件里面存的不是字串而是id,明白了吗?我自己都快糊涂了。)总之,在.rc里面到底要存字串还是常数是由你决定的,但是有的api只能用id不能用字串,也许是为了效率吧?

TNND古巴这个鬼地方一晚上要停电好几次,我曾经丢失好几次文件。实际上这是一个伪命题,什么叫做字串什么资源id这都是我自己想出来的,实际上很简单,对比dll里面输出的函数名和hint number,我想所谓的资源id就是所谓的hint那个应该是一种高效的查找方法大概在文件头部分放了一个表查找速度比字串比对当然快很多了。(难道字串不也是放在哪里吗?仅仅是int比对比字串来得快而 已。)MAKEINTRESOURCE解释了半天The return value is the specified value in the low-order word and zero in the high-order word,实际上你看辕马更简单明了:#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))就是假造了一个字串指针,我猜想i是微软事先计算的相对偏移量,而且从这里可以看出来资源文件是有一定的长度限制的,35536是上限。(这一点我仅仅是猜测。)肚子好饿啊,去吃早饭了。居然这个电视机有机巧,我没有找到所有的频道,居然看到了中央电视台的频道。中国和印度进行联合军事训练说明什么呢?中国开始在印度和巴基斯坦之间搞新的战略了。《百家论坛》在讨论《祝福》里面是否有阶级斗争,鲁四老爷究竟是否是害死祥林嫂的元凶,评论者说祥林嫂到地主家干活在他们家好多了,白胖了。的确,鲁迅自己明白自己不是解救人民的救世主。那个画笔程序聪明的地方在于鼠标左键按下以后鼠标移动画下的临时线要怎样擦掉,这个问题其实不简单,如果你的背景是复杂的图画,你除非重画背景这个可是非常的大的工作量因为鼠标移动事件wm_mousemove会非常的频繁,而且定一个重画的rect实在是很傻,说不定你只好把所有都画一遍。如果不知道作者的办法我还真是想不出来,不过我想学过计算机的尤其学过基本图形的人很可能都知道这个约定成俗的很酷的办法(除我以外?),你的临时线是screen的inverse,多么的聪明的办法,你只要再画一遍就抹掉了,等到lbuttonup的时候再用pen的颜色画最后的线段。我对于createcompatibleDC还是不太理解,为什么bitmap的操作都要用我自己创建的dc呢?

天天看新闻联播的话你会和大多数被韩劳动人民一样认为北朝鲜是全世界的天堂。

十二月二十一日 今天天气很好吗?阳光非常灿烂 。(第六天)

你绘画五角星吗?我当时非常的镇静为什么能够用5个顶点画出总共有10个顶点的五角星呢?看了半天才明白哈哈,真是计算几何学的威力,你的五边形的顶点是alternative的顶点,这就是复杂的多边形,但是GDI进行“scanline algorithm”的时候,你可以有两个选择,winding,alternate,前者全填,后者只填奇数与偶数边之间的区域,这是MSDN的原话,可是你还真需要一些时间去理解呢。还有一些我不太明白,那个magic code0x00960169L究竟定义在哪里?作者说的微软的表可能是很早以前的东西,这个code据说是postfix,我不知道这个是否有什么规律呢?DPSxx是怎么encode呢? 什么是度假?就是坐在棕榈树下的酒吧桌前看着眼前碧蓝的游泳池边比基尼美女晒太阳,在热带微风吹拂下吃着香喷喷的芝士汉堡,并且要不时地提防落在对面椅子上的小鸟的窥探。

十二月二十二日 今天天气很好吗?阳光非常灿烂 。(第七天)

终于在msdn里面找到了Ternary-Raster-Operation的code,可是我却不明白为什么结果不太对。看了半天才找到原因,是我自己的错误,bitblt的destDC当然不是memoryDC了,我应该把destDC的brush设定,这才是我的pattern,顺便说一下,那些ternary的operation只是一些自定义的index,五花八门,大都没有名字。其实brush也可以用bitmap来做,这增加了更多的灵活性,当我们的s,d,p都是bitmap的时候这真是好多好多的可能性。二十年代的上海一个出租汽车公司居然会花一万块美金买一个电话号码?那个时候的美金有多大啊! 调整window大小的函数是setwindowpos,连带把位置也调整了。 证实了一点,一万美金买一个电话号码是吹牛皮,那个时代中国的民族资本家还远未达到那个水平,连三百辆出租车加上其它配套设施加在一起也不过就是五六万美元而已。我肯定是什么GDI的资源未释放现在电脑变得很慢了。 看大陆报道的台湾新闻评论里面有嘉宾说美国人实际上很担心阿扁到时候搞一些意外出来,比如美国驻台代表问连战说如果到时候台湾攻击大陆渔船怎么办?我有两个感想,1。美国人确实很担心,因为现在经济联系这么紧密谁都离不开谁,美国一个次按风暴就让很多人担心明年经济陷入衰退,如果像中国这样的新兴市场再波动那不是雪上加霜?更不要说中国现在有很多美国的投资又是世界的工厂。所以美国人吃不透到底会有什么意外,所以提前来文国民党当然也是提醒。2。美国人对于中国的事情还是外行,你天天看CNN的话就知道美国人根本没时间关心像中国台湾这类事情。国内问题是大事,安全伊拉克非法移民等等全排玩乐也轮不到中国议题,另一方面美国人很天真地认为如果中国大陆的渔民被绑架杀害的话就会陷中国政府与危机,殊不知这类事情在中国人眼里就像死了几个蚂蚁一样不值一提,我小时候大概每个月都有福建渔民被台湾打死的消息,再往前每个月都有广西农民被越南人打死的事情,再往前每个月都有农民被苏联人印度人打死的事情,中国政府什么时候生气了?对越自卫还击也不是为了农民报仇,主要是为了柬埔寨的西哈努克的要求,那个时代只要有一两个小国轨道在中国领导人面前称臣让他们享受一下万邦来朝的虚荣就什么都答应了,包括向西哈努克这类乞丐要在中国嫖妓周恩来都只好找招待所的女服务员来服务。所以,美国人不懂中国,中国不像世界上的大多数政府要替它的臣民考虑,不是的,这种杀渔民的办法不能激怒大陆。阿扁要另想办法。

不过回过头来看台湾的问题很严重,很多人其实并没有意识到危机是注定要发生的,我们不妨仔细看看蓝绿两党在明年的大选中是谁也输不起的,第一国民党输不起。凡事不过三,如果国民党连输三次整个人心就散了,这个当可能就散了,机会主义分子会倒向民进党,党的内部会再次分裂出走,支持者会彻底丧失信心与耐心,总之,国民党会彻底垮掉,所以他们输不起。第二民进党输不起。民进党虽然是执政党但是始终处于很不稳固的地位,最大的问题是掌权的人一旦失去权力就如同失去生命,民进党的财源不如国民党一旦下台可能连维持的钱都没有了,另一方面这些人都害怕国民党重新掌权后会秋后算帐,阿扁就是代表,他们绝对输不起。原本的民主政治是一种平衡的权力,朝野两党不会有这种你死我活的绝对的执政党优势,可是台湾的宪政体制有先天不足导致现在这个情形就是谁都不能输,但是一定会有一个输家的话,很有可能会有极端事件发生导致政局混乱,这个时候才是最大的可能性事件发生:对台湾动武的三个条件中唯一一个可能发生的条件就是岛内发生重大事件比如混乱,大陆绝对要介入否则被联合国或者日美派维和部队的话台湾就国际化了。所以,这就是美国人最担心的因为这个剧本太复杂超出任何人的控制。

十二月二十三日 今天天气很好吗?阳光非常灿烂 。(第八天)

有几件事情要明确一下:1。做bitblt的三个东西,R=memory DC一般就是你创建的一个bitmap,他和一个memory的dc相联系,就是要selectobject,D=实际的screen的dc相联系的,往往可以有bgbrush,与pen之类的画出来的,总之是和实际的dc相联系的,P=和实际dc相联系的brush,不一定是bgbrush,而只不过是目的地的dc的brush。2。如果要抓取屏幕要创建一个和display相联系的dc,这个display-surface用名字"DISPLAY"来获得,CreateDC的其他参数为NULL,同时还要创建一个memory的dc来存储bitmap,屏幕的大小可以有GetDeviceCaps获得,bitmap和memorydc相联系,最好先把你的程序ShowWindow(hwnd, SW_HIDE);然后坐bitblt,memorydc是目的地的dc。3。存储bmp文件比较麻烦,我玩过一段时间感觉还是有些麻烦,主要是要考虑所有的格式的话不太好写的好,如果是单单面向某一种格式当然容易的多,从HBITMAP获得信息是GetObject,获得data是GetDIBits,bitmapinfoheader的定义还是很罗嗦的,我懒得再做一遍就copy微软的例子玩了一次。对于bottomup与topdown的格式我还是不太明白,以前发现有的人反映我的程序有这样的问题,实在是罗嗦的很。4。alphablend功能只能支持32bpp,这当然是合理的,可是rgb居然是pre-multiply with alpha,这就使让人难以接受了,我就懒得玩了。对于localalloc我还不太明白,是否已经没有必要使用了?也许使用heapalloc更好吧?究竟和new,malloc有什么区别呢?是操作系统级的具体实现吗?看伏明霞和郭晶晶的故事感觉很有意思,背后还有这么多呢。

天上的云彩仿佛半透明的羽毛飘来飘去不时地想遮住那轮明月的脸庞,地上徐徐抚面而来的微风不停地拉拽着婀娜多姿的棕榈树。

十二月二十四日 今天天气很好吗?阳光非常灿烂 。(第九天)

犯了一个比较低级的错误,因为我有一种错误的观念,如果你想创建一个singleton的对象,是否应该把它声明成static在“头文件”呢?我的观察是应该用extern声明,好像每一个引用这个头文件的cpp都会有一个自己的实例,所以你会有多个实例,这是非常的subtle,我在写并行程序的时候并没有这种体会因为mpi的程序在不同的node上执行不同的cpp所以每个Node还是只有一个实例。其实二战是一个险胜,因为直到德国投降的最后时刻他们都有翻盘的机会,当时不论是德国还是日本都有很大的机会研制成功原子弹,而且德国的喷气飞机有很大机会得到空中优势,我今天还知道了一个我不知道的历史事件,当时日本和美国一样成功研制了离心机,但是他们缺乏u-235,在德国投降前夜德国决定用潜艇输送500kg的u-235和一批专家到日本,天知道如果日本得到了这批武器战争是否会成为一场原子战争?

据说鲁迅和他弟弟周树人的绝交是因为家庭开销上的纠纷,以前胡一刀说鲁迅日记大概都是什么今日收到某人送来十块银元之类的琐事,后来我就开始学习这种写作风格,可惜始终没有收到某人某日送来的十块银元之类的,实在是一大憾事。如果要登记backgroundbrush应该用SetClassLong,在16位系统用的是SetClassWord,我猜想这个函数实际上就是用的结构的偏移量来设定的,猜测而已其实无关紧要。 让我感到困惑的是隐藏window之后,比如showwindow,我再也不能恢复window,好像消息循环被转移了再也创不到那里了,当然这是我的猜测。我试验了WM_SHOWWINDOW可是还是不行。

我想你一定会被气死的,vc6的资源编辑器居然要求每一行必须用回车结束,我最后一行忘了这个结果一直报错,我还以为是语法错误,文件结尾的判断有这么白痴的吗?真把人气死了。

圣诞大餐吃了些什么?我不知道,我只是知道我喝了好几杯的红酒,然后心里很惆怅,想起了很多,十年前,二十年前的陈年旧事想从胃里不时涌上来的饱嗝一样五味俱全,只不过事件里的人物都成了一个个的符号,一个个没有面孔的符号,我费尽心机的敲打着斑麻木的额头尽力会向那些面孔,可是除了一个个的指令破碎的片断没有任何一张清晰的面孔,一切都是一些模糊的支离破碎的片断。我想我要么是超级白吃要么就是超级天真,你想windows就算再烂也不会有这么低级的想法,我自己创建的wndclass是用来向系统传递参数的,系统内部怎样存储window-class是一个不透明的东西,或者按照操作系统的行话来说是一个不愿意暴露给用户的内部结构,一方面是安全的考虑,一方面是将来升级换代的考虑,总而言之最基本的是在系统内存的东西,我怎么能够天真到以为setclasslong是改变这个参数的属性呢?我一定是没有喝酒的缘故,否则怎么这么白吃?现在我的头疼得厉害。 首先,使用setclasslong改变bgBrush完全没有问题,但是正如我以上所说的wndclass是没有被改变,其次要改变menuname我失败了,并且正如以上所说的,wndclass是不会改变的,而且就算我手动改变也没有用,所以你明白我所说的了,你是只能操作hwnd之类的opaque东西,间接地依靠一些列函数,不可能直接改变数据结构的,这个基本观念我还没有建立实在是可耻。我的结论是也许静态的依靠资源文件建立的菜单不能简单地依靠改变资源文件名,也许可以但是我也许没有找到合适的时机点或者事件,不过我以为wm_nccreate是第一个事件,所以我认为只能用动态创建菜单的办法来改变

十二月二十五日 今天天气很好吗?阳光非常灿烂 。(第十天)

我想原因也许很简单就使setclasslong没有问题,我的确设定了新的menu-string系统也知道,但是我并没有说怎样处理已经load进来的menu,所以我只能硬性删除,getmenu,destroymenu,loadmenu,setmenu,这样一系列动作可以设定预定义的资源文件里的menu,动态创建实在是太麻烦了,我懒得看了。TNND的菜单是WM_COMMAND的wParam。我有一种错误的幻觉,这实在是糟糕,你能否仅仅依靠DSP的ternary-raster-operation来画一个bitmap在一个bitmap上?我的意思是一个cartoon人物画在黑色背景上,然后我想把人物的形象“扣”出来画在复杂背景上,比如一个bitmap上,这个只能使用alpha-blend做,可是我有一种幻想想用naox这几种操作的组合来画出“透明色”,这是不可能的,因为我们的透明这里意味着rgb都是0,而我的bit操作根本不管是不是什么黑色或者无色,这个可以做到的只是SDo但是这个并不是我想要的,因为source的颜色要改变。我浪费了块半个下午把256种可能都试了一遍,当然不是因为我白吃只懂得用这种笨办法来试验,我只是想再证实一下,而且把这个256的表作一下将来是很有用的,vc6例有一点好的地方就是按住alt+shft的鼠标选择,拷贝,简直是天才的设计。在提醒一句,DSP里面的P是hdc的brush,不是bgBrush!这简直是不可原谅的,不能再错了。还有一个白吃的问题,你要抹掉上一次的东西,如果是简单的2D的东西,最简单的就是用bgbrush来patcopy,当然要把bgbrush设定为brush,不过应该可以用invalidateRect,不过我还没有试验。试验了一下,我想我的概念是错的,那个使用beginpaint,endpaint的做法,是要你重新画一下。算了吃饭吧,今天是最后一晚了。叫到这里吧,度假结束了。我觉得就算用底色作P也是不行的,试验过了不行。看battle for wesnoth,它里面的头像都很小,这是否??等回家看看代码如何?

这里的表演其实相当不错,我始终怀疑是否他们是真的在唱,因为如果是的话那么他们的确太好了,仿佛百老汇的歌舞剧,当然我没有去看过不过sound of music,东边西边之类的还是看过几眼的,正好电视里再放,我觉得我还是很喜欢美国的歌舞剧的,我个人以为这是美国文化的精髓之一,相比之下国内似乎很有偏见对于外国的文化很排斥,颇有天朝大国对于其它一切都嗤之以鼻的情节,我现在看国内的所谓文艺界仅有一种迎合大众情趣的倾向,虽然我也觉得赵本山的小品有趣但是正如一位仁兄的评论,有些粗鄙,这不是他的错,错的是现在的文艺界的取向,你不引进介绍大众怎么有机会去品尝?我记得我小时候即便是刚粉碎四人帮文化极度贫乏,电视就只有一个台每天只有几小时的节目还经常可以看到如《胡桃夹子》之类的芭蕾舞之类的,可是现在你在几十个电视台里也找不到一个小时的所谓艺术,我也不是主张什么所谓高雅艺术,那个什么男高音我一点都不感兴趣,美国歌舞剧就是美国的大众文化。

十二月二十七日 今天天气很好吗?蒙特利尔哪里有什么阳光啊?

哈哈,终于回家了。我在阅读maskblt的时候才领悟到了ternary-raster-operation的code的high-order-word仅仅用作index,low-order-word才是op-code,难怪maskblt可以把fore-back的code结合成一个dword,当然了maskblt的foreground或者background的raster-operation都是binary的所以各自用一个byte就够了,而ternary-raster-operation确实是要一个word的,因为复杂嘛。(以上是胡说八道,maskblt明明就是ternary-reaster-op所以我的结论不对,ternary-raster-op需要一个word,那么。。。???除非我们只用operation的Index,因为只有256个,所以两个ternary-raster-op之需要两个byte。终于证明了我的想法!的确是用index的!!!#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore)) )取决于你的sprite是白底还是黑底,你的mask-bitmap的op也要相对应地调整。读了一早上,又看了一个网上的例子才开始明白一点,很关键的一个常识我本来不理解就是关于monochrome的foreground,background的概念,原来从color-bitmap转为monochrome-bitmap的时候你只要设定一个bkcolor就行了,现在想一下很简单,但当初我却没有转过弯来,还打算自己去对pixel操作过滤写一遍,哈哈省了很多事情,所以,所谓的foreground就是“非”background呀!什么是background?你制定一个background-color不就行了?这么简单的道理我却理解了半天。这的确是一个学习gdi的必经过程人人都会问这个问题,我如果现在不问以后就被人笑话了,真是又一个old new story。另一个小小的笑话是CreateBitmap的最后bit指针给NULL的时候我看到的是content undefined,这没有什么错啊!没初始化不行吗?我怎么一开始理解成“结果”undefined!真是莫名其妙!

0=FOREGROUND,1=BACKGROUND这个是monochrome的定义。我对于maskblt的理解完全不对,这个foreground,background完全是一个逻辑的定义,根本没有什么foreground,background,所以可以理解为两组ternary-raster-op定义在一起,执行时候依照monochrome-bitmap的指示来行使!这里碰巧0定义为background-op,1定义为foreground-op这和以上的monochrome毫无关系,但是非常的confusing&misleading。

GetDIBits比较智能返回的bitmapinfo能填充colorinuse,我一开始不明白怎么回事呢。不过我花了很多时间也没有成功制作monochrome的bitmap可能是哪里出了错吧?我感觉肚子还是先填饱了再说吧,因为这很可能不是简单的错误。

出去转了一下明白了一个道理,我的一个工程里面的“参数自动补全”的功能不能用,但是普通自定义函数却可以,因为这是从我的笔记本拷贝过来的,project的include路径和我的台式机不一样,所以我感大胆的断言vc6的这些神奇功能就是简单的函数名字比对而已,当然这是尽人皆知的事实今天又被我当作old-new-story说了一遍。(试验了一下心里有些恐慌,因为include路径之类的是按照系统的,不过我还是怀疑project文件或者opt之类的有问题,就删除了重做就好了,枉费我半天功夫怀疑杀毒软件的问题,当然sympatico的杀毒软件是中安装不成功我也没有办法。)早晨bell的技术员来了解决了大问题,昨天晚上我回来的时候发现internet还是不行,结果打电话给技术支持,我突然试验了一下把电话和电脑的电话现在一个splitter上对换就好了,打电话给那个印度的技术支持她胡说八道什么splitter有类似分频的功能我对于那个小得不能再小的splitter表示深切的怀疑怎么看都不享有芯片在里面就算线圈作分频也不像,但是也不能反驳,因为internet不通电话通实在无法解释。今天早上这个小伙子才揭开了谜团,加拿大的技术支持就是训练有素,原来是电话接入的fusebox的fuse有损伤导致带宽减少,他还特地给我画了一张图来示意,电话占用一小半,internet信号占用一大半,但是除此之外还有很大一块用作同步信号,很可能使我的线路正好同步信号损失了,所以电话没事,internet时通时不通,而且就算给我再多的带宽都没有用。

去古巴差不多就是十天,正好可以凑一个《十日谈》

晚上吃晚饭我亲自走路回家,结果又一次迷路了,从前我告诉某人我经常在城里转的迷路,别人总是不太相信因为我自己也觉得难以置信,可是左后看到我歧视和正常的行走路线只有一步之遥,而就是这一步之遥是的平常走半个小时却让我走了两三个小时。雪不停地下,大地很温暖,走在松软的雪地上很舒服,在这样的夜晚散布实在是一种享受,古巴的夜晚是热带风情的撩拨,蒙特利尔确实雪夜的温情脉脉。雪不停地下,我不停地走,丝毫没有迷路带来的沮丧,仿佛这是一种有意的安排。人的一生的道路经常在迷失与寻找,所谓的正确与错误往往都是一步之遥,但是这一步之遥又往往有着难以想象的巨大差别。再看一边《the last samurai》照样充满了激情,作为真正的武士从来都不恐惧死亡甚至有时候期待着死亡,因为爱森豪威尔说只有不惧怕死亡的士兵才有资格活下去。小时候我很喜欢三国里的计谋,但是中国古代过多的所谓谋略现在却让我越来越反思,战争归根结底是实力的较量,谋略大多数时候是在不对称的实力较量中的弱者最需要的,如果能够依靠实力对比有时候谋略都是多余的,而过分地追求谋略智慧让人放弃实力的追求,这是我的看法。中国和日本何其的相像,同样的明治维新同样的戊戌变法,同样有日本的武士阶层维护皇权义和团保皇帝,为什么结局是这么的不同?为什么这么多人都没有说出一个原因呢?know your enemy!孙吴子说的却从来不为很多人所真正理解,因为只有首先尊重你的敌人你才有可能了解你的敌人,中国是否真正尊重过作为对手的日本?玛克辛机关枪是一个时代的终结,冷兵器时代的终结,这在第一次世界大战中得到了最充分的阐述。女演员叫做koyuki,可能叫做小雪是个女模特。

十二月二十八日 今天天气很好吗?蒙特利尔哪里有什么阳光啊?

差不多浪费了我一个上午!第一个混蛋不知道是我自己的错还是网络上的那些所谓的demo的老问题,基本上你看别人的例子如果你对于那个topic一无所知你就等着吃苦头吧,从color位图生成monochrome位图本来很简单就是把color-bitmap作为源的dc的bitmap,把monochrome-bitmap作为目的dc的bitmap,但是你要设定一个background-color,你认为这个设定是给源的还是给目的的?99%的人应该选择源,可我偏偏认为是目的dc,(不过我非常相信是我看到那个混蛋的例子是这么写的。难道我的记忆里这么差了?)当然如果只有这一个小问题我大概最多画上一个小时就能找到原因,可是还有另一个问题是关于getDIBits的问题,我想把这个单色位图存成文件看看对不对,结果让我百思不得其解的就是怎么存都是黑漆漆一片,而这个存储bitmap的程序是我从msdn拷贝下来的,我也仔细看过觉得没有什么问题,然后我有仔仔细细跟踪发现内存中的位图数据从getDibits读出来的也没有错,bitmap文件的各项都对但是为什么文件不能正确显示呢?后来找了许久才发现所谓文件的单色位图是必须要两个color的,就是rgbquad必须有,但是GetDibits却把它填充为零了,这一点昨天我就注意到了,但是当时我因为相信微软就像当然得认为monochrome的位图应该都是黑白两色所以当然color-table是有些多余了,这在制作透明色的位图来说是对的,可是对于文件位图就不对了,我猜想这个应该算是一个小小的bug,或者至少是一个设计上的问题,我能够理解从color-bitmap转成monochrome-bitmap时候仅仅由backgroundcolor,foregroundcolor是所有其他color,这个时候设定两个RGBQUAD表达两个颜色很无意义,但是作为GetDiBits这么做是有些画蛇添足地修改color-used,总之这实在是一个非常龌龊的问题,我为此耗费了整整一个早上了!本来我应该花大部分时间检验那个monochrome的与或非的操作(我看到仿佛有好几个不同的组合。)可是。。。还有一个我一直在心里骂娘的就是微软的那个bitmapinfo的超级傻逼结构,bmiColors被定义成了RGBQUAD[1]你到底想要怎样?在内存里我自己怎么动态分配内存?村成文件时候你要我用你这个size来村再把colortable-1个RGBQUAD来存?我知道这种不定长度结构很麻烦,可是你要么就只定义BITMAPINFOHEADER就好了何必多此一举?这个结构究竟有什么存在的必要?到底谁要用它?除非是很早以前有了大的改变这个实在是让人难以理解的东西。

pattern-brush不是一个非常好的选择,因为类似于texture-mapping一样如果你的bitmap太小就会复制,所以我没有用ternary,只是用了两次bitblt,mask->dc(srcand);bitmap->dc(srcpaint=sdo)这是因为我的bitmap已经用黑色作底色,制作的mask是sprite为黑色,周围为白色,bitmap->mask(srccopy),这是因为我选择“黑色”作背景色,那么monochrome的背景色是1,结果看到的颜色就是白色了,是不是非常的confusing?我是这么干觉得,要想一下才知道。美军的空地配合几乎到了完美的地步,在半个世纪前的朝鲜战争离空中支援就敢于在地面部队不足百米的地方投弹,现在我看到的一个战例更加的疯狂,这一次是特种部队空降到伊拉克后防备伊拉克的大量地面部队进攻,空军的f16结果用专门对付坦克的集束炸弹来支援,这是迫不得已,但是在地面的引导下一次次地接近阵地前投弹最后一次大概是在阵地前三十米左右,这是非常的可怕得因为这种集束炸弹不是精确制导简直是天女散花而且是设计穿透坦克定装甲的步兵多在战壕里也没有用,完全是dangerous close。这样的部队训练水平是非常得高的,我看到的这些我猜想都是在美军国内训练营里真实地模拟前方实战的,非常的真实,有些无线电对话则是当时的录音。还有大量的巷战非常的真实!这样地部队绝对绝对不是世界上人和其他国家的部队可以相提并论的!我想美国人其实也是很怕中国军队的少壮派的,怕的是什么?怕的是中国军队固步自封,夜郎自大不了解美军的强大贸然开战,这样的例子不计其数,二战中日军其实从国立来看是绝对不应该和美军开战,但是因为日本陆军大都是狂热的土包子积极主张开战,海军占少数不得已只好同意,实际上美军最需要的是不战而胜,可惜世界上很多不自量力的并不真正了解美军的强大。军队的强大不仅仅是武器装备,更重要的是训练,尤其是实战的训练,很多国内的军事专家并不真正了解这一点,美国人相比之下更加深刻的体会到毛泽东的名言,决定战争的最重要因素不是武器而是人,这里说的就是军队的训练与实战的洗礼,用士兵的话来说就是打起仗来基本上都是靠本能了因为那样紧张混乱的情况下士兵根本就没有可能冷静思考,平常的训练完全就体现出来了。相比之下,我想说PLA的训练是一个什么样子我不是很清楚,但是我知道中国军队里的假大空是出了名的,基本上参军的都是农村山区里没出路的,上军校的人基本上不像当兵,合肥炮兵学院的暴乱就是最好的证明,下级军官是统御士兵的关键,而全世界任何正规的军队都知道节制下级军官有多么重要,可是一个堂堂军事学院却闹到学校当局无法控制局面这样的军官素质是可想而知的,这样的军队比八旗兵能强到哪里去就是一个大问号,PLA长期没有意识到部队经商的损害有多大,现在就可以知道打起仗来伤亡就不只是对越自卫还击的每天平均四千人的水平了。我衷心地希望PLA能够真正了解美军的实力不要贸然和美军冲突。

十二月二十九日 今天天气很好吗?蒙特利尔哪里有什么阳光啊?

这一件事情让我百思不得其解,dc的brush我在创建的时候用selectobject设定了,结果好像完全没有用,每次timer事件或者说所有情况下都要再次selectobject系统总是用一个默认的0x1900010的我猜想是white-brush的替代。实在是不懂。

恐怖与色情永远是加拿大电影的主题。看一部电影是否是加拿大出品有以下几个特征可以依据:1。是否是恐怖片比如妖怪吸血鬼等等。2。是否是有若干脱衣女星当然这一点不太准因为没全世界的片子都可能。3。电视里是否有冰球比赛。4。是否有强烈的环保意识比如在湖里面扔个石头就有人跑过来说你有没有执照是否意识到干扰“inhabitant”,这里指的是鱼。5。是否有着强烈的保护少数族裔原住民情绪,比如有一大堆的印第安人的所谓文化的崇拜。6。电影的主体是否是女人和孩子的直觉超过科学家的逻辑思考,或者印第安人的巫术比计算机程序处理的电子设备更可靠。

每次看《kingkong》我都觉得非常得ridiculous,究竟导演想要说明什么?为什么一个二十几英尺高的怪物会对一个女人着迷?不同的物种之间的吸引力最多就是宠物的感觉,那么这个大猩猩为什么会为了一个宠物牺牲自己的生命?母猩猩对他的吸引力会超过一个比她小很多倍的白色洋娃娃吗?

十二月三十一日 今天天气很好吗?下雪了

在创建monochrome-bitmap的时候设定settextcolor是毫无用途的,只有setbkcolor有用,取决于你的bitmap的背景颜色,一般大家不习惯用黑色作背景,大都是用白色,所以你还要把它变成黑色背景的,这个使用sdx就是SRCINVERT,我已开始还想着用SDna,这里的S是我的monochrome-bitmap就是sprite为0,背景为1的,对于这个结果我还是不能正确的解读,因为它变黑色了。glReadPixel里面如果要读bgr顺序的话,那个常数是GL_BGR_EXT,我以前不知道从哪里得出的结论是这个不需要extension的支持,这是错的。创建bitmap并不代表你已经可以用bitmap结构的bits给他赋予位图,而仅仅是分配内存之类的,所以与其用createbitmapindirect不如用createcompatiblebitmap因为是用dc省掉了很多难以想象的错误,我反正用后者就成功调用setdibits而前者就不行,可能是bitmapinfo这个白吃结构有什么问题吧?

月一日 今天天气很好吗?下雪了

《runaway bride》实在是一部有趣的电影,我在想象我参加过的婚礼多少都是有些恐惧的,实在可以说是人生中最折磨人的时刻,不过话说回来了,作为逃跑新娘这个社会多少是会宽容的,会把你当作冲破包办婚姻的新女性主义者或者是勇敢寻找自己理想的强者,对于逃跑新郎我只看到一两个,grant在《four wedding,one funeral》里面挨了结结实实的一记重拳,我觉得这是最轻的惩罚,大概新娘的娘家兄弟来的不多否则一定会让他来个终生残废之类的,因为女人的婚礼在传统上仿佛就是超市买来的物品开了封就不好退货了,(这当然是中国的传统,这里在北美好一些,只要你保留了包装与发票在规定时间内退货是可以的,)电影里的三个逃跑新娘的准新郎其实遭遇都还不错,因为他们最多被社会笑话笑话甚至还当作是同情对象,当然这是当那个新娘养成了婚礼上逃跑的习惯之后社会才认可新郎是受害者,所以第一个新郎是最难当的因为人们会有对他有最多的猜测,随后的新郎一个个都会越来越受到社会的同情甚至敬仰因为他们勇敢敢于挑战别人不敢或者不愿承担的责任与危险,去和这个被男主角,一个专栏作家,所称作的“man-eater”在教堂的婚礼现场决战,看谁更能忍受那种折磨看谁先逃走。我在国内好像参加过不下二三十场的婚礼,每次对我都是一种折磨,第一婚宴总是很晚才开始,我总是饥肠辘辘,所以后来每次参加婚礼我都要先吃一顿,第二婚礼仪式实在是千篇一律你有没有那种看电视台白吃主持人将非常白吃的话有吭哧吭哧将不出来你恨不得跳上去帮他讲出来的感觉?每次看听这样的场面对于一个头脑正常的我都是一次精神上的折磨,你可以想象在中国当共产党的官员都是多么的经得起折磨因为那些冗长弱智的讲话你要天天经受着模拟的神经是多么多么多么的坚强,我只有这个时候才理解共产党官员为什么总喜欢用酒精麻醉自己这样的工作一点都不必再“中美合作所渣滓洞集中营”李寿严刑拷打来得轻松,精神上的折磨一定是更加的残酷。第三让我很感到embarrassing的是中国的婚礼的目的意义,原本我猜想一定是在原是部族群婚社会里突然宣告说你众多的性伙伴里面对于男女成员各自减少了一个(那个时代同性恋还不时兴吧?因为这个东西对于增加人口没帮助社会不鼓励),为了让大家不至于搞错认清一下他们的面孔省得上错床引起不必要的部族内冲突,那么把大家召集来看一看新郎新娘的面孔,(为什么是熟人朋友?因为这些人都是新娘新郎潜在的或者是曾经的伙伴嘛。)渐渐德在原始社会的末期按照恩格斯的说法部族长老开始监守自盗利用职权把部族公有财产留给自己的子女于是私有财产出现了,婚礼成为显示私有财产多寡的一个时机,再接下去私有财产的清单里包含了老婆的多少,于是举行几次婚礼就代表你有多少私有财产的一个标志了。同样的,中国现代婚礼多少也是一个社会地位与私有财产的展示会,新娘的相貌也是要折合成一定的人民币计入新郎的家产的一部分的,同样作为拥有傲人身姿相貌的新娘野心欣然为自己代表的水涨船高的社会标底物而感到高人一筹,这是非常自然的嘛,五六十年代在中国去一个漂亮的老婆大概说明你家里可能有所谓的自行车收音机之类的“三转一响”,大概八十年代是彩电冰箱摩托车吧,因为按照马克思的劳动价值时间理论女人的价值也在增加,到了九十年代和今天大概没有价值百万的住宅美女是不会承认你在社会的位置的,同样的那个婚礼也自然不会发生。在今天我想婚礼当初那种“昭告天下”男女伙伴“不要再和我上床”的意义越来越次要,而其社会地位的昭示作用越来越重要,电影里的女主角在解释她为什么从婚礼上逃跑的一个原因时候说,她感到害怕因为她为每个准新郎改变她自己包括她吃什么类型的煎蛋,所以在婚礼进行曲中向那个她为之而改变一切的男人走过去的时候感到惊慌失措,因为她差不多convince了那个男人她是什么样的女人而实际上她并不是,这就是大多数婚姻的实质,所谓“与敌同眠”因为你有一晚上半夜惊醒发现身旁睡着一个陌生人,两个人都围了对方而作了适当的隐藏与改变只为了走进教堂然后在真实的家庭生活中摘下面具显露赤裸裸的另一面,很多人只是在祈祷“假面舞会”结束的时候自己与对方的心理承受力不至于支撑不住家庭的重负。朱丽亚罗伯茨和 理查基尔的电影往往有很多小资倾向基本上是给社会的intellectual看的,很多劳动阶层对于其中的电影对白可能有理解的困难,揭示的问题和橄榄球爆米花时装八卦新闻有一定的距离,里面有一段比较精彩的告白,凭着我很差的记忆里 复述如下,I can guarantee it will have hard time, I can guarantee there will be a time when one or both of us want to get this out, but I can also guarantee that if I don't make a choice now I will regret it for all my life.话虽然是好话,但是你怎么知道你会后悔?我要原本早上要做一个sprite结果看了这部电影什么都没做,真是耽误事啊。

制作sprite是不能用jpg的,因为去背景色的时候会失真,骗得过眼睛却骗不过程序,只能用bitmap这实在是很头痛的事情,也许这就是为什么wesnoth用的是png的原因吧,据说这个是lossless的,可是微软的那个libpng.dll去哪里找libpng.lib呢,当然我可以采用png.org的源码去编译新的lib可是如果操作系统有的我就不要再分发那不是更好吗?微软对于开发还是很讨厌的一件事。头疼啊。此外看那个png的library实在是很麻烦,我有过看ijl的经历还是很头疼似乎更加的复杂吧?png比jpg更复杂对吗?终于在我的旧电脑里面找到了我曾经编译过的wesnoth的工程。 我想用ternary-raster-operation来画一个silhouette可是我的头脑好像浆糊一样,对于黑白两色和前景背景亮色我每次都要画一下真值表,在古巴的时候我干脆用一个256的循环把所有的可能性都试一遍,我觉得我现在是太懒了,懒得想问题宁可华裔两个小时写一个很傻的程序也不愿花几分钟去想一想。

月二日 今天天气很好吗? 好不容易出太阳了

关于ternary-raster-operation你要把所谓的post-fix想象成是一种stack来存放操作赋予操作元,比如SRCERASE=SDna那么你在wingdi.h的注解就可以看到dest=source AND (NOT dest)我一开始理解错了以为有两个独立的栈,一个operator,一个operand,就是简单的operator压栈,operand压栈,然后两个同时出栈,其实不是的,而是一个共同的栈,类似于nested的挂号式的顺序,就是压栈顺序为SDna然后出栈的时候operator取决于一元还是二元,比如a是二元,那么必须Hold住,等待下一个operator n,这个是一元的等待immediate operand,就是D,那么结果作为a的一个operand,等待下一个operand就是S。(我这里被微软的程序员耍了一下,猛一看NOTSRCERASE=DSon,我瞄了一眼wingdi.h发现是这样dest = (NOT src) AND (NOT dest)顿时紧张起来以为自己理解上有很大的偏差,结果你也知道,TNND为什么弄这种玩笑?直接写NOT(src OR dest)会很难吗?难道DSon这样不直观吗?我的方法画silhuette不能适应所有的形状。

月三日 今天天气很好吗? 冷死了!

花了一天时间企图编译<wesnoth〉结果运行期有一个错误,追踪了很久不得不放弃,1.3版本以后据说用了booster更加的麻烦,看样子将来只有尝试linux下编译了,我觉得可能是自愿文件的问题吧?有一个image error,但是跟踪一次要十几分钟编译一次也要十几分钟我实在是无能为力了,运行的时候要设成window模式-w才能跟踪。今天学到两个小算法。

我觉得美国人是天生的战士,因为在西部拓荒时代人人都持枪。《the quick and the dead》

月五日 今天天气很好吗? 有些冷!窗前屋檐下的积雪融化又结成冰柱掉了下来

M的damage-control应该是对的,这是我做不到的,有一小会儿我认为sort-first有得天独厚的优势sort-last因为无法解决透明物体的问题实际上没有什么大用,但是睡了一觉醒来我才意识到M以前跟我说的,最后sort-first还要回到sort-last,所谓的hybrid实际上最后还是要用sort-last来解决loading-balance的问题,那么如果sort-last不能解决transparency的问题那么整个parallel-rendering就都没有什么意义了,而且在回过头来想想看sort-last只有在90年代才有意义,或者很小的数据要很大的屏幕的时候才有大用,因为你要是一个一个primitive的检验坐标是不可能的,如果用hierarchical的idea比如octree之类的spacial结构最终会有一个时候多个结构都落在多个屏幕分区上,那么这个数量会导致增加rendering node的努力失败,所以sort-first才真的是有scalability的问题。所谓opensg,我以为就是一个distributed scene graph,没有什么大的并行的方案,chromium不过是一个distributed opengl的版本,就是app不用重编译就能进行MDSI这类并行的效果,typically sort-first。那么刚刚兴起的所谓equalizer是个什么咚咚呢?我以为也不过是一个儿童玩具,大概就是对于单机多gpu用多线程来做并行渲染,对于cluster他不过是实现最最原始的sort-frist,sort-last的简单功能,大概是用配置文件和回调函数(对象继承的函数重载),反正pixel-merge居然是用的direct-send这种O(n)的玩意,可见是给初学者玩玩新鲜的幌子。

一月六日 今天天气很好吗?有些冷!窗前屋檐下的积雪融化又结成冰柱掉了下来

GetWindowInfo可以获得所有window相关信息。TNND这个是win2k的东西,又不行。你可以在WM_GETMINMAXINFO里面修改default的max-size但是不能超越GetSystemMetrics里面设定的系统值,总之,超过系统最大resolution的windows是不存在的因为没有意义。我觉得这条路不通。 真后悔没有保存一个版本下在我在被一个奇怪的现象所折磨!TNND,那个叫做GetWindowRect。最让人恼火的就是由一些基本的东西我想找人问一下都没有,这就是孤独。为什么我的bitblt画的不是clientarea呢?好像把整个window包括caption都在画?为什么???

默认的应该都是window的左上角,所以如果你要映射clientarea,最好用setwindowOrgex把那个坐标系移动一下吧?(还没有试验,应该是对的吧。)OffsetViewportOrgEx应该也可以吧?不用了,傻瓜,用clientToScreen,screenToClient转换就可以了,当然我还没有试验bitblt,应该也可以吧?证实了!TNND使用GDI还真的是有一点点地挑战,因为你要takecare的东西真的不少,但是我相信我这样做是最正确地因为相对于API来说所有的建立在这之上的骗傻瓜的玩意一定更加的复杂,也许初看起来使用容易实际上他们要记忆的东西一定比api来得多因为api都是按照最精简的设计的。(windows除外,这帮混蛋简直是毫无计划的乱输出一通API,明明一条路可以的非要有多种可能性!怎么想的?什么叫做canonical?学过没有?)

<Keeping Mum>是一部典型的英国式的黑色幽默或者说黑色喜剧,大概一部家庭生活剧很少会有人会把它跟serial-killer联系起来,尤其是这个killer是一个六七十岁的面容慈祥的老奶奶,老奶奶年轻的时候和女儿失散了,丈夫大概是和别的女人偷情所以被她除掉了,后来大概看见不平的事情就喜欢用这样类似的极端手段解决,关在监狱里几十年终于释放出来了就悄悄地跑到女儿家里做官家,女儿的生活可以说是一塌糊涂,丈夫是神父(mr.bean)生活刻板不会套女人的欢心,一心一意传递上帝的福音,儿子在学校里总收到坏孩子欺负,女儿大概不停地交那些很糟糕的男朋友,在这种情况下女主人偷偷地和一个美国人就是她的高尔夫教练偷情,老奶奶看在心里奇在心头,不动声色地悄悄剪断那些在学校里欺负小外孙的坏孩子的自行车刹车,当然这些小孩子都从悬崖上掉下去或者在公路上摔得半死,老奶奶然后又把那个高尔夫教练除掉了,因为他偷偷来接老奶奶的女儿去墨西哥独家寻欢,当然老奶奶顺便也把讨厌的邻居杀掉了连同他讨人嫌的狗。老奶奶除了平抽空杀人还引导古板的女婿在不到时候讲一些宗教笑话鼓励他多和女儿过过性生活,慢慢地这个家庭从破碎的边缘被拯救回来了,但是老奶奶杀的人太多了被女儿孙女发现了只好吐露实情,当然已开始她们很难接受老奶奶这种爱的方式,老奶奶只好离开顺便把想要告发的另一个讨厌的邻居杀了,不过这一次仅仅用煎盘吓唬了一下那个讨厌的老太婆就心脏病复发吓死了。那么多尸体都沉到池塘里自然要长青苔水草之类,结果老奶奶走后又花草公司来要清干池塘消除水草,老奶奶的女儿在妈妈的教导下也学会了一不做二不休把那两个清水塘的干掉了沉到了水塘里喝一大队尸体作伴了。神父在一系列的实践中都蒙在鼓里,但是它深刻地感觉到了自己的生活在一天天地好起来,于是写了一片布道词到基督教大会上宣讲,题目就是《God's Mysterious Ways》,应用圣经的话就是My way is not your way,对上帝的所谓最好不要多去质问,享用上帝的mysterious way就好了。这就是英国式的黑色幽默,这一类的代表自然就是著名的电影《一条叫做旺达的鱼》。

昨天晚上的片子也很有意思《Art School Confidential》,这是对于所有欣赏西方现代艺术的人的一个入门电影,有不少儿童不宜的内容,同时你看了一定会哈哈大笑不止的,这就是现代艺术,你如果是在那个顶尖上你就可以肆无忌惮的做一个asshole,其他在下面的人你能做的就是cocksucking。粗鲁归粗鲁但是却是实情,大概一个卧底的警察完全的儿童涂鸦被当作了艺术作品,西方大学里种中学生教授最丑恶的东西你都看得到。

一月七日 今天天气很好吗? 天气难以想象的暖和!

终于折磨到了一个头,世界的复杂就在于你犯的错误往往不是一个,问题的解决的困难也在于你需要把多个混合的错误一一解决,在大多数人眼里世界之所以神秘在于你认为你改掉了你认识中的错误世界应当拨云见物显露原来的面目,可实际上还有第二个第三个的错误迷惑你的眼睛,但是有时候一个白痴也有上佳的运气用一个完全错误地揭示碰巧在一个绝无仅有的机会上错搓得正,但是你可以靠运气成功一次,你不能一辈子靠运气,所以最终的道路还是要回到老老实实的探索与学习中。这一次是两个方面的问题混合在一起,首先GDI有一点点状态机的味道,当然只能说味道,很多时候系统作了一件事就又把状态复原了,而你从他现有的状态你并不能知道系统是怎么做的,而微软往往又不愿意告诉你,或者说不知道你原来不知道却想要知道,(废话)。其次,我对于一个window的组成总是概念模糊,你我以为caption-title是天生就有的?我以为menu是自然而然就画出来的?client-area在没有caption和没有menu的情况下肯定是不同的,对于程序员来说操心这个实在太麻烦了,所以所有的坐标都尽量让你用以clientarea左上角为原点的的坐标,可是window的backgroundbrush当初并不知道你的clientarea有多大,所以默认的bkbrush(注意不是hdc的brush这是不同的)当然还是从window左上角为原点,于是每次系统帮你做清洁的时候都回SetBrushOrgEx把这个brush平移到clientarea的原点,所以,我们看到你load进来的bitmap之类的图示正确显示在clientarea的(如果你设定他为backgroundbrush的话,你曾经想过为什么caption没有把它的顶部截掉呢?至少我没有想过,认为这都是理所当然的,以为天生的。)。再次,我一直怀疑有一个潜在的可能出错的地方,我获得了hdc的时候忘记releaseDC是否会对我下一次获得起影响?我现在还不知道这是不是原因,但是凭直觉我觉得这应该是针对多线程同步的作用的那种lock,应该对我现在没有影响吧?总而言之,GDI其实很简单,一句话你想干什么都可以,这就是我想追求的,而使用任何封装的高级的工具给我的感觉就是在别人预设好的圈子里打转转让我有一种说不出的郁闷感。

TransparentBlt是win2k的,所以应该只有一条路没有选择。

一月八日 今天天气很好吗? 你知道今年的冬天有多么暖和吗?积雪都融化了。

看美国的大选实在是让人羡慕,美国真是人才济济,主要是一个好的制度能够让人才脱颖而出,这就是美国长盛不衰的秘密,一个众人皆知却没有几个国家能够做得到的,民主制度在于能够举贤。我原本一向看好希拉里,可是这次奥巴马脱颖而出找是让我吃了一惊,美国不论是他们两个谁当选都代表了一个change,第一个黑人总统还是第一个女总统,这都是一个巨大的进步,想想看美国普通人心目中已经不再由种族肤色性别的概念就知道人们注重的是人的能力,而今天中国的政治仅仅从以前的老人正值走出来还徘徊在黑箱密室操作的阶段,人们选择领导人只能揣摩上意,完全没有什么人才的竞争机制,或者说他们竞争的只是密室斗争的能力,这是国家的不幸人民的不幸。顺便说一下,奥巴马毕竟年轻演讲要强过希拉里,希拉里的演讲鼓动性和文采记忆力都比奥巴马差不少,而且谢谢家人的时候绝口不提他的老公,可能还在为他今天的讲话生气,毕竟攻击性太强的言论不太好吧。

昨天发现原来《yes,prime minister》原来还有一个姐妹篇《yes,minister》,只好动用巨资在购买这个DVD,不过这个非常值得,预算委员会决定再怎么节衣缩食都要买。

一月九日 今天天气很好吗? 风很大。

看英阿马岛战争让人感到热血沸腾,英国在极端困难的情况下打赢了这场战争维护了大英帝国的尊严与荣誉,让英国人为之一振有了信心从衰退中走出来,今天英国的人均生产毛额差不多是超过了美国大概在欧洲排前列,这场战争的胜负应该是有着重大的作用,试想如果英国打输了,今天的英国会怎样? 人生的最大享受就是躲在被窝里在一个风高夜黑的冬天的晚上看《yes,prime minister》,同时等待着<yes, minister〉的到来,同时品尝法国红葡萄酒。

一月十二日 今天天气很好吗? 还好吧。

终于我知道了battle-for-wesnoth运行期的问题,不是什么资源文件的问题,(虽然我还是看到了错误信息却找不到。)是一个coding的错误,大概1.17版问题还比较多吧,同步的问题就很多,alex还提到说文件存储时候不是存当前状态而是存全部。有一个unit_animation的基类,派生出很多子类,然后code用dynamic_cast把基类强 制转换为子类,你想msdn里面关于c++的说明是运行期检查类型信息这种错误抛出异常,这就是问题,我不知道这个版本的window版编译肯定是被改动过,或者他们用的是vc200x之类的编译起比较聪明?总之今天费了我快一个小时才找到这个小错误很高兴!同时在constructor前的explicit局msdn解说是对于多个参数的constructor是meaningless因为不存在convertion-constructor的问题,我对此将信将疑,总之,我想gcc和vc6有很大的不同,非常的烦人。(据说在这一点上vc6编译速度胜过gcc,没有比较不敢说。)这两天一口气把<yes,minister〉都看完了现在开始反复看,其中的妙语连珠真是难以尽数,相比之下,日本的<别了,首相>感觉要捎差一点,毕竟文化的积淀还差不少,其中最后的部分恰好和<yes,minister〉开头部分不谋而合,一个新官上任的新首相总是哇哩哇啦将一同改革民主进步的措施,然后那些资深老练的公务员就微笑地告诉你说这些政策早已在执行了,哈哈这个下马威着实得厉害。

我个人觉得boost简直就是一团糟,里面定义了一大队的宏,居然硬要我使用lib,我找了半天才找到#pragma comment的lib定义,结果又有一大队问题,它倚赖zlib但是又把zlib改了什么,烦死了。我个人觉得这种开源大概没有什么人工作在windows平台上,所以人人都是些自以为是的傲慢的家伙。

一月十四日 今天天气很好吗? 还好吧。

另一个问题我搞错了,explicit对于constructor的修饰问题是conversion-constructor,并不是什么参数的conversion。比如A的constructor只带一个float的参数,那么你再用赋值A a=0.5的时候就会调用conversion constructor,如果你声明constructor用explicit的话就禁止了conversion。有意思的事如果你声明了两个constructor:explicit Conversion(long double f){} Conversion(int i){}然后你这么调用const long double l=4; Conversion con=l;你认为哪一个constructor会调用呢?当然是那个可能conversion的constructor就是参数是integer的那个。这里是关于type-cast的总结

一月十五日 今天天气很好吗? 挺好的。

GDI的一个真理就是永远都按照状态机的方式来处理事件,每次都保存原来状态最后在恢复,比如画背景的时候也还是要考虑clientarea和screen的作别变换,虽然重复但是省掉了很多麻烦。画hexagon网格最好的办法是用循环画polygon。

我现在明白美军在伊拉克的部队加装薄装甲的原因了,RPG是一种射流武器就是说它能够穿透很厚的装甲,早期的非反应装甲不是他的对手,因为你增加装甲厚度赶不上RPG的威力这样不合算,但是这类武器有一个致命的缺点就是它只能在极短的距离起作用,比如在装甲表面爆炸产生的金属射流才具有穿透力,因此装甲车之类的薄装甲车辆有一个简单的应对办法,在装甲外面再加一个保护网让RPG在穿透防护网的时候爆炸,这有一点点原始的反应装甲味道,但是简单有效,所以悍马之类的薄装甲车辆也可以防御RPG了。

关于clienttoscreen我还是弄错了,这个坐标是针对全屏幕的,所以要知道clientarea的原点offset,我只能用嘴笨的办法把窗口的原点和这个clientarea的原点求差值,这个办法实在是泰国尴尬了,但是有更好的办法吗?所以就是getwindowrect和clienttoscreen结合起来求差。

一月十六日 今天天气很好吗?很好,今年的冬天非常的暖和,经常都是零下五度以上。

通过getwindowrect,clienttoscreen的综合得到clientarea的左上角坐标x实际上是边框的宽度,所以如果要完整显示图片宽度加上两倍x,高度加上一倍x。设定SetwindowPos如果用SWP_SHOWWINDOW实际上是发一个消息,因此你必须在这个函数调用前用setclasslong设定backgroundbrush。gdi里面有一系列的坐标变换可以尝试一下。

在诺曼底登陆的前夜,盟军的总指挥艾森豪威尔预先写下了一封登陆失败的辞职信,其实这样大规模的两栖登陆作战成败往往在伯仲之间,当时盟军哪怕掌握的完全的制空制海权登陆作战仍旧面临着很大的失败的危险,隆美尔和当时另一位指挥官好像是曼施泰因对于装甲部队的使用上有着很大的分歧,隆美尔主张在登陆的那一刻就要用优势的装甲部队把盟军赶下海去,曼施泰因则主张装甲部队靠后部署作为防守反击来使用,这样的分歧在日军防御硫磺岛的时候也发生过,就是在盟军这样强大的海空力量下有多大把握打赢反登陆的问题,所以你可以看作是乐观主义和保守主义之争,在那样的情况下反登陆时要取得全胜还是拖延等待援军或者给敌人于最大限度打击的问题,希特勒过于相信从东线调集部队的机动力了,当然那个时候德军捉襟见肘这也是不得已的办法。在硫磺岛防御的目的成为拖延因为在内无粮草外无救兵的情况下胜利是不可能的,唯一能做的事让登陆方付出最大的时间与伤亡代价,那么按照同样的思想曼施泰因的想法就是固守待援,隆美尔则更加的富于赌博心理,结果希特勒最终来了一个折中,一部分坦克部队靠前一部分坦克部队靠后,这实在是最大的问题,两种策略实际上都不能够贯彻,更糟糕的是希特勒开始嗅到他的将军们正企图把他搞下台,在诺曼底登陆的一个月后就发生了那次著名的炸弹暗杀行动,所以当时希特勒坚决不把装甲部队的指挥权交给隆美尔而是一定要等到登陆开始是有原因的,但是这正好更加映证了德国的将军们开始认为希特勒成为他们夺取胜利的绊脚石,到底孰因孰果实在是一个很难评价的事情。总之盟军的成功是建立在巨大的优势前提下,德军的失败并非完全是因为指挥的无能,人力有时有穷奇迹岂能常有?

一月十八日 今天天气很好吗?很好, 但是风很大。

头脑中始终有一些误区,比如dc的brush和bitmap的关系,bitmap是dc的存贮空间,所以select了就可以存了,同时bitmap也是brush的存储空间,可以创建patternbrush,但是归根结底两者并无联系。这正如dc的brush和backgroundbrush一样风马牛不相及。回忆了一下关于hexagon的坐标问题,为什么会导致两个晚上的时间呢?第一是头脑不清楚,第二是问题的复杂。比如有clientarea和windowarea的区别,其次坐标原点在左上的时候直线方程的斜率就和习惯不一样了,然后就是一个白痴的小问题,我为了节省一个变量就自然地把row/2的整数除法结果来使用,就是说row=2或者3的时候应该是一样的,后来忘记了结果变成了row*value/2意义完全不一样了,这是一个教训,不应该这样图省事,多声明一个变量halfRow=row/2要好得多!切记。

《art school confidential》是一部很好的片子,让你想到了小时候看《读者文摘》理解选的外国小说《他是死了还是活着》,所谓的艺术家大都不能在生前得到肯定,所以四个画家抽签决定谁要死去,所谓的死当然是假死,就是向外宣布他死了然后他生前的作品就可以买一个好价钱了,这个从投资的角度看是对的,因为一个人死了自然所有的作品都是绝版了,只能少不能多了,所以价钱就上去了,于是那个抽签的画家就只好一辈子隐姓埋名了,当然钱不回比另外三个少可是不能再“活着了”。电影里面的艺术家也是如此,成了杀人犯关进了监狱就出名了。其中的所谓格言也不错,对于艺术的定义大概是人类的一种本能就是为了吸引交配的一种形式,而所谓的“真正的”艺术家不是那种天天在《时代》杂志露面天天考虑餐后演讲的名人,应该是一日三餐食不果腹天天生活在narcotic moment of creative bliss,当然这些画家为了创作的灵感无所不用其极,酒精毒品女人等等,偶尔地杀几个人也是获得灵感的极好方式。

所有的烦恼都有一个简单的解决办法,那就是SetWindowOrgEx(hdc,-clientLeft,-clientTop)就是说把window的原点设定在clientarea的原点,这省掉了无比多的麻烦。

一月十九日 今天天气很好吗?很好 ,但是风很大。

这就是gdi麻烦的地方,我设定了windoworg,但是随后又被人改了回去,所以这个办法不可靠。同时getBkColor也得到白色即便你已经设定了bkbrush,这是合理的吧,大概就是一个default值。使用TextOut你设定SetTextColor,SetBkColor然后可以使用SetBkMode设定transparent就可以写透明字了,我猜想这个好似rop2的binary-raster的方法一样吧(胡说,应该是使用hollow_brush而已吧。)一个非常简单的概念有耗费了不少时间,如果是做worldtransformation的话,你可以用bitblt,但是设定SetGraphicsMode和SetWorldTransform的时候你是针对destinationDC的,我却“逻辑上”认为是针对sourceDC,到底什么是简单的“逻辑”呢?看来要么我没逻辑,要么全世界都没逻辑,当然是前者了。还有一个逻辑问题,使用getwindowdc获得的dc并不像我想象的仅仅是一个指针或者引用之类的(本质上是kernelobject表里的index),肯定是由某种lock机制,另一方面在强调一下,gdi还是类似于状态机的你针对当前dc的所有操作释放后都失效了,这是好事,但也增加了一下麻烦,比如原本多重图性操作效果可能不一定是叠加的吧?(有点糊涂了)不过bitmap旋转式很好的一件事!只是我必须得给我的sprite传递dc而不是hwnd,因为worldtransform设定是针对当前dc的。让人百思不得其解的是旋转后的bitmap的坐标是怎样的呢?CombineTransform不是很正确,因为他大概就实矩阵相乘所以你自己要设定好矩阵的default值,msdn说的都不算数,比如translate说出edx,edy都不用那肯定是不行的,你必须设定default可是就是这样还是不大对。比如translate+rotate结果却仅仅是translate,可能bitblt还是有些限制吧。这部分非常的糟糕,资料太少。

一月二十日 今天天气很好吗?很好 。

基本常识:一个bitmap如果被一个dc使用就不能再被select了,这是一个我总是在犯的错误,那么有什么bitmap复制的快速方法呢?GetDeviceGammaRamp我猜想适用于校正gamma,应该使用一系列的rgb值来描述颜色变化吧?(什么时候才会有这种应用?艺术家的眼睛?)

超级白吃的问题!我的vc6是n多年前从国内带来的盗版,(这也是我唯一正在使用的盗版软件吧?哈哈)那么为什么很多windowsAPI我的编译器都说没定义呢?这个问题很简单就是版本的问题,在windows.h的宏里面还是WINVER0X0400那当然有问题了!我当年大概还是在用win98的年代就有了这一个盗版吧?这个问题大概是今天使用.net的人不会有的问题,或者vc6应该自己在安装的时候就检测window版本:GetVersionEx来改写那个宏定义,难道是因为盗版的缘故他不敢检验或者删了这一段?(啊,现在才明白,故事还很长,因为那个vc6版本是一个类似于试用版的东西,大概是针对win98之类的,因此不光是头文件,连同lib文件都是一致的,所以简单更改这个是不行的!user32.lib之类的都不全。)关于bitblt的worldtransform有一个问题就是它是以原点为圆心的旋转,所以应该要做两次变换,试验一下吧。刚才玩得有一点点心跳,说来不值一提只不过我从来没有这么做过,所谓编译都不过是.h与.lib的游戏,操作系统当前的dll是可能千变万化的,比如win98,win2k,winxp的dll可能都不同了,那么当时的编译器vc6可能只能适应当时的dll,而是用老版本的.lib.h,那么PLATFORMSDK照理说应该使编译器无关的,可是我觉得微软的platformsdk2003并非如此,可能我还是要做什么样的修正才行,这也是为什么他建议每次运行都要设定环境变量,这个实在是很烦的事情。总之,我目前简单从platformsdk替换了我的vc6的user32.lib,把我的vc6的include的windows.h的winver改为0x500,于是就可以EnumDisplayDevices发现我的显卡有两个display_device,还有一个netmeeting的虚拟的mirror_driver之类的。很好。TranslateBitmapBits看起来很有用的样子,以后试验一下吧。GetDCOrgEx不是我想象的样子,不知道是什么东西,现在有好几个origin我不明白,一个是window的,一个viewport,一个clientarea,从world-->page-->device-->physical这一系列的变换的坐标分别是什么呢?要记住使用float类型的三角函数!!sinf, cosf,这种低级错误!OK,证实了,combinetransform和数学上的定义一样的,你可以定义变换的次序,比如我要让sprite转身,那么你要定义先移回原点在旋转,就是自转,反之为公转,当然我所不知道的事情是bitblt必须是从原点到原点,就是两个dc都是从原点开始,这是我一直出错的原因!!!

一月二十一日 今天天气很好吗?很好 。

CreateColorTransform不是我所想象的用法,完全没有关系。做bitblt的时候使用自身的dc仅仅靠更换bitmap用srccopy是无效的,这个不知道为什么也许是因为自己不能拷贝自己吧?使用createbitmap有一个问题就是微软的bitmap是合别人的不一样的,是上下颠倒的(当然这取决于你怎么看上下的问题),但是从数据的角度看,你是从数组的头获得图像左下角的部分,所以(是这样吗?还是因为window坐标原点在左下上角所以先从左上角画图?)总之,要用createDIBitmap才行。使用GetDIBits能够取出你希望的格式,这个要做为alphablend的数据还要在处理,实在想不出使用jpg的任何好处,为什么大家不使用png?这真是奇怪的事情,也许图性公司内部的确都是使用png之类的,只是我不知道而已。(或者大家早就在使用32bitjpg也是可能的。)哈哈,天大的笑话,我没耐心,读了上句就不想看下一句,大概白吃都会想到不应该所有的alphablending都是perpixel的就是说如果没有alpha-channel也是可以做alphablending的,这就是常识,所以api不可能设计的那么傻,问题是msdn的描述让我感觉很简陋,为什么一定要premultiply alpha呢?仅仅是因为处于系统处理速度的考虑吗?也许是有道理的,如果一个api非常的慢那么很可能根本就不开放,这大概就是原因吧?再重复一遍常识:bit操作不可替代算术操作,尽管有某些算术操作可以用bit操作来实现,比如与零的一系列操作(有意义吗?)这也就是为什么单单使用bitblt始终无法实现某些效果的原因,除非适用alphablend,这个应该是离散数学的问题吧?什么是canonical的operation?也许就是不可替代,(有交集吗?应该没有,也许也有,不过这个是定义的问题,我们可以把一切与零进行的操作不定义为算术运算,而是逻辑运算,于是就没有交集了。)这个让我想起来在古巴度假的日子里我把ternary-raster-operation的256种运算统统尝试了一下,我想知道的是这些定义是否是有某种数学原理,比如这些运算span所有的其他运算通过他们的组合?(不过也许更准确的说这是个无意义的问题,本来就是canonical的运算来组合,只不过这256是目前大家常用的而已。)因此这是个无意义的问题。

这个实在是太初级了,我现在才发现getWindowDC和GetDC的区别,一个是clientarea,我费了很大劲去变来变去原来都是因为这个关系!bitblt最常见的错误是我的width,height不对,实际上能够获得dc得数量很大程度上取决于内存的多少,当然win98/95据说只有5个,因此我的函数迪归调用不断获得dc应该问题不大,当然这种做法应该避免。如果要让sprite研中心旋转,destDC的x=-bmwidth/2,y=-bmheight/2,srcDC的x=y=0;translate的偏移还是从左上角到clientarea的原点,(这一点似乎一开始比较的出乎我的意料但是想一下就明白了,左上角的偏移量),

一月二十二日 今天天气很好吗? 不是吧?

需要纠正一个错误认识,当位图作为brush的时候填充会按照module原则重复,但是bitblt却是严格按照source位图的大小限制,因此当dest比src来的大的画就是相当于nullbrush的空,因此你不能用这个来画一个mirrorimage,只能用xform的transform来使用reflect。(我不知道我从那里得到的这种错误印象,也许是因为我自己一列一列的画得到的印象吧?)我现在刚刚学到region发现我的很多工作可以交给gdi去做,比如我的hexagon如果用createpolygonrgn的话我就不用烦心point是否在hex内的问题了,这个是标准的cg算法,就是数有多少次和boundary相交,这个在scanline里面有两种模式:alternate,winding,一个是boundary无方向,一个有方向,所以,重新改写!!!这就是hex的简单的办法!!!这也就是我怀疑的简单的办法,battleforwesnoth因为要跨平台所以只能自己去写,我粗略看了一下,他的办法不会比我的简单多少,当然他还要返回最近的和次最近的hex,这一点我没有做,不过这个并不复杂,总之这不是什么很复杂的东西,但是很不容易写对,遇到九组组和判断出错的机会非常的大。msdn里面有些是明显的程序员写作风格,忽略细节忘记参数。createcompatibleDC的时候会自带一个默认的1x1的monochrome的bitmap。BeginPaint我现在才开始明白它主要是用来画一个path的,这个很有用,可以做clip。SetWindowRgn就是你所需要的全部!

《The Cat People》是一部老版的同名电影,就是八十年代末重拍的那部片子,1942年代美国的中产阶级生活已经远远超过我们的想象了,生活质量和现在相差无几,不过唯一让人讨厌的事男男女女都抽烟,尤其是在任何地方抽烟。

Region非常的强大!我想我现在才开始接触一些gdi的核心的部分,就是clip,path之类,一条光明的道路在眼前展现 。终于找到了TrackPopupMenuEx。回来再说吧。

重新学习advancedrendering&animation的讲座才开始明白很多,原来在本科的graphics里只是了解一个名词的并不真正明白,现在才开始明白一点,对于数学的要求其实还是有一些的,比如c0,c1,c2 continuety之类的概念在calculus里面似乎不大提,或者使用另一个term,或者我根本就忘了,总之现在明白为什么在飞机汽车设计中那么重要,因为这些都是流体力学里要求的,作为工具graphic必须要满足他们。回顾这些经典理论你也许会觉得没什么了不起,可是科学就是这么积累的,作为全人类也不过就像一个个体一样一点点地积累而来的,所以从这点来看我还有太多太多的空白了。学一点是一点吧。 我一直对于menu有一个理解到误区,从用户的使用角度来理解大概看过计算机的就不干说不知道什么是menu,但是从程序的角度来看实在是不简单,今天明白了一点,createpopupmenu+trackpopupmenuex就是目前我需要的。

一月二十三日 今天天气很好吗? 下雪了

clipping和path还有region是gdi的最核心,我玩了快一个月才刚刚开始接触这个,的确windows的核心是消息,gdi是windows的灵魂,目前应该说windows是世界上最复杂的软件系统,“复杂”有很多的理解,大型计算机也许也复杂但是针对的使用者都是专业程序元,基本上很多东西都没有,唯独windows是什么都要兼顾。今天有一个很搞笑得故事,RGNDATA和BITMAPINFO类似的都定义了一个类似的char buf[1]或者RGBQUAD quad[1]的东西,我从一开始就百思不得其解,既然是不定长又何必要用这么个1长度的数组?结果我也没办法当参数取传入来获得,也不能赋值自己建造,究竟微软的程序员当初是怎么想的?如果是考虑size要alignment与dword着我还能理解,但是实际上也不是。使用getRgndata就更搞笑了,我从一开始阅读msdn就感觉这个玩意可能要call两次,赶紧google了一下,果然第一次长度和指针都用空来获得实际长度,然后分配内存再call一遍,于是从这一点才能明白当初某些微软程序员是怎样思考的,这一类结构的设计很粗糙有可能就是只让输出使用的,或者标准的用法就是treat as byte stream,then allocate memory and then you use pointer。也许是故意不把char buf[1]声明称char* buf是希望使用者惊醒线性内存分配的提示,让你不会犯错误,我想这大概就是原因吧!ExtSelectClipRgn总是有毛病,第二次就只能得到null-region了,不明白,GetWindowRgn也有一个dirty-trick就是普通的classic-window原本是没有windowregion的,所以你会得到error,这实在是ugly,所以现在一旦遇到莫名其妙的问题,我的第一反应是赶紧google,否则你会为这些奇奇怪怪的问题浪费不知道多少时间。rgn是一个对象,一定要记住创建,使用ExtCreateRegion创建的是变换的region,和坐标系的变换完全无关!记住不要double变换,可以想象是几何体的变换,这不属于整个坐标系的变换。CombineRgn是正确的,现在的问题是extSelectClipRgn为什么不对呢? 吃完午饭在实验似乎是对的,GDI时常让我有一种不稳定的感觉,也许是我的电脑中了木马之类的,我有很强的感觉我的电脑被人装了hook,很多时候键盘按下去反应时间很长,哎,这个世道实在太乱了。使用extSelectClipRgn的时候脑子里面的集合操作的“diff”有顺序关系,xor则是diff的绝对值(和顺序无关)。

一月二十四日 今天天气很好吗? 不下雪了

我完全的忘记了上个月我在干些什么:

bsub -n 32 -o binary32.txt -ext "SLURM[nodes=32;exclude=n14]" mpirun -srun ./binarySwapText.exe

我有时候会被蒙蔽因为我不够坚定,比如你运行p个process的时候你想让每个process产生不同的随机数,通常我们使用srand(time(0))就足够了,可是在cluster上为什么我看到的时一样的结果呢?根据这样的现象我居然开始怀疑我运行的是否为多个版本,恰好我随手运行bsub -n 8 mpirun ./myGatherTest.exe系统很懒惰的就把那个孔显得node的8个smp的内核分配给我了,这样我看到的当然就是在同一个node上的八个进程,为什么随机数也是一样的呢?你会不会像我一样的开始怀疑1+1=2?很简单的事我对于这些庞然大物还缺少敬意,事实上cluster很大的一个技术在于始终同步上,这一点是系统级的,我侧试了一下几乎精确到毫秒级,这是非常非常可观的,考虑到我的测试方法本身就有局限(就是简单的gettimeofday),可能比这个还要高!这是非常不容易的技术!所以time(0)这种秒级的数字当然是一样的,(就算毫秒也是一样)。这就是cluster的技术所在!难怪人家要卖几百万加币!

再次强调一下,lsf与slurm没有什么“空间”上的差别,所谓partition是一种概念,就是说bsub之类的shell都是工作在这两者之上的提供了“调度”“容错”等等的功能。等等,我的记忆好像消失了,我才想起来我是使用remote-graphic的shell所以他事先就去分配了运行的资源,所以这个和slurm,lsf无关。mpi_allgather的使用很简单,就是sendbuf实际上和recvbuf可以无关的,但是一般人都会用一个长buf,然后把sendbuf指向自己的block(就是自己的index所在的block)这样就collect了。gdi+里面有一个神奇的“color-transformation”真是闻所未闻!

电影频道的最大好处与坏处就是他不停地重播同一部电影,每次我看《art school confidential》我都要大笑不止,如果说艺术家大部分是疯子的话,学艺术的女生就是疯子中的疯子,而疯子在英语里面有很多的词都有细微的差别,crazy,mad,insane,lunatic,mental disorder,nut,maniac,hypersexual也可以说是一种疯狂吧?frenzy?影片里面有很多东西你不一定能够真正明白,也许本来就是导演留给观众的,比如男主角的老师sandy到底是一个欺世盗名的伪学者,还是一个有些真知灼见但是大部分时候郁郁不得志只能沦落到一个cocksucking的失败事例?女主角对男主角的所谓吸引是否真的入她的lesbian伙伴所说的仅仅是fallinlovewith every talented painter?或者这正是导演所谓借学生的最说出来的主题,艺术原本就是这种弥补attract mating不足的手段,或者因此而导致的情绪宣泄,我想后者大概更符合弗洛伊德的理论。中国传统文化一方面肯定食色性也,另一方面又是重要把他们肯定的某些形式从这一框架里剥离出来,这在我看来真正是pathetic。

ExtSelectClipRgn的返回在跟踪情况下不会正确,因为当时的窗口并不显示,所以正常情况下都是complexregion的返回值变成了nullregion。

The SetMetaRgn function intersects the current clipping region for the specified device context with the current metaregion and saves the combined region as the new metaregion for the specified device context. The clipping region is reset to a null region.

这个也许揭示了为什么有的时候你的clip-region是一个nullregion。使用saveDC,restoreDC可以达到类似于opengl的pushmatrix,popmatrix的效果。

《decoy2》这种搞笑得电影绝对的让人无话可说,college-hot-chicks are all hypersexual aliens。而识别这些blonde alien的办法就是看她们是否有bellybutton,或者是否总是说hot。

一月二十五日 今天天气很好吗?不下雪了

关于HRGN还是要转变一个观念,就是在大多数函数里面必须先创建,比如combineRgn里面不能只用一个handle来承接返回的rgn,我想系统会自己释放内存的,(就是rgndata里面的那个buf),听说GDI+里面有浮点数的坐标这真是一个好消息否则gdi里面anti-aliasing带来的问题实在太麻烦了,大部分操作如果你自己一个像素一个像素的变换一定很难看的,因为锯齿问题太严重了。 使用同心圆依次作为cliprgn并结合缩放来画ripple效果或者是fisheye效果都不太理想,因为太慢了,这里的原因是我不能够把bitmap作为brush来fillrgn因为brush并不能缩放,必须用bitblt结合cliprgn一次次地画,结果特效变成了动画,这实在是搞笑,另一个简单的途径但是我一直逃避,就是最直接的pixel操作,因为我有过直接操作bitmap缩放无法完美地rasterization的问题,就是浮点与整数转换填充的问题,这就是我为什么说听到gdi+支持浮点坐标是个好消息的原因。坐标变换里面比较麻烦的事情是rgn和hdc的变换的同步,比如同样一个xform的transform你可以使用setworldtransform来变换hdc的坐标系,但是要变换rgn要先获得rgndata在用extcreatergn来创建,那么做后你画的时候就可以在world的原点了,如果rgn不牵涉到变形,比如仅仅作为clip来使用那么使用offsetrgn更加的方便。总之,坐标变换我总是搞错,每次都要试验好几次才明白,这是一个比较痛苦的地方。

放大镜使用scale,bitblt加上cliprgn,但是效率还是不高,如果使用mousemove事件的话图像有比较大的话flicker比较严重。看了一下windows自带的magnifier我觉得功能差别还是挺大的,因为那个是另外开一个窗口仅仅把screen的图像按照固定倍数放大一次然后进行平移,而我这个却因为不断要在原图上修改效率当然差很远了,那么怎样改呢?

Stanly Kubrick真是一个超级天才!他的电影总是引起巨大的争议,然后十年后成为不朽的经典载入史册。

一月二十六日 今天天气很好吗? 很好,出太阳了

用像素变换的办法作了一个fisheye的特效,效果还可以但是效率和我估计的一样不行,我猜想原因在于getpixel,setpixel这种api是非常的昂贵的,也许直接把bitmap拷贝到内存操作会好一点,不过这很值得怀疑,另一个就是因为我要不停地在鼠标移动的时候把变换的部分抹掉bitblt的操作也是很昂贵的。今天另一个收获就是我怀疑extselectcliprgn这样的函数不会自己清楚状态,就是说releasedc并不会为你恢复原来的cliprgn,这是我的猜想,总之gdi有不少的毛病,至少我经常发现有些莫名其妙的问题,比如第二次运行的时候现象就消失了,我猜想一定是我修改了什么状态出错以后系统没有及时恢复,要么就是我电脑里的木马太多了,昨天下载了一个免费的avast查出来一大队的木马,这个在我的意料中,只是我实在是懒得重装系统,我有些硬件的驱动可能找不到了吧?这实在是麻烦的事情,(又一个木马居然是藏在我的声卡应用程序里,难怪我的声卡总是出毛病?)所以,总而言之,如果extselectcliprgn然后就使用null在恢复原来状态,这样也许就没有毛病了。

一月二十七日 今天天气很好吗? 很好,出太阳了

用alphablend函数又一个很好的应用就是增亮背景,这个是我一直想要的效果,用bitblt无论如何做不到,但是这个函数又一个小问题,就是如果srcDC和destDC是同一个的时候你可以把不同部分的图像进行混合,但是src与dest的部分不得有重叠部分,在我发现这个问题之后重读alphablend的说明发现这已经提到了,哈哈我没有耐心去读而已。所谓的增强要纠正一个我的误区,我始终有一种错误的想法就是按照颜色值乘一个系数,这个实际上是做不到的,用同样的位图作任何alphablending都是原图,如果你使用黑色刷子倒是可以按比例调暗,但是有什么样的办法可以按比例调亮呢?我觉得仅仅依靠alphablending是做不到的,用白板能做到的是所有颜色都增加一个常数,这个也许就是gamma增强色吧?但是使用过就知道这是有一点失真的,当然如果预处理的时候按比例硬要造出一系列的按像素亮度变化的alpha当然是可以的,不过这有一点点地假吧?试验一下。ExtFloodFill原来是这样子的,很好很好,大概就是学图形课里面的flood-algorithm吧?再提醒一个超级简单白吃的问题,fopen如果不用"rb"模式读单个byte可能会失败,大概是非字符的都不对吧?另外png是使用big-endian的,所以要记住啊。 折腾了一天我实在是搞不懂,StretchDIBits为什么不能够转化jpeg和png格式呢?难道是因为设备不支持?ExtEscape返回都是0按照msdn的说法是没有实现,这不是搞笑吗?可是并没有报错啊?oleloadpicture不能使用png格式,真是倒霉。

一月二十八日 今天天气很好吗? 很好,出太阳了

如果出现link2001的问题,大多数时候是这样的,你使用的事dll,所以需要multi-thread-dll不能够用静态库比如libcmt.lib之类的,这其中的原因我还是不十分清楚,今天和昨天又花了差不多一天一夜在编译libpng的库,说起来ijl和他非常的相像,基本上是windows平台上的噩梦,因为windows平台的程序员一般比较天真以为这个世界上都是和自己一样的傻瓜,同时window上制作dll实在是要比linux麻烦不少,我今天大概有 犯了一个错误吧,就是我已开始要把库编译成静态库,然后链接到我的程序里,因为libpng用的是纯粹的c,就是文件后缀明用的是.c这样vc就按照c编译,而我的project是c++结果链接的时候调用约定不是_cdcl我当然要用extern "C"来改库的头文件,结果库有不答应了,因为我使用的是共同的头文件,结果又要编译完了改回去,我当时并没有清楚的意识脑子一团浆糊,过了很久才明白过来,干脆全部强制用/TP的c++编译省掉了混合编译的麻烦,这实在是头疼的事情,我差不多把所有的时间都花在了编译链接的问题上了,至于说png转换为DIB的毛病我还没来得及看呢,这就是痛苦的地方,明明是图形的问题却在编译上画了这么多的时间。debug宏命令实在是痛苦的事情,我只好用#pragma message("my message")这样原始的办法一块一块地找,非常的麻烦。费了浩大的劲才找到了正确的macro的组合产生dll的输出,注意如果dll没有dllexport定义的话是没有输出lib的,这是个常识。 找了好久才找到,如果定义宏的时候,比如把函数返回类型,参数等等用一个结构来包装,那么这很可能需要一个通用的宏,结果我忘记了这个宏的变量还包含一对挂号,结果结成了双挂号,我找了好半天。ijl与libpng都喜欢这么干。

msdn的话不可全信,比如SetDIBitsToDevice的src坐标说是左下角的坐标,结果我被折磨了很久都看不到图像,去看别人的源代码,应该给的是左上角,当然图像是翻转180度的,于是你在解压缩pgn格式的时候要先进行上下处理,这里面转了好几个弯子,我有些想不清楚,也许msdn说的是对的,但是讲的不太清楚,总之,花了浩大的力气才把人家的libpng制作成了dll供以后使用,这个工作其实也不轻松吧,因为这个library和ijl一样光是看懂使用就有大段大段的代码,难怪这些年来直接使用png与jpeg的很少,jpeg大部分是用intel的库,有些人用oleloadpicture,还有些就是使用从ijl小小修改的所谓面向对象的库,比如有个什么image的玩意,干的和我差不了多少,(实际上我怀疑连intel的都是从ijl改来得。)对于png那简直就更少办法了,绝大多数人都使用gdi+来做,但是我实在是讨厌那个要已开始初始化的gdi+,所以坚决不用。在强调一个重复了n多遍的问题,SetDIBitsToDevice得参数看似两个,一个是bitmapinfo,一个是具体的bitmap-bits可是不要被他骗了实际上这个是“线性”分配的内存,就是说bitmapinfo后边就是数据,或者是index,或者是rgb,你不要以为可以分开来。(这是不对的,两个是可以无关的,哈哈又犯了一个主管的错!)还有一件事,就算你在头文件里面有那个dllimport,dllexport的宏,可是不知道什么原因我居然还要在声明一个extern"C",这似乎有问题。

还有一件事我不理解,png的格式里面,就是IHDR里面的bitdepth我的理解就是bpp,可是结果总是8,难道我理解错了?简单读了一下,bitdepth有别的用途,就是可以作为gama的计算,实际上bpp并不一定有意义,因为dib根本就不care反正是truecolor。所以,这是我的误区。

看电视里现场直播的布什总统在国会的演讲,整个讲演过程布什总统没有讲稿,全场每隔两三分钟就全体起立鼓掌,演说内容涵盖国内国际的方方面面,布什总统讲的激昂流畅,令人十分佩服,我想这里面没有什么空话套话,因为你肯定记不住的,就凭着一点我觉得共产党在国一百年也没有办法找出一条让人才脱颖而出的办法,国会里有一两个议员在打瞌睡结果被记者拍到了,这就是民主国家的新闻的威力,你做大官有如坐针毡,不想中国的官员都是老爷太爷。 几乎可以肯定的是SetDIBitsToDevice不能转化png与jpeg,不知道为什么msdn这么说?

一月二十九日 今天天气很好吗? 很好,出太阳了

gamma矫正据说应该放在系统颜色部分去做,这样节省了大量操作,png的gamma就是先把文件颜色变换到0-1之间,然后计算gamma变换,在gAMA存储里面gamma值是乘过100000的,所以,sample = integer_sample/(2^bitdepth-1)变换到0-1,sample = light_out^(gamma/100000)还有一个重要的事实我忘记了,png里面的颜色是bgr,记得要转换,我费了很久才明白,实在是有一点点让人泄气。非常的令人头疼,dib如果用SetDIBitsToDevice的时候,你要事先把png的上下颠倒,bgr->rgb并作gamma矫正,但是如果你把这样的bitmap作为hbitmap的bits你得的又是一个上下颠倒的图,因为hbitmap不是DIB而是DDB,这怎么办呢?注意我使用createbitmap来制作的。终于解决了,使用StretchBlt有两点注意,src的左上角是0,h,高度是-h,哈哈。同时明白了一个误区,bitdepth跟bpp不同,他指的是一个channel的,所以rgb要乘以三。

微软真是混帐,不,应该说是intel的那帮人比较的混帐,搞出一个什么little-endian,我都已经被搅得头昏脑涨了。在bitmapinfo里的colortable是一个个的rgbquad,{bgra},但是微软自己定义的颜色colorref却是0x00bbggrr,现在你该明白问题了吧,其中的rgb顺序颠倒了,(注意是32位取址模式下,按照little-endian的结构,rgbquad在内存里是“实际的顺序”是argb,而colorref的实际顺序是rrggbb00,我实在不懂为什么当初要这样定义?)所以,问题处在bitmapinfo的colortable定义的是bgra的顺序使得png必须这样转换rgb->bgra。

还有另一条途径创建这种bitmap,createDIBitmap用于把这种dib变为ddb,这个就不再需要使用stretchblt了。 折磨了很久很久我才明白我的白痴,什么样的alphablending可以成为透明色?不能想当然!如果blendfunction里的constantalpha设定为不用0xff,那么alphablend是按照每一pixel的alpha作blend,dest=src+(1-alpha)dest,那么请问什么情况下才是透明色?仅仅透过改变alpha是永远做不到纯透明的,一定要把src变为纯黑呀!这是制作sprite的唯一方法,可是我有种错觉以为有了alpha通道就可以在不破坏原图的基础上做到sprite效果,这是不可能的。(这种问题是否太白痴了?)png可以有alpha,于是写了一个小小的函数传递一个backgroundcolor去修改颜色制作sprite,这个要比传统的执作mask的办法好一点点,就是指需要call一次alphablend函数,而不需要两次bitblt,但是bitblt是纯粹的bit操作应该要比alphablend的src_over操作来得快一些。

一月三十日 今天天气很好吗? 风很大

gamma矫正非常的重要,尤其是screen-gamma的差别非常大,这个大概是各种显示系统的问题,比如pc一般是2.2,(在libpng的帮助里有一些基本的介绍),createDIBitmap的初始化部分可以现象是用户传进的数据,必须用户自己释放,只是作为初始化而已,我为了确信作了一个简单的测试。这个函数可以保证你创建的hbitmap是一个windows可以正确使用的handle,所以很有用,当然前提是你必须正确地读取png,还是要记住,上下颠倒,rgb顺序颠倒,gamma矫正,(backgroundcolor我觉得完全没有什么用,也不知道怎样用?)

一月三十日 今天天气很好吗?风很大

整整一天时间我被自己的错误所惩罚着,我不知道为什么我会得出昨天关于gamma矫正的结论,难道说我有幻觉?gamma矫正的确需要但是你可以交给libpng去做,比如使用png_set_gamma函数里面传入screen的gamma2.2你不需要再次自己去计算gamma,我也许是因为变异环境复杂导致的错觉或者是代码版本错误的问题,总之,今天画了一天的时间学到了一个简单的事实:如果你不按照png的建议去该系统的gamma-ramp那么就只好使用这种gamma校正的方式,同时记住你得原始数据就改变了,这样从windows系统读取getdibits的时候就是现成的数据,不需要进行rgb顺序转化,但是你还是需要上下颠倒。理所当然的你的png很可能是没有gamma的。我感到不太理解的就是如果png需要gamma的时候除了file-gamma之外你还需要screen-gamma,而当png根本没有gamma的时候你却不需要screen-gamma,(我试图解释,原因是因为我loading的时候已经根据pc的gamma作了矫正2.2于是存储文件的时候,是适合pc的png,如果在mac显示问题就又大了,这实在是一个麻烦的问题,除非我loading的时候不改变screen-gamma而是改变系统的显示的gamma就是保存原来的文件属性,这样存储文件的时候就不会有screen-gamma的成分在里面了,在mac显示的时候只要加上mac的gamma就可以了。)但是这个实在是太罗嗦了,为了一幅图片去改变系统的gamma实在是不可能的事情,所以,我现在明白了如果你要写一个游戏在window,mac上都运行正确或者用两套图片文件,或者在游戏开始的时候进行必要的系统gamma调整,这实在是。。。 我想我终于可以吃晚饭了,我翻了一个异常低级的错误然后为此花了好几个小时debug,很经常的,我感觉我很可能实在是太差了。比如从rbg扩展到abgr我的code是正确的,可是我忘了如果从rgba到abgr我的code就是错的,上一次我被问到做swap我就脑子一片空白的这么做,现在我有这么干了,实在无话可说。(png用的大概是network-order,所以是rbg,rbga,windows用的是little-endian,所以是abgr,bgr暂时放一个备份吧,我的实验太乱了。

一月三十一日 今天天气很好吗? 阴天吧。

感觉比较混乱,我比较讨厌libpng必须额外加一个zlib,不是我对于他有什么意见,都是开源的跨平台的都挺好的,不过我想简单一点做成一个dll,试验了半天比较的没有主意,zlib的macro写得比较fancy,参数写得很奇怪也许是为了不同调用约定压栈的缘故吧?总之没找到合适的宏,最后只好先把它编译成静态库,又用了一个它的ZLIB_INTERNAL的宏才成功,顺便记忆一下libpng的编译的宏,省得以后又要用#pragma message来找半天:这个东西原本不值一提,对于c语言的专家也许是小菜一叠不过对于我却非了不少功夫才找到,PNG_BUILD_DLL,PNG_NO_MODULEDEF,PNG_DLL,另外pnglib里面有一个png_set_bgr可以声调我自己转换的麻烦,效率也许会更高一些吧。

《3:10 To Yuma》是一部神奇的电影,大多数中国人是很难理解的,反正我觉得作为中国文化熏陶下非常难以接受,当然如果看过《red river》之类的也许稍微容易些,所谓的信仰是一件非常难得事情,一件毫无所谓“理性”的东西,比如你相信一件事你基本上不需要理由,也基本上不去考虑什么现实的后果,从生物进化的角度看这是一个覆灭种族的特征,注定是要被淘汰的,可是这确实是一件非常珍贵的东西,你要牺牲很多。 你知道最白痴弱智的电影是什么吗?《house of dead2》就是《僵尸战记2》名字是我自己翻译的,大概你可以想象很多人的脑子大概比大猩猩还差不少。

 

 

 

            Here comes the personal notes of English version. The purpose I write both English and Chinese version of my day dreaming gossip is that for some idea, it is more natural for me to write it in English. Of course, there are some percentage of showing off as I stated in the original purpose of establishing this website, however it seems to me that knowledge is accumulated from generation by generation. If everyone is so selfish that he didn't share what he thought, we might never have our prosperous civilization today. Then why don't you show off your idea if you think it is worthwhile? It is nothing shameless to share with others.

14/7/04

I am supposed to write something here, am I? In my Chinese main page, I write down my diary and every month I have to move the last fourth month diary to my backup page as the diary becomes so long.

I like to see the LHS or left-hand-side-column grows longer than RHS or right-hand-side-column even it means imbalance.  It gives me some phoney proud as usually LHS lists all my work during my study. However, the RHS usually records my meaningless solo. I think for most of time, I am simply talk to myself and those "ambiguous, blurred, chaotic words" are only functioning as a reminder for myself when I try to read them later. Should I also write these kinds of garbage in English? Why not?
 

12/7/04

The reason for me to look into "code breaking" is the strong belief that problem solving is a process of code breaking. Here, code in a more general sense is representation of phenomenon of objective world. We are not solve problems on problem itself, rather at bottom of our hearts, more precisely in our brains. Therefore, a isomorphic mapping must be established between the object world and its pattern in our brains. This is exactly the meaning of code. The code is created either by others or more probably by nature itself. What we need to do is to "break" it, or to "understand" it. The way of code-breaking is described like some activities of creation of arts because it requires wild imagination. Let me quote the preface in the book "battle of wits": "It is not necessary to be crazy to be a cryptanalyst. But it always helps." ----Joseph Rochefort.

14/7/04

The "code contest" for me is always a defeat of self-confidence. I cannot even finish the very simple first problem within three hours.

18/7/04

I have a quarrel with my friend Mr. Zhu over distribution of blood type of human kind. I decided to write a little program to test my argument: O type has the smallest chances to be inherited. The only reason of majority of O type in the world must be due to the fact that O type is originally only blood type of human. All other type are developed from O type after many years.  I give this trivial program a star only because it proves me correct, at least its running result does.

A second check revealed a small stupid mistake in displaying---I swapped the result of type O and type AB. In order to save face and save space, I decide to modify it without creating a new version.

And I show the probability by the most stupid way.

20/7/04

I am not in slightest mood to add more sentences into my little imaginary dialog between HAL9000 and Dave in "2001: A Space Odyssey".

The second test program proved to be great difference from previous one.

21/7/04

I want to achieve the variable number of parameter like those in function "printf()". But the template class doesn't work. I guess maybe the passing convention of either template class, or virtual function is different from c convention.

26/7/04

It is my greatest honour to receive such encouragement from respectable professor Mr. Cliff Shaffer!

27/7/04

I think the approach is beyond the ability of compiler.

However, I think it is easy for users to work around the power set problem if they know the type of set they are working. Sure, they know!

29/7/04

I found the way to remove comparison class!!!.

10/8/04

I always want to write Huffman code as it is such a famous and fundamental algorithm. However, compressing file is still not very easy as you need to operate on bits instead of bytes since all file manipulating functions deal with bytes as far as I know. Then aligning Huffman code to series bytes is a tedious job. So, I give up.

11/8/04

 It is a good evening to take a walk around with some stupid idea in mind such as recursion. You know, it puzzles me when I think over this stupid question. Every computer science student understands recursion. However, I always regard there exists two kinds of recursions: recursive structure and recursive algorithm. For the first one, we can find an example in definition of set. And I think usually the concept of recursion refers to the second one---recursive algorithm. Is there any connection between two kinds of recursions? Ironically, before asking this vague question, I begin to wonder if there really EXISTS recursive structure in real world! Can  you imagine that you could find an exact same box inside a box in 3D world? Mathematically, we can define a recursive structure like a set, but we even find it difficult to realize it in as abstract way as in computer language. Just remember your first experience to define a linked list in C++, the recursion is done by a pointer instead the structure itself. Considering pointer is of no size at all comparing with structure. Does it imply that the recursive structure doesn't exist in real world at all? If this is true, then why do we have this concept of recursive structure? Or maybe we are confusing the two concepts? Or more probably, it is me who invents this stupid concept?

15/8/04

Today I played basketball with my good friend Mr. Zhu and we talked about philosophy of life a little bit. He told me that he realized he is a common person and he felt a kind of relief. I told him I felt similarly. However, as I said before, I am just a common person with a common wish to try to look like uncommon. In contrast, he is an uncommon person with an uncommon wish to try to look like common.

I tried to use two simple grammar example to indicate how to use SLR(1) grammar to detect context-free-grammar ambiguity. Of course, I cannot prove it at all and I highly suspect it is a good one, or a reliable at all.

16/8/04

Two naughty boys play a little game with you. As they are both genius of  math, you can only beat them if you are a computer science student or a programmer.

I don't think many people would make such stupid mistake like I did for so many times. It is purely a shame since I just read MSDN without understanding anything! There is a long-time naive thought in my mind about "files", that file is similar to "null-terminated" string that has some special terminating character to indicate end of file. This impression maybe come from the shape of function "feof". I continually trace the run-time of VC6.0 and it is Mr. Zhu's comment that reminded me: the length of file is recorded in file descriptor. And I was told this from so many courses, comp229, comp346 etc. However, they seems to have no effect on my mind when I deal with practical problem! Indeed, Mr. Zhu has a stronger logic mind as he declared! 

22/8/04

So, everybody who already has taken computer architecture course knows that the average latency time for disk arm to move to the target track is 1/3 of time it moves across all tracks. But how to calculate this? Honestly I don't know. I write a simple program to simulate and convince myself. However, there is one pre-condition for all kinds of "average waiting time" problems no matter whether the waiting elements are processes or tasks or threads or whatever. The length of queue must be stable otherwise there is no average waiting time at all.  Just imagine the queue is continuing to increase as the output is much slower than input. Can you predict the average waiting time? Increasing to infinite?  That is why I write the second version to test under different the incoming rate. The result is exactly 1/3 if the tasks are sparse and few.

After lunch I visit Mr. Zhu and understand the way of integral. The "latency" has nothing to do with "waiting time". They are completely different things!!! Latency is simply the time needed to reach the point by moving disk head. We simply don't have to consider the waiting time for each task.

In fact, it is a rather simple calculus problem.

25/8/04

A simple problem! But why should I use such complicated way to solve? Maybe I just want to show the application of "radix sort" which is said to be the way used by IBM in World War II for American secret service to help breaking Japanese code: how to find repeated string in enciphered code?

29/8/04

Today I understand a little problem of my code: You cannot passing expression as parameter to a "macro"! I distinctly remembered this problem when I took "compiler design" when I always took for granted that I CAN always passing an expression as parameter as long as the types are in consistent. During that course, I realized how much work has to be done to achieve such seemingly-easy functionality. You know, the preprocessor mechanically replace the "macro" and at that time, parser even has not started job, then how can precedence and meaning of operator be able to be translated by parser?

i.e. #define ABS(x)  (x>=0?x:-x)

If you want to use it like this: ABS(--x), then what is the truth value of

"--x>=0"? There should be some unpredictable problems.

30/8/04

It is rather strange that when I try to define a function in "dll" by using "__stdcall" which is said to be the "windows API" calling convention my calling function pointer cannot correctly find the exported procedure address by using "GetProcAddress()" call after I load library with "LoadLibrary()" call. It is OK if I define the exported function by using "extern "C"" and my calling function is also defined as "__cdecl". But why cannot I use "stdcall"? Is that because I am using VC++ which is now compiling into C++ name decoration?

2/9/04

The last summer sunshine in my eyes. I am in my last sunshine. The last sunshine in my heart.

6/9/04

I should read these books, I wish, at least this is what I thought. Thanks.

15/9/04

I decide to take AI in winter. In order to memorize the basic operation of vector, I write an extremely trivial little program for practicing. The point worth mentioning is the argument of "..." which I believe very few programmer would like to use it.

18/9/04

I try to prove 1 + 1 =\= 0.

And I post my FTPServer. But please don't copy all of them, otherwise we will all get zero marks.

21/9/04

Sometimes, I just wish I have the chance to study more about mathematics.

I am hesitating on if I should post my ultimate version.

22/9/04

It is probably the footstep of those hackers. And I wish I have time to write a simple program to monitor all ports of my computer to alert me if there is some unusual activity at certain port. I am sure there is finished tools with this functionality, but it is fun to write by myself, if I have time, of course.

24/9/04

I proved a trivial lemma...

I began to suspect my theory.

03/10/04

Yesterday I spent one dollar to watch two big movies: "I, robot" and "King Arthur". However, I was soaked in the rain.

"Winzip" is said to use "Lempel-Ziv" compression algorithm. I finished the simple compression before going to cinema. The de-compression should be finished in next edition.

11/10/04

My thanks-giving is a hard-working day, at least I only eat two instant noodle to prove that I am working very hard. The UDP turns out to be complicated than I expected. This is ridiculous. 

15/10/04

I found some problems in linear algebra. It quite upset me that when I told all my friends that the idea of linear transformation is very profound and almost always their reactions were not what I expected.  Maybe my mind is becoming slower and slower recently.

15/10/04

Guess what I look like..

Are we proving they are linearly independent or not?

Yes, I am wrong.

19/10/04

I just don't understand why the longest common subsequence between three strings are different when you change the sequence of comparing.

20/10/04

My puzzle in assignment...

02/11/04

I like the quotes in my networking textbook very much:

Data is not information; Information is not knowledge; Knowledge is not understanding; Understanding is not wisdom;

If you forgive me, I would like to add one more from my own: Wisdom is not originality;

10/11/04

Maybe my mind is more and more like a machine because I found I have difficulty in justifying a simple problem without help of compiler of  C++.

11/11/04

It takes me five paper to write down my proof.

12/11/04

I add a binary search for monotone array. The program is trivial, but the analysis by Master Theorem is a bit of fun. At least I try to understand the practical usage of this theorem.

14/11/04

I finished "gobackN" with some kind of hard-working since there is some confusing part you cannot predict until you write a program. This is what I said often to my friends: Unless you are 100% of clear about what you are going to write, you are surely going to make some mistakes. There are several issues worth of clearing up before you begin coding:

1) Should receiver send NAK for each out of order packet? Or is NAK necessary?

2) Should sender resend all outstanding packets in window whenever it receives a ACK for some packet?  Or should sender be wiser to wait if last packet window is ACKED before timeout?

3) Should the last EOF packet be included in last window to be sent out with other packet? Or does it help to send the EOF before all data packet are ACKED?

4) Is it a kind of advantage for receiver to ACK each well-ordered packet?

5) How to solve the last packet dilemma?

16/11/04

I am not convinced by your proof.

17/11/04

Indeed dynamic-programming is rather shallow intellectually as it is said in lecture. However, when we do programming, should we add a bit flavor of dynamical instead of statical? I mean, is it wise to calculate all sub-problem even the user's request is obviously impossible? In this case recursive call is more efficient because it only touches those sub-cases that it needs. On the hand, recursion might repeatedly call those cases it solved. In order to combine the both advantage of "dynamic-programming" and "usual recursion", I just add one line of code to check the stored records of calculated cases before recursive call. So shallow intellectually, albeit quite useful. It saves tens of hundreds of wasted executions.

Is dynamic programming as powerful as you imagined? It is a mixed answer. On one hand the total calls for single base LCS(1,1) is far less than expected. The total repeated call of all repeated recursion calls is still very big. From this trivial experiment of LCS, I want to prove my suspect of the claimed upper-bound.

20/11/04

The tutor should have warned me that small modulo number won't work for go-backN under condition of "delay"! It only until the demo time that I discover this problem. The reason is similar to "stop-and-wait" when delay happens. However, I am stubborn to modulo sequence number since it has no upper limit for size of file to be transferred and it saves the size of header of packet. The compromise is to use a comparatively large modulo than window size. In my case it is 32 because there is only 5 bits left in the first byte of my packet.

28/11/04

I try to save the most important things I learned in lab project of comp451. And also I saved some naive understanding of NP-complete problem for my future review. It is always help to clear my mind when I try to write down what I am thinking and what I think I understand. Quite often they turn out to be a contradiction or conflict.

This morning the news program in CBC is discussing some moral value of anti-terrorism war. It is said, "Sometimes what is right doesn't work; Sometimes what works isn't right"; I have to compromise with my ideal to this realistic world.

29/11/04

I don't like to do those kind of numb-minded-mechanical job. So, I write a simple program to calculate the Bellman-Ford routing algorithm. It is a rather intuitive, straight-forward algorithm. And I am too lazy to write a matrix-reading function. So, I borrow a simplified "matrix" from my old code.

30/11/04

I wandered in library and found a book which talked about implementing graph and combinatorial algorithms. But it is a pity that they used a high-level language called "mathematik". Maybe I should write little by little by myself with c++.

Whenever I told my Chinese classmates that I was taking "linear algebra". They would always tell me that is an easy one. And I would always try very hard to evaluate my IQ to see if it was below 100 then. Why should they regard it is an easy one? To me it is such profound theory such that you can use vector to explain so many issues. Is matrix a naturally a part of linear algebra? I always suspect it. To me, matrix is nothing but a perfect tool to represent pair-wise relationship among elements of a set. And linear algebra is perfect to describe the relationship between all subsets in a superset. Why? Have you asked yourself that is it by coincidence or by consequence that a matrix of MxN has dimension of MxN  and the collection of all linear mappings from vector space V to vector space U whose dimension is M and N respectively also forms a vector space of dimension of MxN. Or in mathematics language:

dim(Matrix of m x n) = m x n

A={ f |  f: V-->U , dim(V)=n; dim(U)=m and f is linear transmission}

dim(A) = m x n

(If matrix has not the same dimension, we cannot expect it to represent all transmissions.)

02/12/04

In DBMS, there is almost everything you can find in OS. I want to write a simulation for scheduler in DBMS which use time-stamp to ensure valid concurrency. However, it takes me a whole day to start with the environment. What is a task? What is a transaction? What is a task item? What is a scheduler? It becomes quite messy after I create this environment!

A little improvement of Bellman-Ford algorithm. Now, it update more entries within one loop, therefore it saves some time.

04/12/04

I finished the second version of scheduler with two basic operations: read, write at the price of forgetting my breakfast. After a hot shower, I am in a rather sad mood in listening to some classic music.

Actually in the afternoon I tried very hard to finish the "abort" and "commit". As a reward, I think I found a big loophole in the scheduling protocol of textbook. In the reading request, the book asks to check database element's committed status. And only grant read unless it is true. But if the read request is from the same transaction of previous write, there should be no need for checking. Otherwise it is a deadlock since committed status will always be set false if it writes.

The code becomes quite complicated to me. And I highly suspect anybody can easily understand what I am writing. I often hear somebody boasts that he has been learning C++ for XX years. However, it seems to me that he is saying that he learned C++ XX years ago since he may not be using it so often, or in worst case, not at all. How many hours have I been coding since I learned C++ two years ago? I roughly estimate it should be more than 1000 hours. It is just like those elite pilots compared with each other with flying hours per year. Otherwise, the question of how many year you have learned C++ becomes quite meaningless.

14/12/04

A personal understanding of similarity of two matrix.

27/12/04

My mind is in a chaos state for several days after my finals because I am continually playing the most silly PC game day and night. Then I excused myself for finishing a simple extensible hashing for more than two days. There is some tiny details about disk hashing that I don't understand clearly, especially how to expand, split bucket.  It once more proved that you cannot write a program to implement an algorithm if there is any double, ambiguity about it.

04/01/05

experience is priceless.

The first lecture of a course is often misleading. i.e. Comp326 makes me feel I am entering a wrong classroom. Sometimes I am thinking I am playing "Age of Empire" because the slides show the development of human architecture and it is quite similar to the game from Microsoft. Sometimes I am thinking I am taking a market course because I get the impression that a design engineer of chip company has to take market factor into consideration. I wonder why this should happen. I mean, as an engineer, I just do my best job to optimize the output based on limited input. That's it and just leave the salesman to take care of other issues.

07/01/05

 I have been hesitating for my bit-matrix for several days. On one hand, I think it is still very simple and need more implementation, especially for an approximate approach for calculating "clique" problem. On the other hand, I clearly know that for all this kinds of "mission impossible" adventure, it is futile to spend more time and energy. Honestly I do think it is possible to find a polynomial algorithm for problem of clique because when the "k" of "clique(G, k)" is a certain concrete number, it is not NP-complete problem. It is only when k is somewhat related with size of G, say k=n/2, it becomes NP-complete problem. But I am definitely not the genius to find any algorithm.

Oracle pointed to the porch behind Neo and said, "it is Latin, means 'know thyself'."           -------<The Matrix>

The question is how to know yourself? In my opinion, if you want to prove x=k for some number k, you have to prove that both x>=k and x<=k are true. Then logically you have to find out both your upper bound and lower bound. The closer you find your both upper limit and your lower limit, the more accurate you know yourself. In my case, I found my upper limit in comp465 of "analysis and design of algorithm". I know I am not The One. However, it makes me feel better just like Neo took the cookie Oracle gave to him.

In <The Matrix>, I particularly like the Agent Smith, the guardian of the Matrix. In his solo with Morphius, he shared with us his philosophy. He found out that human beings is not even a kind of mammal because all mammals in this planet would achieve an equilibrium with nature. However, human beings moves to every area they can find and multiply infinitely until all natural resources are consumed. Then they have to spread to another area to survive. Agent Smith found out that there is only another organism in this planet shares the same pattern. It is virus. Therefore Agent Smith thinks human beings are a disease, a plague and the Matrix is the cure.

Another interesting point from Agent Smith is that human beings defines their reality as misery and suffering therefore no one would like to stay in the perfect dreaming world of the Matrix. Or coincidentally as I quoted ancient Chinese saying that "people would die in safe and slackness." In North America, people lead a almost perfect life that so many people continually ask why the world is like this. So, they ask themselves who I  am and  where I am from. As a joke Mr. Bean (Rowan Atkinson) in my favourite series "The Thin Blue Line" answered perfectly, "they should look it up in their passport or ask their parents." Haha, I like so much about the puns and jokes in the British humour even though it is very difficult even for a native English-speaker in North America. I just watch it over and over.

Some say that language is the shell of thought. And logically it implies that language is only a tool or carrier of idea. However, the carrier and passenger are in such close relation that you cannot imagine chemists talk to each other without referring to formula and elements and compounds and musicians communicate with each other without actually playing the instruments. Similarly without thought there is no need for developing language. Then in this sense language is a part of idea, or gut of thought to some extent. In China, there is an overwhelming popular tendency that people educate their kids by learning English without developing corresponding minds. I think I am one of the victim in my university education in China. That is why I feel mind shock when I took Eng207 in Concordia. During the English lecture my teacher emphasize more logic and idea even than most of my computer science and math courses.   

10/01/05

I am surprised and grateful to professor's detailed explanation. I feel lucky to take a right course with a right professor plus the right tutor!

14/01/05

Practicing programming under UNIX.

14/01/05

Have you ever realized that "copy file" is not a basic system call in any usual operating system? And at beginning I was worrying about the relative path and absolute path,  then I realized that "lstat" is not system call and can do a little "parsing" job to ease programmer's pain.

18/01/05

My memory is as bad as that! I even call the algorithm as "Euclid Algorithm"! What a joke!

20/01/05

I think there is nothing shameful to share experience and knowledge with others. The only problem is whether it is worth sharing.

I update my "weblog"(I learn this term from Dr. Grogono one year after I have been updating my weblog the way that the term defines. It gives me a sense that there are many, many people who are thinking in the similar ways. ) in a real time mode, so, I am acting like real time system? It is a bad joke.

21/01/05

I cannot observe the strange behaviour of "readlink" again.

23/01/05

temporarily backup my first part of lab1.

24/01/05

It is quite a painful job to debug under GDB of Linux as it takes me almost two hours to find a simple pointer error. And there is some subtle difference in function pointer between C++ and C. Also the "constant" in C is treated almost like variable and I have to change it to be "#define variable value" instead of "const int variable=value;"

I add a dynamic array in my lab1 which is written by me at least more than three times. It is always fun for me to write those old simple subjects. But the debugging of pointers in GDB under Linux is a real pain.

30/01/05

Miss Sunny supplied an interesting algorithm to minimize DFA. If I have time, I would do it. However, I am struggling with my comp444.

03/02/05

My miserable life in Concordia. I cannot complain about these courses, except writing a small program to comfort myself.

08/02/05

How to convince myself that the parent and child process are sharing the same file status table?

09/02/05

If someone would ever ask me the question: what is the major characteristic of Canadian film, I would tell him/her without any hesitation by two words, nudity and horror. The theme is always similar. A blood-lust parasite or epidemic, vampire-like or zombie-like, Montreal or Toronto...It seems the imagination of Canadian directors are restricted within horrors happened inside Condos. 

14/02/05

For the number of blocks in each block group, a formula was given in lecture: block# in partition / (8x number of bytes in each block). I think it over and over and understand that file system in Linux must use one block to hold all block group as bitmap. This maybe explained in lecture, but as far as I can recall, I have no impression. During the lecture of comp326, the instructor found precious lecture time is so difficult to waste that he deliberate allowed students to give out various comments publicly which usually had nothing to do with technical stuff. Some students complained about ambiguity of questions in both comp228 and comp229 which I totally disagree. In Concordia, comp229 is one of the unique course which needs student's double efforts to understand it thoroughly. As for me, I gave it triple efforts in the sense that I actually listen to lecture for THREE times. By my personal opinion, usually those who are doomed to be the level of application programmer will definitely find system programming boring. Those who are destined to be system programmer will inevitably find application programming fascinating and application programmer farce. 

I collect those useful questions and answers of which I highly appreciate.

And for personal review purpose, I store my second assignment here because by experience if I don't posted here I may never find them in future.

23/02/05

Can you predict how many signal do I receive?

27/02/05

A personal reminder of sigsuspend().

At the nick of blade...(Signal handling programming is tricky and time-consuming in the sense that you cannot trace them properly since they are definitely multi-task programming. Is there any good reason to use signal within one process except you implement thread by yourself?) It is a hard job than I expected and I am really happy when my program can generate 2000 child processes and play in a tournament of 1000 games, even though the joy is a slightly less than playing "Koukai4" for more than 16 hours a day.

03/03/05

Some discoveries about pipe.

SIGPIPE is necessary.

05/03/05

SIGPIPE is only available for good-habited programmer.

GDB is magic!

09/03/05

Today there is a demonstration in Concordia and some students want to go on strike. I read the bio of my professor and it is really interesting. His life is not so straight forward. It reminds myself which I also think is not so straight. And what's more, I learned a perfect word to describe myself--hyperbole.

10/03/05

Thread test1. The name of novel I have forgotten for long is "Martin Eden" by Jack London. I dimly find the same shape in the bio of my professor. The other day I saw DVD <A.I.> is on sale for 11.99 and I was attempted to buy it. However, I recalled that it is one of the few films that makes me shed tears. So, I persuaded myself not to buy it.

14/03/05

This is just a personal reminder: To solve the circular softlink puzzle, i.e. A--> B, B-->A, you need to cautiously call "lstat" first to be sure if it is a softlink. If yes, then call "readlink" to retrieve the contents of softlink. Then repeat previous step until you reach regular file or directory.

There is one and only one mode in C, passing-by-value, nothing more and nothing less.

18/03/05

I really don't want to treat this synchronization-revisit as some new work for me.

25/03/05

The puzzle of sleeping thread...

27/03/05

This is a naive approach and it is some kind of stupid try like my previous try on "clique" problem. It is only to satisfy myself. And I even don't want to explain that. Just keep the page full.

My little DVD collection. :)

30/03/05

Why should I specify "O_RDWR" instead of "O_WRONLY"?

A program for enjoying myself. This kind of programming makes me feel real good. It is purely for fun. It is a minishell.

02/04/05

Wild, wild, test. These are just mindless tests.

05/04/05

Don't you think Chinese students are actually cheating by assuming they are qualified for studying in English-speaking universities?

05/04/05

The major lesson I learned from this lab4.

09/04/05

I write a small program to simulate the collision of two quantum which follows the conservation of both moment and energy.

12/04/05

signal is essentially bitmap and counting won't guarantee for all children's SIGCHLD signal

15/04/05

Grammar is just a pattern,and compilers in most cases are "predictable-pattern-processor". What if the pattern is unpredictable and we need to add newly-discovered pattern  dynamically into old compiler? A dynamic compiler?

19/04/05

Trouble in Asia.

22/04/05

I spent 7 hours a day to finish this little program and began to worry about my coding ability.

25/04/05

My book collections. Generally I don't like to buy those copied ones since I have the belief that only if I treat those books seriously enough can I be treated seriously enough by those books. Most men would like make friends with a real girl instead of a replica of human. So, I don't like reading a copied one.

Is it semantically reasonable?

24/05/05

China has become a crazy world! Can you imagine that millions of kids stay in internet bars for day and night? Can you imagine that one internet game has more than 80 million regular players? Can you imagine that countless kids are paying nearly 2000 Canadian dollars for one weapon in web games and that amount money is almost several months' salary for a common person in China? And can you imagine that some teenage dealers for stolen account/password can earn ten thousand Canadian dollars per month? Isn't it crazy?

For record purpose, I just post two small trivial project which were finished before my travel to Guangzhou. Half-finished big-number and inexact-match with DFS.

16/06/05

The only thing in my mind about Shakespeare is "Denmark is rotten."  Now I should say "China is rotten!"

18/06/05

My little dream which seems to be such a common wish for most common people. But I really doubt it is.

23/07/05

I always consider template is a key to many issues in my heart and they are also often puzzles in my mind. Once I read a message in Chinese BBS which discusses the connection and conflict of template and inheritance. It is said these are two different approaches for a common purpose. But it seems to me that template has more unexplainable profound meaning.

For quite a long time, I am searching for ways to handle pointer of member functions of a class. It seems there is way to handle them. And after the little test, I reconsidered the significance and realized that it could be considered as a demo of implementation mechanism of late binding and vtable.

This is also a remarkable event. I discovered a new way of passing callback function pointer to a template class. Usually I will define the function pointer type and declare the variable which points to the implementation function. Then declare the template class variable by passing the function pointer variable to constructor of class. However, this new way is demoed in a famous book <Generic Programming and the STL>, that it declare a struct which overloads the operator(). Then you just pass the "struct" to the "type" parameter of template class. Please note that we DON'T pass struct variable to constructor. My own explanation is that the struct's overloaded operator() is like a static method of an abstract class which will be called by constructor. (This is purely my guessing.)

23/07/05

After I wrote down those notes in yesterday, I bought a Chinese version of <The C++ Standard Library> which is translated by the same writer who is from Taiwan. In this book, everything is described so clearly and many my long-time puzzles are explained thoroughly. And I also found many "my" discoveries which are treated so ordinarily that I felt very disappointed because these are so common to those masters of C++. i.e. Once I noticed there exists an overloading of operator "void*" by "iostream" and I thought it is quite remarkable and now I understand the reason. You also overload operator "!" for "iostream" and this is a test for errors which already happened. And operator "void*" tests errors just happened now. i.e. if (cin>>myInt) which just calls operator "void*" and if (!cin) calls operator "!" to test errors happened already.

17/08/05

Yesterday midnight I came back by last flight from Guangzhou to Xiamen and ended my nearly one-month wandering in China. There are the traces of my footprints during wandering.

07/09/05

Today it is the first class of AI and there comes the old famous question: Is "DeepBlue" intelligent? As always I think we need to define our question very clearly before attempting to give an answer: What on earth is intelligence? Decision-making, problem-solving, learning etc maybe your answer. Then under the chess-playing environment, DeepBlue is indeed doing very well in decision-making, problem-solving, even learning on the senses of known environment. Why don't we call brute-force-searching intelligence? Probably those who ask this question consider that simple intelligence is not really intelligence. But without the first floor, how can you come up to the top of building?

Another thing I attempted to exclaim in the class is that I come up with my own little definition of A.I.: I want to switch the AI to IA which stands for "Intelligence Automation". If this definition can be accepted, then there will be no such questions like above because automated intelligence are all part of IA no matter how simple or complex it might be.

08/09/05

Is definition itself able to be defined? Can algorithms itself be described in the format of an algorithm? In other words, algorithm will be manipulated as common data.

A set is a domain or a context such that elements inside it can be referred in a denotation system, i.e. names. Maybe scope is its alias in this sense.

set ->stack -> list -> vector is a sequence of denotation system such that information needed to describe the system is decreasing. i.e. In set, you have no other way to denote each element except enumerate them one by one. Stack gives you a single direction of enumeration while list may provide double direction. Vector is a well ordered form which can be accessed randomly which means that you can use minimum information to book keep a system.

Knowledge is a system of compression. Knowledge is an evolution of encryption or encoding. Learning is a process of decryption. Memorization is the simplest way of decryption and it costs most. Whatever way to help decreasing amount of information is considered as a progress in civilization.

I am recovering bit by bit from difference both of time zone and culture. Hopefully isolation can play a good role in this process because no internet connection at home is becoming such a luxury that you can ponder on whatever is worth thinking about such as Scheme, OpenGL etc.

To mount a CD in Linux, just type mount /dev/cdrom /mnt/cdrom.

15/09/05


Today I found a few things in lab regarding OpenGL:
1. I defined glOrtho2D(). Therefore my view volume is just a plane which means the solid-sphere cannot be displayed properly. It won't be a solid sphere.
2. Secondly the co-ordinate I chose for the above function decides the position of object I drew. It won't be in middle of clip until you define xmin=-WinSize and xmax=WinSize; ...
3. In order to draw a moveable object, one of my tutors introduced "PushMatrix" method. But Ram said that it is too expensive and should be avoided. The lesson here is that there is always many ways to go to your destination.
4. The problem Ram and I cannot solve is that I tried to define a function pointer array of a series of OpenGL function so that I can call them in future by their indexes.But I always get a compilation error, or more accurately "linking error". I suspect that the definition of function must be available for linker to link because I test with some static function and it works. Therefore my theory is that OpenGL function are all defined
in "dll" file and can only be linked dynamically. Ram suspected that it is due to function signature or those calling convention key words in MS VC++. And he suggested that I tried it in Linux.

16/09/05

The problem is due to calling convention.

17/09/05

I have internet at home again and I can continue to update my blog. I added a new column for "scheme"--a dialect of LISP. It is rather trivial for experienced programmer. However, it is really hard for any beginner in functional programming. At least I think it is my case.

20/09/05

It took me four hours to figure out a permutation of list. But combination only took me less than five minutes.

12/10/05

I spent almost three days including Thanks-giving Day to try to establish an object-oriented model for those primitives and commonly-used model in OpenGL. However, the result is very disappointing. At some point, I have to stop this futile exploration as deadline of assignment is approaching. Then I realized one of the major reason why this way is not so popular. It is efficiency. When talking about efficiency, there are two aspect regarding it. One is the performance efficiency and the other is the coding efficiency. Students from Engineering department can enumerate various reasons against OOP when performance is highly required. Even students want to argue that OOP helps improving coding efficiency, they have to realize that OpenGL transformation must be done at a proper order and sometimes lack of flexibility in OOP will eliminate all those benefits brought by class model.

The idea of my small project is straight forward and it is different from Dr. Grogono who tries to wrap those basic primitives in OpenGL which is handy and sound. My design concentrate on all higher level object developed by programmer and try to find out all the common property and method of them. Then define a base class which will be inherited by all models and also define most commonly operations of them. i.e. Every model object has a property of coordinate, color, direction which is the axis of the object, occupying dimension which is the enclosing cube created by scaling on three dimensional direction. And all objects have to implement an abstract method display which will be called by a global callback. However, within this function programmer doesn't have to think about rotation, translate, scaling operations because base class already take care of that with the property of derived classes such as coordinate, direction, dimension volume etc. Only the most basic simple standard drawing function need to be defined by programmer. And an object manager class handles all creation, storage, viewing jobs of all objects. This sounds quite nice to me and one immediate benefit to this system is that I can used it in my project design by creating a script system that art user can create their 3D world by script file which will be read by my glut Object manager class. However, some viewing problem puzzled me for quite some time and I stopped there. Just in case I need them again, I store a half-finished version here.

After four-month of wandering, I feel quite embarrassed to post such a trivial program. Maybe the days of no-programming means blank days to me. To ease my pain in heart, let me post a few Scheme which is quite awkward. Tower of Hanoi. CNF_convertion.

13/10/05

In "wesnoth", for some units, at some time, the best defence is offence and for some other units, at some other time, the best offence is defence.

My vision comes from my passion; My passion comes from my mission; My mission is to cross star ocean;

15/10/05

The more I use VC++6.0, the more I feel hopeless. When I started using VC++ almost three years ago, I felt it was almost perfect. However, day after day I have an feeling that sooner or later there would be a day when I realized it is not perfect at all. Maybe the day is approaching. Besides the gigantic amount of bugs in templates, there are also many so-called "nuisance" within the class operators overloading. I heard this evaluation against VC++ from Dr. Grogono when I tried to explain to him one bizarre behaviour in compiling his graphic library. (Maybe it is due to my wild-guessing explanation, however, the behaviour is unusual and it is almost a certain thing when you try to compile code in both windows and Linux.)  There are so many illogical design in class model, if I can say so. Taking the example given in comp348 by Professor, class Account has a member function which takes a parameter of an object of class Account, void modify( Account& another), and it is possible for different Account object modify another Account object. You may attribute this to bad design. But you cannot deny this is a kind of flaw in class model since objects from same class has similar code denies the independence of each object.

Today I encounter something similar to above. I want to overload the operator * for my Vector class which takes a "double" parameter and return another Vector object: Vector operator*(double d); However, when applying, I need pass Vector object as constant reference as parameter in some function, then I have no way to use this operator.

void Matrix::rotate(const Vector& vect, double degree)

{ //now you cannot use this vect to operate.

Vector temp;  temp=vect*degree;//this would be wrong since my operator overloading is not for "reference".

What I have to do is to define a global operator* overloading which takes LHS parameter as Vector&, and RHS parameter as double. Is it insane?

(When I finished above babbling, I get a second thought that I forget to overload operator* as a const function so that compiler refused to apply the operator* to const Vector&vect. This is explains everything and restores a little confidence for me in VC6. And it is a good lesson even though I have met such problem before several times. But why do I repeatedly forget such basic problem? Maybe by writing down can I start learning from my lessons!)

To describe a system with dimension of N, we usually need N+1 dimension space to describe it. Can this wild guess be a theorem? Recall in theoretical computation, there is a famous example that a program can not calculate the result of another program, since the program which is running only has two degree of freedom. Of course this is all my wild guessing.

In order to free myself from matrix calculation, I write a trivial tool to calculate the transformation matrix in graphic.

22/10/05

Sad day it is today! Even though I have anticipated this situation as long as two years ago, still I cannot accept this simple fact---I cannot code under pressure and my mind just stop working in that excitement. Programming competition is never a place for me because of the simple reason: I am too old for this sprint. Maybe I am a good marathon player. There is absolute reason for people to realize something which is absolutely painful! And that is it.

23/10/05

Failure in competition maybe a good thing for me to concentrate on preparing midterm of AI.

I write down this simple argument for proving evaluation function is monotonely non-decreasing for A* algorithm. And I also suspect there is a flaw in proof of textbook on monotonicity implying A* algorithms.

And here comes the cnf-sat. I spent almost a whole week fighting for this project and as a reward to my efforts, our group finally use my code. Even though it is a team work, sometimes you will find it is quite difficult to balance both job, functions and relations. So, I often prefer to do it all by myself as long as I can manage it because I discover that I have a big trouble to understand code of others.

25/10/05

LL sends a birthday card and then I realized that I am passing on another meaningful day after another meaningless year. It is said by ancient Chinese poet that 80-90% of wishes of one man are unfulfilled. Maybe I still belong to the lucky class. Suddenly I recalled ten years ago when I first visited Montreal as a member of business delegation. At that time, I cannot expect I have the chance to live in this beautiful city. Even though the small island across Pacific is also a beautiful city, here I enjoy more peacefulness.

26/10/05

The process of pattern-recognition is the process of repetition-discovery. The process of learning is the process of wrapping repetition with high-order functions. What is high-order function? I don't know and can only get a glimpse when I encounter linear transformation in graphic where 3D space linear transformation is unified by 4-dimension matrix transformation. And programmer always understand that if you want to write some clear-cut code, you need to wrap all repetition in another function and call them in a generic method. This is what I mean high-order function.

Something cannot be solved by scientists can sometimes be solved by engineers. Maybe I should try to become an engineer?

Generating all possible partition pattern takes me a quite some efforts! I even failed long time ago which is one month ago. And it takes me more than three hours to figure out my stupid mistake. This also proves that partition is a much complicated operation compared with combination and permutation. So, there are more "relation constraints" in generating a partition.

27/10/05

Our great leader and poet Chairman Mao taught us that: "Theory comes from practice and must serve practice." Indeed it must be like so. When I thought DFS,BFS,Backtrack,Best-First-Search,A* algorithm are trivial, I proved myself to be an idiot once again. The very first trivial discovery traced back the small puzzle when I read algorithm of Best-First search. I was about to write to ask why there is no path returned like DFS or BFS, then I hesitated because it is meaningless to let professor realize I am the most insane idiot in Concordia by asking such trivial question. The hesitation seems to be correct because under Best-First search algorithm, it is hard to track a path when you always choose the best node to proceed from open-list where both ancestors and descendants are mixed. I then try to use a internal link list to link each node with its parent when suddenly I realized that the "standard library" in C++ is passing by values for those "deque, list, map etc." and since those data structure are stored internally sorted from time to time, I have no way to pinpoint a pointer! This is purely implementation details since I am using c++ standard template library, however, it may have more profound meaning behind.

If I don't try to do it myself for those algorithm in textbook, it would be impossible for me to discover that problem, or worse, to realize there exists some problems. I am late for graphic tutorial now.

28/10/05

I didn't expect this trivial 8-puzzle debugging takes me so long and I even didn't finish it after 2am. However, when I wakeup I find a better way to recover the transition path. That is using the original start state instead of goal state which is obvious. The optimal path of 8puzzle is 57 step and I am still waiting the outcome of 15puzzle which is probably hundreds of steps. I write two versions, one without heuristic, the other is best-first search with A* compatible heuristic where heuristic is as simple as summation of offset distance of all nodes. Also I understand one thing, just like Dijkstra algorithm which can tell you the minimal distance without telling you the path. It is possible that these kinds of "greedy algorithm" won't be able give path unless you design your way to track it.

By the way, I forget to keep a version of newest "glutobject" which I continually updating for new objects and improvement. Yesterday I realized one thing I didn't expect. For non-symmetric objects, you need at least two vector to represent directions. I cheated by using a "lastDraw" to remit this flaw which only works for special cases. However, this is always the dilemma of design and application. It is hard to balance flexibility and robustness. One design can never satisfy all demands. Instead of modifying framework repeatedly, I decide to choose to ignore these issues.

I am only half-convinced about the explanation of DY because I highly suspect there can be as big mistake as this one for a well-known textbook of fourth edition. However, I am too stupid to see any obvious reason there is no decent explanation of using two principally different concepts without any notion. Maybe I should stop here and keep it in mind.

30/10/05

How do you make birds fly? How do you make flowers blossom? Actually I don't know the answer. Neither do I know how I should proceed on with my "glutobject"!

31/10/05

Can you call that programming? I mean, sometimes people regard parameter setting up as programming or coding. And this helicopter is the case. It takes me just a couple of hours to do the coding, or parameter setup including a little naive scene construction. The movement is quite straight forward. However, I do notice the weird phenomenon mentioned by my classmates in class about the pitch. I guess it is due to the similar reason when you rotate around 3-axis even though I cannot solve it. 

I did very bad in AI which is quite easy to be predicted when I hardly read either book or slides. What else can you expect? However, honestly speaking, some questions are beyond my reach even I did read book. This is a bit unfair because I am no genius and how can I know something I never learned?

This month I did programming a lot and this comforts me a little bit. You know, I did absolutely nothing in this summer vacation in China. This makes me feel guilty.

01/11/05

I am lucky today to find another flaw in vc6 that when I include <cstring> instead of <string>, I will get wrong answer for operations of string, like +=, append etc. But this seems to be the convention to enable my program portable to Linux by changing <string> to <cstring> in include statement. Why? I also find a good toy of overloading operator "," so that you can pass infinite parameter to a statement, but you cannot do it easily in function as compiler would check number of parameter before invoking operator ",". Anyway it would be handy to call like this way: cout<<(Proposition1, Proposition2,Proposition3)<<endl; Isn't nice?

Hopefully I can finish my proposition translation from logic to c++ within today.

02/11/05

I give up the proposition simply because it is too trivial. But predicate is just too complicated for C++ to define it. And alpha-beta pruning is not so simple to implement. Just to output a tree takes me couple of hours to figure out. Hopefully I will finish pruning tomorrow morning.

Here is my puzzle: At beginning, I thought that I couldn't implement an algorithm if I didn't understand every detail of it. Later I realized that even if I understood (at least I thought I did.) every detail of an algorithm, still I might not be able to implement it. But in some cases, even I implement an algorithm, there is still big chances that I don't understand every detail of it because sometimes implementation of algorithm by following pseudo code in text is like a copy-paste. Alpha-beta pruning is of this case because the algorithm in text book is not very clear. Or I don't quite understand. It seems that I need another day to finish it.

I guess most students would consider this algorithm is trivial since there is only a comparatively less paragraph to cover it. However, I suddenly realized that without explicitly setup a concept of depths or levels of search it would be extremely difficult for you to implement it. As far as I know, it is a DFS with bounded depth for a MinMax tree which is generated ONLY when your DFS reaches a node. And it only ignore certain branches unless you already have some information, like heuristic value of leaf nodes. However, most of us are misguided by its "already-generated" minimax tree. (This is explained quite clear in a Chinese text book I bought this summer. It proves that not all Chinese textbooks are useless copies.)

This morning I went to attend a seminar of title of "Privacy Compliance of email" which was given by a post-doc from Uni. of Ottawa. This is a rather academic experimental approach to prevent carelessness of people who accidentally send out sensitive, private information. The hardcore of system is heavily depended on a rather poor parser which tries very hard to detect those key words in contents of emails by an extremely simple grammar rule sets. I personally estimate that it is very simple because: 1.It is impossible for a mail server to do heavy parsing job which will significantly reduce performance. 2. It is not worthwhile to do such job because the style of email is more flexible than formal article and natural language process is done no good on it. Therefore I highly suspect this baby toy can have any practical application except for academics research unless they find a better way for NLP. You see their statistic shows that the precision is very poor when the so-called "semantic-tagging" procedure does a poor job. Any good thing about it? I think it mentions a formal language developed by IBM for security rules which is quite interesting style. The name is EPAL. Maybe I can use this seminar for my comp495 report since it is academically shallow and is quite open for naive ideas such as their next stage goal: detecting attached files etc.

I bought a packet of frozen shrimp a few days ago and decided not to cook until I finished my alpha-beta pruning. You see I am training myself to write program in some similarity of training a monkey to do math. No matter how dump I am, as long as I continue to learn I would become smarter than most of those who stopped learning after they graduated. Let me try a new English saying I learned today. If there is learning, there is hope. It suits exactly for the case of AI because beyond all else learning is the most important part to solve. Although the more practical question is what to learn before how to learn. Or more essentially what is learning?

What happened to those monkeys which stopped learning millions of years ago? They become fossils of ice age. Then what would happen to those who stopped learning after grownup? I don't know. Maybe compu-archaeologists in far distant future would find out when computers become lord and master of earth.

04/11/05

The picture of alpha-beta pruning is becoming clear when I try to answer these questions: 1. Can alpha prune and beta prune be executed at same time for a certain period? No. 2. When is alpha-beta prune invoked and which nodes are affected? Alpha-prune affects alpha nodes, and beta prune affect beta prune. For all other nodes, you still have to obey rule of MinMax game. 3. Is alpha-beta executed in DFS style? Yes. Do I take care of depth issues? No, no need to worry of depth because prune function returns a heuristic value. According to Chinese textbook, by pruning redundant node, you can return parent node function call with current node value. And since pruning only happens for descendant nodes, you don't have to worry about sibling's descendant nodes.

This refinement of algorithm proves one thing: I simply don't get what is written in text. Those English sentences must sound as meaningless as those meaningless articles in the book listed in my English book report. It  is written by an American feminist and I hate her historical exaggeration of social problems as a columnist in <New York Times>. I simply don't believe USA has so many serious social problems!

It takes me another five hours to finish this seemingly trivial experimental program---alpha-beta-prune. Once again I should say it is almost impossible to write correct code unless you really understand each word of algorithm. At least it is the case of me. Some notes might be worth memorizing since I learned these after a couple of days! Dull may I be, I am learning.

05/11/05

In order to run job in background in "alpha.cs.concordia.ca" which is solaris, you need do like this: try running "./puzzle.exe >& result.txt &"

the ">&" sends both stdout and stderr to the file and the last
"&" puts it in the backgroup. This is a bit strange compared with Linux command "& yourprogram > outputfile". It seems that solaris is using a stack for parameter parsing.

I modified a little bit of alpha-beta pruning by hand-coding the tree of assignment. And I add a small star to this little program as an encouragement to me because there has been no star program for almost half year.

For a time, I have an impulse to call "visual studio" as "virtual stupid". And if I found a way to solve my problem, I can shout "I have a visual, I have a visual" instead of "Erika".
 

08/11/05

Spend almost whole morning to write a logic tester for zebra puzzle. A couple of years ago, when I was naive as a c++ beginning learner, I wrote several version of program to solve this puzzle by DFS. Now it becomes my assignment in AI, however, I am a little reluctant to write a similar version in Scheme. Anyway to implement the propositional logic tester may be more appropriate.

13/11/05

A question that every student who is learning graphic will ask.

I write a simple brute-force searching program for "zebra puzzle". The first edition is finished so fast that I suspect there is no brain activity in my head because I realized there are a little bit too many permutations only after I finished the coding. Then I quickly fixed a serious bug of tester and did a little cheating with given knowledge. I hope this version can generate some results.

14/11/05

Out of context, out of mind. What would you choose to be if you are only given two choices? One is zombie, and the other is  fish. Both of them don't need too much sleeping.

15/11/05

Finally I understand how to do "while loop" in scheme. What a shame!

17/11/05

Is it correct to say that real programmer only uses C/C++ and only super programmer may also use Scheme occasionally? For a while I am not sure if I am restarting to write in assembly language because I am doing something similar with Scheme. That is, I am re-implementing some basic I/O operations.

When should I fix the bug of alpha-beta-prune?

21/11/05

During the meeting of yesterday, Alex helped me to solve the mysterious vector reference problem which I regarded as a bug of Gambit implementation of Scheme. I will post it lately today because I need sleep now. The origin of problem is, I believe, from so-called "premature optimization" which shouldn't be done unless you are out of the stack frame of function you are calling to. I learned this phrase from some Chinese forum of C/C++ who worship those masters and authors of C/C++ bibles.

Last Saturday we have a dinner after Mr. Zhu successfully moved out for the sixth time within one year. Mr. Zhang explained to me the puzzle of word "transparent" which I have read for so many times. It is simple. If something is transparent, you cannot see it as if it doesn't exist. Before that I got a mistaken interpretation of myself as "something you can see through it and ???." It doesn't make much sense and I now realized that probably it is due to the reason that in China I seldom saw any high quality glass window in my childhood that "you can see through it without sense of its existence". You see, the so-called common sense is not so "common".

24/11/05

Today I attended the seminar about "Golomb Ruler problem". The only thing I understand is that it is a problem of well-ordered set of a binary relation of a set. 

If science is a severe master then computer science must be a cruel master. I don't know why I am always feeling so hungry.

Today I attended a thesis defense about so-called "cascaded refactoring ...". It really sounds to me like foreign language. However, it presents me a fundamental question: what is equal? Because one professor questioned about the consistency during refactoring even though you have defined a one-to-one mapping. Maybe we should also map the dependency relation to its model. I also borrowed the book <automated theorem proof> by Dr. Newborn. Actually I borrowed this book two years ago, now it is time for me to be able to read it. There is a rather difficult way to define "equality" because this is the most basic concept even before "true" and "false".

28/11/05

Shortest-Path maybe the most complicated function I have ever written. And I think it is really a powerful one. However, the problem of "reference" in Scheme may not be able to be solved as I expected before. It is a problem like this.

I like to deal with computers rather than with human because they seem to be like bloody idiots who can never cheat you. However, as they are bloody idiots, you can never cheat them because they only believe in the simple truth, nothing but truth.

In AI class, the professor introduced an idea of machine learning like this: y=f(x) where x is the input and y is the output. It says that whatever you learn can be generalized like an output for an input. I personally disagree with this "seemingly-beautiful" simplification because it seems to me more like "recognition" which is only one of important processes of machine learning. To me the more important and difficult part is "induction" which generates hypothesis and "deduction" which proves and disproves the hypothesis. And between these two processes, "induction" is much more difficult than "deduction" because the processes of generalization and abstraction is far beyond "first-order logic" if my guessing is correct. And if this guess is true, I should have a very good reason to doubt if current programming language is capable to do "induction" because it seems to me all programming languages are just expressions of first-order logics. Should we invent new programming languages? Or is it possible to mimic higher order logic with this first-order logic? The answer maybe yes because almost all current science and technique are based on previous establishment which means we never really invent something completely new, instead we create by morphing current, mutating previous. The question is how?

30/11/05

Decision tree is purely intuitive which I mean as common as me can come up this idea one year ago. The difference is that some people in MIT or Stanford were born many years ago and spent some time to make an algorithms and theory. It is just a way to discover logic. Why do we need logic? Logic is a pattern. Why do we need pattern? Pattern saves us memory? How? Because all our current sciences and techniques in every area is on earth a kind of information compression technique which try to help us to know those things without memorize all states in a scenario or even help us to know something even we haven't encountered before PERSONALLY. You see the math symbols, physics formulas, chemical equations..., but these are all abstraction of clustered information or behaviours which are predictable. Prediction or deterministic is our pursuit.

However, genetic algorithms seems only to be speculations even it guesses with reasons, still I dislike this desperately, hopelessly, last measure for those lazy experimentalists. It may work for those seemingly unconquerable questions and at this moment, nothing harms by guessing.

I must have lost most of my memorizing ability because when I read my diary today I am surprised to see I even tried a naive way to solve 3CNF before by randomizing algorithms. What a surprise! I cleanly forget I have done this about half year ago! However, I do remember yesterday my classmate explained a little about pattern recognition. He told me that they have a large database and by comparing previous pattern in database with sample, you can recognize it. This sounds OK, but do we human recognize things always by memory? No, there are two kinds of recognition: comparing sample with memory in brain, and reconstruct sample by imagination. Or we can call them two stage of one process. Taking alphabetic and numbers on picture, do we compare them with memory or just use our imagination to reconstruct?

01/12/05

I got an idea this morning and I am 99.99...% sure it won't work as usual because it is another wild idea to try to solve CNF.  Observe:

(!AvBvC)^(Av!B)^(Av!C)^(AvBvC)^(!Av!B)^(!Av!C)

is not as symmetric as (!Av!B)^(AvB)^(!AvB)^(Av!B)

By the way, I need to keep an edition of "hex game" which allows human vs. computer now.

02/12/05

Everyday I forget what I have thought about yesterday. Therefore everyday I think I have some new idea even they are more or less the same of what I had yesterday. It is very good when you watch an old movie from time to time because you think you are always watching a new movie. That is why I like to collect old movies. I write down my understanding of neural network in case I would think I find something new tomorrow.

The way ahead. When I read my "puzzles" two years ago when I have no idea of difference between proposition and predicate, it does seem naively brave to write an email to professor about these questions. Now I understand a bit that the best way to deal with a learner with puzzle is just let him/it to think/search. Maybe in future I would also design such a machine to let him think/search. Anyway reading my email of before sometimes is fun.

03/12/05

If a job can be done with hand within half hour, would you like to do it by programming with three hours? Probably nobody except me would do such meaningless thing. ID3 is just a simple but effective algorithm in AI and I just cannot help writing a simulating program to test it.

04/12/05

two views.

And gradually I realize that knowledge is just compression and intelligence is simply encoding/decoding. Time is universal marker for total ordered set while probability is a measure of binary relationship of a set. This is my view of world.

06/12/05

Philosophy is the biggest heuristic of computer scientists.

epistemology.

07/12/05

Finally I am in the mood to fix the bug in alpha-beta-prune.

16/12/05

...

10/01/06

There is a trend in development of AI such that pure mimic is regarded as a possible way to birth of true intelligence. In my opinion, it is a pure illusion because these activities are far below the conscience of human. For example, a language translation program based on bi-text training using probabilistic algorithms can never understand the meaning of the translated language. (maybe this "never" is a little too absolute, they may use bi-semantic training after the program evolves to proficiency.) (Only one second after I finished above assert, I began to suspect myself. Why not? A understanding of a language is simply a kind of mapping words to semantic representing objects. If we can manage the mapping from  English-->French, and why cannot we manage to establish the mapping of French-->Semantic-Object based on already-established                English-->Semantic-Object? )

I think my mind is always in such a mess that only after one second I overthrow whatever I have established because during that very second another new idea rushed into my mind. If I stick to my belief about knowledge which is simply a well-defined compression of data, then the method above-mentioned has to automatically find the suitable encryption method for compressing data acquired. I think people call this process as induction. That is, data-->abstraction.

There is another puzzle in my mind about induction and deduction. Which one is more important? Which one comes first? Is this another example of egg-and-chicken? Without the basic deduction, no induction can be made. But can deduction be generated by itself without accumulated induction? Obviously not. (Is it true? Can coincidence create the basic deduction system millions of years ago?)

I wrote to my professor once to say that I wish life is like an automaton for me such that I don't have to pick up choices. Then quite soon I run out of choices. No choice become my only choice. Surely it is the best choice because there is no other choice at all. It is somewhat like the little thing in "combinatorial algorithms" where I happen to notice that it is only true when m=2 that "n mod m = -n mod m". Maybe this is the origin of "reflected binary representation of Grey Code". Or maybe it is the nature of "two's complement representation of binary integer". And I also remember about the so-called "buddy's algorithm" in data structure. All of this comes from "the order of minimal change in set" which is such a beautiful creature by Lord. Maybe recognition of similarity should be defined as finding the minimum distance between two objects. Perhaps Eigenvalue is a hash function of such distance. Who knows? God knows.

16/01/06

I did a trivial test in backtrack of latin square. The only thing I want to make a note is that I am thinking a way to check if a vector is a valid permutation of elements from a set.  For example, (1,2,3) is a valid permutation while (1,1,3} is not. But how do you quickly check? I am thinking about to map these n elements to the first n prime numbers so that by checking the product of them I know if there is repetition. Anyway I didn't use this idea in my test as I am too lazy to write it.

20/01/06

Unique factorial representation.

30/01/06

I want to give my first java program one star and I think nobody will object this. The question answered by tutor is more helpful than the program. Originally I want to write some bits and bytes about the surprising things for C++ programmer who tried to learn java for the first time. However, after I write down some pieces in Chinese, I lost the impulse to rewrite them in English. I mean will this be a joke or useful to anybody? Will a programmer in C++ ever have need to "learn" how to program java? What for?

My classmate called me and ask about the mutual exclusive testing. I told her it is very hard to design a testing case since RMI is implemented by TCP which cannot run properly after a large number of calls, say 3000 calls in a loop. The tutor suggests to design some special cases instead of such random testing. This implies of using thread which is something I don't want to write. However, her request did motivate me to write such a test cases. I used a fancy java synchronization object "CyclicBarrier" to let all threads to be barriered before running. The idea is simple. To create equal number of threads to either deposit or withdraw same amount into same account. If the server is not properly synchronized, the balance will not be able to remain the same as before testing.

06/02/06

Aks showed me the artwork of professional CG artists. These are modern artists. Mouse and keyboards are their brushes and palettes. Those masterpieces have the same breath-taking effect as real arts.

MPI deadlock can be detected by OS? Because when I tried the example in book by using two big array as sending parameter to let two nodes to send them to each other and MPI immediately return error.

In Java, the Semaphore is initialized by the parameter "permit" which gives you the first available number of tokens. I made a mistake on that. Another stupid thing is that "main" function always expect a "String argv[]" argument. In MPI, the tag is mandatory for classifying message class. And if you use MPI_Recv, you might get stuck if you are expecting wrong tag. Professor said that the multi-thread in RMI is implemented by creating multi-instance of server object. However, I tried to use a "static" Semaphore and still my synchronization is not working properly. Tutor suspected problem might arising from file operations and suggested using memory for testing. Anyway, I will try to use file lock instead because I am running out of time.

In STL, I am still making low level mistakes. The "Prev" parameter for "set" is a function object and I overload the "bool operator()(const Key_t& x, const Key_t& y)". However, I am making low level logical mistakes. This operator requires a "total order" effect that "==" is achieved by "both comp(x,y) and comp(y,x) are false". Therefore, for two different key, I must return either true or false. But for same key, I must return false in all means.(Tricky or sticky in mind?)

Another low level mistake I am making is actually affected by using java recently. It lowers my IQ greatly. You see, in java, int[] can be treat as a type and you can even define like "int[] array;". In C/C++, I typedef int Array_t[16]; However, if you pass this type into STL as parameter, there might be problem. I am not sure if "set<Array_t>" is intelligent enough to copy contents for you or just copy the pointer. Probably it will only copy "const int*" which is Array_t for you because the "16" here is only used for compiler to check type instead of allocate memory in code generation. Usually I think it will treat "int[]" as "const int*" and ignore the size of array. So, the correct way is to define a struct which holds "int puz[16];" and pass struct as an element type in "set" constuctor, set<Array_struct, Array_Comp>.

13/02/06

Did I re-discovered a well-known vector space?

If somebody claims to have some talent in computer science, then he should try combinatorial algorithms. For me, I dare not touch the topic. However, I do understand this area is the kernel of kernel, heart of heart of all computer science. If discrete mathematics is the foundation of computer science then combinatorial algorithms is body of computer science. I think I am not exaggerating.

14/02/06

I was confused by the so-called lexicographic order in text because it uses a so-called characteristic vector to represent subset where the index of vector starts from right to left, starting from 0 to n-1 and the element denoted by the bit is starting from left to right, starting from 1 to n. So, a subset {2,3,6} from base set {1,2,3,4,5,6,7,8} is denoted in vector as [01100100] and the index referred to each element accordingly is 6,5,2 where you need subtract the element by n which is 8 in this case. In other word, if an element is i (starting from 1) then its index is n-i starting from right to left. What an awkward denotation system! The author must be very comfortable with pseudo code only!  And at beginning I was bewildered looking at the sequence of {},{3},{2},{2,3},{1},{1,3},{1,2},{1,2,3}. Is this called lexicographic order? Later I understood that the order is depended on the "characteristic vector". It is quite confusing that later the author indeed uses elements to define lexicographic order when discussing k-element subset. i.e. {1,2,3},{1,2,4},{2,3,4} of 3-set of base set {1,2,3,4}.

About "write through" policy, I have been forgotten its definition again and again. Let's write it down. The policy of "write through" is compared with "write back" which is lazy writing. That is to say, write through always updates memory when it writes to cache while write back only updates when cache is replaced. Hope I wouldn't need to refer to text in future.

In Gray code, when its rank is even number, its order is also even number.

22/02/06

After almost one week struggle, I finished my work on CORBA which I think quite good in view of its thread-safe and robust in deadlock-free. I really learned a lot except there is some regrets in "NamingContext". Apart from using file lock, you have to use mutex for synchronization and socket for TCP communication. Of course the CORBA technique is very complicated.

25/02/06

I really hate reading. Just as one of my classmate mentioned that I have no patience in reading. However, at a glimpse of "logical timestamp", I realized that it essentially had the same idea of theory of relativity of Einstein in which the essence is that transmission of message costs time even if by light. In world of digital communication, network transmission is never free of time. Whatever you observe in one end has a logical simultaneous moment at other end until your message is able to reach destination. That is to say a communication connection setup and synchronization of clock begins. So, it is that people in different coordinate may observe same event with a different timestamp with respect to different time coordinate. That is it and no more reading is needed. 
 

26/02/06

I only half-finished this and I want to give it a star.

01/03/06

Yesterday I finally found the bug of my assignment 1 which is not correctly synchronized. It is all due to my misunderstanding of java syntax of "finally" and I doubled the release count of semaphore which invalidate the using of semaphore for synchronization.

03/03/06

In shell, use "exec" and >command& is similar to nice command. ps -A = top. In VC long =int and __int64 is real 64bit integer. In Linux, use long long. In VC, use size_t and use typedef unsigned int size_t; in Linux. When calculating (n,k), be careful integer division divisor in decreasing order.

04/03/06

Yesterday I struggled for whole day for this "revolving door" algorithms. One reason is that I underestimate the difficulty and the major reason is that I planned to port it to MPI. Therefore I used an unusual algorithm---unrank. The small mistake of size of groundset cost me more than two hours debugging which is terrible. You see, I have to pin down the loop among (72,8) which turn out to be overflow of integer. This is exactly why I called myself a idiot because before starting programming I already calculated that even for the largest size of 48, a integer with 64 bit won't overflow. However, I messed up with the length of vector with ground set size of subset. It should be (36,8) which will not overflow.  The MPI version is just a demo of my belief: if given a rank function for a computation job, we can divide this sequential job into parts and distribute them among different nodes. This can also be done along with another paradigm which divide the problem context into different parts which basically create a set of problem with smaller size. And it seems to me these are two different divide and conquer. Yesterday I also meet Mr. R who gives me many information of graphic. It is a revolutionary method in my view.

14/03/06

Even though I wish this conversation can continue, still I have got no time for it. What a pity! It seems that we can only find some free time during the coming summer for this discussion, I hope.

The interesting thing of yesterday is that I spent some time in trying to define a "recursive callback". And finally I realized that this is impossible in current language. For example, I want to define a callback such that it takes an integer parameter and another callback function pointer which also takes an integer parameter and a callback function pointer which also takes an integer as parameter and a callback function pointer which ... Can you do that? Usually a solution to this recursion is a forward declaration, but how can I do it for a callback type?

I hesitate in posting the slightly modified version of minimal-weight because 1. it is not worth another web page for my misunderstanding;2. the result is not available for test7. So, maybe I should overwrite it. Anyway in order to keep it as it is, just give it another page.

A recursion version of permutation generation in order of minimal change.

15/03/06

The big truth I learned these two days.

Sometimes the discussion is more interested than a simple program itself.

16/03/06

For a while I thought there were full of idiots in "sun.com" because many of its tutorials are unbelievably wrong. For example, when I take a first glance at its many repeated "hello-world-like-tutorial" in namingcontext, I thought I must have jumped to conclusion too fast because it is such an obvious mistake in "bind_new_context". And the guy who copy-paste tutorial must have no idea what he is doing because it reveals that he has no sense of tree or whatever data structure. Then I tested and convinced myself that in the countless examples in sun.com, there are many work done by those idiots in this seemingly-impressive company which I considered to be a advertisement-successive-only type. It wasted me nearly one hour to test his ignorance.

23/03/06

In area of comb. algo., there are only two types of players: genius or ingenious ones. As for Knuth, I really don't know which type of player he belongs to. I remember a trendy saying in China which I heard a few years ago when I just began to study computer science. It is said that programming is just coding and it is the lowest type of work in computer science. However, if those who holds such kind of belief would spend some time reading the notes of Knuth, surely they may change their view. Basically there are different types of programming in real life just like cooking in real life. A house wife goes to supermarket and shops a half-finished dinner. She follows exactly the step in a recipe written down from a popular TV-cuisine program. So, such a Saturday-evening-dinner is cooked in a way similar to those described as programming by following well-written algorithms. What a boring assignment.

In order to prove to myself later that I am alive these days, I posted these boring assignments.

And this max clique problem.

27/03/06

Long long ago, SD told me that I was a normal man only when I was working. Now I feel I am only living like a normal man when I am programming. By exaggerating a little bit, I should say I am programming. So, I am.

Sometimes I am proud that I have more than half energy than those who has less half of my ages. However, when I read Knuth's notes and program, I feel depressed because I am sure I don't have more than twice energy than Knuth who probably only has less than twice ages than I have.

"Blade Runner" probably is one of the best science fiction film in the world. I think everyone will be deeply impressed by its breath-taking image and imagination. Do you know the same director also directed "Alien" which is another mile stone in science fiction film. Many people believe that "Zergling" from "StarCraft" is inspired by this film.

05/04/06

In textbook, it says that Gray Code problem is actually a Hamilton-Circle problem which is quite difficult to understand. I try to explain to myself like this: If it is a minimal-change-order or in Gray Code, then the xor of two  consecutive subsets will have order of one. In other words, there is only one element different between two consecutive subsets. Let's take an example of base-set of three. There are only three subsets with order of one: A=001,B=010,C=100. Now let's find all possible pairs whose xor is one of them.

X={000+001, 010+011,100+101,110+111} has xor of A

Y={000+010,001+011,100+110,101+111} has xor of B

 Z={000+100,001+101,010+110,011+111} has xor of C

Observe: 1) If consider each subset as an vertex in a graph and edges are all vertices between "+" in above, finding a minimal change order is just finding a Hamilton circle among these vertices. 2) Although we can start from any vertex in Hamilton circle, however it is easy to see starting from 000 and ending at 000 is the easiest way because it is our convention that a code starts from empty set or zero. 3) If starting from 000, we must four different Hamilton circle. Let me enumerate one of them. (000,001,101,111,011,010,110,100,000). This one is not Gray Code, but it has an extra property which I consider better than Gray Code. Just observe that the result of xor of consecutive two subsets is A,C,B,C,A,C,B which is a little bit more balanced than Gray Code which is A,B,A,C,A,B,A.

06/04/06

Once a month, I spend a few hours thinking about problems in comb. algo. which is always like puzzles to me, especially when I try to understand Knuth's notes.

Sometimes I feel myself like those invincible heroes who can see through nature with keen eyes. Sometimes I wake up and realize what I see is exactly common senses that every one with average IQ can figure out. However, this is the process of understanding because if this never happens to you it simply means that either you can never learn or you never need to learn.

13/04/06

Let me call it a project.

14/04/06

Do you know dancinglink? If you want to understand it, read knuth's paper.

16/04/06

N-Queen by dancing link.

19/04/06

Let me write down what I understand about virutal synchrony after visiting professor.

After I write down what I think, I have new ideas about virtual synchrony and it is more convincing.

11/05/06

Do you know how to make birds fly? Do you know how to make flowers blossom? Now I know! After more than half year I know why my OpenGL library doesn't work and now it works. From now on, students from comp471 would be happy to do no coding at all in assignment! This might be a bad news for professors. I just change one number in one line! To set near plane to be 0.5 instead of 0.0. That is it and I don't know why!

12/05/06

I think I figure out the setup of wmpi2. First of all, you must reboot after updating licence key and this is known for anybody except me. Secondly, WMPI2 is stupid because it needs you to setup identical executable file in all nodes. I mean why WMPI itself copy this executable to all nodes like lan-mpi which is easy to do!!! The third thing is that wmpi cannot pass firewall and I have to turn it off. The fourth thing is that run it from "mpiexec" and setup wmpi.clusterconf file and "program name".pg2 file properly. There are corresponding environment variable to setup the path of these files. And the executable copy job can be done by a batch file with shared file folders in each nodes.

13/05/06

Talking with RG over phone for one hour and really getting a lot of help. First, I don't need that glew32.dll because the extension of OpenGL I am querying is not located in it. The extension implementation is within hardware driver, i.e. display driver. The "glew" only helps easing querying job and this is not absolutely necessary as long as I have those extensions declared within "glext.h". (I should say this header file is continuously updating by manufacturers.) Second, RG tells some idea of his code and it saves me a lot of time to understand them. I find out it is always difficult to understand other people's code, including my own code. View frustum culling is implemented already and occlusion culling is not. (I need to read papers about this.) Third is that the "glQueryXXX" is no good according to RG. What else? A lot of bits and bytes which may seem trivial but they may puzzle you for quite long time. For example, his color of texture mapping is set in those shading language file and that is why I cannot find them in code. Those shading language is written in ARB assembly language. Scanner generates separate "texture file" for color of points. And he suggests me to dump all collected result into disk for the time being. And first of all, try to get dirty with my hands of coding otherwise I may never realize there are countless problems awaiting ahead. It proves my "road map" report is a good idea to write down what I understand to get confirmation from professor. Then what am I waiting for?

18/05/06

I don't know how many students have ever given a thought of why OpenGL chooses to use column array as transformation matrix instead of usual row array in C/C++. After a few seconds of pondering, I think I got it. It maybe due to the possibility of hardware. For example, some powerful graphic cards have special "vector register" which is similar to those "super scalar" architecture of super computers. By using column array, it will be very natural for the vector register to load operand in consecutive memory access.

|c[0]  c[4]  c[8] c[12] |     |v[0] |
|c[1]  c[5]  c[9] c[13] |     |v[1] |
|c[2]  c[6]  c[10] c[14] | x  |v[2] |
|c[3]  c[7]  c[11] c[15] |     |v[3] |

is equivalent to [(c[0],c[1],c[2],c[3])* v[0], (c[4],c[5],c[6],c[7])*v[1], ...]

Please note that c[0],c[1],c[2],c[3] is just a vector in consecutive memory address, and it is usually the requirement for vector-computer to access one vector of data in one access. Otherwise the performance gained by vector register operation will be defeated by multiply memory access.

19/05/06

Finally I think RG is correct with the matrix multiplication and I am wrong. This is a typical lesson which I have learned from time to time. That is, don't jump to conclusion too quickly! Please note, no matter what kind of matrix representation OpenGL is using, still we must follow the basic way of matrix multiplication or linear transformation rule. That is, transformation matrix is at LHS and vertex or coordinate vector is at RHS. Then each row vector multiplies the "transposed" vector to get a new vector. (Isn't this too trivial? However, I just get confused to which one should be transposed, the matrix or the vector.) Even though OpenGL matrix is using column-major matrix for optimization of vector-register operation, still we need to follow this basic rule. That is to say, suppose we have a C-array matrix C=(v0,v1,v2,v3) in row based 16 float array such that v0=(C[0], C[1],C[2],c[3]), v1=(C[4],C[5],C[6],C[7]), v2=(C[8],C[9],C[10],C[11]),v3=(C[12],C[13],C[14],C[15]).  Also assume the coordinate vector of vertex is v. Then what OpenGL is doing is to use the transposed matrix of C (without actually doing the transpose, it is logic! And this is where I get confused.)  to do the multiplication. Let's say T=transpose(C) = (u0,u1,u2,u3) where u0=(C[0], C[4],C[8],C[12]), u1=(C[1],C[5],C[9],C[13]), u2=(C[2],C[6],C[10],C[14]), u3=(C[3],C[7],C[11],C[15]).

Then, the actually result of transformation is equivalent to

T*v = u0*v+u1*v+u2*v+u3*v

And please note that the total 16 multiplication + 12 addition operation becomes 4 vector multiplication + 3 vector addition. In those super computer or special CPU like some powerful GPU, vector operation takes roughly the same time as common operation in common CPU. So, this is what we learned about parallel in comp326.

Finally just keep in mind, if you are calculating youself matrix transformation in "geometry" sense, and you want to call "glLoadMatrix" to overwrite OpenGL matrix, you have to transpose it first.

Actually I learned this fact in comp471 and I even have used in my library. Still I get confused when I read RG's code. Sigh...

24/05/06

Made a small tutorial slides for synchronization. This actually makes previous one easier to be understood. And there is some crazy tips for C++ programmer who uses java for the first time.

27/05/06

I should say VBO is really a tricky part and the tutorial code I read in web is not trustworthy. Let's always concentrate on official OpenGL doc's only!

31/05/06

I think I really feel happy by teaching or helping others with whatever I have learned.

20/07/06

To prove I am still alive, you can check those simple quick tips on project. Compared with this project, my current research project is much more touch in the sense that you never know if it works or not. So, the most frequent word I am using is "clueless".

01/08/06

One of a good thing as a marker is that you can learn from what you marked. Even though I dislike java language very much, I have to admit that some flexible syntax is a bit intriguing. For example, I now know that you can create a thread either by inheriting from class Thread or by extending Runnable interface. Of course this is trivial in OOP. However, the surprise is that some student declare their "so-called main class" as an implementation of Runnable. At first glance, I thought it was impossible because "main" function is the only entrance point of program and the "main" function will automatically become the "main" thread. Then how can you make it a multi-threaded? After a couple of minutes rendering, it becomes so simple. You see, the "main" function is just a static method which has nothing to do with the "enclosing" class. i.e. It happens to reside there. Within the static "main" function, you can "new" an object of your "main" class. As for the "starting" thread issue, it depends whether you want your class to be inherited from "Thread" or not. If your class is "extended" from "Thread", you can call the "start" method at its constructor or after your "new". Or you can simply "implements" the "Runnable" interface and pass your class object as parameter for "new Thread(myClass, "start Thread");"

Actually everything is so trivial and the only difficulty comes from my C-syntax because it never occurs to me that I can "start" a thread within itself which is impossible conceptually. You see, if you create a thread with "CREATE_SUSPENDED", then you can only "ResumeThread" from other thread. However, in java treating thread as a class, the part of constructor will always be executed even though the thread hasn't been ready to run. And it is there we can call "this.start()".

09/08/06

I must have made a fool of myself! The compression algorithm used for fax or T4 is using one byte for color and the other byte for length. And I take for granted to combine the two bytes as one byte. That is to use first four bits as color and the rest four bits for length. Do you know what happens? The compression rate is extremely low! You see, the idea is to use more bits to represent a longer length. And using one byte to represent a few different color is a little bit inefficient. However, the most important thing is to use more bits for a bigger number to represent longer length!

14/08/06

10% of luck, 15% of skill, 20% of concentrated power, 5% of pleasure, 50% of pain, 100% reason to remember the name.

That is the lyric of "PLU" for "starcraft" and it also suits for programming.

30/08/06

They called it "HowEasy" and I didn't make it right.

07/09/06

To be blocking or not to be blocking, this is a problem and it is a problem of deadlock or not. I spent almost a whole day to change communication mode to be non-blocking. However, there is some limits because it is like the "logic time" in distributed system. Some events must go before some other events. Therefore some asynchronized communication have to be synchronized at some stages. It seems that I am practicing the "distributed system design" in my real life.  

30/10/06

How many lines of code do I make every month recently? I don't know. Maybe less than before and definitely they are all unpublished here. First, I am doing the big project of parallel computation which is not suitable to be posted here. And it is keeping updating. Secondly when you write one big program instead of a series of small program, the situation is different. That is to say, the difficulty of coding lines is different. Surely I am learning. Today I learned how to wakeup a remote computer which is in hibernating or sleeping. It is called "remote-wakeup" or "wake on LAN". I guess this program may be the simplest program I have ever posted here, but the hardware configuration makes it worth posting for memorandums.

 

                               back.gif (341 bytes)     up.gif (335 bytes)     next.gif (337 bytes)