国庆: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++语言我几乎没有怎么“涉猎”。是不是有点避重就轻?是不是应该在平时多花一点时间在低级语言上呢?希望我在这个学期内可以有所改善。

不喜欢Picasa for Mac

picasa前几天听说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删掉了。虽然我还没有找到索引文件的保存地址,但也留在以后慢慢再说吧。想到了上面的几点,我是一点也不想把它留在机器上了。

解密辅助工具

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

top 在全屏的 iTerm 中运行
top 在全屏的 iTerm 中运行

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

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

英文单词列表

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

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这样的基础单词给删掉了。看来还要再增加啊。

智能不智能

jess-in-action本文是我看了一小节老师给我们的《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就是专家系统时,着实让我失望了一把。

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

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

Twitter备份的代码

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

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

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

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

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

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

让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的问题。

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

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库,结果程序无法运行。当然这些只是我的推测,希望可以尽快解决吧。还有就是生成报告的程序,应该不难,但要在这个的基础上写。