2006年12月2日星期六

Bach: Organ Works

每次听Helmut Walcha演奏的巴赫管风琴作品时都会不由自主地想,如果我能有巴赫百分之一的音乐天才加上Walcha十分之一的演奏天才,那该有多好啊,多么希望自己能够亲手体会巴赫的世界啊……

2006年8月19日星期六

一点想法

大多数一般的软件产品在发布其初版的时候就应该考虑到以后更新版本的问题。不应该在初版时就公布过多的不成熟的功能,这将直接导致更新版本时负担过重。用户一般不习惯看到 ChangeLog 中有某功能被移除的记录,即使是免费软件也同样,商业软件更可能让用户觉得花钱升级还不如不升级。当然,如果初版一来就有较强的完整的功能,这也将为软件的前途做出好的铺垫。因此,一切都应该由开发者在着手开发前仔细地揣度的掂量,自己的团队有没有能力完成所有功能,市场有没有对这些功能的兴趣。

2006年7月24日星期一

考研班

这段时间上考研复习班,每天早上7点钟起床,晚上7点钟才能回到宿舍,真是很累。不过好歹也养成了一天三顿饭的正常习惯(原来都是一天一顿……汗)。中午也很难好好的休息一下,教室的环境比较恶劣。还是能充分地感受到当时高考时候的那种氛围,每个人都在为了一个考试努力奋斗,为了考上一个好的研究生院而奋斗,而我在中间就感觉像是一个异族,和高考一样,对这一切都放不开,自己明明不愿做,但对这一切有都不愿真心实意地投入,这种心态和准备TOEFL和GRE确实还是不同的。现在还是存有疑虑,怕两头都抓,到头来两头都抓不住啊。

后天就结束了,可以回家啦!

2006年7月9日星期日

C 与汇编代码结合

花了近一个星期,研究了一个看起来初级得不能再初级的问题,刚才终于成功了。就是用汇编写一个函数,导出到一个 C 程序里面调用它。想得很简单,不外乎就是 .asm 和 .c 分别编译成 .obj,然后链接。谁知问题多多。

汇编我用的是 NASM (http://sourceforge.net/projects/nasm),代码如下,实现一个类似 memcpy 的函数(myMemcpy.asm):

global _myMemcpy

;segment myMemcpy class=code

_myMemcpy:
mov eax, esp
push cx
push ds
push es

mov cx, [ss:eax + 12] ; count
mov ds, [ss:eax + 10] ; src segment
mov si, [ss:eax + 8] ; src offset
mov es, [ss:eax + 6] ; dest segment
mov di, [ss:eax + 4] ; dest offset

xor eax, eax
mov dx, es
mov ax, di ; return value is in dx:ax

rep movsb

pop es
pop ds
pop cx
retf

返回值存于 dx:ax。

C 代码如下,用 Turbo C 2.01 编译(test.c):

#include >stdio.h<
#include >stdlib.h<

extern void* myMemcpy(void* dest, void* src, int count);

main()
{
const int c = 5;
char* a = (char*) malloc(c);
char* b = (char*) malloc(c);

sprintf(a, "Dest");
sprintf(b, "Src");

printf(myMemcpy(a, b, c));

return 0;
}

如果运行正确,则会输出 Src。

NASM 汇编语句为 nasmw myMemcpy.asm -f obj,没什么好说的。

C 编译语句为 tcc -mh -c test.c,此处的 -mh 表示选择 Huge 内存模型,而其他的内存模型都不可行。如果用 Small 或者 Tiny 模型会产生错误:

Fixup overflow in module TEST.C at _TEXT:0036, target = _MYMEMCPY

原因可参见 Coping with 'Fixup Overflow' messages.,而 Large 模型(-ml)会在程序结束前的一个 call 产生错误,错误代码 36。

链接语句为 tlink /x test.obj myMemcpy.obj lib\c0h.obj, , , lib\ch.lib ,c0h.obj 和 ch.lib 对应 Huge 模型的库文件。

如果在 myMemcpy.asm 没写 segment 语句,NASM 会自动把 _myMemcpy 分配到 __NASMDEFSEG 段里去。segment 语句后面的 class=code 会告诉链接器,这个段一个代码段。可以在链接时把 /x 改成 /s,生成详细的 map 文件,里面记载了每个段的类型。当然,这个 segment 语句不是必须的。

关于外部函数的声明,Coping with 'Fixup Overflow' messages. 里面提到可以写成

extern void (far * far myMemcpy)(void* dest, void* src, int count);

这样,产生的代码(可由 tcc -S test.c 产生)为

mov ax,seg _myMemcpy
mov es,ax
call dword ptr es:_myMemcpy

而一般的声明方式产生的代码是

call far ptr _myMemcpy

两种方法我都试过,不过似乎只有一般的 call far ptr _myMemcpy 可以正常运行,也不会产生任何链接错误或者警告。简单才是美嘛。

我这里生成的 exe 文件,程序的实际入口是在相对入口地址偏移 F8 的一个 call,用 W32Dasm 打开可以发现那是 call 0000:0000,也就是在 call 前的代码运行时修改了这个 call 的实际目标地址。而 call 里面的代码就和 tcc -S test.c 生成的 test.asm 类似了。

虽然简单的一个小程序,但遇到问题还是折磨死人。不过也好,幸亏有这些问题,我也学到很多关于系统底层、可执行文件和调试方面的知识。

2006年7月8日星期六

夜思

自习回宿舍,夜阑人静,耳闻贝多芬的钢奏,信步所至,百感交集。忽然想到,这奇妙无比的感觉虽然现在就在我身上,这无可替代的享受虽然现在还属于我,但它决不会永远地持续下去,即使我现在就站在原地依依不舍,夜阑总会被白昼驱赶,人静总会被秩序打破。这享受也只能属于我一个人,不可能同另一个人,另一个女人,共同拥有和品味。想到这里,本欲放声痛哭,奈何无泪可出。抬头望月,回想这三年半独立的生活和种种遭遇,还不如一个释怀的苦笑来得痛快。行至湖边,希望拥有一架钢琴、希望能自己来创造快乐的信念越来越强烈,挥之不去。

虽然音乐绝不是一个人唯一的快乐源泉,虽然肉体一样需要得到满足……

回到宿舍,又是一片乌烟瘴气。

2006年7月1日星期六

《忏悔录》读后

一个多月没更新了,GRE 和期末考试是主要原因。同原来一样,在最忙的时候还是忍不住去找了一本书来读。上次在厦门的书店就看到了这本《忏悔录》,回来就在图书馆借了回来。

今天晚上刚看完了第二部,总的来说有两点感想:

1) 世上没有毫无道理的无理取闹。从书中的注解和安德烈•莫洛亚为1949年法国勃达斯版的《忏悔录》写的序言中看,卢梭在他的作品中所表达的很多疑惑和指控其实都是缺少根据的。而他所不能理解的百科全书派的朋友们变成了他的敌人,他自己的所作所为在其中所占的地位也应该是不可忽略的,如安德烈•莫洛亚所写到的,“他,一个聪明的公民,一个与道德为伍的朋友,一个对不纯洁的享乐的蔑视者,一个文明的敌人,征服了巴黎。接着,这个戏剧的反对者却为宫廷写了一部歌剧。…… 这位发表最著名的教育论文的作者却把自己的五个孩子全送进了育婴堂,或者至少还为此而夸耀。他就这样给自己的敌人提供了致命的武器。” 即使安德烈•莫洛亚的论据中也有言过其实的部分,卢梭所宣扬的和所做的还是反映出了很大的矛盾之处,而这可能正是他的朋友们所不能容忍的。我想,但我自己的朋友对我的态度有所改变而我又有所发觉的时候,我应该首先在自己身上找原因,虽然这往往是一项异常困难的任务。

2) 从这本书里面,我至少认识到,从小学开始就如雷贯耳的这些伟人的名字,他们的主人在真实的生活中却和任何一个有血有肉的普通人一样,有虚荣,有胆怯,有错误,有斗争。卢梭,这个自由的坚定守护者,教育理论的提倡者,竟也是一个多愁善感的、没有亲手抚养过孩子的人;狄德罗,被称为“哲学家”的哲学家,被卢梭认为是搞阴谋的人;而伏尔泰,不仅是卢梭对他怀有无法和解的憎恨,迟到了几十年的莫扎特对他毫无好感,即使他是法国启蒙运动的主要人物。时间就是一个大的筛子,会把(它认为)应该被人记住的人留下来并且美化他,把其他的人都抛进历史的长河中。一个人真正的面目往往和我们能够了解到的是迥异的。

2006年5月10日星期三

介入别人的生活

我一直认为,我希望介入别人的生活,亲近他们,无论他们是男人还是女人。同时,得不到成功的原因也应该是别人拒绝我的介入。问题在于,如果我坚持,进一步采取行动,我多半就能最终成功,而事实上我却没有这么做。看起来我好像喜欢孤独而黑暗,因为孤独和黑暗意味着深邃和独立。然而我内心告诉我,我并不喜欢,我试图避免,却又不知道如何改变。

我开始意识到,并不是别人拒绝我的介入,而是我不愿别人介入我的生活,虽然这两者看起来很相似。一位女生请我吃饭,我习惯地产生一种警惕感,害怕她进一步地介入我的生活,改变我的生活。按理来说,这种感觉一般应该是女生产生的,对于男生,有女性青睐(我不讨论女生的实际意图,假设她是确实青睐于我)一般都是好事,我却本能似地感到畏惧。小时候的痛苦回忆每每在关键的时刻起作用,告诉我,别人可能会使你原本虽不完美但也还平静的生活从此消失,甚至可能会伤害你。归根到底,父亲在这一切里仍然扮演了至关重要的角色。我不知道如何去改变这一切,因为我不愿意去强行改变我自己,所幸我认为每人都有自己的命运,谋事在人成事在天吧。

2006年5月6日星期六

去厦门玩了一转

五一这几天去厦门旅游,今天早上刚回广州。总体感觉厦门确实是一个不可多得的好地方,水好,山虽然不高也不错,最重要的是,人也好。

给我感受最深的有两样:第一件,鼓浪屿的小巷们让我重新找到了小时候成都的熟悉而又陌生的印象。在那里,家家户户都是一排平房,一扇面朝街道的带有门槛的小门,而里屋也因为缺少光照而显得黑乎乎的,除了差了一个天井,活脱脱就是爷爷奶奶老房子的翻版。而那些街道也是一块块石板砌成的,一天一天被本应恬静平淡的人们踩着,因此我也不止一次责备包括我在内的旅游者们打扰了那些居民们。我不知道他们为什么可以容忍外人介入他们的世外桃源,但如果仅仅是为了钱,他们有一万个其他的途径可以致富。那天晚上路过了一所鼓浪屿上的基督教小教堂,便也进去听了听牧师的布道。很难形容当时的感觉,外面是没有路灯的老街,里面是 10 余位虔诚的信徒,牧师操着并不标准的普通话,手中捧着一本老旧的圣经,一切都显得是那么的和谐和安静,似乎时间又回到了 10 余年前的某个晚上,某个记忆深处的晚上。

第二件,厦门人,至少在我所能接触的范围内,非常的好客,非常的让人感到一种温暖。印象最深的几个人有:我们的房东,一个退了役的军人,处于下岗状态的服装店老板。对于我们两个陌生人(我和同去的朋友)的几次麻烦的要求不厌其烦,对我们房租几乎不收押金,而一天晚上的促膝长谈也很大程度上拉近了我们的距离。晓风书店的几位店员,首先晓风书店(厦大外不远)是我见过的品味档次最高的书店之一(在这里可以轻易找到很多大书店找不到的数,而要找所谓的“世界名著”则很难),店员们对读者的要求总是十分热情地帮忙,而当我问及他们为什么不扩大书店的规模时,他们和我想到的共同答案也是,在可能获得更多利润的同时将不可避免地降低书店的档次。云香茶叶店的沏茶小姐,从她熟练的沏茶技巧和沉稳大方的气质,我觉得茶叶店缺少了她将很大程度上降低品茶者在这里享受到的那种艺术气息。厦门国际青年旅社的人们,老房子改造的旅社,和鼓浪屿的老街有着异曲同工之妙,在这里,原本素不相识人们就好像在一个大家庭里一样,很容易感受到弥漫在空气中的和谐。

总之,在厦门,在与人的交往中人们可以很大程度上放松平常的警惕和距离感,只要你愿意,几乎人人都是朋友;而在与自然的接触中,人们可以充分体会到自然与人的和谐共处,当然也少不了自然本身之美。

2006年4月30日星期日

PE Loader 有所突破

想了一个办法,把 Loader 宿主程序的 ImageBase 在链接时设到不是 0x00400000 的地址,那么被运行的程序就可以在 0x00400000 安家了。

今天花了很多时间来修改导入表的程序段,加入了 Forwarder 导出函数(比如 WSock32.dll 中的导出函数 WSAStartup 其实只是 WS2_32.dll 中的 WSAStartup 的一个引用)的导入程序段,现在基本上可以保证所有导入函数能够被正确导入。

现在的问题是,即使被运行程序的 ImageBase 正确了,被导入的 DLL 们也无法保证他们的 ImageBase。一般来说,很多 DLL 的 ImageBase 都处在很高的内存段,而且相互之间很可能会重叠,遇到这些情况,被导入的 DLL 就必须挪位置。不幸的是,很多程序里面给出的访问地址就是以默认 ImageBase 的值为参照的,所以肯定会出错。我还想不到什么办法来解决这个问题。

更奇快的是,我现在一调试程序,整个 Windows (Windows XP SP1)的所有图标都没了,然后陷入半死机状态,所有程序无法运行。我发现是只要我一装载 exe 文件到 0x00400000,就会出现这个问题,完全让人摸不到头脑……

关于调试器,我找不到合适的、运行于 Windows 下的、开源的 exe 的调试器,而且我发现,就算是 OllyDbg,它也是通过 API 来装载好了一个 exe 后再进行调试的,而我需要的恰恰是在不调用任何关键 API 的情况下装载并运行 exe。看来后面的路还很长。

2006年4月25日星期二

PE Loader 遇到难题

开始做 PE Loader。我的思路是,在自己的宿主程序里读入一个 EXE 文件,将之映像(Image)复制到内存(当然是这个 Loader 宿主程序的内存空间里的某处),同时把相关 DLL 以同样的方式载入,最后跳转(JMP)到 EXE 程序的入口地址,将程序的控制权交给它。我还没有考虑到如果目标 EXE 程序结束后,程序运行指针会指向哪里,实在不行,用一个 CALL 来调用。

现在的进度是,能够将 EXE 读入内存(Section 正确对齐 SectionAlignment),能把所有相关 DLL 载入内存,找到导入函数入口地址并修改 FirstThunk 数组。由于 Loader 宿主程序的映像自己占据了 0x00400000(ImageBase 默认值),所以载入的 EXE 的 ImageBase 肯定会在其他地方。当我想 JMP 时,发现程序中很多地址还是以 0x00400000 作为 ImageBase,所以一访问这些地址就会出错。我现在想不到怎么解决这个问题,想不明白 Windows 的 PE Loader 是怎么考虑这个重定位的,而且我手动把一个 EXE 的 ImageBase 改到 0x00500000,程序一样无法运行。

最大嫌疑是在 IAT 表和 Relocation 表。但很多程序根本没有 Relocation 表,IAT 也在修正 FirstThunk 数组时改过了。网上关于 PE Loader 方面的资料真的很少,更多的都是讲 PE 文件结构(想来这几天把 Iczelion 和 LUEVELSMEYER 的 PE 教程看了不知道多少遍)。我想,很可能为这个 EXE 分配内存时不能用常规的 VirtualAlloc,在 Loader 宿主空间里申请,而应该类似虚拟机那样让其有一个独立的虚拟内存空间。

现在的打算是,有时间就研究一下类似 OllyDbg 的这些调试器,因为它们确实能做到 Load and Execute PE file.

2006年4月14日星期五

GRE 作文终于考完了

4月13日上午终于把 GRE 作文考了,题目比较容易。无论如何,解决一心头大患了(想想为了它规避了多少节课)。现在该准备笔试了。

2006年3月19日星期日

庸俗和高雅

现在,我终于开始意识到,一个人是否庸俗或者是否高雅,这完全是个人的爱好。高雅与否,这几乎完全不影响这个人的生活和工作,这仅仅决定了这个人会有什么样生活方式,什么样的娱乐倾向,什么样的朋友圈,什么样的工作。而同爱好一样,有共同爱好的人们常常会走到一起,同样庸俗的人和同样高雅的人也常常结伴而行,不同类的人往往很难相互理解。

可以肯定,庸俗和高雅就和音乐和天文一样,是完全中性的名词,用来表示爱好的一种。还可以肯定,从很小的时候开始,我就一直在犯一个错误,那就是,我幻想着在某一天,高雅的人们会像启示录里描述的天使们一样从天而降,将庸俗的人们打败。幸好在我 20 岁的时候,我认识到了自己的幼稚。

2006年3月18日星期六

卡夫卡的《谈话录》

发现《谈话录》是一个极为有价值的集子,展现了卡夫卡思想里面的较为浅层的东西,也让我们从另一个角度来认识卡夫卡。我将在下面摘抄我认为精彩的段落:

第14篇:

卡夫卡博士摇了摇头说道:“您别这样做!您不知道,沉默包含了多少力量。咄咄逼人的进攻只是一种假象,一种诡计,人们常常用它在自己和世界面前遮掩弱点。真正持久的力量存在于忍受中。只有软骨头才急躁粗暴。它通常因此而丧失了人的尊严。”

……

卡夫卡抿了抿嘴唇:“您何苦读这种昙花一现的东西?大多数现代书籍只不过是对今天的闪烁耀眼的反映。这点光芒很快就熄灭。您应该多读古书。古典文学,如歌德的作品。古的东西把它最内在的价值表露到了外面——持久性。时新东西都是短暂的,今天是美好的,明天就显得可笑。这就是文学的道路。”

第15篇:

他就此对我说:“您的作品非常清新。您谈得更多的是事情在您身上唤起的印象,而不是事件和事物本身。这是抒情诗。您在抚摸世界,而不是去把握世界。”
“那我写的东西没有一点价值?”
卡夫卡抓住我的手:“我没有这样说。这些小故事对您肯定具有某种价值。写下的每一个字都是个人的文献资料。不过艺术……”
“不过这还不是艺术,”我苦涩地补充道。
“这还不是艺术,”卡夫卡肯定地说,“这种印象和感情的表达不过是对世界的小心翼翼的摸索,犹如还没有睡醒的眼睛。但是这很快就会过去,摸索的伸出去的手也许会缩回来,仿佛它触到了火。您也许会大喊起来,结结巴巴地乱说一通,或者咬紧牙关,睁大眼睛。不过,这一切都只是言论罢了。艺术向来都是要投入整个身心的事情,因此,艺术归根结底是悲剧性的。”

第24篇:

我摇摇头:“不是奇迹,博士先生,这是完全正常的。我不相信世界的毁灭。”
卡夫卡微微一笑:“这是您的责任。您还年轻。不相信明天的青年就是对自己的背叛。人要生活,就一定要有信仰。”
“信仰什么?”
“相信一切事物在一切时刻的合理的内在联系,相信生活作为整体将永远延续下去,相信最近的东西和最远的东西。”

第30篇:

(卡夫卡)他说:“我指的是公正的衰落。我们大家都参与其中。我们感觉到它。许多人甚至知道它,但谁也不愿意承认我们生活在不公之中,因此我们发明遁词。我们谈论社会的、心灵的、民族的以及其他种种不公,为的是美化那唯一的罪责,我们自己的罪责。不公这个词是什么意思?‘不公(Ungerechtigkeit)’是‘我们的公正(unsere Gerechtgkeit)’的连写。只对我一个人使用的公正是暴力准则,是不公。社会不公这个名称只是无数掩盖真相的手段之一。”

第33篇:

(卡夫卡)他说:“……德意志人肯定不读,因为他们不愿承认,不愿理解,不愿阅读。他们只想占有,只想统治,而理解通常只能是占有和统治的一种障碍。不认识他人,就能更好的压迫他人。这时没有良心的谴责。正因如此,没有人了解犹太人的历史。”

第36篇:

“音乐产生新的、更加细腻、更加复杂、因而更加危险的刺激,”弗兰茨·卡夫卡有一次这样说,“而文学则要澄清纷乱复杂的刺激,把它上升为意识,加以净化,从而赋予它人性。音乐是感官生活的成倍增加。而文学则压制感官生活,把它引到更高的层次。”

(对于卡夫卡这段谈话,我不是太理解,不排除翻译的问题。为什么“音乐是感官生活的成倍增加”?在我看来,古典音乐中的美和音乐中反射出来的作曲家对生活的思考,只能是对生活的在更高一个层次上的阐述,而非简单的感官生活。而流行、摇滚这些音乐比古典音乐更能产生感官上的满足)

第41篇:

“您是说,这幅画像照片那样逼真?”
“您想哪儿去了?最能欺骗您的莫过于照片。而真实是心灵的事。而心,只能用艺术才能接近,”弗兰茨·卡夫卡说,“真正的现实总是非现实的。您看看中国彩色木刻的清、纯、真。能这样的话,真是一种本事!”

第50篇:

弗兰茨·卡夫卡说:“上帝只能让每个人自己去理解。每个人都有他的生活和他的上帝,都有他自己的辩护人和法官。神父和礼拜只是心灵的已经倦怠的体验和拐杖。”

2006年3月6日星期一

饥饿艺术家

同其他的艺术家一样,饥饿艺术家其饥饿的本质在于更深层次的饥饿,无限的饥饿。而这本身就存在着矛盾,现实的有限和理想的无限在不完全理性的头脑中一定会产生痛苦,这是饥饿艺术家的第一层痛苦。

饥饿艺术家总是为别人无法理解他的艺术,怀疑他的艺术而感到痛苦。这是饥饿艺术家的第二层痛苦。需知道,艺术,特别是深层次的、前卫的艺术从来就不是普通大众所能接受的。饥饿艺术家把他的艺术建立在“别人”而非“自己”上本来就是错误。当然,人处在社会,本能地需要得到社会的认同,这是极其自然的事。有些人注定生下来就是要受一辈子苦的,尼采,卡夫卡,他们在他们的那个时代是太超前了,但如果放到我们现在这个时代来,他们就不一定和你我有多大不同了。

好在饥饿艺术家在临终时似乎已经放弃了他的第二层痛苦,他“假如找到这样的食物……(我会)像你和大家一样,吃得饱饱的”。它已经放弃了对于艺术家来说极为重要的虚荣心和自豪感,宁愿过着和平常人一样的生活,也决不放弃对艺术的追求。这个刚才还看似矛盾的要求并不是不能做到的,只是,要么你作为一个“艺术家”,去追求平常人的生活,要么作为一个“平常人”,去追求艺术。看来,卡夫卡在晚年仍然抱有悔意了,后悔这一辈子这么舍弃一切追求艺术了?不管怎样,卡夫卡的一生是悲剧的,他用他一生的快乐换来了这样不朽的诗篇。

然而对于艺术,我越来越不明白,难道艺术不是美好的东西吗?难道不是令人愉悦的东西吗?既然真正的艺术总是不会得到大众的理解,那这样的艺术家难道不是在走一条绝路?庸俗的小说、相声可以赚很多钱,而高雅的古典音乐却常常被人们视作 YY 的对象,从这一点看,艺术从一开始就只是个人的东西。把追求艺术作为职业,这注定会是悲哀。

2006年3月4日星期六

无法避免的

我注视着那两只鸟,在想,它们无忧无虑的叫着,多令人羡慕啊。为什么人就做不到那么无忧无虑呢?常常听人说,傻子是最快乐的,他们不懂人世间的纷争,只活在自己的理想世界里。当然,在我们现在这个世界里,几乎没人愿意去当一个“傻子”,但是,如果所有人都是傻子呢?如果人从来就没有进化过,永远就像鸟儿们一般呢?

当然,这是不可能的,事物总是发展的,宇宙不可能永远保持一个平衡的状态不变。如果人类没有进化,可能在我们那低级的脑袋里面还是愿意自己成为自然界的领头羊。人类的进化是不可避免的,既然它已经发生了。

我不想知道人世间的那么多复杂的事物和关系,不想知道那些丑恶的东西,但是为了生活得更好,我必须比别人更狡猾。同样,别人也是这么想的,这样,人变得越来越聪明了,事务也变得越来越复杂了。这种复杂化虽然不是上帝的意愿,自然的结果,但也是无法避免的,这是社会的产物。

很多事情都具有这样的特点,比如核武器。原子里面蕴藏着巨大的能量,这是自开天辟地以来就一直不变的真理,原子能的发现是迟早的事。核技术的发展、核武器的制造虽然是每个人每个国家都不愿意的,但是为了保护自己牵制别人,核竞争也变成了不可避免。

在我现在看来,发明者或发现者,都有权力而且有义务去认清新事物的本质,进而决定将之公诸于世或者私下销毁。不负责任可能会导致另其自己后悔的结果。

2006年2月26日星期日

关于男女之间关系的一点思考

在我看来,男人和女人,最起码都是一个人,而一个人就应该是独立的,自由的,有自己的思想。对于任何一个人来说,他或她只属于自己,而非任何其他人。男女通过婚姻来建立一种约束关系我认为是丝毫不可靠的,因为他(她)在任何时候都有权利提出解除这种关系,这和奴隶和奴隶主的关系是不同的。

孩子是一种理想的约束条件,因为孩子各占有父母的一半基因,也就是说,男人和女人把孩子抚养长大有助于传播他们自身的基因,这是符合人的本能的。但是,大多数情况下,离婚本身不会影响到孩子的生命,所以孩子的这种约束条件看来也不是那么牢靠。

在我没有找到更有力的理由之前,我还是认为没有结婚的必要。和心爱的人白头偕老需要的不是约束,而是理解和尊重等等。当然,从法律上来说,要终结婚姻这种关系可能还需要很长时间,甚至是永远。

双簧管的困惑

昨天重新拿起放下了几个月的管子,突然发现竟然没有一首自己急切想吹的曲子。可能是现在为学习而忙碌,可能是太久没有接触多少古典音乐,也有可能自己已经深受同宿舍广东人的影响(指流行和摇滚方面),但无论如何,基本上没有那种久违的感觉,那种热情。

双簧管有几个比其他乐器更困难的地方。一是对乐器要求很高,好乐器和差乐器的差别比其他乐器还要大些。二是对簧片的要求极高,这一点从双簧管的名称就可以看出来,双簧比单簧更难控制,所以簧片的材质、厚薄、形状都要和演奏者相适宜,像我这样的业余爱好者很难掌握火候。三是双簧管的可用的乐谱太少,这一点和钢琴比较最明显了,也是没办法的是,谁叫别人的表现力强呢?

到我目前这个地步,只有两条路,一是进入专业的练习和演奏,成为职业演奏者,或者就此永远停留到现在这个水平。我只能说,如果不是我的这个判断有错的话,就是双簧管的可发展潜力太小了,至少对我来说是如此。

还是希望在以后有了固定工作和固定住处后,能学习钢琴。

2006年2月19日星期日

初窥 OpenGL

最近买了一本 OpenGL 的书,似乎很有名,叫 《OpenGL 超级宝典》(OpenGL SuperBible)。差不多看到第四章了,感觉书写得不错,翻译也过得去(经常去 China-Pub 看到那些人在骂译者翻译得烂,当然在西红柿和鸡蛋中也能偶尔见得到一两本说翻译得好的。不过总觉得,如果我这里写“翻译也很不错”,那就有一种鸡蛋不久将临的感觉)。

因为原来也学过 DirectX,所以看到这本书时,还是燃起了对 3D 编程的热情,总还是想比较一下 OpenGL 和 DirectX。很早就听说过 OpenGL,也总是听闻它的效率在很多时候要高于鼎鼎大名的 D3D,或者至少不会比 D3D 更低吧。不过在心中总还是觉得 OpenGL 这个名词闪耀着神秘的光芒,一直不敢去碰它。当然,很大的原因是出于对 C 语言本身的畏惧的。以前用 DirectX 也是用的它的 Managed 版,用 C# 编。现在想起去年拿着自己一个人编了 3 个月的所谓的 “3D引擎” 去参加软件大赛,结果灰头土脸回来的感觉,一方面觉得自己太过骄傲和不自量力,另一方面也觉得 DirectX,即使是 Managed DirectX 也还是太繁杂。就是到参赛的当天凌晨,我都还在为怎么样打开全屏模式而不会出现 Exception 而苦恼。总之,DirectX 给我留下的印象不好。

不过话又说回来,那段时间也不是白学了,至少我对 Viewport, Cull 这些名词,矩阵操作,纹理和碰撞这些概念都有了实际的接触。现在再来看 OpenGL,发现好像一切都还是那么亲切。我不是专门搞图形的,对那些复杂的数学不仅是小学,就是现在大三了都还是既不喜欢也不强悍。但我是一个游戏迷,我想这个理由就足够我去研究图形接口了。

OpenGL 和 DirectX 最大的区别,我觉得在于 DirectX 是微软一家发明和维护的技术,而 OpenGL 仅仅是一系列的接口(API),具体实现是各个公司和个人(如果可能的话)去做的。这样,同一个 OpenGL 游戏使用微软的 OpenGL 库和使用 SGI 公司的库可能有很大的区别。(总还是感觉微软的 Win32 API 是那么地名不副实,自己写一套借口,自己实现,还不准别人去实现,这叫什么接口?不就是一个 Public 函数么?)

OpenGL 的结构好像比 DirectX 更简洁,简洁到让人怀疑它能不能完成程序员们需要的功能。打个比方,DirectX 就像 C++,面向对象;OpenGL 就像 C,面向过程。大家都知道 C++ 是 C 的超集,但没人怀疑 C 是最适合系统编程的语言之一。从第一印象来说,比起 DirectX,我更喜欢 OpenGL(大家都知道人们往往对第一次接触的东西印象最好)。正如 OpenGL SuperBible 里面讲到的,“John (Carmack) 证明了为了完成相同的任务(渲染一些三角形),OpenGL 只需要使用 10 行左右的代码,而 Direct3D 则需要 2 到 3 页的代码”。

目前的打算是,有时间用 OpenGL 重新写一次上次软件大赛的参赛作品,倒时候再来讨论 OpenGL 应该更有说服力了。

另外,似乎 Microsoft 已经被踢出 OpenGL ARB 了,看来我也无缘看到书中所说的 “Microsoft 如此大胆地进行误导,为什么它还没有从 ARB 中被踢出来呢?这一直是一个谜,一定存在一些不可告人的秘密” 了。:-(

2006年2月9日星期四

饮茶有感

那天去了大伯家,和他讨论了很多,茶是大伯喜爱之物,自然也成为主要话题。我们谈到茶的分类,茶的加工,品茶艺术,着实令我开了不少眼界。听说大红袍这种茶极其珍贵,非平常人吃得到,我们开玩笑说,等以后有钱有权了,国家首脑来接见,问我们要什么,我们就要大红袍!

谈完茶,我们又来谈茶壶。大伯收集了很多宜兴紫砂壶,全都拿了出来给我看。其中的一把子冶壶,特别独特,全身粗砂,壶身刻着

“画竹多而作书少,人道余书无竹好。偶然作此当竹看,又道竹不如老。子冶自记。”

同时刻有几支竹。壶底有“子冶”二字。另外不同的是,壶盖用的是桥式柄,不像其他的壶都是圆柄。而壶底由三只脚来托住,而非整个壶底。

他说,收藏东西也是有一个境界在里面。一般刚开始收集东西的人都爱收藏那种带彩的东西,比如这个花瓶,彩绘油墨。再忘深里去,一般就越来越喜欢淡雅的东西了,到了最后,一般都喜欢素的东西。再比如说玉。一般的玉都是拿来刻成各种各样的图案,而真正最好的玉肯定是它最自然的形态,为什么呢?因为比如我是工匠,拿到这么好的一块玉,自己肯定知道他的价值,肯定会想,我来雕刻它根本就是糟蹋了这么完美的一件东西。而历代的工匠都这么想,所以那些流传至今仍然保持原始风貌的玉才是极上品。乾隆也算是有点鉴赏力和修养的人了,他拿到那些好玉,从来都是不动,或者只是雕一点,有个意味就行了。

其实,音乐又何尝不是如此呢?想当初,我对约翰施特劳斯的音乐如痴如醉,认为这比那些港台流行歌曲好听得多,有意义得多。而现在,那些 CD 早已束之高阁,取而代之的是曾经认为绝对无法接受的巴赫、贝多芬。现在我认为我比以前要深刻得多了,成熟得多了,我认为巴赫的音乐才具有真正音乐上的美,那以后呢?我还是那么多年时间好活,等到我老了,我又会怎么看待现在我的想法呢?幼稚么?无所谓,这是必经之路。

一切的艺术都是共通的。为什么我在听到大伯谈论收藏时我会想到音乐呢?我觉得在人的大脑里,艺术占据着一个很特殊的位置,它不同于我们一般的生活。每当我接触到那个地方时,总会有莫名的冲动。可以将之理解为虚荣,因为我认为在这个世界上真正接触到艺术的人并不多,而我就是其中的一个。我认为我很幸运,因为现在的我懂得什么是艺术,艺术能带给我什么,因此我才会毫不犹豫地去追求艺术。如果我不是 8 岁或者更早接触音乐,我可能一辈子都无法到达我现在这个水平,因为我会犹豫,会茫然。什么是艺术?我无法告诉你,它就是一种感情,一种和性相媲美的快乐,只能有幸者自己去体会。

临走时,大伯把那把子冶壶送了给我。

我的 Borland 之路

看到 Borland 公司的一篇通告 “Borland to Acquire Software Quality Company, Segue Software; Announces Plan to Divest IDE Product Lines”,其中说道 Borland 准备卖掉他们的 IDE 产品,全力发展他们的 ALM (Application Lifecycle Management) 市场。看来 Delphi 在 Visual Studio 和 Eclipse 的挤压下,最终还是选择了放弃 IDE 这个市场。那么 Delphi, C++ Builder 这些曾经优秀的软件是否将永远离开我们呢?

其实 Borland 并不是没有好软件。记得高中的时候,有一天星期六,我和 Alex 一起去电脑城买 Delphi。当时觉得 API 是一件极为神秘而伟大的东西,而比较熟悉的 VB 在这方面天生不足,强大的 C, C++ 我们又望而生畏。正没个准头时,我突然发现了 Delphi 6。那时我从没用过 Delphi,甚至连 Pascal 都只闻其名。买了一套回来试用,逐渐发现 VCL 库是多么的方便和强大,只需要引用一个头文件,就可以轻松调用 API。这是它让我爱不释手的原因之一。记得那一个学期,就靠每天中午本该睡午觉的时候,我就偷偷起来编程序,最后做出了算是我第一个比较完整的程序 Animations' (这个名字至今仍被 Alex 嘲笑,他认为这是世上最好的媒体播放软件)。无论如何,通过 Delphi,我认识了什么是 API,什么是传出传入变量,什么是 Pascal 和 Object Pascal,什么是自建控件,当然,还有 procedure 这个词。在那个时候,我颇为我的 Delphi 可能比 Alex 操得熟而自豪。

就现在为止,我仍然认为 Pascal 是一门非常严谨的语言。在我学习了编译原理以后,我越来越对它有所了解和理解,也发现了它作为传统编程语言教学范例的原因。确实,它的语言特点比 C, VB 等等静态语言更符合编译过程的需要,单就变量声明来说,var 的使用,变量-类型的顺序,所有变量声明的位置集中,这些都为编译器提供了准确和便利。我没有具体研究 Pascal 每一条产生式,但是我想,要在里面找到具有二义的文法应该是不可能的。但是可能正是这些本来优秀的特性导致了 Pascal 本身的不足。Pascal 产生的原因就是为了教学目的,似乎 Pascal 天生就不善应酬越来越多的对灵活性要求越来越大的场合。C 不同,C 生来就是杀手,就是为了写出更好更灵活的程序而诞生的。我想这就是为什么 C 语言 30 余年来还大行其道,而 Pascal 始终未能登入大雅之堂的原因吧。

在我印象中,Delphi 7 和 Delphi 6 似乎没有什么不同,即使在界面上,除了 Splash 外,也几乎完全一样 (这在微软的产品中几乎是不可能出现的,是不允许出现的:))。好像在数据库方面有所加强,不过我承认那时候我对数据库的认识也仅限于 Access。很遗憾,大家都说用 Delphi 不用它的数据库组建就想去了雅典不去太阳神庙一样,我就是这么一个人。

C# 出来了。这个带有 C 字样的语言立刻吸引了我,因为我一直对 C 语言抱有敬畏,即希望接近它,有怕被它拒绝。以前多次的尝试的失败这次在 C# 面前没有出现,原因是,我发现 C# 中有很多东西是在 Object Pascal 里面见过的。比起 VB 来说,Pascal 当然更接近 C 语言范畴,应该说,Pascal 作为了我接触 C 类语言的跳板。直到后来,我认真捧起 《C Primer Plus》,发现 C# 和 C 也异曲同工时,我才算真正学会了神秘的 C 语言。无疑的,没有 Delphi,我没那么容易能走到今天这步,所以我一直对 Delphi 抱有好感。

Delphi 8 无疑令人遗憾。我认为我没有多少权力来评价它,因为我使用它的时间总共不到 2 个小时。从界面上说,Delphi 8 有了很大改变,这让每一个 Delphi 的忠实玩家不得不花点时间来熟悉和自定义。从内容上说,感觉 Delphi 8 是一个 .NET + VCL 的……说好听点,混合体;说难听点,杂种。没有了 Object Pascal,我实在找不到以往使用 Delphi 的感觉。有了 .NET,我又实在找不到我放弃 VS2003 而转投 Delphi 8 的理由。Delphi 8 真的称得上“迈入 .NET 平台的最佳利器,将带给您无穷的潜力与展望。”吗?我觉得设一个投票,看看到底有多少人是从 Delphi 认识 .NET,这最能说明问题。

从那个时候起,Delphi 再也不是不可替代的了,因为它走了 .NET 的道路,这是微软的道路。在 .NET 领域,相信更多的人会选择 .NET 创立者门下拜师,Borland 又扮演了什么样的角色呢?我想,如果微软比作少林寺,那么 Borland 就是少林寺俗家弟子。他不会没有门徒,但绝对没法修得最高深的武功。别人 Microsoft 秘不示人的功夫可是有名的呢!直道现在的 Delphi 2005, Delphi 2006,我都没有再试用过了,看着那成 G 的 ISO,真是怀念当年 1 张 CD 打遍天下的时候啊。

说完 Delphi,在来说说,JBuilder。C++ Builder 我没用过,因为我接触 C 语言比较晚,而 Java,那我就是被逼着学的了。大二分布式的课,老师要求用 Java 写程序。我首先试了那时已经赫赫有名的 Eclipse,发觉和 Dev-C++ 有相同的毛病:调试。不知道那个调试器怎么回事,总是出现意想不到的结果,调个程序跟上战场似的得小心翼翼。没办法,只得再试试 JBuilder。JBuilder 2005 让我比较满意,至少在调试方面我感觉没什么压力。因为我对 Java 仍然持保留态度,所以没对 JBuilder 2005 进行更多的探索。不过有两点很令人不爽:1) 运行个程序还得先手动创建一个 Profile,难道就没有默认的提供选择吗?2) 用 Java 做窗口做界面,其过程似乎还停留在 Pre-VB 时代。这应该是 Java 本身的不足,看来 Java 对 EJB 这类不需要 GUI 的东西更感兴趣。巧的是,这两点微软都做得很好,看来我中微软的毒不浅哪。(我在想,Eclipse 不也是 Java 写的么?它的界面怎么这么漂亮?)

现在,Borland 要卖掉 IDE 了。如果 Delphi 以后消失了,Borland 不再是现在的 Borland 了,又还会有多少人记住这些名字,又能记住多久呢?

2006年2月4日星期六

最近遇到的问题

春节这几天,除了探亲访友,就是解决一系列的 Bug。我发现,用 CreateFile 打开一个分区后,再用 CreateFile 打开同一分区下的一个文件,并修改它,这时,再用 WriteFile 操作这个分区的 FAT,将无法实际写入分区——即使用 ReadFile 读出数据确认确实修改了,但实际数据并未修改。对于这个问题,可以在修改文件之前先用 CloseHandle 关闭分区,再在修改完文件后打开分区。

另外,如果在打开文件(CreateFile)时没有加 FILE_FLAG_WRITE_THROUGH 参数,还会有一点其它问题。经常是在程序中修改了文件内容,再读文件的 Short Directory Entry,发现其中的文件大小仍然是修改前的大小。似乎用 FlushFileBuffers 可以把系统缓存写回磁盘,但我没成功。另外,好像 CreateFile 打开分区,不管加不加 FILE_FLAG_WRITE_THROUGH 都默认是不是用缓存。

总之,感觉通过 CreateFile 直接操作磁盘确实很方便,但是也有互斥上的问题,因为 CreateFile 要求打开分区必须加上 FILE_SHARE_WRITE。通过中断操作磁盘应该就不会有这样的问题,但是那就比较麻烦了。

2006年1月2日星期一

热情与依恋

最近在看《简爱》。刚看到第 27 章婚礼落空那里。想到的一点是,人们常常对某些东西产生热情,在这种狂热的情绪下,人们一般都回顺着自己的感情走,一味的认为“非做这件事不可”,很少或者从来没有去想过“如果不……”的情况。无论对于男人还是对于女人来说,在这种时候失去理智都是很危险的事,而女人尤其危险,因为在大多数情况下,女人扮演的是被动的角色,一旦事情发生的变化,她们往往难以靠自己的力量挽回。

大多数人似乎都很怕去想“如果他(她)想和我结婚仅仅是一时冲动那么会怎样呢?”这类问题。他们缺乏勇于质问自己,怕这样会使本来美丽的幻想破灭。其实,正常人在面对突如其来的好运时都会犹豫,人们早已习惯圣经里面的奇迹决不会发生在自己身上。对于太好的情况抱有怀疑是好事,但是在经过初步的判断而没有发现问题时,大多数人更倾向于放心地享受。侥幸心理几乎人人都有,而侥幸的事却很少发生,以至于发生很多悲剧。

举个例子,大一的时候,我曾经对宗教很感兴趣。对于我来说,要研究宗教最好的对象就是基督教,于是我托在加拿大的姨妈帮我买一本英文的圣经。我承认,对于基督教,那时的我并不比我现在了解地更多,简言之,了解很少,买圣经仅仅是我一时的冲动,这在我拿到那本圣经的两个小时里得到了验证。无疑的,我把这本圣经搁置在书架上很久。问题在于,我虽然不像一个基督徒那样每天捧着它日课夜课,但每逢在小说上或者其他媒体上看到圣经上的名句时,我也一定把它拿出来找到原文。慢慢的,对它了解虽然很少,但总归还是有加深了。

关于这个例子,我想说,对于一个热情,人们往往认为它能保持很久,比如经常听到那些流行歌曲里面唱到的“爱你一辈子”。但事实上,热情总是会在很短时间里面消失,这种时候,大多数情况是这个人认为他当初的热情是一个错误,然后从此不再去关心这个热情施加的对象。但是,在少数有缘份的情况下,他并没有完全抛弃它,取而代之的是长时间里对这个闯入生活的新事物的慢慢的认识,慢慢地找到它(他、她)的价值的真实所在,和当初吸引我们的真正的地方,慢慢地找回当时的热情。

我认为,热情从来都不是没有意义的,重要的是如何去对待它。