September 2009 Archives

September 30, 2009

国庆:1999年10月1日

这两天有晚上上床小睡一会的习惯。如果白天精力消耗过度,就直接睡到第二天6点,如果白天精力消耗一般,就过一会就起床,继续搞一阵子。

刚才躺在床上,听到隔壁朋友在看阅兵式,脑中不禁思绪万千,觉得要下来写一点了。不过因为身在国外的缘故,现在我越来越对这类活动不感兴趣了。像奥运开幕、春晚之类的我都有意的不看。最多到后来下载了一次奥运开幕看了一下。所以我说的不是阅兵,而是10月1日这个日子。当然也和阅兵有一定关系,因为我们国家每10年进行一次大庆,我们也大概会有一次大型的活动,来表达我们莘莘学子对祖国的拳拳之情。而我这次自然想到的,则是10年前的10月1日发生的事情。

那年我刚上初一,一切都懵懵懂懂的,什么都不大了解,什么都想了解。尽管当时没有特别的感觉,但现在对于当时在班上学了什么东西,都不怎么记得了。那时的学习仍然在延续小学的那种状态,每天都被班主任兼语文老师留下来,不是默写就是听写,出错3处以上就要再来一次。我那时基本上都是7点多(那时正常的下午放学时间好像是5:30)才一个人骑自行车,走大约40分钟的路回家。那时我刚学会骑自行车不久,远不如后来随随便便就不知不觉的能回家。记得那时印象最深的是,我骑车经过泉城广场,在等红灯的时候,那里的大屏幕正在放新闻联播。由于放学后被留下,我对新闻的内容当然无法提起任何兴趣,只是在想:“现在才初一,难道之后到初三的三年中,我每天都要这个点才回家?”那时我对自己的学习成绩也没有多大的信心,“努力学习争取不被留下”的想法,不是不敢有,而是根本不会出现。

1999年的10月1日,我们济南育英中学要求每个一年级的学生参加一个活动。主题是什么我记不清了,反正和国庆有关,要表达我们对祖国的热爱,好像还有表达我们自己健康向上的那种精神。表达方式是我们一起从学校大门出发,向西跑步,大概要穿过两条马路的样子。今天想起来,有点像行为艺术的感觉,一样让人摸不着头脑。活动非常严肃,不允许请假。我的一位同班同学,本来家里打算趁十一假期回趟老家,结果就算家长出面也没有被准假,让他们一家在背后恶骂不已。

那天学校要求我们很早就到学校。具体时间现在自然记不清了,但既然很早,想来大概是7点的样子吧。像我这样家离学校很远,需要骑车30多分钟(狂奔等级)才能到学校的,自然就比较痛苦了。到了学校后,我们先在教室等着。由于没有课,我们就在教室里开心的聊天。然后大概到了似乎8点半到9点的样子,我们在操场集合,被带到校门口,也没有管什么队形,就像马拉松一样,一个班一个班的跑。当时似乎刚下了毛毛雨,地上湿乎乎的。而我们的班长正好在我后面。他的意思是让我使劲跑,别掉队,于是在后面手放在我的背上不住的推我。他也没有使劲,但我竟然被绊了一下。本来也没有什么事,但由于他在我背后轻微的作用力,让我就这样跌倒了。于是当时还比较干净的校服,就沾上了一些泥巴。

更扯的是,当我们跑到了东方大厦的时候,竟然谁也不知道该干什么了,该跑到什么地方位置。校领导也没怎么有指示。于是我们就稀里糊涂的回家了。一切活动,进行了不到20分钟就完了,让我那位想回老家的同学哭笑不得。为了这么几小时的事,不能回老家,党与国与家的主流社会价值也淋漓尽致的体现了出来。

我是回到姥姥家,在那里看的看阅兵式。当时时值国家50大庆,据家人解释说阅兵式相当隆重,当时看的我是心潮澎湃,意犹未尽。遗憾的是阅兵式是每10年举行一次的。1999年我在想,要等到下次的阅兵式,还要等10年,那时候我已经上大学了吧,这是多么漫长的岁月啊。10年时间,现在看来,真得是白驹过隙,似乎是刹那间的事情。而1999年的阅兵式,可能是我有生以来唯一一次看直播的阅兵式了。1999年的10年前,我才2岁,而现在分析起来,那时候国内的环境,在四个月后的中国,能有怎样的阅兵式啊?!

10年,感觉上一瞬间的事情,但事实上却发生了许多。刚才在Twitter上看到有人说,江爷爷看上去不如往年壮实了。岁月衰人老,想当年看江爷爷在车上喊“同志们好”的飒爽英姿,心里不由得一片唏嘘。其实,何止是江爷爷,我们大家都老了,或者说是“成长”了。那时的我非常希望能入党,最好能步步高升,什么时候坐到江爷爷的位置,能够大展宏图,带领祖国人民“屹立与民族之林”。十年后的我,感觉在国内自己什么也不是,十年前脑中幻想的一切,看上去是那么的飘渺,与自己是那么的遥远……其实毕竟人都是要老要死的,就算是生前做了任何的伟业,无论死后还有没有意识存在,不都是一场空吗?我似乎很久之前就能看开了。

现在想来,唯一让我耿耿于怀的事情,就是我记得是在我小学四年级,也就是97年的时候,姥姥家就又过去的简易楼搬到塔楼里去了。但另一方面,我又觉得1999年我在看阅兵式的时候,是在老式的简易楼里发生的,看的也是那个十几寸的小彩电。虽然我近几年记忆力下降,但记忆冲突这还是第一次。

从回来之前就在家里看《Programming Ruby》,想尽快把这门语言入门。我以前也说过,对我来说,过去的知识常常会阻碍我接受新知识。过去学Python的时候是这样,现在学Ruby的时候也是一样。其实这类语法类似的脚本语言,它们的语法我早就基本掌握了,欠缺的就是解决某类问题的经验,以及对相应库的了解程度。这些就与实际编程的经验有关了。

为此,我最近写一些程序都是用的Ruby。就算用其它语言可以很快解决的,我也尽量用Ruby完成。我们密码学的第一次作业中的一道题,很简单,给一串密文:

TQLEQ TCDEJ ZFOZY EDFNN PPOEC JECJL RLTYX

而且告诉了它是用shift cipher(就是每个字母都换成了字母表中牌子后面的字母,如abc被加密成了def,就是字母被换成字母表中排在后面3位的字母了)来加密的。让我们从1到26,用穷举来列出每种情况,然后再判断原文是什么。

本来计划是用Ruby来写的。像这种不算复杂的算法类程序,又是与字符串相关的,用这种脚本语言最合适了──不用写与问题本身无关的冗余代码。题目的要求是用C、C++、Java或Pascal这些语言来写,其它语言需要教授批准。为了这个,我还专门找了教授,问他能不能用Perl、Python、Ruby这种script languages来做。后来他同意后,我就开始用Ruby来写。

结果花了我几乎半天的时间,我的结果简直可以用“惨不忍睹”来形容了。我把字符串放在数组里面,每次调用.next!来改变当前的字母。但由于Ruby的引用策略的关系,导致我的修改无法返回原数组去。因此总是出一些奇奇怪怪的错误。

本来打算再找时间研究一下的,但昨天上午的《计算机网络》这门课的实验课,要我们用C语言写socket程序。服务器端读取公交车的到站时间,客户端发送目前时间和公交车的车次,服务器端返回下一个到站的时间。自从学了脚本语言后,我越来越少用C语言认真的写程序了。主要是字符串那些东西,经常出错,远不如脚本语言方便,就连Java也比C语言方便不少。因此看到实验要求,我虽然有点怕,但还是硬写下去。结果竟然被我写出来了。

有了实验作业给我的底气,我觉得用C来完成密码学作业也不是太难了,就试着用C来写。结果让我意外的是,不到半小时这个程序就像模像样了。总共也不过30多行,比我之前用Ruby写的半成品多不了几行。

经过这件事,我开始反思我在这几年是不是对写程序不那么严肃了。如果让我评价对几种语言的喜好程度,我一定觉得脚本语言胜过C之类的语言。我花在Python上的时间比较多,而除了Java外,C语言和C++语言我几乎没有怎么“涉猎”。是不是有点避重就轻?是不是应该在平时多花一点时间在低级语言上呢?希望我在这个学期内可以有所改善。

September 27, 2009

不喜欢Picasa for Mac

picasa.jpg前几天听说Picasa在Mac平台出了3.5版本的,还从某个地方(印象里是Twitter)看到有人说在Mac下用Picasa替换了iPhoto。今天想起了这话,于是下载了下来看了一下。结果却是比较负面的。

我目前使用的就是iPhoto。我对照片管理没有什么要求,只是有个地方可以同一管理就可以了,最好可以方便我上传到Flickr(我的Flickr相册)。其它就没有什么要求了。到此为止iPhoto在Mac下运行的是相当不错的,特别是到了09版本后,可以方便的上传到Flickr上、可以人脸识别、支持地理标签(虽然我还没有GPS定位系统)等功能,让我非常满意。至于iPhoto的一些缺点,比如封闭性,还有照片库体积膨胀,我的需求没有这方面的冲突,因此也没有什么不爽的。

我在Windows平台下用过Picasa,感觉管理照片还不错。在Windows下,如果我们当年的那台本子的性能足够好的话,Picasa可以算作我的第一选择了。但今天在Mac下试用了Picasa后,我马上就把它删掉了。

首先的原因是在线图片服务的问题。经过我过去的调查,我在Flickr和Picasa Web之间选择了Flickr,这是一种很微妙的感官问题,很难说清楚。选择了Flickr后,我更是购买了Flickr Pro帐号,因为感到物有所值。这样一来,基本上首先就可以排除Picasa了。就算Picasa支持Flickr帐号,它肯定对Picasa Web的支持更好,因此很难让我安心的用Flickr。

第二个原因与Mac平台有关。印象里最早Google写的for Mac软件,是用虚拟机软件来模拟的。因此自然无法与Mac平滑结合。现在Picasa到了3.5版本,我觉得凭Google的水平,找几个人把Picasa移植到Cocoa框架下应该不是难事吧。不过在Picasa启动的时候,我又看到了象征X程序的那种鼠标外形。所以Picasa应该不是一个Cocoa或Carbon程序。随着Snow Leopard的到来,我们肯定要慢慢过渡到64位Cocoa上的。这样一来,Google用模拟的手段来移植软件有有点不好了。

第三个原因是一个个人的控制感的因素。我个人不喜欢软件帮我做太多的事。而在打开Picasa后,它做的第一件事,就是扫描我计算机上的图片,加到它的图片库里去。这样一下子让我对它的负面印象增加很多。首先我只是想试用一下这个软件,我还没有把它复制到我的Applications目录里,只是在dmg里面运行了它,这样子就给我在不知道什么地方创建了索引,我想删除的时候也不知道去哪里删。其次是并不是所有的照片我都想让Picasa来管理,至少在索引之前先让我设置个范围吧。还有,在索引前征求一下我的意见,这总是可以的吧?如果我知道要进行索引的话,我很可能就不会让它继续了。

最后一个原因是我的推测,我把它成为“发展前途”。选择软件对一个计算机用户也是一门学问。当你选择了一个软件后,过了几年公司倒闭了,或者取消了这个项目,你就只能换用其它软件。我一直把Google当作网络公司,虽然它出了Google Desktop、Google Picasa、Google Earth等软件,但同等的都会有在线版的服务可以用。比如Google Talk,在发布不久后就不大被支持了,转而开始推广Gmail Chat。Google Earth和Google Maps之间也是类似情况。因此我对Google推出的软件都是抱有比较谨慎的态度的。而Apple的软件部门是公司的大头,Apple肯定会大力支持。iLife系列也是Apple的几大软件之一,质量肯定有保障。

到了最后,我把Picasa删掉了。虽然我还没有找到索引文件的保存地址,但也留在以后慢慢再说吧。想到了上面的几点,我是一点也不想把它留在机器上了。

September 26, 2009

解密辅助工具

我们的密码学课程的作业之一就是老师给你一段字母拼成的文字,单词已经划分好了,每个字母都代表另外一个字母,让你翻译成原文。翻译的方法是通过找出一些特殊的部分,不如两个相同字母结尾的单词、单字母单词之类的,来找出更多的字母。对于这种方法的难处,我在之前的文章里有过描述。其中也说了我要写个工具来帮我干这个事情。今天用Ruby简单的写了这么一个。放在了这里

经过测试,程序能按照我的想法来做事。比如那篇文章里说的SKYQD一词,我有了arge结尾后,怎么也想不到large这个词。有了这个工具,运行match.rb SKYQD | grep arge就可以了返回large了,应该会给我的工作有很大帮助。程序的原理也很简单:对于SKYQD,先把它处理成一个标准的模式──ABCDE(更好的例子是HYTOOW,处理成标准模式后是ABCDDE)。然后再从保存了处理成标准模式的英文单词的Hash中查找就可以了。我是Ruby初学者,因此写的代码也没有什么优化,应该也挺罗唆。

目前这个程序有几个问题。

一是程序中上来先把我之前获得的英文单词都处理成我要的模式,这样每次运行都来一遍,应该挺废时间。我在想说不定把处理完毕的Hash保存起来可能会更有效率。

二是我目前的单词列表非常不够。我目前的单词列表是在这篇文章里说的,通过一个小程序在一个网站上抓取的所谓“常用单词3000字”。有很多单词都却是,因此我得到的常常就是Not Found。我无法在网上找到非常全面的单词列表,因此可能要写个程序从网络上解析网页抓单词。因为我们的这些句子经常是老师从Winnipeg Free Press上得到的,如果能把这个网站上用到的单词都作为程序的基础,那么破解起来应该会更方便。

第三点就有点提高了。目前这个程序只是按照我的要求来寻找合适的单词,并不能更进一步帮助我。如果能把我的单词列表中的单词都配上一些属性,通过人工智能上的一些技术来做进一步的筛选的话,应该会更方便。我在一年前学《人工智能》的时候,有一项作业是用Prolog来写一个检验一句话是否符合日本俳句的标准。如果能结合这两点,让程序帮忙整句的筛选,那就更理想了。

这样的桌面也不错

升级了Snow Leopard之后,我原先结合了SIMBL(记不清模块的名字了)的Terminal.app就不能打开了。简单的搜索了一下,没找到解决方案,于是就直接用起了iTerm。几天下来,除了切换标签是command+option+左右键让我不习惯外(我喜欢标准的Mac OS X方式:command+shift+{}),其它的感觉还都不错。

iTerm有一项全屏功能,按command+enter就可以了。因此我也没有调整它的默认大小,需要在终端工作的时候就进入全屏模式,感觉很爽。

下面是一张我在全屏模式下运行top的截图:

iterm-top.png

在全屏模式下,完全就是iTerm的世界。Mac OS X的菜单栏、Dock都被盖住了,让我有想起了用Linux时的感觉。

我一度想把这个界面弄成了的桌面,放在最底层。这样一来,计算机的性能、还有时间(右上角)什么的就都有了,还不影响前台的工作。可惜在Mac下的菜单栏、Dock都太重要了,我也不知道该怎么达到需要的效果,只好作罢。不过在Linux下,特别是如果使用像FVWM那样的窗口管理器的人,或许可以尝试一下。

September 21, 2009

英文单词列表

《密码学》课上的一个内容就是“破译”密码。其实我们也不算真正的破译,只是老师选一段话,把每个字母用另外一个字母代替,让我们找出原文。比如这个:

GKVVEHDRR ER GKOEHQ K SKXQD

STOEHQ, ZKXEHQ, ZSTRD-PHEJ AKYESU --

EH KHTJGDX ZEJU. QDTXQD CBXHR.

其实破译这种密码并不困难,单词已经分开了,你只要找规律试就可以了。比如第一行的K,一个单独的字母单词,很容易猜到可能是a或I;还有几个EHQ结尾的单词,也很容易的会想到ing。就这样把已知的几个单词替换回去,并猜出更多的单词。最后,我们能得到这样的原文:

Happiness is having a large

loving, caring, close-knit family --

in another city. George Burns.

经过几次这样的尝试,我发现这种破译对于英文为第一语言的人来说是很简单的,可对于像我这种后来才学英语的人,对于英文单词就没有这么的敏感。比如那天我破译这一段的时候,第一行的SKYQD中,后四个我都猜出来了,于是就想了半天:什么单词是一个字母加上arge结尾的?结果想到最后,直到通过其它途径破解了密码后,才发现原来这个单词就是large啊。可当时我是怎么也想不出来。相信对于英文为母语的人来说,几乎是条件反射般的迅速反应吧。

我从上这门课的第一天,就想写个程序来协助破译。程序也不需要很复杂,用户告诉程序需要的单词的pattern,比如“GKVVEHDRR”,而程序通过搜索单词列表,把符合条件的单词都找出来,这样不用乱枪打鸟,比原先就方便多了。

但程序的基础,就是要有一份常用单词的列表。本来以为这样的东西网上一找一大片,没想到找了半天,得到的都是一些特殊的单词列表,什么简化英语单词列表之类的。很少有我想要的。而这种需求通过词典更不能解决了。

找了半天,发现了这样的一个网页,上面有3000个英文常用单词,看了之后,我觉得不错,但需要把单词整理成一个文件,每行放一个单词,然后再排序之类的。因此把这些单词都抓下来就是首要任务了。

我对Perl的正则比较熟悉,对Python的字符串处理也还行,但因为想练习Ruby,就选择用它来做。觉得Ruby这么大的“家业”,相关的模块应该不少,从网上搜索一番后,找到了Nokogiri这个库,据说是最快的一个HTML/XML Parser。它的用法很简单,看了例子后,我很快就上手了。相比起从网页中用正则挨个判断,用Nokogiri实在是太爽了。

但写程序的时候出现了一个小问题。我不知道怎么获得链接的地址。因为那个单词列表的页面上,有15个列表,点进去才是一个真正的单词表。因此我要通过Nokogiri来获得那些页面的链接。但找遍了Nokogiri的文档,却只看到返回标签内容的方法,丝毫找不到返回链接地址的方法。我不知道是因为我还没有习惯rdoc还是rdoc本来就没有这些详细的报告。最后我从一个中文blog上看到了答案,原来链接的地址被保存在对象的[:href]这里。

其它的基本上就是顺其自然的写下来了,一共不到20行。我把程序上传到了这里。程序运行后就在终端输出单词列表,稍加整理就应该能用了。不过,我用wc测试了一下,发现这个列表里面只有2000多个单词,根本没有达到页面上说的3000的数目。而且作者还把像tree这样的基础单词给删掉了。看来还要再增加啊。

September 20, 2009

智能不智能

jess-in-action.jpg本文是我看了一小节老师给我们的《Jess in Action》书后得出的对“专家系统”的不成熟的感觉。

在计算机系里上了这么长时间的课,我发觉我对“人工智能”的兴趣不小。但自从我去年上过对于人工智能的介绍后,我就知道人们对于人工智能的研究还很浮浅。比如我们学校里搞的也不过是弄机器人踢足球之类的,从录像上来看也不过是刚刚起步。话说日本从90年代就开始搞人工智能,搞到现在他们产的机器人也不过如此,远远达不到电影中的只能程度。

这个学期我学《专家系统》这门课,除了因为对这个老师的印象还不错外,我之前对这方面的一些印象也让我比较感兴趣。专家系统是人工智能的一个分支,据说在卡内基梅隆时李开复的导师那帮人就用专家系统来训练计算机识别人类语言,做英文语音输入。虽然最后还是李开复用统计的方法把英文语非特定性音识别率提升到了变态的98%之多,但之前那帮教授对于专家系统的信心也证明了它在人工智能领域中的地位。

上了这门课后,我挺高兴可以接触一些比较高阶的知识,不料几节课之后却发现和我原先想象中的有很大的差距。

我们学习专家系统是用Jess来讲的。因此《Jess in Action》这本书则成了我们的两本必看教材之一(另一本是Elias M. Awad著的《Building Expert Systems: Principles, Procedures, and Applications》)。我们的教授也真是厉害,竟然打印了《Jess in Action》这本书给我们,而第二本书则让我们从他那里借阅一个学期。我们班有10人左右(到了4000级别的课程就比较趋于专业性质的了,每学期注册的人不多),而《Jess in Action》有将近500页,给每人打印一份,绝对是一个大工程了。

拿到书之后我便开始看了起来。但看完了第一章后才发现,这个所谓的rule-based语言,其实就是用户往里输入一些规则,然后根据这些规则来判断,给出真或假。我之前学过Prolog,感觉两者没有太大区别。Jess用Java语言写的,可以运行在JVM上,也就可以和Java的等等产品结合使用。但在本质上,并没有什么进步。让我有些失望。

其实让我觉得困惑的不是rule engine的语法,而是对于这些研究的发展方向感到困惑。我们现在的《专家系统》课上正在介绍expertise,讲对于知识的总结归纳以及专家的关系。而且通过阅读,我也知道人们对于知识的表达就是facts+rules模式。通过定义一些基础的事实,然后通过逻辑运算(与、或、非)组成更高级的事实。然后定义规则,用规则来过滤输入,然后输出结果。当知道了我们平时用于电子邮件的spam filter就是专家系统时,着实让我失望了一把。

倒不是说看不上电邮的垃圾邮件过滤,而是我觉得对于知识的表达还不到位,因此从这上面发展出来的人工智能研究究竟能走多远?逻辑确实不错,但能不能表达我们的世界,我对此持怀疑态度。否则的话,不说是我们的整个宇宙,至少我们身边的一些小的范围的“世界”,已经可以总结成事实+规则了。从人脑的角度来说,我们认知这个世界,是不是通过事实+规则来进行的,我觉得不是。因此通过逻辑,我们走的是一条取巧的路,但绝非正路。也就是说,从这条道路上继续走下去,我们永远也无法用机器来模拟人类的智慧。

但愿这是我的胡思乱想,等过一段时间看看我的想法有没有改变。

September 18, 2009

Twitter备份的代码

我前天写过文章,说写了一个保存Twitter记录的工具。今天把代码整理了一下,上传到了网上

目前我只完成了数据获取的部分,至于报表生成的部分我还没有写。写个cgi来输出HTML表格,我上学期学过,应该不难。

程序中用到了sqlite3-ruby和twitter4r这两个库,它们都可以通过RubyGems来安装。

对数据库的操作,我用了最直接的方法,没有进行任何优化。一是考虑到这个程序对速度的要求不高,二是我这学期才开始学数据库,对于SQL语句的优化还没有什么概念。

最后,说一下Ruby中的YAML配置。考虑到不管是数据库的初始化还是更新数据库,都需要Twitter的用户名和密码,而且我也想把一次抓取多少条tweet这个变量也提取出来。本来想的是在程序的开头设置变量,但这样会让程序的使用变得麻烦──修改Twitter的用户名和密码后,需要在两个程序里做出改动。因此写个配置文件就是比较必要的了。过去我一直觉得写一个带配置文件的程序是比较困难的,因为需要自己解析。但Ruby中的YAML让一切变得非常简单。正好借这个机会,学习一些YAML的解析。

中文网页很少,我没有搜到什么结果。最后从一个外国blog上看到了例子,才知道Ruby中用YAML原来是这样的简单。想看的同学自己去看看就会用了。

September 17, 2009

让Jess在Emacs中运行

我们这学期有门课《专家系统》,课上用到Jess。因此,让Jess在我们自己的环境上运行起来就是我们前几节课的任务。

Jess是用Java写成的,运行在Java虚拟机下,因此在Mac上运行不成问题。今天尝试了一下,除了把路径中的空格给删除之外,似乎直接就能运行。Jess里的bin目录下有jess这个shell文件,我把整个Jess目录放到了/opt下,并在/opt/local/bin里面做了一个软链接,就一切正常了。

我平时用Emacs比较多,因此就想在Emacs里编辑Jess程序。我估计Jess是在Windows下开发的,因为老师给我们的程序包中有TextPad的Jess语法文件。同时,老师也提供了用eclipse当环境的方法。其它的就需要我们自己探索了。

我从网上找到了Jess-Mode,把它给的两个.el文件放在了自己的site-lisp目录中,并按照页面上的要求修改了.emacs文件。但却不能正常运行,说shared-lisp-mode-map这个变量没有值什么的。我对相关方面的编程不是很了解,就胡乱试试,在用到这个变量前面随便加了一行

(defvar shared-lisp-mode-map t "hello")

再试,就可以了。网站上没有提到这个问题,因此我不确定是不是我的CarbonEmacs的问题。

解决了这个问题之后,其它就没有什么问题了。

September 16, 2009

Twitter备份

自从上次开始,我就想写一个工具,可以像Google搜索历史那样,把Twitter的历史记录下来。思考了几天后,今天开始动手写。

我简单的找了一下,没看到有很合适的工具,也不知道有什么好办法,就用最简单粗暴的方式,写个定时运行的程序,保存tweets到sqlite数据库中,然后从数据库中获取数据,得到列表。

前几天看了Ruby的书,就用Ruby来练一下。并找到了Twitter4r库,能比较方便的获取一定数量的tweet记录。然后结合sqlite3 api接口,在解决了下述几个问题后,程序运行成功。代码我还没有整理好,等以后再上传吧。以下是当中遇到的几个问题。

一是Ruby正则表达式替换的处理,以及sqlite对于转义字符的处理问题。Tweets上经常会有引号,这样在写SQL语句的时候就有了转义的问题。我在程序中是用单引号来包含字符串的,中间一度怎么也搞不定单引号的转义问题──要么把引号弄没了,要么生成不了正确的的结果。看了一下Ruby书,似乎在Ruby正则表达式中,\'和\有特殊的含义,不能直接转义。经过几次尝试,最后用gsub(/'/, '\'\'')解决了问题。具体是什么原理,我没研究过Ruby书,因此没有深究。

二是写好程序后上传到Dreamhost服务器上,sqlite总提示出错。似乎是用了IF EXISTS和IF NOT EXISTS就不行。后来经过搜索才知道,sqlite从3.3.4之后才支持EXISTS关键字。而Dreamhost上的版本不够,于是造成了这个问题。在检查了代码后,觉得虽然不如加了EXISTS保险一些(如果有人工干预操作数据库就可能出错),但也不是非要不可,把EXISTS删除就好了。

第三是当终于能运行了后,却又发现在Dreamhost上生成的数据库在合并的时候会出现每条tweet都存了两遍的情况。为了这个我检查了将近半下午,最后才发现是时区问题。我的表中有个DATETIME字段,存了tweet发布的时间。在我这里时区是GMT-5,而在Dreamhost服务器所在的地方,时区是GMT-7。把建立数据库的程序在服务器上运行一遍后就算解决了问题。

以上是写程序中遇到的三个问题,已经解决了。但在最后我又遇到了一个最大的问题。我准备在Dreamhost上用crontab来每天运行更新程序,但Dreamhost默认没有安装twitter4r,我是通过gem安装的。而似乎crontab运行程序的用户组不是普通用户,导致找不到twitter4r库,结果程序无法运行。当然这些只是我的推测,希望可以尽快解决吧。还有就是生成报告的程序,应该不难,但要在这个的基础上写。

September 14, 2009

翻译维基百科的Xcon条目

今天下午上了一节《专家系统》的课。这节课是这个学期的第二节。上节课讲了学期的大纲,因此这节课才开始接触实际内容。

一节课听下来,感觉受打击不小。在往下一堂课的教师的途中,我边走边想:“上节课我都获得了什么知识?”结果却令我沮丧,我没有任何概念上的东西。感觉老师讲得、课堂笔记都很零散,一点重点都抓不住。唯一记得的大概就是教授在讲一个名为“Xcon”的东西。

另外,我在上个学期从另一位老师中知道这位教授挺认真的。那位老师是这样评价教授的:“当你给他看一篇文章,他是少数几个会认真看一遍并告诉你他的想法的”。我当时对这位教授的印象不错。结果听了一节课,就有了恍惚的感觉,完全没有我上其它课的兴奋感。另外,教授在投影仪上写板书,竟然全部是大写字母。我怀疑用大写字母写板书的教授都是老一辈的人了吧,难道我与这类教授“不合”?

为了加深对于课堂内容的理解,我在所有课程结束后搜索了一下Xcon,看到了它的维基百科条目。我大略的扫了一下,感觉不是很难,也大体了解了那段历史,于是就花了点时间把它翻译成中文。这样,加上我昨天翻译的Jess程序设计语言,我一共翻译了两篇关于专家系统的条目了。

刚才,我把上课记录的那些全是大写字母的笔记拿出来看了一下,竟然一下子豁然开朗了起来。原来教授讲的是1980年代的那段关于Xcon的历史,我在理解的方向上有了些差错。

在ConTeXt中使用花体字母

今天上密码学课记笔记的时候,用到了花体英文字母。我之前没在TeX中用过,于是上网搜索,结果不论搜“花体字母”还是“script letters”都找不到。大概是ConTeXt的名字起得太大众,文档又不多,结果搜索的时候只找到一些包含英文单词context的文章。LaTeX就没有这个问题:)

找了半天,最终还是在ConTeXt的老家ConTeXt Garden找到了答案。我没有深究,只是把wiki上给出的设定:

\starttypescript [math] [modern,computer-modern,latin-modern,ams] [size]
\definebodyfont [17.3pt,14.4pt,12pt,11pt,10pt,9pt][mm][mc=rsfs10 sa 1]
\definebodyfont [8pt,7pt] [mm] [mc=rsfs7 sa 1]
\definebodyfont [6pt,5pt,4pt] [mm] [mc=rsfs5 sa 1]
\stoptypescript

\definefamilysynonym [default] [scriptfamily] [mc]

\def\scr{\fam\purefamily{scriptfamily}}

\definetypeface [modern] [mm] [math] [modern] [ams] [encoding=texnansi]

\setupbodyfont[reset,modern,11pt]

有了这些之后,只要在正文中需要用花体字母的地方,用\scr来表示就行了。比如要用花体A,就写$\scr A$。注意花体字似乎要在mathmode中才行。

这是我最后得到的结果,就是我需要的(点击看大图): context-script-letters.png

September 13, 2009

新学期的课程

上周四是我们2009年秋季学期的第一天。虽然带着对于假期生活的种种不舍,我还是收拾心情,回归了日常的学习生活。

这学期我目前选了五门课,课程比较紧。我之前的经验是,一学期四门课是比较紧张的争创水平。现在的课程还没有完全定下来,我先观望一阵,如果觉得撑不住了就注销一门。

我最先上的是《数据库概念》这门课。上课的是位中国老师,从名字上来看应该是来自台湾。我之前有两门课是另一位中国老师教的,那个老师估计是在这里生活了很长时间,英文说的很流利;而这位老师则明显能听出华人的感觉。这门课的内容不错,但听了老师讲完一节课,却让我闷的想睡觉。可能是还没有正式进入课程内容的原因吧,但愿如此。

第二门课是《计算机结构》。老师过去给我们上过几节课,我之前也写过文章描述。这门课给我的第一个感觉是作业很难。首先总共三次作业,是一次套一次的──第三次作业需要第二次作业的结果,第二次作业需要第一次作业的结果。也就是说,如果前两次作业有没做好的,就会影响之后的作业。而我们的第一次作业就是让我们写个汇编语言虚拟机,来执行老师的编译器生成的二进制代码。不过我觉得还是要接受挑战,拼一把试试。

第三门课是《密码学》。教授是我们学院的副院长,之前选课的时候和他打过交到。这老师上的课比较有趣,我之前写的文章里的密码就是这节课上给出的。我现在估计这门课的难度不小,因为是编号为4开头的课,而且要求读书。课本我已经买了,80加元,在同类计算机中算是便宜的了。第一节课结束时教授让我们读第一章,而昨天在Twitter看到我们计算机学生会的主席他读完了,而我那时候还没有读,顿感压力倍增,于是今天下午就到了学校把书给读了。

第四门是《专家系统》。听了一节课,还没有进行到正文,因此对专家系统还没有什么概念。我们上课用的工具是Jess,Java Expert System Shell的缩写,在行业中据说名气不小。为了了解一下这个系统,前天在学校我把维基百科上的英文条目翻译到了中文。但是目前还不会用,因此还比较紧张。另外一个让我感到不安的是课程需要做一个项目,在后期要上台演示。我还不知道会不会找到好的idea。

第五门课是《计算机网络1》。讲课的是一位中国女老师,我之前的文章已经写过了。这门课我感觉应该概念稍多一些,同样要求看书,但我还没有购买课本,因为课本超过100加元,比较贵,我先观望一阵子。买的话也从亚马逊上买打折的。之前有同学学过这门课,距反馈是挺难挺无聊的,希望我能挺过去。课程要求小组做一个网络项目,现在还没有公开是哪个方面的项目,但愿不是很困难。更变态的是,这门课有12节实验课,缺席一节实验就会导致我们这门课不及格。这个就只能自求多福了。

MT5发布了Beta版

今天上MovableType.org的时候,看到了MT5的beta测试版发布的消息,就下载下来试验了一下。我一直觉得MT相对WP的一点优势就是对多种格式数据库的支持,特别是sqlite,可以方便的随便安装一个独立的MT网站;不像WordPress,只支持MySQL,弄起来那么麻烦。这是题外话了。

MT5给我的第一个印象就是安装界面有了一定的美化。特别是按钮,在Mac OS X下的Firefox 3.5版本中,显示为圆角,这在之前似乎是没有的。登录时我注意到了另一点不同,就是输入用户名和密码的框变大了,和WordPress的登录框差不多了,而不是像MT4那样的扁扁一条。

登录进去的新界面让我有点茫然,似乎有了不少变动。而且根据MT的页面上说的,默认生成的页面就是Website,而不是过去的Blog。要写Blog,需要在Website下面再建立一个Blog。这一点在介绍MT5的blog文章上有写,里面有示意图,可以过去看看。

在后台进入了特定的blog设定界面后,让我还是有种眼前一亮的感觉。整个色系有了很大的变化,让我有一种见到了MT3的感觉,与MT4的黑色风格非常不同。MT4里在标题下方的一些下拉菜单,被移动到了页面左侧。菜单没有自动弹出,点一下菜单标题右边的箭头,下级菜单会显式在下面。

写一篇文章试试看,发现标题栏的字体变得比MT4好了很多,不再是那种难看的粗粗的了。正文的地方的字体还是很难看,看来需要调整一番。输入框不是MT4的那种凹凸风格,而是整个的平滑风格,比较漂亮。Basename的地方的编辑框消失了,要点一下Edit才会显示出来,Warning是一样存在的。MT还是没有解决其它国家语言标题导致的basename异常的问题。另外,Preview按钮到了右上角,Save按钮变成了位于分类设定上方的Publish和Draft两个按钮,同样也是圆角风格的。

我试着导入我这个blog的备份,结果看到了出错的提示。文章没有被全部导入,只是导入了20篇左右。然后试着发布,则提示有宽字符导致的错误。相信这些bug会在正式版中得到解决。

MT介绍MT5的文章中提到,MT5是MT在日本的分部负责开发的。虽然我知道MT的日本分部,但这个事实还是让我感到非常惊讶。我的印象里这种创意性的东西一般很少由日本的公司开发的。但事实就是事实,相比与在中国blog的没落,这也是一件无可奈何的事情。

September 11, 2009

中国女老师

今天下午的计算机网络课是一位中国女老师给我们上的。

回想我在语言班毕业之后,在大学中的课程没有一门是由女老师上的,计算机系更是如此。所以今天的网络课,让我感觉很不自在。

不自在的原因,在于老师让我有了在国内听课的感觉。相比起其他老师的温文尔雅,这个老师给人一种雷厉风行的感觉,讲话声音很大。也可能是因为同是中国人的缘故吧,对方的语音也有太多的华人“提示”,让我会有一种被看透的感觉,反而不敢在课堂上放松。

另外,今天上午上的密码学课倒还算有趣,上课前教授给了我们一段小密码热身:

gkvvehdrr er gkoehq k skxqd

stoehq, zkxehq, zstrd-phej akyesu --

eh khtjgdx zeju. qdtxqd cbxhr

每一个字母都代表另外一个字母,不包括标点。翻译出来后是一个joke。我在中午花了约半小时给弄出来了,感觉不是英文为第一语言的人,弄这个有点额外难度。比如说知道一个单词:?arge,问号是未知的字符,我怎么也想不起来应该是什么。结果解出来之后才发现原来就是large,可当时一点感觉都没有。解完后看了半天,也不明白为什么它是个joke。给老师发邮件报告答案,顺便问了后,才明白过来。

September 10, 2009

停止使用NetNewsWire

我大概是一个多月前开始尝试使用NetNewsWire的。当时是看了apple4us上的一篇文章,于是尝试了一下,发现这个免费的工具非常好用,改变了我对离线RSS阅读器的不良印象。而且它支持与Google Reader的同步,这样Google Reader里的内容也会即时更新,方便了移动阅读。

不过今天经过考虑,我决定还是停止使用NetNewsWire,用回Google Reader。有一小一大两个原因。

小原因是NetNewsWire不支持Google Reader的follow功能。我曾经纳闷为什么我的未读RSS数量变得那么少了,后来才发现follow中的未读数目都没有算进去,而那时我的follow中已经有了大约80条的未读RSS了。说这个问题是小原因是因为只要NetNewsWire还在维护状态,早晚会支持follow功能的。而且Google Reader的follow功能本身就是个time killer,就算NetNewsWire不支持,隔一段时间去Google Reader上扫一下也就可以了。

大原因是我最终认识到离线RSS阅读在一个正常网络环境下是没有前途的,也不是自然的阅读方式。如果在一个网络被限制的环境,如不能保证随时联网、或者网络按照在线时间收费的情况下,离线RSS阅读器会比较方便。而当你在正常联网的状态下,离线阅读器的缺点就有了。

最大的缺点就是网络作品里的超链接。有时候,我们不得不查看文章中引用的链接地址,这时离线RSS阅读器就难以胜任打开网页的功能了。当然NetNewsWire中内置一个网页浏览器,而且我想应该会支持在外部浏览器中打开链接。但这样依赖,常常是阅读的思路就被打断了。可以这么说,我觉得NetNewsWire欠缺的是后台标签打开页面的功能。我就被弹出的页面折腾的很难受了。

同时,在阅读的情况下,我们常常希望使用浏览器中的一些功能。比如在firefox中我设定的LookItUp这个GreaseMonkey脚本,可以方便的帮我从Google搜索、Google图像、在线字典中查询选中的内容。自然,让NetNewsWire支持这些功能还是比较遥远的事情。

所以,最终让我放弃NetNewsWire的原因,就是离线RSS阅读的非自然性。把阅读放在浏览器里完成,则大大改进了阅读体验。不过,NetNewsWire本身是一个让我非常满意的软件,只不过方向和我不对路。

PS,NetNewsWire有一个比较不好的bug,几个版本都没有改进,我也不知道是不是我的环境设置的问题,反正不用了,顺便在这里说一下。就是在NetNewsWire从全屏状态还原时,中间的文章列表和文章内容之间的分界线会自己往上方移动,来回几次分界线就上到无法触及的地方了,因此我不得不在实际发生前手动调整回来。这个问题我觉得应该及早解决。

September 6, 2009

I Wanna My Tweet Archive

twitter-screenshot.png回来这边已经几天了。比两年前的第一次出国的激动紧张相比,有点更加怀念在国内的日子。说来也怪,在国内的时候没有感觉到什么,反而觉得不如在国外舒服。现在倒是经常能回味在国内生活的点滴,如果有机会可以选择是要国外的生活还是国内的,我可能会选择国内的吧。

经常时不时有一些小片段浮现在我脑中,比如在北京的饭店里因为时差原因,很早就醒了,然后躺在床上看电视;还有在北京的饭店时,为了更新Twitter方便,自己写了一个中转网页,不断调试;还有去烟台的路上听到车载收音机里说军人节日什么的,才想到那天是8月1日……所以我突然有了一个想法,把回国时的日程记录到日历上,以便回顾更精细的细节。

这时我第一个想到的就是Twitter。虽然在国内上Twitter不方便,但像我之流的人还是想尽各种办法来更新Twitter。于是Twitter的记录就成为了一个很好的回忆的方法。但当我打开Twitter页面的时候,我就觉得Twitter很可能无法帮助我完成这个任务了。

首先就是Twitter页面最下方的翻页按钮变成了more。虽然说从原先的GET换成AJAX应该是一个进步,但这样的副作用就是用户无法跨越页面来翻阅,而只能一页一页的点more。这样的搜索历史记录就非常的缓慢了。

其次就是当我点了不知道多少遍more后,我发现那个more按钮竟然没有了。最旧的一条记录是8月9日的一条。我当时就有点崩溃,因为我想的是找到7月23日左右之后的记录。

在令我大失所望之后,我找到了一个折衷方法,就是放弃和朋友交谈的记录,只从我的Twitter页面上来寻找,果然找到了我要的记录,虽然并不是我想要的完整对话。

所以这就是我一直想让Twitter改进的地方。虽然现在人们对Twitter的减法赞不绝口,而我想要的archive功能其实算是个加法。但没有了archive,Twitter就只是人们的日常对话而已,过了一天就消逝的无影无踪;而有了archive,Twitter的实用性就变得丰满了起来。

我简略的从网上找了一下,想找一个Twitter API写就的工具,来帮助人们整理过去的tweet记录。结果找到了TweetScan。它有办法帮助你把你的记录保存成TiddlyWiki的形式,打包让你下载。不过它的功能太简略,没有按照时间线来区分,而且保存的似乎也不是我所有的tweet。我现在在考虑是不是自己写一个工具来做这事。

写这篇文章的时候,我想到,如果Twitter被卖给了Google,这项功能是不是就有了。现在Google的搜索记录已经可以查询了,是按日历的形式展现的。而Twitter的形式和Google的搜索记录是非常类似的,只要有足够的资源,达到这个目标应该不难。只是我比较怀疑Twitter的实例就是了。

September 3, 2009

卡尔加里机场无线网络

今天凌晨一点之后,我就没怎么睡觉。虽然眼睛的疲劳还是比较明显,但总是无法入睡。到了5:15,我起床洗了个澡,感觉精神了不少。5:45旅馆的起床呼叫服务响了,我就收拾了一下,5:50下了楼办理退房。昨天晚上在旅馆的饭店吃饭,花了23块多。加航给负责10元,我就付了13元。结果退房的时候前台竟然要我支付昨晚的饭费,说是饭费没有到他这边的帐上。我昨天晚上刷完信用卡后,觉得收据没用了,就揉成一团扔到了房间的垃圾桶里。这时听到饭费出了问题,就又要回了方卡,去房间的垃圾桶把收据找了出来,交给了前台,才解决了问题。现在想起来,如果我一念之差,把收据扔在了走道的垃圾桶里,今天就麻烦了。看来刷卡消费后一段时间内保留收据还是很重要的啊。

今天主要是想说一下卡尔加里飞机场这里的无线网络。

加拿大的飞机场的无线网络都很发达,完全不像在北京的机场里只有一个很慢的CMCC能用。我在温哥华的机场上网时,除了遇到过一次https问题外,都没有其它问题。连上机场的免费无线网络(温哥华机场的是“YVR_PUBLIC”)后,用http随便打开一个网页,就会自动转向到YVR.com的一个页面上,同意了协议后就可以上网了,总共也就两、三下鼠标。结果导致我以为在加拿大的飞机场上网都很方便,今天在卡尔加里登机前上网的经验,却让我知道自己错了。

我连接上了名为“YYC.Free.Public.WiFi”的无线网络后,在浏览器中访问g.cn后,竟然很长时间没有反应,看地址栏的地址,页面被导入到了一个叫BOLDstreet的一个页面上。等了很长时间后,终于出现了同意协议的页面。点了AGREE之后,竟然不是直接可以上网,而是要有一个登录过程。登录的方式有三种:一是用在机场注册的帐号,二是用Facebook Connect,三是用Bell或者Rogers的帐户登录。

我的手机就是Rogers公司的,觉得用Rogers帐户登录会更方便,就选了用Rogers帐户登录。结果被转向到了Rogers的页面上,让我输入电话号码和密码。我输入后被告知错误,后来想想这样登录万一要收费,直接扣我的电话费就麻烦了,于是就选择了用Facebook Connect登录。输入了我的Facebook的用户名和密码后,同意了连接,终于可以上网了。

我看了一下BOLDstreet的页面,似乎是一个无线网络提供商。我猜是不是卡尔加里把机场的无线网络服务外包给了这个公司。如果是这样的话,把公益设施随便归属于某个商业机构管,我觉得就会出现不妥,比如说导致用户连接无线网络的种种问题,比如我到现在也不明白把机场的无线网络和Facebook关联起来有什么用处。

September 2, 2009

改签

我从北京到温哥华的AC030航班因为故障原因推迟起飞了一个多小时。本来应该在温哥华时间中午12点整到达的飞机,这次落地是下午两点多了,这样就赶不上下午一点半起飞的从温哥华到温尼伯的航班了。加拿大航空公司为我们安排了改签,结果我要从卡尔加里转机,还要在卡尔加里住一夜,当然费用都是加航支付。

我在卡尔加里下飞机后,从客服人员那里拿到一张单子,然后搭乘指定的出租车公司的车去了指定的旅馆。办好了住宿手续后,我在旅馆的餐厅里吃了晚饭,加航提供10元的饭钱,其它的部分要我支付。

旅馆里有无线网络,比较方便。说是单人间,但实际上有两张床位,每张都是类似国内的双人床的大小。虽然床很舒服,但明天早上6:10就要到达机场,我让旅馆的人在5:45叫我起床,然后乘坐6点的出租车去机场,应该没有多少时间可以睡觉了。

另外比较有趣的是,我在这次飞机上的enRoute娱乐系统中,在当代电影项目里看到了Ferris Bueller's Day Off这部电影。当初在读语言的时候,因为老师不满意我的英文名字,就换了Ferris这个名字。后来那个老师居然不教我们班了。在又一次学校组织的郊游时,那个老师问起我改名字的事情,我告诉她了新名字。她当时就提到了这部电影,说是里面的主人公就叫Ferris。后来我查了电影的资料,知道是一个讲述逃学的故事。但由于电影时间比较久远,我一直没有机会看。这次在飞机上正好看了一遍,还不错。而且在我又看的两集美剧The Office中的一集,里面的经理Michael就提到了这部电影,他仿制了一个电影中主人公让人家以为自己在睡觉的道具。

在飞机上还看了最新的Star Trek。当然我是冲着Zachary Quinto去的。整体感觉还可以,算是比较热闹的个人成长史,然后就是几张熟悉的面孔。相信看过其它系列的Star Trek迷们会比我有更多的体会。不过Zachary的发型让我感觉真奇怪,而且他瞪眼时的表情,总是让我觉得有挥之不去的Sylar的影子。

September 1, 2009

“回”加拿大

从7月23日到达北京,到现在的五个多星期的时间,就像是瞬间就过去了。明天早上,我就要乘坐去北京的火车,去坐飞机了。今天下午,在父母的帮助下,把东西放进了一个大箱子和一个手提包之中,书籍也打算带上基本,放在我的书包里带过去。不过还没有决心是不是要多带上两本。

走之前几天就有的一个感觉,就是觉得有点不舍现在在家中闲适的生活。又稍微有了第一次出国前心中的惴惴的感觉。其实回想我刚到北京的时候,也觉得有些不习惯。坐车出门的时候觉得旁边的车离我们的车那么进,险些就擦上。马路上的喇叭声此起彼伏,街上的路人也熙熙攘攘的,让我感觉有些吵闹的受不了。国内不能上YouTube也让我大骂不已。每天在家里都觉得不舒服。当时时常想着要是在加拿大就没有这些问题了。而到了几个星期前,我感觉我逐渐适应了国内的生活,对回加拿大也没有那么的想念了。而且那时我自己觉得,过去见到外国人可以直接上前问话的,现在也要掂量一下自己的英语了。

因此我总结到,对我来说,旅游的最长时间,就在半个月左右。超过了半个月,我就会渐渐的对当地的生活感到适应,而不大想返回自己的生活中去了。

现在想到,明天下午就要坐11个小时的飞机到温哥华,然后坐2小时40分钟的飞机去温尼伯,心中也有点不安了起来,不知道什么时候能恢复。