下一个路口

September 17, 2008 – 9:45 pm

零时迷子似乎很久没有来写 blog 了,大概一眼望去,页面上似乎没什么技术文章,所以一直想写一篇,但是我酝酿了很久很久的这篇文章却由于最近一直在忙一些其他的事情,相关的东西还没有做出来,也一直迟迟不好写。不过还是决定来写一篇好了,关于生活的。

这也算是一个路口吧,一路走来总是这样的。寝室的四个人,一个已经搬到了考研寝室,几乎再也没有见过了;一个在外面实习刚刚回来,屋里的东西还没有收拾好似乎又出门去了,大概是为找工作而奔波吧?一个一边扎入实验室,一边为留洋的 PhD 之路而忙碌;我也在实验室,可是每当我骑车经过林荫道的时候,总是恍惚觉得搬到玉泉来之后,生活似乎发生了一些剧变,然而,更令人不安的是,这就像是暴风雨来临之前的乌云那样重重地压下来,让人有些喘不过气来。暴风雨过后是一篇狼藉还是晴空万里?不管怎样,总之又会是另一个样子了。

最近是 MSTC 秋学期纳新的最后阶段,昨天刚刚面试过了许多新人,许多人都很厉害,MSTC 这个舞台会让他们展示出自己的精彩。所以面试这些人其实也是比较累的了,晚上回来没做什么就直接睡了。可是半夜两点多的时候不知为何醒过来了,一直都睡不着,便起床来开始 coding 。在夜深人静的时候写程序,似乎很久没有过这样的感觉了。直到不知道什么时候发现天已经完全亮了,世界便又开始喧嚣起来。

突然之间觉得前不久看过一篇 blog ,有些感触,便开始找,找来找去,最后发现是石老师以前的 blog 上的一篇文章“真令人伤感”:

真令人伤感,每过几年就是离别时。

我站在窗前,无奈的看着朋友们为了工作奔走,
而不能帮上哪怕一点忙。
就像十年前,就像六年前,就像三年前
就像每一次与人擦肩而过却故意目不斜视。
但这一次也许好一点,毕竟我们以后可能还能时常相聚,
而不像现在只能看着从前的好友的博客独自伤感。
那种陌生,令人心碎。

Read the rest >>>

程序优化中的测不准原理

September 2, 2008 – 3:50 pm

optimize在《The Art of Computer Programming》一书中有这样一句话:

Premature optimization is the root of all evil in programming.

相信大家肯定都已经耳熟能详了,也大都清楚我在“Ruby: 提升性能的几点尝试”中提到的优化程序应该走的基本步骤。虽然如此,这样的情况还是时常发生:花力气把代码大改一番之后发现性能并没有得到什么提升的时候,才开始悔恨自己没有先跑一遍 profiler 。可是如果只是机械地去重复“找出程序热点”、“优化热点”的步骤的话,实际上并没有掌握优化的真谛。

例如下面是我用 Valgrind 分析程序得到的一个结果报告:

Read the rest >>>

思考是人的最后底线吗?

August 25, 2008 – 2:26 pm
new_mind.png
Image from the cover of The Emperor’s New Mind

本来不想把标题取得这么大,因为本来就是我自己说几句自己的看法,我也不是专门研究这个的,所以基本上等于是胡说了,不过想来想去也没有想到什么其他的标题。

其实我对这个问题倒是挺感兴趣,只是想来想去都是无解,本来打算一直到自己那天下决心把那本《皇帝新脑》看完之前不再纠缠的,不过今天无意中在豆瓣上看到一篇叫做“你知道你为什么脑残吗?”的文章,看了以后,发现文章中说的脑残和我想像中的似乎不太一样——如果我看明白了的话,我觉得他说的是“不注重独立思考,太依赖网络(或工具)”的现象就是叫做脑残。虽然我有时候还是会自己想一些问题,但是想起自己前几天写的那篇“口算能力太弱了”的 blog ,似乎我也是脑残的典型了? ^_^bb

其实我不太喜欢看那些带些脏话的文章,不过,抛开“脑残”这个词好了,关于“工具”与“思考”的问题似乎还得在讨论一下。总的来说,两者都是人类的特长,不过还是有亲疏之分,脑袋是自己的,工具则是外面的,过于依赖于工具,似乎会有点大清王朝任用了太多汉人为官的那种感觉——给汉人这么大的权力,哪天他们起来造反不就完了?

Read the rest >>>

在线 DNS 查询

August 25, 2008 – 9:45 am

今天不知道是学校的 DNS 出问题了(倒是经常出问题),还是国内的 DNS 出问题了(也是经常出“问题”),突然访问不了 github ,通过 online proxy 上了一下发现不是网站挂掉了,不过本地无法解析这个域名。

于是我便找了一个在线查询 DNS 的网站,Google 一下会有很多结果,比如这个 online nslookup 。不过通常查询出来的 ip 并不能直接在浏览器里输入进行访问,如果页面里有诸如 http://github.com/blabla 这样的绝对链接的话,还是解析不出来。更常见的一种情况是 web server 通过客户端访问的 host 来区别不同的 web app ,比如 mail.mstczju.org ,wiki.mstczju.org 和 www.mstczju.org 这些站点实际上都是在同一台机器上同一个 ip 地址同一个端口上运行的。

所以,一劳永逸的解决办法就是把 host 和 ip 对应的项写入到 hosts 文件中。不过,如果以后 github.com 的 ip 变动了(虽然应该不会随便变动吧?)而又忘记了自己曾经改过 hosts 的话,大概会弄得焦头烂额,哈哈! ^_^

玉泉西门行

August 24, 2008 – 9:01 pm

中午去同学那里聊了一会关于实验室、导师以及若干问题,可惜到最后也没有得出什么实质性的结论来。不过三十二舍那边条件还真不错,寝室里面的环境和紫金港那边最好的那种寝室差不多,桌子也还是那么大;而寝室外面就是山,虽然有许多人会很讨厌虫子,但是我还是更喜欢像小时候那样住得和绿色更近一些;大厅也很宽敞,不像三十舍根本就没有大厅,连窗户都很小气,风都吹不进去,难道还是怕楼层太高了一不小心掉下去?

离开的时候差不多四点钟,真不是个好时间,如果回去的话,差不多刚到就要出来吃饭了,直接去吃饭的话又太早了。大概是到了特别容易怀旧的年龄了呢,看到一些东西,总是会想起许多事情来,在脑子里晃来晃去,不过,我还是明白自己不是生活在幻想的世界中的,正好有时间,便决定去散散心。玉泉虽然结构错综复杂,但是地方其实只有那么大,只要方向弄清楚了就没问题了。

Read the rest >>>

口算能力太弱了

August 22, 2008 – 2:22 am

也许可以归结为对计算机太依赖的原因,但是其实我从小就是这样,如果笔算能算得更轻松的话,何必用口算呢?我似乎就是这样一种性格:追求更方便的工具,而不是注重磨砺自身的能力。在从小到大的数学课中我感触最深,比如自从学会了方程之后,我就绝对不会采用直接反推的方式求解了;高一的时候学到计算函数的斜率,有时候会非常难算,结果我翻出来了用导数求斜率的方法;还有后来的立体几何,我找来了三维向量叉乘求法向量的办法,非常好用。

记得临近高考的时候,我还抱着一本挺厚的《复数》在看,同学们都笑话我,因为复数基本上属于只考一点点的那种内容。然而只有我知道我在干什么:虽然三维向量解立体几何题很好用,但是我的计算能力太差了,时常算错,我想找一种更方便的办法来弥补。不过最后其实没有找到。

一方面,使用工具应当是人最大的特点之一了吧,然而太过于依赖工具又会产生问题。试想现在的社会,如果突然全世界的电脑都停止运转了,或者全世界都停电了,那人们的生活会受到什么样的影响?而我自己似乎总是在不断地追求更方便的工具,却忘记了注重根基,就好像房子快被风吹倒了,便再往上造一层一样。其实我自己也一直知道这是有问题的,但是已经到这个地步了,也是没有办法的事情。 :p 所以闹出今天这样的笑话我似乎也习以为常了。

Read the rest >>>

Gift from Thousand Parsec

August 20, 2008 – 11:33 am

As a student taking part in Google Summer of Code 2008 under the Thousand Parsec mentoring organization. I just received the gift from Mithro.

gift_from_tp.jpg

The gift includes a cool Thousand Parsec T-shirt and other Thousand Parsec/Google widgets. If I finished the final-evaluation successfully, I’ll get a GSoC T-shirt from Google. I like them very much! (Including the last gift from Google — a copy of O’Reilly’s Beautiful Code). ^_^

I’m currently preparing the first release of Schemepy for the final-evaluation of GSoC. However, I would like to keep on development/maintenance even after the GSoC final-evaluation.

‘\n’ at the end of each line

August 14, 2008 – 10:18 pm

其实我记忆中已经不止一两次碰到这个问题了,在今天又被它折腾了几个小时之后,我决定一定要把它记录在 Bug Archive 中。这就是从文件中一行一行地读取文本并进行处理的时候,末尾的那个换行的问题。

在 C 语言里一般不会遇到这样的问题,因为 C 语言有 getsfgets 两个函数,其中前者会去掉 '\n' ,而后者则会保留 '\n' ,而一般人都记不住这两者分别的行为,所以使用的时候都会小心翼翼。

而在 Python/Ruby/Perl 这样的语言中,从文件中按行读取简直太容易了,写一个处理文本行的程序就那么简单,可是却容易忘记了末尾的换行符。原本我想得到的是一个 "foobar" 的字符串,结果得到了 "foobar\n" 我还浑然不觉,继续处理,到最后结果完全出乎意料。

下次一定要记住,读入的文本行包含了换行符,如果必要的话,调用 strip 将它剔除!其实我觉得好像大多数情况下都不需要末尾的换行符,也许读取行的函数默认剔除换行符更加方便一些呢! :)

rmmseg-cpp 0.2.6 & pymmseg-cpp 1.0.1

August 14, 2008 – 5:48 pm

上一篇文章中我说了 pymmseg-cpp 在 Windows 下无法正常工作的事情,经过一番折腾,现在终于能正常运行了。于是我发布了 1.0.1 版,并在 google code 申请了一个 project ,用于存放 release 包:pymmseg-cpp 在 google code 的项目主页

另外,在 github 上看到 nasi 将 rmmseg-cpp fork 了一下并对编译脚本针对 Mac OSX 进行了一点修改,便把补丁添加进来了。我身边也不好找 Mac 的机器,不过 ashchan 告诉我说打过这个补丁之后在 Mac 下挂起的问题解决掉了。于是我便顺便发布了一个 rmmseg-cpp 的新版本,没有其他改动,非 Mac 的用户不必升级。

再回过头来看看一开始 pymmseg-cpp 无法在 Windows 上工作的问题,有一个原因看起来是 C 和 C++ 之间的瓜葛,原来我写的 C 包装层大概像这个样子:

Read the rest >>>

pymmseg-cpp: rmmseg-cpp with Python interface

August 14, 2008 – 1:16 pm

以前为了提高 RMMSeg 的性能,我写了 rmmseg-cpp ,根据 JavaEye 一段时间的使用情况来看,似乎挺稳定的,性能也很不错。其实 rmmseg-cpp 虽然名字里面有一个 “r” 字,但是算法核心完全是用 C++ 做的,最后才加了一层 Ruby 的接口包装。正巧最近我又两个用 Python 的项目都要用到中文分词,便决定给 rmmseg-cpp 加一个 Python 的接口。

正如我在 On the Rubinius FFI 一文中描述的一样,做到 Native 模块的接口有两种方法,一种是我在 rmmseg-cpp 中用的写 C 代码来粘合二者。另一种则是直接用语言提供的 FFI 接口,写 Python 代码来粘合。也可以算是各有各的好处吧,不过这里用 FFI 有一个很吸引我的地方就是粘合代码不用进行编译。如果用 C 来写粘合代码的话,需要用编译 Python 解释器相同的编译环境下加上 Python 的源代码(至少是头文件)一起编译,在 Linux 下倒是挺方便的,但是在 Windows 下可以说是相当麻烦,这似乎也是 rmmseg-cpp 一直不支持 Windows 平台的原因。但是如果用 FFI 来写粘合代码的话,就只需要单独编译原本的 Native 模块。编译一个标准的 C/C++ 模块和编译一个依赖于 Python/Ruby 源代码/头文件的模块是不一样的,这样的任务即使在 Windows 下也可以很方便地完成。

Read the rest >>>