November 2009 Archives

November 30, 2009

学校真是太可爱了

我在周三要做一个关于专家系统的seminar,我定的题目是MACSYMA。为了找资料,我从上星期就开始搜索了,结果很多相关的论文都不是免费的。我唯一能找到的就是Joel Moses写的一个相关的历史,其它的很多都指向ACM的Portal系统。我有ACM的学生会员帐号,但有些论文有分类性,必须是相应的子会员才能阅读,学生会员就不行。要注册会员就要多花钱。

今天下午,我在看书的时候,突然想到,我们学校的图书馆说不定有这方面的藏书,于是就用MACSYMA关键字搜索,结果搜到一本。然后看到图书馆网页上,除了书之外,也可以搜索相关的论文等文献。然后去计算机科学的分类下面一看,正好有ACM系统在上面。通过那个链接点进去,然后再搜索MACSYMA,找到了好几页,而且每一篇都可以下载。我呼呼的一下弄了20多篇。

之前我也知道有这么个系统,不过一直没有正式使用过,也不知道学校早就给我们买了集体帐号,那些论文都可以阅读。我在之前遇到过好几次我的学生帐号不能阅读相关论文的情况,但由于那时候想看的论文不是必须要看的,所以就没有继续追究。如果早点知道这个东西就好了。

我喜欢这样的网络环境

这张图是我今天上午上Facebook上截下来的:

chtsai-facebook.png

我觉得这是一个积极的网络环境。可惜在国内,Facebook会被校内代替,蔡智浩想在上面贴自己的Twitter或Plurk估计都很难。后面因为蔡智浩说Facebook没有备份机制,然后别人回复说Facebook的封闭性是它的缺点。当对岸嫌Facebook封闭的时候,我们还在校内上不亦乐乎。

到现在我好像很长时间没有登录校内了。过去经常登录的原因是害怕丢失了同学的消息,后来觉得没必要了,因为很多消息都属于八卦一类的,原创内容也少。我于是就想,能不能从此戒掉校内呢?没想到现在居然成功了,看来校内上的很多信息对我没有用。

大折腾

我在之前说到我想改变网站的目录结构,主要原因是想用MT来把普通网页一并管理了。之前我手工写网页,但太麻烦了,尤其是想建立多个页面的时候。而且一些统计代码什么的也不方便添加。用MT可以有统一的模板,而且还可以用Markdown,正是我需要的效果。我目前来用UseMod Wiki来管理普通页面,但基于安全性的考虑,wiki系统普遍都不支持纯HTML,这样我的页面的表达能力就大打折扣,javascript代码、标签什么的都不能加,所以我觉得我终究要回到CMS系统上来。尤其是MT5会添加一个website概念,所有的blog都是在website下面的,这基本上就是我的需求了。

后来我发现问题不是那么简单的。因为我在开始建立blog的时候,把目录建立在了子域名下了。而主域名似乎和子域名是不相通的。我在MT后台里试了几次,都无法指定把一个blog的文章发布到一个子域名下。我试验过MT4和MT5系统,都无法这样子做。

后来我在另外一个域名下做实验,找到了一个解决方法。就是把子域名在虚拟主机上的目录设定在主域名下面。例如,我在Dreamhost上的用户路径是cnliufeng/,这个主域名指向的目录是cnliufeng/cnliufeng/。过去的blog子域名的目录是cnliufeng/blog/,现在改为指向cnliufeng/cnliufeng/blog/。我在另外一个域名上试过后觉得可以,今天就在这个域名下做了同样的改动。

虽然域名变过来了,但整个blog的链接系统还是老样子。于是我导出了旧的blog,用emacs的查找替换把里面所有的http://blog.cnliufeng.com/给替换成http://www.cnliufeng.com/blog/,然后在主域名下新安装了一个MT4,再导入,然后重新发布一下整个blog就成了。这样一来,老的子域名并没有被删除,通过老的域名来访问原来的网页,但再次在页面里面点击内部链接,就都变成了新的域名了。

当然,这样做损失也很大。但由于我只是给过去的域名换了一个位置,所以就的链接都可以正常访问。但现在应该每个页面会有两个地址。我觉得用301重定向应该可以解决问题,而且可以把原先的PR给转过来,不过还没有研究htaccess文件的写法。新blog我没有使用过去自己做的风格,而是使用了系统自带的Cityspace SF风格,结果中文字体又成了老样子。之所以使用这个风格是因为我想尝试一下三栏的主题。我看一些人的blog,弄的虽然有些“拥挤”,不过仔细看起来感觉也不错。当初通过carol的部落格知道的憂郁馬戲團用的就是这个主题,我看了后挺喜欢,于是现在就用了。我现在MT知识多了一些,因此直接从后台修改css文件,覆盖默认设定,也比较方便。目前页面的中文字体基本上正常了,唯一有问题的就是文章的标题,还是有大小不一的情况发生。后台的字体我还没来得及改,因此现在我写这篇文章的感觉相当难受。好在之前有记录,照着再改回去应该就可以了。

过去我一直用的是开源版本的MT,但试用MT5的时候看到默认的下载就是MT5 Pro。因此我这次装新系统,下载的也是MT4 Pro。目前除了一些细节上不一样外,还没有发现有什么不同。我到现在还是不能正常使用MT5,而今天MT的网页上有新文章说在日本MT5已经正式发行了,而我这里的MT5还是有宽字符错误,真让人吃惊。MT5在欧美将于12月8日发布,现在RC3都还是有问题,我有点怀疑在正式发行之后宽字符错误会依旧存在,我能正式使用MT5还是要等待一阵子。

除了字体设定之外,之前我一直没有对MT进行一些底层的改动。今天趁着新设定一个系统,正好又看到了《通过Cache提升MT基于Tag搜索的速度》这篇文章。我过去看过这篇文章,不过因为tag的速度还勉强可以忍受,而且也不确定会不会给系统带来影响,所以一直没有尝试。今天看了一下需要进行的步骤,下载文件后把相应的文件放在相应的地方就可以了,所以就试了一下。弄好之后,测试了一下,果然有效。tag的缓存时间为一天,也恰到好处。

目前的feed地址依然有效,不过我现在觉得遇到整个系统变动的话feed地址的问题还真是麻烦,早知道当初别停用feedburner就好了。MT的默认feed地址是http://www.cnliufeng.com/blog/atom.xml,我估计将来要整治这一块。如果页面也用MT生成的话,搞个合烧还是不错的。只是这个可能要等到用了MT5之后再说了。

November 29, 2009

我也讨厌修电脑

今天在清理Google Reader的时候,看到了有人分享了这么一篇文章《不停地帮人重装系统是一种犯贱行为》,看标题就让我很心动了,看完了更让我有发泄了一口气的感觉。虽然这篇文章是半年前的,我现在看到也有了写写自己的感觉的心情。

上大学之后,大家开始住校,有同学带电脑去学校,有时候然病毒了无法启动或者想局域网联机打游戏不会设定的,基本上会找我帮忙。开始时是我宿舍周围的人来找我,后来传的广了也给楼上楼下的同学修。那时候我没有自己的电脑,平时接触计算机的机会还挺少的,所以当我有时间我都会帮忙。那时候的问题基本上也不会耗费很多时间,那些同学的电脑里除了游戏就是电影,没有什么重要的信息,所以有问题时大不了重装就好了。反而是一些设置的问题,我倒要自习琢磨、反复实验,好在基本上都能让我蒙出来。我在那时候之前没有接触过局域网,也摸索着让两台电脑成功连起CS来,感觉也不错,主要是觉得长了见识,比如无线路由器的设置我也是那时候从别人的宿舍里“自学成才”的。

来加拿大之后,这种情况有了改变。一是我有了自己的机器,更主要的时我在2007年10月份在本子上装上了Ubuntu之后,就再也没有自己用过Windows。早一些的系统还好,如XP,之后的Vista我就没有正式用过了,一些设置选项根本不知道在什么地方,只能靠经验摸索。有一次我应学长的邀请给另外一个人设定局域网,就搞了一下午才搞成。感觉选项都对,就是连不上,我只能一个参数一个参数的试。经常给别人解决问题后,别人夸我厉害,我都会说:“侥幸”。别人都以为我是在谦虚,实际上我说的是实情。

修电脑的时候主要是盛情难却,都是几年的同学,在别的地方也不一定能帮上忙,能出力的时候就出把力也是应该的。不过有的时候情况确实很让人无语。比如这学期开始的时候,同学搬家后需要重新设定路由器。去了他家后问他的用户名、密码之类的倒是一问三不知,到后来我都懒得回想是怎么解决的问题的了。还有的时候根本是“巧妇难为无米之炊”,系统坏了要重装,却没有安装盘。我也实在是没办法了。

我挺早之前就有一个感觉,当我电脑知识还不行的时候,就觉得没什么难题可以难住我,因此也不管给人家备份,就把人家的资料给弄丢了。到现在是以计算机为专业,理论上说应该计算机很厉害,但实际上却觉得越来越不会修了。与之前的手到病除不同,我坐到电脑前就觉得脑子空了,要干什么都要自习回想一下。我看过一些武侠小说,里面说“忘招”是更高的境界,不知道我这算不算“忘招” :)。

为什么我身边的电脑这么容易坏呢?我也想过这个问题,得出了一个不一定靠谱的答案──电脑不是谁都可以用的。我觉得用汽车来比喻比较恰当,现在私家车很多,汽车现在对于一个家庭来说就像十多年前电脑对于一个家庭一样。虽然你能买得起车了,但也不是说你想开就开的,你要经过训练与考核。Windows的流行对于计算机普及起了极大的作用,它的副作用也很大,就是一个人不需要什么专业知识就可以操纵电脑干一些事情了。而Windows即使做的再简单易用,如果使用不当的话也是容易中病毒的。前面引用的那篇文章也说过,意识比杀毒软件重要。

如果只是Windows,我觉得还不至于导致病毒那么猖獗,从另一方面,盗版也帮了很大的忙。盗版最大的恶行,我觉得是让人们养成了一种唾手可得的心理。知道了一个软件,听说它不错,也不管自己需不需要,就下载安装。有了这样的思想之后,很容易在安装一个从第三方渠道下载的软件就感染了病毒。另一方面,盗版让软件的价格降至几乎为零,也给病毒的流行带来了相当大的基础。试想一下,如果组装了电脑后没钱买Windows了,自然不会有这么多Windows机器,甚至都不会有这么多电脑,怎么会传染病毒?

我的想法可能有点“反动”,不过我觉得是合理的。之前阮一峰写过两篇关于海盗湾的文章,提及了盗版的问题。我看下面有人留言说他喜欢盗版,因为“如果没有盗版,说不定到今天他还不能使用计算机并上网”;还有人说有盗版是因为软件厂商定的价格不符合中国的国情,所以应该盗版。我觉得这些论点都建立在一个基础上,就是我们一定要使用计算机。

我说,凭什么中国人就一定要使用电脑的?电脑不是让人生存的基本要素之一,有些落后国家的人甚至连温饱都有问题,我们却在这里嚷嚷着说软件太贵就要盗版。我读过很多相关领域的人物的故事,比如苹果的创始人之一Woz,在早年自己买不起当时的个人计算机,因此自己买零件组装了苹果。相比而言,我们觉得软件贵的时候却想到了偷,高下立现。事实上,买不起Windows,不是还有免费的Linux吗?又说Linux不好用。这就像你只有10元钱,却嫌路边小吃不好吃,要去偷人家(甚至是吃剩的)法国大餐。而说这些话的人,拿电脑多数是娱乐用的,天天沉浸在游戏里,我不觉得用不成电脑对他们来说是什么损失。

确实有些人说自己的专业不是计算机,不想学相应的知识,但总得有一定的基础吧。不想学也可以,那篇文章里有句话说着特解气:

不是认为自己有钱用正版的操作系统很牛逼么,不是认为自己有钱用正版的杀毒软件很牛逼么?去打他们的工程师电话啊,反正你们已经交过钱的,干嘛去找旁边那个“电脑高手”,那个无辜的Linux用户呢?

中心思想就是,之所以现在这么多人的电脑有毛病,是因为有电脑的人太多了,很多不该有电脑的人,因为电脑硬件便宜、以及盗版,也有了电脑了。玩游戏的话,用XBox、PS、Wii,从来没听说过软件出问题的。电脑毕竟不能过于普及。

November 28, 2009

MT5 Release Candidate 3

之前在MT5 Release Candidate 1出来的时候也写过文章。其实这篇文章也是前几天的事了,只是那时太忙,变在周末整理出来。

我在平时会时不时的去MT的官方网站上看看有没有新产品发布,结果就看到了《Movable Type 5.0 Release Candidate 2这篇文章。本来我没想试用这个版本,因为文章下面的修复错误列表也没有我之前遇到的错误,不过总是抱有一丝侥幸的心理,说不定这次就成了呢。于是我就去ftp下载路径看了看,却发现原来里面已经有了RC3了,就下载下来看看。

我目前有两个域名,所以也不用在我当前的域名下再动什么,放心的在另一个域名目录下面胡搞就可以。MT也支持sqlite数据库,这是我最喜欢的地方之一。我挺不喜欢操纵mysql的,总感觉需要的权限更高,也更麻烦,mysqladmin也慢,而且这个dreamhost也不是我买的,我的帐号只能建数据库却看不到已经存在的,结果目前数据库让我建的有点乱,所以也不太想动。用sqlite正好,只是一个文件而已,不想要的时候删了就了事。

装上了MT后,感觉还是和原先一样。导入文章一切正常,发布的时候依然出现宽字符错误。

mt5-publish-failure.png

不过我觉得,如果把MT5当作一款新的blog发布系统,安装上不管过去的备份,从头开始写,应该是不错的。可惜我之前的文章和留言基本上是无论如何都不能丢的。

我这次又从网上搜索这个错误的提示信息,找到了一个页面,感觉有点解决的思路了。这个页面是一个论坛,一个人用Perl写的程序在调用md5-hex()函数的时候出现了同样的问题,询问解决方案。结果后来他自己发现了解决方法,就是在调用函数之前,先调用一个encode_utf8()函数:

print md5hex(encodeutf8($str)), "\n";

我于是就想,如果把MT的代码中,调用了md5-hex()地方,都加上encode_utf8(),说不定能解决问题。于是我用grep搜索全部文件,找到了几处地方。不过我在修改的时候,意识到调用这个函数可能还要引入什么库之类的,我也不知道具体是哪个库。自己写程序试验了几次,也没确定下来。后来也没有很充足的时间,又想了几个其它方法,于是就放弃了。

我想的其它方法,其实也是碰运气。比如说我先装一个MT4,导入备份后可以发布,然后我从MT4升级到MT5,说不定就行了,结果在MT5发布的时候失败。还有就是装了MT4后,在MT4中导入备份,然后升级到MT5,再导出。然后全新安装一个MT5,把新的备份文件导入,后来也失败了。然后我就想,查看生成的路径,在出错之前已经有了2009以及下面的从11到05几个目录,说明错误是从生成04目录的时候发生的,也就是引起错误的文章在4月份。通过把4月份的文章的状态分别从“发布”改成“草稿”,不久可以确定是那篇文章导致的问题了吗?找到后好好改改文章中的潜在语法问题,说不定就能解决。结果我把全部4月份的文章的状态改了后(MT竟然不能整月选取文章,远程更改好慢啊),再发布的时候确实多生成了几个目录,但又出现了同样的问题。看来有问题的地方不是一处啊,“阴谋”宣告破产。:( 只有等官方改掉这个问题了。

经过几次试用我也对MT5的website之类的概念有了一些了解了。我一直想用MT来帮我生成首页的,所以也加剧了我想升级MT5的念头。现在用的wiki虽然也不错,但不支持纯HTML代码是最大的问题。对于wiki来说支持纯HTML有安全隐患,但对我来说就很麻烦,不能加贴纸,也不能加统计代码了。所以升级是必要的。但如果升级后统一管理,就不能用子域名了,这是一个相当大的损失,也让我一直犹豫。我现在在尝试把子域名的目录建在主域名目录下面,看看能不能同时访问,不过还要等几个小时才能有结果。

不公平

周三我在上网络课之前和坐在我旁边的当地同学聊天。他是我学期项目小组的成员,因为周二我们正式提交了项目,并给TA做了演示,所以我们这次的聊天内容第一次与项目无关。

他这学期学了一门《人工智能》课。我在一年前的这个时候已经学了这门,不过不是同一个老师教的。之前他给我们说,他们的课程结束后要求写一篇人工智能相关话题的论文,我当时感到略微有些庆幸。我们当时没有这么多要求,除了期中期末考试外,就是四次到五次作业了。作业内容除了第一次是 first order logic 外,其它的都是用 PROLOG 来写程序。

而那天我同学告诉我,他们需要在学期最后做一个项目。我问他是什么项目,他说是用 PROLOG 来实现一个专家系统。因为我这学期学了专家系统这门课,那个时候又一直在琢磨 seminar 的问题,因此一听到他的话有点受刺激──我在真正听这门课之前,对专家系统没有任何概念,而他们竟然在学人工智能的时候就要求写一个专家系统了。如果我在一年前修的是他们老师讲的人工智能,我在一年前就已经能写出一个专家系统来了,和我现在对专家系统的认识自然不可同日而语。

除此之外,我在人工智能课上学的似乎并不是完整的内容。我在这学期上专家系统的时候,经常有老师问“你们在人工智能课上没学这个?”的情况。而我通常是没有这方面的任何记忆。当然也不排除是我忘了的情况,不过我对人工智能这门课感觉还不错,虽然不能说当时比别的课用了更多的时间,但接受程度上来说是比别的课更深一些。而且班上不止我一个人,其他人都没有什么印象,这样我忘记的可能性就比较小了。

这两个老师我都上过他们的课。我先接触的是我人工智能老师(姓名缩写为 JB),是一年前跟他学了人工智能课(姓名缩写为 JA),然后是今年初跟着另外一个老师上了面向对象的课。从我之前的经验来说,JA 明显比 JB 更严一些。我们的面向对象课有一共四、五次作业,几乎都是大作业,交作业的时候除了上传程序外,还要把程序都打印出来。一般来说打印50页纸是常有的事。而且最恶心的是,作业是连环着的。也就是说,第一次作业写系统的一部分,第二次作业让你修改你自己第一部分的代码,加上新功能或者用别的方式来实现。老师在发作业的时候会给你参考答案,但是不准你在下次作业的时候用他的程序。如果第一次作业做的不好,自然会影响第二次作业的成绩。我当时就吃了很多亏。他的做法似乎在系里都流传开了,连其他的老师都有耳闻。像我们这学期的计算机组织课的作业也是连环起来的,但之后的作业是不管你之前写了什么代码,都必须在老师的标准答案的基础上写。老师还提到“不像你们的面向对象作业那样……”,迎来了底下同学的不少赞叹。

JB 老师不如 JA 老师这么难搞。他挺有意思的,似乎是德国人,挺壮的一个人,每次来教师都是单手托着一个大约9英寸的小型笔电,连上投影仪的信号线给我们讲课。小笔电上运行着 Kubuntu,但他不运行桌面,只是开一个 kterminal,什么东西都从终端上运行,比如给我们放录像,就运行 mplayer,幻灯片就是 ooimpress,他还是一个 Emacs 的 fan。有时候他会在笔电上展示 PROLOG 程序,需要在笔电上输入很多字。我一直都坐第一排,离讲台最近的位置,所以看到他那对勉强可以用热狗形容的手指,在那个小小的笔电键盘上敲击的样子,感觉很好笑。

其实说是不公平,如果让我选择的话,我应该还是会选给学生负担轻松一点的老师讲课。之前和另外一位当地朋友 MSN 的时候,她问我最喜欢哪门课?我说如果我每天有至少48个小时的话,我可能会喜欢所有的课;但因为我现在每天只有24个小时,所有的课程都会成为一种压力,让我也说不清楚是喜欢还是讨厌了。

November 27, 2009

专家系统演讲

学期临近尾声,我们的一些课程也到了最后的部分。我们这学期的《专家系统》一课从这周三和今天停课了,因为到最后讲的一些只是收集、商业系统之类的东西已经与我们的关系不大了。我们从下周一开始会有一周的时间,让每个听课的同学做一个关于一个专家系统的seminar,这两天停课正好让我们准备。

我之前写过文章讲我目前对专家系统的态度,觉得目前专家系统领域的研究有点像进入了一个死胡同的感觉。现在我仍然这样想。不过,不管怎样,还是要把seminar做好。我之前对专家系统并没有系统上的认知,听了这门课才知道世界上有各种各样、形形色色的专家系统。我们要从中捡出一个来讲15分钟。在课堂上老师介绍过几种专家系统:有用于辅助销售计算机配件的XCON,有为病患开处方的MYCIN,有只能的煮饭工具fuzzy rice cooker,有操纵驾驶日本地铁的专家系统,检验宝丽金光碟封面的系统等等。不过这些方面的系统多数与生活、商业有关,反而与计算领域关系不大,我一直不想往这些方面走。这也是我现在对专家系统负面感觉的原因之一。

老师给我安排的演讲时间是下周三,因此我这个周末就要准备相关的材料。老师在这两天停课的另一个原因是我们可以去找他讨论seminar的选题等问题。我不希望在讲的时候才发现我和别人选了相同的题目,因此决定在这两天去找他一次。昨天晚上开始搜索了一些资料,不过没有我感兴趣的。今天早上起得早,洗完澡后还有40多分钟才要出门,于是我就翻了一下老师之前借给我们的书《Building Expert Systems: Principles, Procedures, and Applications》,其中有一节中有两个表格分别列出了传统的专家系统和比较近期的专家系统,以及它们的作者、作用以及开发语言。我当时非常吃惊的从传统专家系统列表里看到了MACSYMA的名字,一时间眼前一亮。

我第一次听到MACSYMA,还是从王垠的网页那里。王垠当时介绍了一种名叫MAXIMA的代数计算工具,提到了MAXIMA其实就是MACSYMA的GPL版本。说句题外话,其实除了MAXIMA,我有很多计算机方面的知识都是从那里来的,比如Linux、Emacs(我现在的Emacs配置文件里还有很多是王垠的Emacs网页上抄来的),有很多还是第一次听到,比如TeX和MAXIMA。在2005年王垠退学前大概两、三年的时候我就经常看他的网页,当时由于上网费用贵,家里又有打印机,就把他的很多网页都打印了下来,有空就翻翻,一直到现在都珍藏了很多。王垠退学导致了他在技术之外的世界里声名大噪,舆论对他的评价也不一。我倒是一直都把他当作技术人物,我从他的网页上学到的太多了。

第二次听到MACSYMA,是从一篇名叫《Berkeley二十年Unix历史》的文章中看到的。这篇文章是早期加州大学伯克利分校的计算机系统研究小组(CSRG)的成员,Marshall Kirk McKusick写的BSD UNIX操作系统的历史,文章非常棒,从Ken Thompson和Dennis Ritchie于1973年在Purdue大学的操作系统研讨会写起,一直写到1995年4.4BSD-lite 2发布、CSRG解散为止,中间穿插了Bill Joy等人的传奇,以及vi、TCP、Internet的历史。我在国内的家里还保存这这篇文章的打印版本,当时是在FreeBSDChina.org上的论坛上贴出来的,我从精华区里找到了这篇文章。后来FreeBSDChina的论坛改版,打印文章很不方便,我倒是很庆幸之前打印了这篇文章。再后来我再去找这篇文章,论坛上已经没有了,文章被移动到了专门的网页上,不过已经不是原先的样子,章节混乱不堪,令人不胜唏嘘啊。好在从Google上搜索还能搜到别人过去转载的,虽然不如原版的好看,但聊胜于无。这篇文章的一节讲了早期在伯克利使用的PDP-10/11机器无法满足MACSYMA的开发,因此在1978年初,Richard Fateman教授等人申请了经费买来了当时最新的VAX系统,后来伯克利的人给当时运行在VAX上的UNIX系统加上了虚拟内存功能,导致了VAX UNIX系统的诞生。

当我第一次在王垠那里听到MAXIMA后,我就找机会从网上下载了安装文件,在本地上尝试了一下。不过当时我正在高中时期,一来没有时间,二来当时对需要用到MAXIMA来处理的高等数学也没有什么认识,所以MAXIMA对我的吸引力不大,我只知道了它大概的样子就没有再管它。这学期学了专家系统后,竟然一直不知道MACSYMA竟然也是专家系统,因此今天早上看到专家系统的列表上有它的名字后,着实吃了一惊。我当机下载了MAXIMA的代码,看了一会,并不像通过我们学的专家系统外壳写出来的事实和规则组成的系统,到像是一个一个函数组成的。不过从solve之类的函数中还是能看出一点端倪来。

不过既然有我熟悉的系统,而且又是用于公式推倒、符号演算的代数系统,也好过了去研究那些用于医药、信用卡验证之类的我不感兴趣的东西。于是就给我们的老师发了一封邮件,问问有没有人要讲这个,并告诉他今天中午去找他谈话。之前因为选题没有定下来,因此我一直都有点紧张,一种不确定感一直在困扰着我。发了邮件后,立刻觉得轻松了下来,有种兵来将挡、水来土掩的感受。上学路上坐的公交车也开得格外流畅没有中间没有堵车的情况。

顺便说一句,之前的文章我一直说,我对专家系统的最初印象是CMU做的非特定用户的语音识别系统,也就是李开复在那里读博士的时候。他的导师等一群人工智能专家在用专家系统的方法来训练计算机听懂人话,结果李开复最后用统计学做出来了。今天早上我在看列表的时候,也看到了CMU做的专家系统,就是面向语音识别的,名字叫HEARSAY,使用的开发工具是SAIL。这个系统输入的是声波,输出的是系统猜测的声音意思。在1975年,系统有了1000个单词的语料库,达到了75%的精确律。我估计就是李开复那时候的那个。书上说那个系统只对训练它的人有效,换了一个陌生人后识别率马上就下来了。后来李开复通过统计,把精确律提高到98%,并且对每个人都有效。

到了学校后,看到了老师回的邮件,说这个题目可以,我这才放下了心。下了上午的课后,我从网上针对MACSYMA找了些资料。目前来说最有帮助的是Joel Moses写的《Macsyma: A Personal History》。Joel Moses是MACSYMA当年的作者之一,他在这篇文章中从最早期在读研究生的时候研究的问题开始,讲述了MACSYMA的早期历史。不过其它方面的文章就不大好找了,因为很多文章都不开放。它们大多指向ACM的Portal文献系统,即使我有ACM的学生会员,也无法访问,必须花钱买更深一层的会员才可以。我先从别处找找办法再说。

到了中午,去了老师的办公室,跟他谈了一会。他虽然说这个题目很老,不过也是可以的。他从书橱上翻了翻,查看了一下几本书的索引,借给我了一本Donald A. Waterman写的《A Guide to Expert Systems》。这本书看来很老了,在亚马逊上买二手的,加上运费才4美元(其中运费3.99美元),不过我翻了一下目录后,却觉得比老师之前借给我们的《Building Expert Systems: Principles, Procedures, and Applications》要好一些。之前那本书主要讲了专家系统领域里的一些大方向,算是一个框架,不如这本书有技术性一些。

另外,我也问了老师关于专家系统近期发展的问题,比如我们学的Jess是不是现在流行的工具,现在专家系统领域有没有新的研究成果之类的。老师说Jess不是专门用于教学的软件,因此除了最新的一些系统外,Jess仍然在使用中。现在专家系统应用的并不少,只是人们更倾向于叫它“商业系统(Business System)”罢了。至于最新的研究成果,有别的国家的学生发表过一篇论文,讨论Fuzzy Logic应用的,可能用到了FuzzyJess,不过他记不清了。这更加让我觉得专家系统这条路是死胡同了。

不管怎样,有了题目,剩下的就好办多了。不过我周日还有另一门作业要交,要求我们从已经写好的虚拟机代码中加入DMA支持,可以让汇编语言访问硬盘。这个作业我已经想了两天了,觉得应该不会太难,就是不知道到时候要调试多长时间,以及会不会有新问题出现了。

November 25, 2009

项目完工

这篇文章本来是昨天要写的,不过昨天忙着写密码学作业,一直写到今天早上四点多,所以只能放在今天来完成。

这个星期一的23:59是我们项目的上交截止日期。在此之外,我们还要在一个预定时间把项目的运行情况给TA展示一下。昨天下午就是我们小组展示的时间段。老师的原话是做一个demo,我之前以为是要上台作报告演讲之类的,还稍微有些紧张。结果就是我们三个人私下给TA运行一下程序,让TA知道程序运行正常,实现了哪些功能就是了。展示的时间是15分钟,结果不知不觉就过去了。

在这个项目中,前期主要是我一个人在编码,在试验了集中可能性之后(多进程、多线程、select),在最后一周内是我和当地人做了绝大多数的工作。我负责实现了两个结构体数组保存用户的信息和程序的状态,然后写一些API函数。当地人把我之前做的局域网多人聊天程序改写成服务器程序,分析客户端发来的protocol信息并调用相应的我写的函数,并根据函数的返回值生成新的protocol并回发给客户端。然后当地人写了客户端的读取用户输入,生成protocol并发送的部分,我写了客户端的接收服务器的protocol并生成给用户的信息并输出的部分。到了最后的一天,我们和另外一个中国人写了文档,我用LaTeX排版后上交。

这次项目自然学到了很多东西。首先是Subversion的使用。项目开始的时候,我惊讶的发现另外两人没有使用版本管理的经验。开始我跟中国人讨论的时候,问他有没有对于使用哪种版本管理工具的想法,他问我有没有用过Dropbox,说我们的工作可以保存在Dropbox里然后分享。在之前的暑假学期里,他和我都修了《软件工程》这门课,他们小组就是这么做的。我当时虽然很惊讶,但因为只是项目的开始,没有实际设计到编码,而且我平时也用Dropbox,就建立了一个共享目录,把当时的protocol草稿放了进去。

到了第二次我和当地人又讨论这个问题时,他竟然也没有使用版本管理工具的经验。我用过Subversion和Git,在GitHub上有帐号,本来想让大家都用Git的。但当地人好像只听说过Subversion,而且之前我的印象是Git对Windows机器支持不好,而另外两人都是Windows机器,我们于是就定下了用Subversion来管理版本。

我在Google Code上建立了一个仓库。之前那个暑假学期我在修《软件工程》课时,我们的课程的小组项目也是用Subversion来管理的。当时的项目组长在xp-dev.org上建立了一个SVN仓库,我们又是用NetBeans来开发,因此只要在NetBeans设定好仓库地址和密码,其它的都由NetBeans来办就成了。而且当时为了方便,我们是建立了一个公用密码,因此从头到尾只能看到一个人在commit。除了上次的项目外,我之前对SVN的使用也仅限于checkout别人的代码而已,因此在Google Code上建立好仓库后竟然很长时间不知道怎么用。因此那几天就只是整理了一些开发文档,放到了Google Code仓库的wiki上。后来看了一些文档,但却很少有与Google Code相关的,因此在本地建立仓库之类的命令就怎么也用不着了。后来自己试验了一下,原来直接checkout那个加密的版本,就算是在本地设定好了仓库了。之后的开发就水到渠成了。

到了上个周末,我SVN的一些基本功能都比较熟练了。因为之前用过Git,因此又去YouTube上找了Linus on Git视频再看一遍。之前看的时候多两个系统都没有怎么用过,因此收获不多,这次听了之后,则对Linus一直强调的Git的分布式优势的理解更深了。不过我现在觉得我们这三人小组(实际写代码并使用SVN操作仓库的只有我和当地人两人)使用SVN正合适,使用Git也无法体现出分布式的好处。不同于开源项目,我们的编码是有计划而且固定的。我只负责游戏API和部分客户端,当地人只负责服务器和另一部分客户端。因此commit的时候很少有冲突的情况。当两个人同时编码时,如果我们如果不是坐在一起,就会一直用MSN交流,因此哪怕发现了对方代码里的bug,也是从MSN上通知对方,对方修改并提交后我们再更新本地代码。这其实并没有把版本控制发挥的“淋漓尽致”,但刚好满足了我们的情况。开始的时候我们分别在两个branch中开发,这也不是标准的分支,对方的分支只有服务器和客户端,我的分支只有游戏API,最后由我合并到trunk中,互不干扰。这样Git的优势也很难体现出来。

第二个收获是获得了编码的经验。我之前的文章说过,我几乎没有用C语言写过什么称得上“项目”的东西。之前虽然有用C语言写过实际程序,但属于算法方面的偏多,实际应用就很少了。算法的程序虽然理论技术含量高,但实现起来基本上就是数组或者链表就OK了。而实际应用就不同了,虽然算法上很简单,但在C语言中写起来却容易出错。我们这次写的游戏就是这样,逻辑上的部分我用脑子想象就有了伪码,很快就写好了,但中间的一些底层问题调试起来却要了老命。说起来还是C语言太低级的缘故。很早就知道C语言是一门低级的高级语言,但只限于语义上的认识,实际上没怎么用C语言写过程序,很难知道其中的含义。

比方说指针,我过去看过的许多教材(包括我的C/C++语言启蒙教材),都说指针是让C语言强力的原因,因此从很早之前我就对C语言的指针充满向往,希望有一天我学好指针后也能写出强力的程序。后来真正看到指针章节后,觉得指针的概念很简单啊,书上也没具体怎么说指针怎么让C语言强力了,只是让我知道了指针和数组之间的同性,以及两者之间可以互相转换表达形式的特点,在我看来只是语法糖而已,并没有什么很大的不同。当我实际写程序的时候才觉得,很难说指针让C语言强力,事实上是C语言没有了指针就没法办一些事。归根结底还是C语言太低级了,从语法上没有别的语言中的传址的概念,因此我们要让一个函数可以修改参数的值,就只有通过指针把地址传给函数,函数通过类似汇编语言中indirect address的东西来读取或修改的地址指向内存的内容。另外的例子是数组和字符串,往函数中传递的时候也是传的地址,没有了指针都很难办到。因为C语言低级,所以并没有帮助我们弄出高级一些的传址方式,所以我们要自己用指针实现。在这次的程序中,我用保存用户信息和游戏状态的结构体定义了两个数组。按照之前在Java中的经验,这些数组中的元素自然是一个个结构体类型,结果我却发现里面指向字符串的指针在运行时却指向了同一块内存,后来在初始化每个数组元素时,都用malloc先分配内存,才解决了问题。因为C语言低级,没有帮我们自动处理内存分配这些东西,所以我们要手动设定指针并分配内存。这给我们带来了很多灵活性,但也是出错的根源之一。(本段写的未必正确)

我之前没有正式写过网络程序,之前在一次实验要把老师给我们的socket程序改写成查询公交车到站时间的程序,实际上只是加上一个事务模块,并分析发过来的信息以及生成返回信息就行了。之前以为这次的程序也差不多,结果在11月初才知道我想法的幼稚,两个客户端怎么同时与服务器通过一个端口交流,客户端怎么在和服务器交互的同时读取用户的输入,这些问题我之前都没有考虑过。像之前的暑假里《操作系统》课程里C语言库函数中函数的blocking性质似乎早就还给了老师,一直到了项目后期我才惊觉。后来在某个凌晨,在网上找了一些socket交互的代码才知道了在服务器用select来选择与那个客户端交互(我上个学期学《分布式程序设计》的时候在Perl中学过select,但没有学扎实,因此在这个项目的前期就尽量逃避这个思路,多线程也是这样),在客户端用两个进程分别与服务器和用户交互,这样才自然的解决了问题。

这次的项目还让我用gdb调试的水平有了提高(因为之前是0,所以可以说提高了很多)。我最早调试程序的经验是从QBasic开始,后来用Turbo Pascal、FreePascal来写一些计算机奥赛程序,也经常用调试器。他们虽然古老,而且还是在字符界面下工作,但都有了“图形”界面的IDE。我过去都是用IDE里面带的调试器来调试程序的。但现在写C语言,只能用gdb调试,就有点不大习惯了。在Linux下有ddd,但我一直没有花功夫学,而且在Mac下运行的也不好。gdb我知道一些指令,但却没有实际调试的经验。结果下来却发现熟练了后也没有这么困难,只监视变量和堆栈在字符界面下不如图形界面下那么直观就是了。其实我用到的指令也不多,主要是发生seg fault的时候就在gdb里面执行一次,当发生错误的时候程序终止的位置通常就是有问题的代码。或者当程序的逻辑不对的时候,也就是找到调用那段代码的行号,并通过b来设定断点,程序暂停后用p来查看变量的值、用bt查看函数调用的堆栈、用n来单步执行、用s来进入一个函数跟踪。稍微有点耐心的分析变量的值有什么变化,很容易就能找到出了什么问题。

还有一个经验是自从一年前之后,我就没有自己写过Makefile了。这次项目的编译需要一个Makefile,我于是又找了文档来研究。通过实验与改进,我终于成功的弄出了一个可以根据代码是否改动来决定是否编译某一部分的Makefile。后来写Makefile写上了隐,我又给doc目录下写了一个Makefile,来自动从LaTeX生成PDF文档。

这个项目的前期我们都没怎么行动。同组的另一个中国人因为生病,一直没有实际参与项目,我又低估了项目的难度并高估了我的实力,一直在一个人写服务器端。一直到了项目截止日期前一个星期我才发现,老师给我们分的三部分计划,我连第一部分都没有实现。于是在那个晚上,我去网上找了一些代码来学习,并再第二天开始和当地人合作实际分工写代码。大概过了大半个星期后,我们的代码写的差不多了,于是那个周六我们就把代码合并,在周日主要测试并调试,因此到周一就让代码几乎没有问题了。但周一晚上当地人在写测试文档的时候,发现了程序有我们还没考虑的bug,于是我们就立刻紧张起来,调试并添加新的判断条件。结果到最后我再整理文档的时候,时间就挺紧急了,到了截止时间之前5分钟我才运行了提交程序。慌乱的导致了我露掉了最后加进来的测试文档,我当时把当地人传给我的文档放在了本地的目录中,但忘了在SVN里面注册,所以我最终commit的时候,测试文档并没有被包括在内。我到第二天中午的时候发现了问题,并给老师发邮件,幸好老师说没问题。

在演示的时候,我们本来运行的挺好的程序,却在用户名的部分有了点问题,其中一个用户名在正常的用户名之外还显式一些奇怪的东西,估计是哪个指针没有设定好。不过TA说这不是大问题,重点是网络交互这部分工作正常就行了。

之前一个星期的工作实际上挺紧张的,因为项目设计与别人相关,经常是我想放松一下的时候,当地人在MSN上又说了一个新问题,我又要继续编码。所以我现在Google Reader里的未读项目已经接近500了。当中很少有大块时间可以干别的,唯一的乐趣就是去看袁萌的博客以及留言。昨天本来觉得可以放松一下了,结果今天早上又是另外一项作业的截止日期。我当晚到12点多才回家,并一直弄到4点多才写完。结果今天早上在图书馆匆匆忙忙的打印出作业后,老师却说作业的截止日期延伸到周五,直接让我晕倒。

November 23, 2009

再论专家系统

这两天的专家系统课,让我越听越郁闷。

我在上这门课之前,对人工智能、专家系统这一块是非常向往的。人工智能是早就有印象,而我现在说起专家系统,最早的印象是凌志军写过一本书《中国人在微软》,里面讲的李开复早年在CMU读研究生的经历。说当时李开复的导师和其他一些人工智能领域的权威,一直深信让计算机听懂人话是要用专家系统,像教小孩说话一样来让计算机慢慢学习。结果李开复独排众议,改用了统计的方法,结果把识别率提升到高达98%。这件事我之前也写过,我一直对这个故事有着深刻的印象,因为隐隐觉得如果真能做到这个底部,或许成就还无法达到CMU那帮人的水平,但这种研究已经很有趣了。所以这学期我发现专家系统课和另一门同样是必修的autometa课有冲突时,我毫不犹豫的选择这个学期先修专家系统。

正因为我之前对专家系统没有一个清晰的认识,总是模模糊糊的感觉非常高深的样子。前几节课听起来确实是这样。第一节课后我感到似乎什么也没听懂,只是把老师的笔记一字不落的记了下来。虽然觉得没怎么听懂,但还是感觉很兴奋,因为真正接触到了高深的内容。下了课后,我在咖啡厅里搜索老师的笔记,并在维基百科上找到了老师笔记上的XCON,DEC在1970年代末期时开发的的一套辅助销售人员为客户搭配VAX计算机的硬件的。当时仔细的把文章看了几遍,又顺便把它翻译成了中文。那时只是从介绍里了解了一下XCON的用途,但不知道它是怎么编写的,因此之后的几节课我都是相当兴奋,十分专注的去听的。

到后来我们接触了Jess,然后课程的内容就是讲Jess的语法,以及一些性质。因此我们可以用Jess来完成一些作业。中间穿插的讲了Rule Based Expert System,我当时一直没有意识到,这就是我一直向往的专家系统。用Jess来写Rule Based的程序非常简单,从表面上看来,Jess其实就是“披着LISP外衣的PROLOG”。Rule Based Expert System的核心部分是facts和rules。在Jess中,就是用deffacts来定义一组facts,并用defrule来定义几条rules。所谓的fact,就是一条像(male jack)这样的语句,表明了一个事实。而一条rule,就像是过程语言中的if语句。比如说一条rule的内容是“如果一个人是男人,他又是另外一个人的parent,那么他就是那个人的父亲。在Jess里面就是如下定义的:

(defrule father
  (father ?X)
  (parent ?X ?Y)
  =>
  (assert (father ?X ?Y))
  )

可以看到,=>前面是这条规则的前提,=>后面是当满足了这个前提后我们要做什么。assert是在系统的rule base中再加一条rule,?X和?Y是变量,没有什么难的。当我们有了facts和rules之后,Jess的inference engine会根据rules和facts的关系,来计算出rules的运行顺序,然后就执行每一条rule,直到没有rule适用为止。这个时候,fact base被这些rules改变,我们要的结果就包含在里面。基本上这就是rule-base专家系统,就是这么简单。

当然,有的时候rule-base不能满足我们的需求,因为用完全清晰的逻辑语言来描述fact并不是那么容易的,因此我们引入了fuzzy logic,给事实加上了一个数值。比如说形容一个人老还是中年,我们没有严格的定义人几岁之后就是老,所以我们定义中年是30~60岁,老年是55~100+岁。两个定义可以有重叠,因为我们很难说55~60岁的人是老还是不老,因此这个概念是被模糊的定义的,我们应用的时候,通过defuzzy函数来把一个模糊的概念(比如说老)转换成一个数值,然后通过数值来计算。

更有一些时候,我们发现无论怎么样总结,都很难把一件处理事情的方法给总结成一条规则,没有规则,rule-based expert system就无法适用。因此我们又引入了case base reasoning的概念,也就是说,把我们能够找到的问题和处理问题的方法,都用fact表示出来,就像是给专家系统了一些例子。当专家系统遇到了类似的问题时,就用类似的处理方法来解决。这种方法不如rule-based expert system获得正确结果的几率高,但因为专家系统的规则不是编在程序里面的,而是可视的,所以当操作人员获得了结果后,判断结果是否正确,如果正确,就把这个问题和解决方案加进例子库里面去,如果错误,也把问题和结果加入到反例库里去。经过这样不断演进,我们的专家系统解决问题的正确率就上去了。

上面的三种分类(rule-based expert system、fuzzy logic、和case base reasoning),就是我们学的在编程方面的专家系统的大多数知识。在这些结束了之后,我们又在重点讲知识的获取,也就是说如何从专家处获得知识,并把知识转换成相应的规则。这些都是knowledge engineer的工作。

学到现在,我算是对专家系统有认识了。所谓专家系统,实际上就是让计算机来模拟专家的行为,这样我们就可以一来踢掉专家,不用付专家钱;二来可以让机器24小时连续运行,这是人类专家无法做到的。具体实现起来,就是要有专家系统外壳以及知识。Jess就是专家系统外壳,它把知识在计算机上的保存基础,以及用于知识推理的inference engine都实现了。有了这个外壳之后,开发专家系统的工作就是从人类专家处获取知识,总结成规则,保存起来,然后外壳来处理这些规则,就成了专家系统。

而我现在感觉专家系统没有什么前途。我说的前途是指,在将来我能不能在这个领域里有学术性的建树,或者我能不能在相应领域的企业中找到有创新性的工作,结果这两条我都觉得是负面的。在大家使用相同的专家系统外壳的情况下,专家系统的好坏就取决于知识手机的准确度、完整度,以及事实排列顺序的效率,而真正有研究性的工作,我觉得还是在于外壳这一部分。而现在的外壳发展到现在这个地步,能改进的可能性就不多了。除了改进Rete算法之外,我想不到在更上一级还能做什么。

从现在来看这一个学期学的专家系统课程,我有点纯粹是浪费时间的感觉。首先这个领域的内容,尤其是我们学到的内容,有点不值得学;其次就算真的要学,我觉得花两三个小时就能讲的差不多了。我现在比较后悔,就是没有早一点看老师给我们的《Jess in Action》一书。书中有一些专家系统的例子,比如说电脑检测系统之类的。看了这些例子之后才打碎了我过去对于专家系统的幻想。

这门课剩下的内容还有两条:一是在下周三做个10到15分钟的seminar,二是一个项目。我现在还不知道要做真么题目,找到题目后还要去找老师讨论一下,顺便也问问专家系统的发展前途的问题。

November 21, 2009

大人物

这学期的《密码学》课上老师喜欢用彩笔在白板上写很多笔记,我不喜欢用手写快速的抄英文,因为不光很慢,而且手会很累,因此就一直用ConTeXt来记录。又一次,在写公式的时候,突然想起了TeX发明人Knuth在主页上贴出的一张他的fvwm配置的屏幕截图来,里面是他在用Emacs编辑Plain TeX文件,内容大概是某本书的5.1.3节(不确定是不是TAOCP)。

knuth-screen.jpg

印象里截图里的文件有很多符号,心想老头子怎么能记住这么多东西?然后忽然想到,Knuth是在用自己写的软件来工作。他的主页上有tex82的WEB程序,用CWEB处理后就可以编译出可执行文件,把他的TeX源代码编译成dvi文件,这不就是全部了吗?TeX在我们看来是非常伟大的软件,但从Knuth的角度,不过是一个处理文本并输出另一种文本的程序而已,和我写的一些脚本的作用差不多,无非是让生活更舒适罢了。

不过让我写TeX这种规模的程序,我觉得还写不出来。现在我们做的这个C/S程序,我写游戏部分的API,当地人写服务器来调用。我们今天下午从MSN上来回讨论,什么时候他又需要个新功能啦,什么时候我的代码又需要改动啦,总之是不能一次到位的做好。这种软件的功能比较琐碎,因此很难考虑完备。不知道用Knuth的Literate Programming能不能有所好转。不过好在是写游戏的功能模块,要是让我调试和客户端的交互部分,这个月初的经历让我的信心可不是那么高。

当时我低估了程序的复杂度,大言不惭的给当地人说服务器我自己搞定,想想也挺简单的,之前在实验课上我们已经完成了一个C/S查询公交车时间的程序,我当时把查询模块放到了另外的文件里,在服务器代码里调用。写游戏的话就把游戏放在另外一个文件里,用服务器里的代码调用。输入客户端发来的信息,执行,生成返回信息,由服务器发回给客户端就行了。结果在11月初的一个周日晚上,我最终把大部分的代码写完了之后,运行一下试验,却发现了种种我未考虑到的问题,比如服务器要连接多个客户端。开始时我觉得用多进程就行,结果却发现进程见的数据都不是共享的,一个客户端发送信息后,我要通知另一个客户端,这样一来就要用到IPC……为了不用IPC,我就要用线程,my god。

现在把与客户端的交互部分给对方来写,专注于整个程序的一部分,才渐渐的感到轻松。之前我对C语言不是很熟练,因此写出的库有错误。在C语言里要做许多低级的分配工作,而我想当然的用Java或Pascal的方式给做了,结果当地人的程序发生了奇怪的问题,后来加了几个malloc才算搞定。

计算机历史上的一些大人物,多数都有为自己写软件的经历。比如Emacs、Linux都有这种意味在里面,从现在看来确实有高山仰止的感觉。什么时候我也能这样呢?

November 19, 2009

谢谢饭否

fanfou.jpg昨天在查看blog的流量统计时,翻到了之前写的一篇文章。那时饭否刚刚开始自己停止了服务,官方上的说法还是几天后会重开。那个时候我也觉得饭否想避过那时的风头,等着过几天会重新开放,但没想到饭否会一直死到今天。

我在那篇文章里说,同样是无法访问,饭否是主动封锁,用户用什么方法都无法登录,而Twitter是被动封锁,只要能翻墙,还是可以使用的。当时我没有想到饭否会一直无法恢复,因此心里也没有现在这么肯定,也一直在担心。担心的点是Twitter在长期被封锁下,会导致中国用户的离开。我在Twitter上follow用户的原则是只follow我认识的,其它的一些名人什么的一概不管。确实名人们的Twitter会有丰富的信息,但也会让我的信息负载加重,反而影响了我对需要信息的获取。这个原则让我的follow列表长度保持在20之内,也就是说我经常交流的Twitter用户只限于不倒20人。而里面经常发言的又更少了。如果这些人之中有人离开了Twitter,我的交流渠道就会大大减少。

新浪微博发布时,我觉得可能会是一个冲击,不过并不十分担心。因为我一直觉得新浪对于blog、微博这些东西掌握的不好,做出来的东西华而不实,不会吸引Twitter用户,而国内微博服务的用户的去留与我无关。另外,新浪微博的封闭性也阻塞了它的流传。除了API方面的种种之外,首当其冲的是其封闭注册的性质。而更过分的是,不注册却无法浏览别人的页面(最近好像有改善),这直接阻止了我对其进行评估,也断掉了我使用的可能。而且邀请注册的吸引人的前提是别无分号的东西,gmail邀请的时期其成功是因为没有免费的1G邮箱,Google Wave邀请的抢手也是如此(顺便说一句,手里还有19个邀请,不过我谁也不给,哈哈)。新浪微博在这种情况下弄个邀请,如果除了对自己的服务确实没有信心,那就纯是在装逼作秀了。

真正让我担心的,其实还是像饭否这种国内的专注于微博服务的公司。首先是它们有口碑,对人的吸引力更大;其次是它们的服务,对于普通用户来说,确实也能与Twitter一拼,而且像客户端什么的也都挺火爆的。所以我那一阵子是挺怕那些公司把Twitter上的用户吸引过去的。不过它们自己本身也有问题,最大的问题是天生就有的。“合则力强、分则力弱”,本来在国内还算小众的微博用户群,被几家给瓜分了,就更加难与Twitter抗衡了。Twitter不像电子邮件,目前使用者被固定在一个公司的服务中,就很难和别的服务互通。什么时候这个问题被真正解决了(嘀咕那种的迂回同步不算真正解决问题),国内微博才有能力真正和Twitter一拼。不过就算这样,我也不希望我follow的Twitter用户离开。

而饭否的关闭,则帮了我一个忙。

首先是饭否用实际行动证明了微博服务在国内的不可控性。你的发言,可以在任何情况下,仅仅因为一个理由,就全都消失一空,朋友之间的联系也因此而丧失。饭否是国内微博服务的佼佼者,口碑数一数二,由“老大哥”来做示范确实很有效果。而且,饭否在这么长时间之后都没有兑现当初说的十几天之后恢复的承诺,反而积极删贴的新浪微博倒还好好的,这也告诉了用户──除非饭否做到新浪那个份上,否则饭否则很难继续下去。这也让用户知道了,真正能体验微博服务,只能找国外的公司,也就是Twitter。所以现在,尽管我的follow列表里在国内的同学都无法正常发推,但总有工具可以帮助他们和我完成Twitter上的交流,而且他们的发言频率也并没有因此而减少。

所以我昨天看到了之前写的文章,不由的觉得应该对饭否说声谢谢──你给国内的微博用户上了宝贵的一课。

另外,今天看到月光贴了篇文章,说百度发布了自己的微博产品──i贴吧。我过去看了一看,里面也有一些名人的头像。我点进去看看,感觉就像是一个论坛上的某位用户的发帖列表,里面没有几篇发言。不过每一篇下面的用户回复则几乎全是“沙发”、“留名”之类的东西,我于是知道了什么是中国特色,同时也完成了对于i贴吧这个产品的定位,并对Twitter的稳固地位更加放心了。

November 18, 2009

同学感染了H1N1

上一篇文章说我这学期有一门课要三个人组成一个小组完成一个小型的socket项目。

我们班上除我之外还有几个中国人,一开始我觉得都是中国人应该交流起来方便一些,不过本着与当地人接触并认识新朋友的精神,又觉得应该找当地人组成的小组。在思想斗争了有一个星期之后,终于在上交小组成员名单的截止日期的前几天下课后,抱着破釜沉舟、但试无妨的心态和当时坐在我左边的一个陌生人答话,问他有没有和别人组队,能不能和他一起工作之类。结果对方也是一个人,于是我们就先订下了项目。正说着话,这时又过来了一位中国人,问能否加入我们,于是我们三个人就组成了小组。

项目并不是非常顺利的在进行。其实一直到现在,我们三个人都还没有一起进行过小组讨论。一开始订好了时间,结果正好到了感冒高发期,中国人生病,当地人的儿子生病(我的一些同学都是写大叔级的人物,不过这位倒还算年轻),于是讨论推迟两天。结果我之前记录的项目笔记,以及画的程序的state machine,总共大概两三页的材料都没有用上。到了那天,当地人又有事无法来学校,于是我和中国人在一起做了简单的讨论,并顺便聊天互相认识了一下,才知道原来他和我来自同一个城市。

时间过的很快,中间我也经历了种种考试,以及大大小小的作业,因此到最近项目的截止日期快到了,我们才开始紧张的赶工。不过这个星期开始我竟然找不到中国人了。我本来猜测他是不是过了半个学期,觉得成绩不佳,注销了这门课?结果去了课程网站查看可以发给电子邮件的名单,他还在名单上。一般当注销了课之后,明单上就没有这个人才对。

今天中午我和当地人讨论了之后,下午他的课比我早,于是他就先离开了自习室。不一会我收到了中国人发给我们两个人的电子邮件,说他感染了H1N1,因此这几天都不能来学校,我们在项目上需要他做什么的,直接指派给他就行。我当时连看了两遍H1N1字样,虽然还不到震撼的程度,但已经觉得有点难以相信了。虽然之前有报道当地有中国留学生回过后被诊断出疑似来,但毕竟那人是另一所学校的,而这次却是切切实实的我身边的人感染了H1N1。虽然我一直声称不怕H1N1,但对于这种有可能致命的病我还是有点发怵,毕竟想到一旦自己知道活不成了,想到还有这么多的事情没有完成,岂不是遗憾啊。然后就开始计算自己和他接触的次数,以及自己也染病的几率。不过前几个星期我注射了疫苗,算是稍微有点安心。

今天下午和当地人说起这件事,结果当地人满不在乎的说“it's just another flu”,然后又开始给我讲了很多诸如世界上有百分之多少的人死于普通感冒,温尼伯当地有多少人感染了H1N1等等。我问他有没有注射疫苗,他说没有,说有很多情况疫苗反而比疾病更有可能致命云云。这老外,我开始的时候觉得这人挺阴沉的,也不怎么何人打交道,没想到接触起来还是比较说的来的。

前几天我发了低烧,有感冒,到现在基本已经治愈,但咳嗽依旧,因此最近有开始恢复汉化甘草片(那滋味只能靠毅力忍着啊),刚才吃了消炎药。本来我觉得整天这么咳嗽,别人大概会担心我感染了H1N1,因此不愿意和我接近。不过这几天完全没有这样的事情发生,看来这里的人对待H1N1还是挺开明的嘛。

编程语言喜好

一个人对于编程语言也有自己的倾向,我最近和同学一起完成学期项目时,有了深刻的体会。

我们的学期项目是网络课上要求的,让我们写一个socket程序,让几个客户端可以通过服务器来玩NIM游戏。我们第一次小组讨论的时候决定用C来做。我同时修一门计算机组成的课,作业是用C语言写虚拟机。我看了老师给的答案后,感觉有豁然开朗的感觉,一扫以前对C语言的恐惧心理,所以也信心满满的做了起来。

但从开始写到现在,总感觉一些细小的部分在阻挠我。而且一些socket交互相关的问题,比如进程、线程、select函数之类的小问题,也让我相当头疼。因此本来看上去很简单的程序,写到现在还在继续弄。

我之前也写过,我对C语言还没有建立起一种“体系”。我在过去写BASIC和Pascal程序的时候,哪怕不能解决问题,都有一种掌控全局的清晰感觉。而对于C语言,我现在还不行。总有一些小地方,一不注意就会出问题。比如结构体中的字符串,今天也费了我不少功夫才搞清楚,原因是之前我写程序从来不用结构体,因此也不知道C语言具体怎么给里面的字符串分配内存。Pascal没有C语言里的指针这么深刻的概念,所以我对这类问题掌控不明确。

我曾经考虑过:是什么让我过去对BASIC、Pascal等语言有掌控全局的感觉?我写了多少程序才建立起了这种感觉?能不能从这些程序里找出一个最小的必要集合,学新语言的时候就用那种语言把这些问题实现几遍,就能摸透语言的关键并形成习惯呢?可惜我一直没有时间深刻去思考这个问题。在有了答案之前,唯有像无头苍蝇一般,看到什么就练什么,直到哪一天把必要的知识点都“撞”全了。

相反,我对一些不那么流行的语言倒是有挺浓厚的兴趣。之前我们学了Prolog、LISP、我们老师发明的fp、J,这学期我们又接触了Jess。去年冬季我有一门课,名为Programming Language Concepts,专门讲各种编程语言,也用它们来写程序,我就做的不错。和我一起做项目的组员这学期也修这门课,就觉得这门课很难,觉得那些奇怪的语法让他转不过弯来。可他对C语言倒挺熟练的,所以项目里困难的部分,就让他去做了。

今天中午他在复习下午的考试时,问了我几个相关的问题,我都觉得挺简单的,他却一脸迷茫。一些稍微复杂一点的Prolog程序,比如归并排序里的merge,我觉得很容易理解,他却觉得已经难到天了。所以我看编程语言,还是要和人的性格相合啊。

November 16, 2009

关于时间管理

其实也不是最近,挺早之前就已经觉得时间不够用了。

小时候几乎没有这种感觉。我在小学阶段是以能熬夜闻名的,初中也是。小学起不知道怎么着,我写作业的速度特别慢。现在想来作业未必算很多(当然有很多例外情况),只是经常对写作业有种逆反心理,写作业时感觉不到快乐,反而书橱里的种种书籍,或者小时候对着台灯进行天马行空的幻想,则对我更有吸引力一些。

我第一次印象里睡觉很晚是小学一年级,当时在父母的卧室里床旁边的一个床头橱上写还是汉语拼音的作业。那时我对作业没什么概念,因此母亲总是陪着我写作业。什么时候她说行了,我也就放心的去睡觉了。我第二次熬夜写作业是在小学二、三年级的时候,第一节语文课学的是“安徽黄山”之类的名胜的名字。当时在课堂上老师就让我们把一些词语什么的抄写多少遍,我那个作业就没完成,于是晚上的作业就变成了白天的课堂作业+晚上的家庭作业。两个作业和着搞到我大概凌晨两点半才上床睡觉。当然类似的情况有很多,但这两项是我印象里最深刻的。我有时和同学聊天的时候,说起我的熬夜经历,都会让他们惊叹不已。

上初中后我对作业有了较强的控制能力了,晚上基本上都可以在11点前完成作业。不过那时起我更喜欢读文学或计算机方面的书,经常在睡觉前往枕头边上扔上这么一本,躺在床上看,大概到1点左右关灯睡觉,这或许是那时候我最惬意的时光了吧。这样的日子其实也不怎么影响我第二天的精力,有的时候第二天还能够神采奕奕的去上学。不过到了高中我的这项本领就丧失了,经常有这种情况:睡觉前往枕头边上扔一本书,等上床后盖上被子,知道书在枕头边上,但就是不愿去翻。也不甘心就这么关灯睡觉,于是不知不觉的睡到第二天,灯也没关。那时候我想我也许在高中前就把夜晚都给透支干净了吧,所以到了高中才无法熬夜。

现在想来,其实那种日子也还好。最近的几个学期,我经常感觉时间已经不够用了。我经常有个疑问:是不是年纪越大,对时间的“忍耐力”就越强?小时候人经常有“坐不住”的感觉,总觉得日子太长;而大了以后反而觉得时间过得太快,一眨眼一个小时就这么过去了,中间具体干了什么事?不知道。想象一天也就24小时,出去睡觉、吃饭等,真正能用的也不过12小时,而当中能利用起来的则更少,于是经常感到惶恐,也更能体会朱自清写《匆匆》的心态了。

我曾经思考过一个问题──为什么在国内上学很少有时间不够用的感觉,而在加拿大就这么明显呢?我后来得出的结论是可能我们的时间管理的能力没有培育好甚至根本没有被刻意的培育。

从小到大,我们有固定的教室、固定的座位、固定的课程表,每天有当天必须完成、第二天要交的作业。因此除非那种完成任务非常快的学生外,能有很多课余时间的同学并不多,再加上很多人又被家长报名了“课外兴趣班”,因此导致了真正可由我们自己支配的时间少之又少。总之每天老师、家长都给我们安排好了时间、安排好了任务,反正都要做完,因此怎么安排顺序都没有太大影响。而在国外上大学,课程的时间、地点、教师等都在学期前发布在选课系统上,每个学期学什么课都是学生自己选择。原则上是三到五门课,如果这个学期想轻松一些,就少选课;如果想多点负担,只要课程时间不冲突,就都可以选。作业也是一样,我现在的作业都不是当天布置第二天要交,而是有几个星期的时间让你做,有的甚至是整整一个学期的项目。而怎么来安排这些时间,我觉得这是导致我现在难受的一个根源。

我不知道国外的小朋友上的学是怎么样子的,反正从我自身来说,我觉得国内从小学上过来的同学,对时间的掌控能力都不怎么高明。义务教育的体系让我们没有机会也没有必要去管理自己的时间,因此一旦到了一个表面上宽松的环境,我们则很难正确的规划这些时间,因此导致了现在疲惫的状态。

往深层次去想,我觉得是中国在50年代至90年代的一种思想固化给我们整整几代人带来的根深蒂固的“服从”思想。不光是我们,前几年似乎是刹那间风靡网络的GTD,被很多人奉为圭臬,而这群人并不只是我们这一代的年轻人。其实在这个年代每天上网、“生活”在网络上的人或多或少都算是更加开明了,还有千千万万的人在过着每天朝九晚五的生活,而在九五之外,则难以称得上是生活。

尽管网络的流行吹开了我们的思维,但还是无法和我们的根深蒂固的传统思想抗衡。我看过很多人的例子,想用GTD来改善自己对时间的管理,结果没多久就弃置不用了。我本来觉得是不是东方人与西方人的本质上的生活以及思想有区别,后来才觉得很可能就是这种根深蒂固的想法在影响着我们。

不过话虽然这么说,真要我改变什么,我自问也没有这样的能力。去年暑假我曾坚持在iCal上把第二天几点到几点的日程安排好,并严格执行,结果没几个星期就没继续了。那时候我每天都能把TopLanguage讨论组上的文章都读完,结果记得从8月份的一次因为复习考试而没有读完开始,到了现在我已经有总共29365篇没有读了。现在再看这将近3万的文章,就觉得没有读下去的动力了,导致了恶性循环。事实上怎正能完全把握自己时间的人非常稀少了,平常人则很难有那种坚持的毅力。

其实不止是网上论坛,就连最普通的浏览网页也是如此。我经常看到有感兴趣的东西,就在后台打开一个新标签页,但经常没有机会来得及看。再加上我很长时间不关机,所以标签页越攒越多,经常会有我下定决心,斩断乱麻,把浏览器整个退出的情况。比如说刚才的截图,是我浏览器的标签列表的一半不到:

firefox-tab-list.png

November 14, 2009

Jess新体会

jess-in-action-cover.png我们这学期的一门课是专家系统,在课上我们用Jess作为编程语言。我们的老师也算大方,把Jess的作者写的一本书《Jess in Action》全书影印下来给我们看,又把另外一本《Building Expert Systems: Principles, Procedures, and Applications》借给我们看。前几个星期,我因为第二本书是借的,就在一个周末把全书浏览了一遍,写了一篇文章。这个周末,我把第一本书带到学校,看了几章。

我之前其实是不大看重这本书的。因为从书名上看来,这本书主要讲的是Jess语言。而另外一本书题目中有专家系统,显得更大观一些。Jess语言的一些内容是我们课程的前半部分的主要内容之一,因此Jess语言的一些语法之类的东西我们早就在课上学到了。Jess本身对我来说不是难学的语言,因为之前用LISP、Prolog和J写过作业,因此我相信除了Brainfuck一类的语言外,不会再有让我很难接受的语法了。

不过今天扫完了书的前8章后,感觉比之前又有了不同。

首先是一些语言的细节。我们之前对语言的介绍有些“功利”的感觉──主要讲的是专家系统、关于知识的一些概念,Jess只不过是一个辅助的语言。学这门课的人都有用Prolog写作业的经历,因此我一度觉得为什么不用Prolog而是要用Jess来做专家系统呢?而这本书把语言的基石,以及fact、rule相关的一些东西分别细说出来后,对于Jess语言的感觉就更明显了。原先是整个是一团混沌,只知道要做成一样东西需要怎么做;现在则是把这团混沌条理化了。

另外就是也看了在课上老师没有讲的一些东西,比如Rete network之类的属于语言实现的底层的内容。还有JVM的地址空间大小导致Java垃圾回收的效率对Jess程序执行速度的影响等。

看这本书的另一个收获就是Jess的价值。世界上专家系统的外壳很多,知名的除了Jess外,还有public domain的CLIPS。CLIPS是用C语言来实现的,其实抛开一些细节上的改良之外,Jess只不过是用Java把CLIPS再实现一遍罢了。与人工智能仍在实验室之内不同,专家系统则早已被人们用在了各种商业领域(填写报税表、操控仪器、驾驶地铁等)。而涉及到商用领域的编程,Java则明显的比C语言有了很大的优势。

就好比JRuby比CRuby对JVM更友好一样,Jess可以很容易的与Java互动。本来我只是以为Jess由于是用Java实现的关系,可以调用编译成字节码的Java函数。结果没想到两者间的互动远比我想象的深刻,除了函数外,连Java的类都可以在Jess中使用。这样就相当于Java的数据类型可以和Jess互通了,而且书上也有代码展示了在Jess中创建一个Java的HashMap对象,然后往里面hash东西,就和在Java中一样。这样一来,Jess和Java的关系,就不只是我过去想的代码互相调用、通过JDBC操控数据库那么简单了。实际上,书上说用Jess来编写专家系统可以有两种大的方向:一是用Java来写,并调用Jess来完成专家系统部分的运算;二是用Jess来写,并在适度需要的时候调用Java代码。而Java作为一个纯面向对象的语言,用它来写大型商用程序,自然比C语言来的得心应手。

在掌握了Jess的语法后,我总是觉得不如Prolog来得顺手。当然抛开两个语言的底层的不同(比如Jess是forward chaining而Prolog是backward chaining,意味着Jess中几乎不能的递归,而这在Prolog中却是家常便饭)外,主要原因还是Jess的LISP语法有些繁琐。在Jess中添加一个fact,需要放在deffact中,在Prolog中则直接写就行了;定义rule也是如此。不过相比起Jess和Java的关系,Prolog的语法实在是太“惊世骇俗”了。因此Prolog几乎不是一个流行的语言,即使有人用Java实现了jPrologProlog Cafe,但毕竟因为没有完整的模拟Prolog,也没有流行起来。

专家系统领域并不如何开放。现在专家系统方面的顶尖技术都掌握在一些公司手中,研发了新技术后并不公开,因此在学术领域的发展是很落后的。所以我现在也不知道Jess在专家系统领域中处于一个什么地位。不过我估计应该不会很差,因为Jess并不是开源软件。用户需要向开发者付费购买许可证才能把Jess应用到商业软件中(Jess其实就是一个不到700KB的jess.jar文件),学术使用也需要联系开发者申请学术许可证。我们用的Jess都是老师给我们的,而不是我们从网上下载的。我今天中午给开发者写了封邮件,看看能不能申请下载到源代码来研究一下。不过半小时前收到邮件,说我可以获得用于学术的二进制代码,可以使用一年。只能长叹一声:其实我从老师那里得到的版本已经比它多很多了,我要的其实是源代码啊。

最近听说了不少关于编程语言的项目。比如Google的Go,还有VIM作者的Zimbu。不过这群大牛好像没有研究专家系统的,要是能设计个开源的专家系统外壳就好了。

火警

刚才的火警是我在这边经历的第二次消防警报了。第一次是在今年暑期中,那次没有经验,糊里糊涂的就过去了。这次倒是从头到尾的看到了事情的经过。

我们学校里火警的铃声有点像过去在小学、中学里上课、下课铃的那种声音,不过放大了至少一倍。我在咖啡厅里坐的位置旁边就是一个警铃,因此听的很真切。在加拿大,人们对防火比较重视,每家每户都有一个火警探测器。一旦感应到有烟之类的东西,警报就会响。老外很少像中国人一样炒菜,因此房子里安装抽油烟机的很少。所以当中国人在家里做饭的时候,经常会用一个袋子把警报器蒙上。老外抽烟也都在室外抽,而中国人喜欢在家里舒服的抽,因此也要对警报器做一定的措施。警报器都和消防队连接着,因此当你的警报器响了后,消防队马上就知道了。如果你不在一定时间内报告消防队这是一次由做饭、抽烟引起的误报,消防车就会往你家跑了。

在公共场合,也有火警的报警开关,我们学校里隔几步就有这么一个。之前住过学校的同学告诉我,有人晚上喝醉了,拉警报开关,不一会就引来了消防车。学校里有些地方还有逃生门,就是一个平时都不用的普通的门。门上有告示,说是只要门被打开,警报就会自动想起,不过我没有测试过。因此,在学校里引发消防警报的机会就很多了。有人发坏拉警报开关,有人吸烟正好引发了感应器,或者有人不小心推了逃生门,都有可能让警铃想起。

警铃想了之后,在室内的人都要赶紧跑到户外去,这是规定。其实就算你想留在室内也很难,我在第一次遇到这种情况的时候,正看东西在兴头上,不想打断,因此就晚走了一会。但那刺耳的铃声有很强的分散注意力的效果,所以根本没法在屋子里呆。不过一般火警误报的可能性巨大,我们也没有看到明火或有烟或焦味,所以只是把外套穿上就出去了,电脑和书包之类的还是放在桌子上。

在外面等了大概5分钟,就听到消防车的警报声音了。不过估计消防员也觉得误报的可能性多一些,在外面又没有看到火苗,因此第一辆车上下来的第一个人是一个非常肥的女消防员。她慢悠悠的扭进了楼后,又陆续进入了几个人。我们在外面等了大概有10分钟,警铃终于停止了。有过了两、三分钟的样子,消防员从楼里面走了出来,冲大家挥了一下手,示意可以进去了。我们才纷纷回到了楼内。

虽然这样子挺讨厌的,但好在几率并不高,忍一忍也就过去了。而且经常来上这么一回,除了当作防火演习外,还让我们知道了消防员随时可以来,让我们感到些许的安全感。

PS,上周六帮同学去买电脑的时候,在路上看到一辆消防车和一辆轿车堵在了十字路口中间,看样子是辆车相撞了。当时地上有一些沙子,一帮消防员在扫地。旁边的轿车的前面明显的凹了进去。过一会消防车就开走了。这也算是一件逸闻了。

November 12, 2009

MT5 Release Candidate 1

今天中午的时候看MT官网上在11月6日发布了一篇新文章,说是MT5发布了RC1版本。本来我是没什么兴趣的,但看到介绍说有了新的Theme──Pico,从截图上看也挺好看,于是就从另外一个域名上安装一下试试。

MT从3版本开始的安装程序就已经非常不错了,因此安装起来没有任何困难。但仍然是数据库的问题在困扰我:如果选择使用sqlite来做数据库,默认的数据库路径是Site Root/MT/db/mt.db,但默认情况下,MT目录下面并没有db目录。可如果没有db目录,安装程序在检测数据库的时候就会报错,因此必须手工创建db目录。我觉得程序应该可以做的更智能一点(或者说“不那么愚蠢”),解决这个不算是问题的问题应该不难。我印象里MT3没有这个问题,MT4就有了,现在MT5到了RC1版本还是有这个瑕疵。

MT5自从Alpha版本发布后,我就测试过,但因为不是正式版,因此我一直没有仔细研究。现在感觉我对MT真是搞不懂,website和page、blog的关系越来越复杂了。也许是我的观念没转过来的原因,总之安装好之后让我很困惑。

安装完毕后,我直接建立了一个blog,没想到pico这个新theme不是我想象的那样是之后选择,而是在创建的时候就要决定。我本来是以为pico就是一个普通的theme,可以随时替换的那样,结果实际上似乎比我想的更大。总之选定了之后,发布一看,效果确实不错。我导入了这个blog的导出内容,虽然等了大约5分多中,但最后没有什么问题。导入结束后我查看了一下mt.db文件的大小,3.7M,还可以。看来我的blog目前的规模,用sqlite应该是可以承受的。试着发布了一下,等了又5分多钟,竟然报错了:

mt5-publish-failure.png

我印象里我在尝试上一个版本的时候也发生过这种问题。我一直不清楚是什么原因,也没有去查,只是“祈祷”在MT5正式发布后会有所改善。

我比较喜欢简洁的观感,因此这次的新的pico主题让我比较喜欢,这是首页最上面的截图:

mt5-pico-style-up.png

这是首页最下面的截图:

mt5-pico-style-bottom.png

虽然简单,但别有风味,我觉得也是一个不错的选择。而且汉字的显式也很舒服,而不是像MT4的默认设定,让你看着就觉得别扭。在后台的Style设定下,Pico主题有自己的分栏,里面有深蓝、深灰、棕褐以及白色四种选择。我估计通过修改css文件,应该可以手动设定更多的风格:

mt5-style-pico.png

安装后我一直挺纳闷,为什么主页上什么内容都没有呢?我用的是Classic的页面风格,就是那个枣红色的。我试着创建新page,但也没搞清楚page的设定关系。结果我创建了一个在打开页面后默认显式的page,想当然的把它的名称定义为index.html,结果页面还是空空如也,只是在右边栏上多了一个index.html的链接。点了之后依旧没有反应,我估计是和默认的页面文件名相冲突的原因。于是我在后台删除了我刚建立的index.html这个页面,结果竟然把本来的index.html也给删掉了,直接导致根目录下没有了index.html文件,直接把赤裸裸的目录结构给展示出来了。

我在重新生成了整个website后,发现了一个更让我困惑的地方──website居然就是我的blog在Classic风格下面的展示:

mt5-website.png

既然website和blog的内容一模一样,只是风格换了,那么website的意义何在呢?当然这也可能是我没有写任何page的缘故。不过website还没有pico风格,如何让website和blog的风格统一,也是一个问题。同样的,希望在正式版中会有所改进。

最后我还是没有搞定子域名的问题。这个问题来源于我想用MT来管理我的整个网站包括首页和blog。我目前首页的网址是http://www.cnliufeng.com/,MT5在新建blog的时候可以设定blog的URL地址,并且有“建立在子域名下”的选项。可当我选定了这个选项后,blog的网址就变成了“XXX.www.cnliufeng.com/”,而XXX就是我要填写的。即使这样设定了之后,子域名还是工作不正常,因此我只是把blog建立在了子目录下面,但我在子域名下写了将近三年blog,就这样切换URL肯定会导致链接问题。而且我也开始怀疑子域名的问题必须在服务器那边进行设置,通过MT来设定是没有办法的。

虽然我目前用UseMod Wiki来做首页感觉还不错,但有一个最关键的问题一直在困扰我──就是wiki不能插入纯HTML代码。目前情况下我在页面里插入HTML代码后都不能正常解析,而是直接把HTML代码输出出来。这样的问题就是我无法在wiki上放badge、也无法在页脚放置Google Analytics的javascript代码。所以我对用MT管理首页还是抱有希望的,同时我也在继续探索其它的wiki中。

PS:目前Six Apart似乎把更多的重点放在了blog之外的交流上。比如今天我在官方网页上看到了上面对于Motion的通告:

typepad-motion.png

我之前讨论过motion,其实就是一个类似Twitter的让人们发布短小信息的社区工具,当然它对信息的格式更宽容一些,但毕竟没有一个很好的交互模式,让我感觉目前与主流社区(Twitter、Plurk)格格不入,所以还是有待观望。不过从上面那个宣传条上,居然看到了Zachary Quinto的名字,去了他的网页一看,果然很漂亮、很绚丽,不过对于个人用户来说,现在并没有看出什么实际用途。

November 9, 2009

新首页

use-mod-wiki.gif今天在看fred的一篇文章的时候,被他的整个页面所吸引。当时正好又引起了整治一下我的首页想法。不过与上次不同,这次我不是想用Movable Type来管理,而是用wiki。

当然Movable Type是第一选择,但要整治到我的首页上要做的实在太大,我之前没有这方面改动的经验。我也实在没有时间与精力来研究这些东西,而且我也不敢保证做了改动之后这个blog还能不能正常运转。而wiki则不同,它相对MT来说比较轻量。我之前也用过MediaWiki来建立过站点,对一些设定都比较了解。

不过这次我不希望再用MediaWiki了。MediaWiki是为了Wikipedia设计的,用来做个人的首页太大了,也不方便管理。很多相关的设置都是完全不必要的,比如用户的权限等级。我的首页当然只需要我自己来编辑,其他人能改动的地方应该不多,也没有必要多用户。再者对于个人的虚拟主机来说,MediaWiki的速度也挺让人头疼的。关键是,对于做首页来说,我其实是把wiki当作了出版工具来用,只是用来方便了书写而已,wiki的交互功能,则是越少越好。

其它的要求,主要就是尽量轻量。比如最好不要用Java的,最好不需要用数据库,或者支持sqlite也行。其实我在去年有想法是自己用Perl之类的语言写一个转换程序,我用wiki格式的文件来直接写页面的正文,保存在一个固定的文件夹里面,这个程序结合提前设定的模板,来生成html文件。其实就是不使用数据库的MT,或者blosxom。但后来没有时间来写,只好放弃。

我从Wikipedia上找到了一个wiki程序比较表,然后根据我的要求比对,第一个找到了UseMod Wiki。看Wikipedia的历史,早期就是用的这个wiki程序,后来由于负载的原因才又开发了MediaWiki。看来口碑还不错呢。正好晚上有点时间,就来研究一下。

其实当我第一眼看到它的网页的时候,我就喜欢上了。页面清晰,没有什么多余内容,体积也很小。这个程序,根据它的页面上说明,就是根据wiki概念的创始人Ward Cunningham的概念设计的,产生的结果也和Ward Cunningham做的世界上第一个wiki──WikiWikiWeb很像。它的安装也很简单,只有一个Perl程序就能运行。它需要建立一个文档目录,本来我还以为是往里面放文本文件,然后程序动态的生成html文件,结果运行了之后才发现,它完全是在浏览器里面书写wiki格式的文章的。可以在发布前预览,完全就跟MediaWiki、MT一个样子。

花了一点时间,把过去的首页上的内容手动移植到wiki上,便成了现在的样子。但我还不知道怎么在页面上插入纯HTML代码,所以原先首页上的一些标签什么的,现在通通不在了。等有机会再研究。

UseMod Wiki还有一个缺点(也是很多wiki程序共有的缺点),就是国内用的人不多,相关的中文文档很少。我从它的官方网页上的中文翻译的作者的页面上看到了有中文的一个小型的教程,地址在这里,已经写的相当不错了。可惜这位作者好像不再在这上面玩了,相关的翻译也没有更新。

最近由于用MT的关系,我似乎对静态页面有了依赖的心理,总觉得没有静态页面就不保险。ModUse Wiki把文档文件夹当作一个在文件系统上的数据库,我实在是害怕有一天这个文件夹出了什么问题,导致我的页面都丢掉了。只能但愿UseMod Wiki的程序写的够稳健了。

总之,在有更好的方案之前,我的首页就是这个样子的。

November 8, 2009

Ryan放的火

ryan-started-the-fire.jpg王小峰写过一篇文章《借个火》,里面提到了一首歌──Billy Joel的We Didn't Started the Fire。我之前没听过这首歌,于是在看那篇文章的时候就听了一下,感觉不错。除了优美的曲调之外,用歌词记录了1949年至1989年发生的一些著名事件。

在看《The Office》的时候,印象里是第二季里的一集,实习生Ryan在烤箱里把奶酪给烤糊了。烟雾引起了防火警报,Dwight发现后说他有一首非常适合当时情况的歌,于是就唱了起来“Ryan started the fire!”。随着电视上的播出,这句话也成为了The Office迷的流行语之一。

今天在看Pam Halpert的blog(由扮演Pam Halpert的Jenna Fischer来写的)的时候,看到她贴了一段YouTube视频,看了之后直呼“太酷了!”,并从YouTube上找到了加长版的视频:

怎么个酷法呢?视频制作者把The Office中的内容,用We Didn't Started the Fire的形式表示了个遍,简直让我百看不厌。我在土豆网上上传了一份,如果看YouTube不方便的话,可以去那里看。

November 6, 2009

恩格尔系数

这个星期一直感冒发烧,到了昨天晚上才开始好了一点,因此一直没有去体育馆锻炼。今天下午上晚课,感觉身体已经恢复的不错了,就去锻炼了一下。

在换完衣服往场地里走的时候,看到了一家人带着几个小孩来锻炼,不由得想起了我前几个星期一直在想的问题──什么时候在中国,健身才能成为人们的日常活动呢?

我两年多没在国内呆,不大了解近期情况,不过两年前,根据我的经验,在济南,我在上大学之前和别人说到谁去了健身房,就感觉那人好像怪怪的似地。到了大学之后,我身边才开始有同学日常会去健身房锻炼。来到加拿大之后的第一年,我的另外两个同学说是在学校花了100加元左右办了一年的健身卡,并劝我也办一张。我当时一口回绝,以当时一比七的汇率,100加元已经算是挺大额的消费了,在我之前从来没有经历过,因此觉得这样子有点太败家了。到了第二年才开始习惯。

在我的观念中,去健身房不是生活必需品。当然身体健康很重要,但要保持健康,在户外跑跑步,或者在家里做几个俯卧撑就行了。而专门花一段时间在一个场所里,用各种器械来消耗自己的体力,用俗话来说就是“有劲没处使”。这也是我们从小到大学校的老师批评打架的同学的一贯用语。当然用器械来消耗体力比打架来消耗体力更文明、也更安全一些,但打架可不用付钱啊。所以如果深究起观念来,我觉得去健身房是一件比打架更恶劣的行为,是资本家的奢侈浪费。

而在几个星期前,我正在器械上做无氧时,又想起了这个问题。恰巧与我相对的一侧是一排让使用者模仿骑自行车的器械(我不知道它的学名是什么),与我正对的两台上面坐了两个小朋友,估摸着也就六、七岁的年纪吧。当时我立即觉得,在加拿大当地的两个小孩子,在六岁的时候就已经知道去健身房了。而我一个二十多岁的中国人,还在怀疑去健身房是不是太奢侈。在这里,一家人一起去健身房锻炼相当正常,而在国内,健身也只是80年代后期出生的这一代人刚开始流行起来的事情。

它对我们的影响,我觉得是巨大的,体现在国民的身体素质上,其根本在于人们对于锻炼身体一事的态度上。在国内的思想里,锻炼身体几乎都是被动的。从小学开始,我们每天用来锻炼身体的时间,在于每天的课间操,以及体育课的时间里。一旦我们进入了大学,没有了每天强制性的这些活动,能坚持锻炼的只是少数人,然后有更多的一些人有一两种体育爱好,比如足球、篮球之类的,而大多数人则从此不再坚持锻炼了。而在加拿大,锻炼身体已经成为了生活上必需的事情。一旦养成了习惯,锻炼身体就是生活工作再忙也会抽时间进行的事情。

我考虑过造成这两者的原因。除了传统及思想的影响外,经济条件应该是主要的因素。归根结底就是我们不如别人有钱,要为生活而奔波,没有相当的福利,去健身房自然成了奢侈的事情。我才国内一直宣传的恩格尔系数,应该是把锻炼身体这一项去掉了吧。我们什么时候能把去健身房作为生活的必需品,大概才能在生活水平上和发达国家有的比较。

November 5, 2009

最近几天小病一场,白天一直没有心情写一些作业之外的东西。今天病情基本上完全遏止了,加上刚才心情确实不错,在这里记一笔。

刚才在看The Office第五季第七集,里面说到Michael要去加拿大出差了。然后在他与公司的CFO,David Wallace通电话,确认需要携带的物品的时候,镜头转到了David那边,他解释了因为公司把Michael新交的女朋友,公司的人力资源经理Holly调到别的城市后,Michael的心情一直很低落,这次的恩惠使得他完全回复过来,而且,也确实很难找到有人愿意在11月中旬去温尼伯的人。

the-office-winnipeg.png

看到这里,我不禁鼓掌大笑,原因是我太喜欢这部剧了,经常让我感到就像是和我有一些关联似的。比如上次在飞机上也有鬼使神差的那么一次。而这次是,剧集里面的主人公来我现在居住的城市开会,时间也大差不差。

现在是11月上旬,温尼伯的日常温度已经在零下5度以下了,晚上的时候更冷。到了11月中旬,按照我前两年的经验,温度至少要到零下10度以下。而主人公所在的地方是宾夕法尼亚的Scranton,那里的气候怎么样我不了解,但既然在加拿大南部,肯定不如这边这么冷。

The Office第五季,如果我没记错的话,应该是2008年拍的吧。不知道剧组有没有实际到温尼伯来取景。不过就算来了,那时我也对这部剧一无所知,不会有任何激动。我是刚看到那个场景就来写这一篇的,因此还不知道呆会剧情会怎样。发布了这一篇后再继续看下去。

November 2, 2009

中文域名

昨天看了蔡智浩的新文《中文網址的未來(在 ICANN 開放網域名稱使用非拉丁字母之後)》,提到了ICANN新通过的在域名中使用Unicode的草案。过去的非拉丁域名的标准,是把字符转换成拉丁字母,比如「中文」被转换成「xn—fiq228c」。而这次的新标准,算是一个进步──我们不需要那个没有任何信息的拉丁符号了。

虽然把计算机中文化是很多人的梦想,因此搞出了类似“中文内核”、“中文编程语言”之类的东西(或称为“闹剧”)。我觉得在域名中使用中文,至少在目前是没什么用。

域名的作用,是给数字形式的IP地址关联上一个容易记忆、方便使用的标志。在目前计算机里的一切都是用英文字母表示的时代(就连输入法也是),拉丁字母无疑是最方便使用的。如果域名里有了中文,我们输入的时候就要切换到中文输入法,多按了不知多少键盘。更麻烦的是,在一台没有中文输入法的机器上,就无法输入中文域名,直接打开网页。

确实,Unicode域名扩展了英文字母的域名。经过了互联网发展的几年,很多域名都不能用了。如果有了Unicode域名,我们确实可以缓解这一情况。不过,基于上述的困难,我觉得还是开发新的顶级域名稍微合理一些。

之前反波发布过一则播客,题目是域名贩子。内容大概是说一个韩裔美国人,通过抢注域名再贩卖发了财,被人们称为“那个掌控了因特网的人”。不过,播客最后提到了一点我很赞同,就是在Google等搜索引擎越来越火的时代,抢注域名的方法已经不管用了,因为很多人都是直接用搜索引擎搜索关键词,再点击进入网页,连域名都懒得记。而对于今天的Unicode域名扩展域名基础这一点,我觉得同样适用。如果没有好的域名,用一个不那么好的域名,如果把知名度打响,通过搜索引擎,也一样能正常发展。

November 1, 2009

停用iChat

ichat-icon.jpg今天我把用了大约半年的iChat给关闭了,改用Adium。

自从我买了MacBook,我就在用Adium作为聊天客户端。Macintosh自带的聊天工具是iChat,而且在Leopard发布时一起作了更新,有了一些新功能。我过去定说过iChat,但对其外观、功能与特色不甚了然。在看了Apple官方的介绍Leopard的视频后,我才感叹到iChat实在是太棒了。但真正让我感到惊讶的是协作功能,双方甚至可以完全操作对方的电脑。但当我为了尽可能与更多的朋友在网上联系,我同时有Google Talk、MSN和QQ帐号。iChat只支持其中的Google Talk,而Adium三个都支持,因此我尽管很想用iChat,结果还是用了Adium。

大约半年前,不知道腾讯公司又在搞什么,Adium的QQ插件无法登录了。当登录QQ时,Adium总是提示我的密码错误,而我用官方版的QQ则没有问题。我不喜欢同时运行两个用于类似功能的程序,于是就干脆不上QQ了。反正平时也没有什么正事,我有事找同学的话就用官方版的登录。后来我看到了可以通过Jabber服务器来让iChat连上MSN,当进行成功后,我就用iChat替换了Adium。

今天我实在是不想忍受iChat了。iChat最大的毛病是,当主程序不开着的时候,经常掉线。iChat可以启动一个Agent在后台运行,并在系统的菜单栏右边显式一个图标,而主程序可以退出。当有人给我发信息的时候,iChat会自动启动。可这个Agent经常失效,命名图标是连线的标志,可是我实际上是不在线的。今天我登录gmail的时候,看到我母亲给我留的言,我才发现原来iChatAgent又一次失效了。于是就忍无可忍,把iChat彻底关掉了,并拖出了Dock。

iChat虽然可以通过Jabber来登录MSN,但工作的并不好。有时Jabber服务器登录失败,会接连发来消息,让人感到很讨厌,这也是我放弃iChat的一个原因。而iChat吸引我的地方,我这里完全用不到。即使是支持Google Talk帐户,如果对方用的不是Macintosh的话,我们也无法协作。

经过了半年时间,Adium还是无法登录QQ,不过我也习惯了。QQ本来就是娱乐用的,对我来说不是什么正事。而刚才看了一下Adium,才发现竟然有这么多联系人同时登录。而我终于也能够“光明正大”的用MSN了。不过,这件事,以及之前Safari 4在我这里运行的一些问题,还有一些细节问题,倒是提示了我,Apple并不总是写好的软件的。

第一次遇到Internal Server Error

刚才在写上一篇文章的时候,中间需要插入一张图片。为了保证访问,我现在比较少把图片上传到flickr上再链接到文章中,而是直接上传到了服务器上。

在点了MT后台的上传图片按钮之后,这次弹出的不是上传选项,而是一个“Internal Server Error”的提示。之前我从网上看过其他一些用MT的人说过这个问题,是因为服务器的资源限制。现在Dreamhost不限制CPU时间了,出现这个问题让我挺奇怪。

我最担心的是,之前写的那些文字还没有保存。虽然现在MT有定时保存的功能,但能够保存多少,我还不知道。试着按了一下esc键,竟然成功的退回来了。我马上把全文复制了一下。

我又试了几次,每次都是出现这种错误,包括我把草稿保存了后,重新进了一次后台,也是这个样子。没办法,我用ssh登录上了服务器,用top看了一下正在运行的程序,发现除了bash和top外,其它的进程都是mt-tb.cgi。我不知道正常情况下是什么样子,但我推测有十几个mt-tb.cgi进程在运行,应该是有十几个服务器在进行trackback。要么就是我在trackback一个没有相应的服务器。总之大概不是正常的情况。我试着用killall来杀死了那些进程,在点上传图片按钮,于是就正常了。

我检查了一下后台的错误记录,发现和mt-cb.cgi相关的信息是这样子的:

Premature end of script headers: mt-tb.cgi

还没有查过究竟是什么问题,但确实是长了一点经验。

另外,我今天第一次登录后台的时候,很长时间都没有成功,最后收到提示是说无法正确连接到MySQL服务器。我现在觉得MySQL是把数据不知道以什么形式放在服务器上,虽然可能效率高一些,但相比起看得见的文件来说,还是文件更放心一些,备份起来也方便。MT支持sqlite数据库,我一直有把数据库从MySQL换到sqlite的想法,但又没找到一些相关的案例,对执行效率有点担心,也没有什么时间。等过一阵子再看看吧。

劳累的一天

前天晚上同学来我家,说是因为强行关机,他的Acer Aspire笔记本无法启动了。Acer的笔记本没有恢复光盘,只能通过在Windows里执行恢复程序,从硬盘上的恢复分区里恢复出厂设置。我之前已经帮他恢复过好几次了,但这次无法启动到Windows,我也无能为力了。

然后我告诉他,我可以帮他重装一遍系统,然后从Acer的网站上下载驱动。这样虽然变成了盗版,但也不影响日常使用。奇怪的是,我上了Acer的网站上,竟然找不到他的这款8500笔记本的型号,只有8000和9000的,我也不知道驱动能不能用。另外,我之前刻录的那张Windows XP的安装盘找不到了,我又没有空白CD了,无法刻录一张新的。学校虽然给了我MSDNAA帐户,可以下载Vista,可惜我也没有保留镜像,因此虽然我有空白DVD,但也不能马上刻录。那同学急着要玩游戏,再加上那台老电脑经常蓝屏,因此决定明天去买一台台式机,并要我随行“指导”。我们说好早上10点多出发,他会在10点左右给我打电话确保我起床。

到了昨天,我9:30醒了后,看手机上没有未接来电,于是就继续睡一会,然后到了将近10:30醒了,看了手机还是没有未接,于是就给他打了个电话,结果那孙子竟然还在床上。那天我睡的比较晚,看了几集《The Office》并看了2007年的Emmy颁奖典礼,一直到3点多才睡的。给对方打电话之后,下床洗了个澡,收拾了一下,然后他开车到了我的楼下,我就背着书包下去了。我本来想的是买电脑用不了两个小时,办完了之后还能去学校上自习。

等我们杀去了Future Shop后,就从那里转来转去。他希望找一台有独立显卡的机器,并且不要太贵,结果我们转了半天也没有找到合适的。于是我们只好驱车去了在Downtown的bestbuy。从那里又研究了挺长时间,最后弄回来一台HP台式,不到800元,配置还不错。等回到他家已经是将近下午四点了。我们的另外一个朋友本来要昨天晚上来聚餐,我就在他家吃了晚饭,主要是卤味,还吃了一些螃蟹。然后我和另外的同学干了一瓶茅台,感觉还不错。晚上快11点了才回家。

话说我很早以前,就已经厌倦了帮朋友弄电脑了。主要是我很长时间不用Windows,一些细节上的设置都忘了。经常有些问题,我觉得等我找到原因的话,还不如重装来的痛快。而且弄这些也非常耽误时间,还非常无聊。我记得小时候非常喜欢捣鼓这些,安装什么软件的时候总是一丝不苟的盯着进度条,把每一个细节都记住,给别人修电脑也总是乐此不疲。现在我虽然学的是计算机专业,但对计算机的维修反而觉得越来越不在行了。有时朋友请我帮忙,我还是会做,但已经感觉不到小时候的那种快乐了。对自己也没有了那种“手到病除”的那种信心,每次都是发自内心的说“我只能试试”而不是小时候的那种“没问题”了。我也没有什么好的方法论来操作,只是根据自己的分析以及一些计算机常识来试验。等着“瞎猫碰上死耗子”时就是修好的时候。然后别人称赞我太厉害了,我说是“蒙的”,是实情,但对方总认为我是谦虚。我觉得研究计算机科学的人,大概都不是好的修电脑的人员,看上去有违常理,但确实我的真实感受。

我曾经在手里没有一台自己可以随时使用的电脑的时候,经常看报纸上的配件价格表,并在纸上自己“组装”了很多次机器──列出配置列表和大约价格。因此也给买电脑的人提出过一些建议。现在我对这些的兴趣大减,也很少关注这些事情了。过去对一些CPU、显卡的型号总是如数家珍,昨天除了Intel的显卡外,我也不大知道那些型号是集成显卡。比如看到ATI的Radeon HD 3200,感觉是独立显卡,但看了机器上的标示才知道其实是集成的。因此我只是胡说一通。我觉得当机器有了6GB内存后,显卡只要不太差,玩游戏应该没什么差别。不过我平时只玩超级玛丽,因此对这一点没什么认识。我之前在加拿大也陪同学买过电脑,并出了一些垃圾建议,同学一直都很感激我,并认为我水平很高,而我自己都觉得当时实在胡说一通,其实脑子里不知道在想些什么。

不过昨天去买电脑,自己的收获是发现现在硬件的价格比我印象里要低很多。比如我同学买的那台电脑,三核CPU、6GB内存、600GB+硬盘、独显什么的,连20寸显示器什么的一共不到800。按照汇率来算,也就5000人民币左右。可能我现在的思想还停留在97年家里的第一台电脑的时候,一台586、166MHz、16MB内存、15寸显示器加上HP打印机一共给了15000元。那台电脑是母亲的同事给组装的,我们对计算机还是一无所知,只觉得15000元对于买一台当时还没有普及的计算机来说,大概是等值的吧。

颠簸了一天后,回到同学家,帮他把电脑装起来,设置好,并装了小红伞。本来他想把硬盘分一下区的,因为出厂设置是除了恢复分区外只有一个大C盘(我不知道为什么厂商不用一个稍微好一点的分区方案,可能是想收取服务费吧),但找了半天也没找到可以使用的PM之类的软件。我从国内帮我妹妹调整分区的时候用了个软件不错,可我怎么也想不起名字来了。下载了一些都无法从Windows 7上运行。我也就劝同学说过因为Windows 7太新,一些分区软件不能用,等两天再看看。他急着在新电脑上玩游戏,于是也就接受了。那时候我已经感到相当疲倦了,十分想睡,感觉头很沉,再让我继续给他调整Windows我大概要吐了。然后忍着不适,给他弄好了中文支持。

然后我坐在一边,继续弄我的程序。并解决了一个seg fault错误。然后我们出去从餐馆订了菜,并买了饮料,为晚上的聚餐做准备。等我们回来后,我都感觉自己快要发烧了。他们在厨房准备的时候,我在一张椅子上迷糊了大概半小时,然后才又有了精神。然后就是聚餐,并一起回顾了一些过去高中和大学的事迹,以及和同学喝酒。本来我以为自从上次喝伤了之后,我可能不能再喝白酒了。经过两年多的“禁酒”,现在竟然还能喝半斤而没有了过去那种恶心的感觉,倒是意外之喜啊。和我去买电脑的那位同学,在我们谈话的时候,不忘去照顾他的游戏,遭到我们的一致鄙视:

playing-game.jpg

等到了十点半,我们吃饱喝足,我坐着同学的车回家了。在家中的厕所洗漱的时候,我忽然想起了YM爷爷。我发现他现在在做的一些事情,是我小时候很喜欢做的。现在我已经对这些不感兴趣了。对于Linux的推广,我觉得为什么要执着于别人在用什么系统呢?哪怕是Linux用的人再少,只要有人在维护,我可以正常的使用就好了,完全不必要写那些文章遭人骂。一些在做一件别人觉得没用的工作,并给其中的一个赋予“中国Linux之父”的名号,我觉得就跟小孩过家家一样。

可能是因为喝了酒的原因,我12点多就睡觉了。睡的也很沉,并做了两个梦。第一个梦是和一些同学进行郊游,但我认识的只有zhaokai。我们在一条小胡同里排成一溜,席地而坐,此时开始下小雨,我带了伞,并和zhaokai在一个伞下面。突然左侧好像发生了什么大事情,我们就冲过去。这时我们好像成了武侠小说里的人一样,有功夫、有师父。zhaokai冲了一半就折回,原因我已经忘了,我是继续往前冲的。到最后我冲进了一个四合院,并进了一件屋子。里面只有一张床,床上有枕头和被子。我冲了过去掀开杯子,里面没有人,但被子上还留有体温。我不知道为什么,感觉那是师父躺过的床,而师父已经仙去了,此时我悲从中来。这一切就像电影一样,我这个做梦人是在一张萤幕前看着萤幕里的自己进行着种种动作。然后屋子外面有响动,我知道了自己进入了一个陷阱。我含恨冲出屋子,决定在临死前尽量杀人为师父报仇。在屋外,我看到了一个拿镰刀的人一动不动。正在奇怪的时候,我回头,似乎看到了非常恐怖的画面,并尖叫了出来。就像我前面说过的,我这个做梦人是在看着萤幕里的自己,因此我只知道萤幕里的自己回头,一脸惊恐,但“自己”看到了什么画面,我是不知道的。下一个场景是我在尖叫,并且因此惊醒,并在尖叫出声音来。我在知道自己做了一个梦后,一会又睡了过去。

第二个梦是我在下午去了“华季火锅店”买烧烤卤味,在里面碰见的老板是我现在公寓旁边的“文开超市”的老板。我们交谈了一阵子,我买了半斤鸭子,还有别的什么的。等我回家后,跟我母亲说起这事,她说那个老板是她大学同学的亲弟弟什么的。然后我想起我还没有买完卤味,但这时又醒了。我没有睁眼,一直想再回到梦中去买卤味,但过了大概五分钟还是不行,只好翻身看了一下表,是10:30了,只好下床准备今天去学校的事情。

来学校后吃饭时和了一杯espresso,没有加任何东西,到现在都觉得挺精神。我也不知道是喝了咖啡的原因,还是昨晚喝酒导致睡眠充分的效果。