还是建了一个 wiki

| 4 Comments | No TrackBacks

最近一段时间,我一直断断续续的研究 wiki。主要的目的是想用 wiki 来做首页,因为我厌倦了一直依赖手写 HTML 代码来更新首页。因为这样弄起来麻烦,所以过去我的首页基本上都是常年不变的。我一直觉得首页应该是一个站点的门户,所以我在 2007 年第一次建立这个站点的时候就决定把 blog 分离出来。那时候有很多人的首页上来就是自己的 blog,我觉得作为一个学计算机的,网站应该保留一些传统,所以尽管我的主页常年不动,几乎是个废物,我还是一直留着它。

直到我忍不了了,心想应该需要大修一下,最起码要做到内容和格式分离。开始的时候我想的是用 MT 来一并管理了,后来总是不得法,一直没有成功。然后就决定用 wiki 来做,也能达到一个 CMS 的要求了。我当时想的是首页不需要多少功能,就选了个最简单的 wiki 程序──UseMod Wiki。它不使用数据库,所有数据用纯文件保存。后来觉得首页全用 wiki 写有很大限制,比方说不能插入 javascript 代码,这样我就不能在页面上放一些贴纸(比如 Ubuntu 发布倒计时什么的)。我试验了好几个 wiki 程序,他们的设计方向都是多人共同编辑,因此在插入可执行代码方面的政策相当保守。最后只好作罢。后来想起了之前用过的 Blosxom,它可以在文章中放置任何代码,但我最后还是觉得 Blosxom 主要还是为 Blog 系统设计的,要想让它编程首页的样子,就要重新设计模板,而这正式我最不擅长的。

前几个星期我在看 Ramhost 的消息的时候,看到它的老板曾经写过一个叫 Ram-CMS 的项目。它很类似 Blosxom,也是手动把页面写在纯文本文件里,放在一个目录中,系统会通过链接找到文件,显式出来。我把在首页上放了几天,觉得还算不错,不过也有部分问题,就是这个项目的开发还不够成熟,用它来做很多事都挺麻烦。虽然能够完成,但我毕竟是不想再手写 HTML 代码,要是能有类似 Markdown 那样的抽象机制就好了。同样的,那个项目不是一个产品项目,而是作者给自己开发的小玩意。我要对模板做一些改动才能使用。我于是一遍慢慢进行,一遍在寻找其它产品。

我前几天又上了 Zoom.Quiet 的页面,他们一帮人组织的致力于 Python 的推广学习的啄木鸟社区,用的是 MoinMoin 做的 wiki。而那个社区里的一些看上去杂乱的页面风格挺符合我的胃口,我那时候有正在考虑 CMS 的问题,就想试试 MoinMoin。后来看了半天文档、又实践,却发现 MoinMoin 很难安装在共享虚拟主机上。最后也不得不放弃,同时发现,Python 程序和 Ruby 写的 CMS 往我的 Site5 主机上放都不太容易。Perl 写的 CGI 已经就差不多了,当然最方便的还是 PHP。

后来由于怀念起很早之前用 MediaWiki 搭建的一个歌词为主题的 wiki 了,于是就又装了一个 MediaWiki。我印象里一直以为 MediaWiki 只支持 MySQL 的,结果查了一下发现 MediaWiki 同样支持 SQLite。我目前觉得 SQLite 数据库比纯文本文件数据库还要方便,毕竟一个目录和一个文件的便宜程度是没法比的。Site5 主机上的 MySQL 默认的字符编码是 Swedish,很讨厌,我一直也没有成功的弄到 UTF-8 上,于是我没有在主机上建立一个数据库,全部用的 SQLite。不过装上 MediaWiki 后却发现不会用了。我过去为了管那个站点,还研究过一段时间,但将近两年的时间没有再管理了,再次见到一头瞎。最后觉得也不甚理想,于是就删除。

昨天看到 TualatriX 写的文章《摆脱信息爆炸,开启个人Wiki的时代》,提到他用 MoinMoin 建立了一个 wiki。我看了之后也挺羡慕的,只谈自己没有 VPS 啊。不过文章却启发了我,之前一直想用 wiki 做首页,但其实真正弄一个私人的 wiki 还真是个不错的主意。日常里有些信息还真得需要用 wiki 来维护。

我最头疼的首先是打开的网页。我的习惯是看到好页面,如果不是特别想看的话,而且还有别的页面也想看时,就把它的标签留着,以后再看。反正我平时的本子基本上不管,移动的话直接一扣,Mac OS X 的电源管理还是做得很好的。这样时间长了我的 Firefox 就积攒很多标签,既影响速度,又让我觉得很难看完,而关掉有觉得不甘心。最后要么把所有标签收藏起来,好么就把链接保存在文件里,等将来再看(虽然绝大多数情况是将来再也没有看过)。我曾经写过一个 Google App Engine 上运行的程序,名叫 URL-Basket,专门收集临时链接的。跨年的时候写的,但不能处理非英文的字符,后来事情多了也没有再修改。现在觉得而这些东西放进 wiki 里应该也不错。同样因为是放在网上,移动的问题也解决了,远比在硬盘上建立文件方便。

我心中理想的产品,是一个 wiki 为基础的大杂烩,可以进行普通的编辑,也可以在上面加各种各样的应用,最好它本身就是一种语言的解释器,可以运行自己的语言。所有的东西可以放在一个页面里,也可以进入不同的目录。程序也即文本,也就是那些小程序模块可以像文字一样复制粘帖。其实这个东西就相当于一个在线版的 Emacs,我这想法也没有任何依据表明它一定会有用,不过我空想中觉得应该是挺好玩的。目前的 wiki 程序算是完成了一半的要求,不过毕竟发展的思路不同,或许将来会有类似的东西吧。

既然自己要弄一个 wiki 系统,我还是选择了 MediaWiki。因为不是想用它做首页了,所以复杂一些也没关系。过去在 Dreamhost 上运行 MediaWiki 要忍受它的龟速,但在 Site5 的共享主机上就完全没有速度的问题了。我试过一些其它的 PHP 写的 wiki 程序,很多都只支持 MySQL 数据库,这是我不想要的。MediaWiki 支持 SQLite,也被 Wikipedia 证明了它的稳定性,所以我也就义无反顾的选择了它。安装好了还是想不起来怎么用,只好查文档看各种资料,折腾了一会好歹把之前的数据都放进去了。

目前来看,我对这个 wiki 还是比较满意的。本着能用就好的原则,我也没有进行过多的设置。把自己的 favicon 和 MediaWiki 的 logo 合并,作为了 wiki 的 logo,虽然觉得那粗线挺丑的,但也算到了我设计能力的“极限”了,也只好将就了。

弄了 wiki 后,首页我就不打算放 wiki 了。之前那些杂货也都挪到 wiki 上了,首页就让我设计成几个指向我几个不同帐户的图标组合了。目前看起来一切都还好。

分居

| No Comments | No TrackBacks

我之前写过我找室友的经历,当时我之前的室友毕业回过,我要给客厅找个室友跟我合租。

我首先想到 A 同学,我在读语言的时候和他一个班,关系一直不错。之前听说他住在一套两室一厅的客厅里,合租的是两个陌生人,于是就想把他“勾引”过来──与其与陌生人合租,不如和熟人合租更好说话。不过问他的时候,他说其中的一个室友搬出了,他从客厅升级到卧室去了。而且他住在另一处公寓的女友(也是我语言班的同学)搬去和他一块了。不过他的女友之前是和我国内来的同学 B 合租的,我可以问问他们那间卧室还在不在,如果找室友困难的话,我就搬过去。不过我先问了 C 同学,同样是之前语言班的同学,不知道他有没有搬出来的意思。我问他的时候比较隐晦,没有直接问他要不要来,而是问他有没有朋友要找房子的,原因是他那时和别人合租一套两室一厅,虽然是和陌生人合租的,不过好好的干嘛要来我这里住客厅呢。他没有意思之后,我就问我国内的同学,他之前和女朋友与 A 的女友合租一套两室一厅,我问了后结果我那同学回国了,那间卧室也已经租出去了,于是最后一条找熟人合租的路也没了,我只好从论坛上发帖子。

本来我的打算是找房子难但有房子就不愁租不出去,结果发帖之后几天都没有信。平安夜那天我和另外两个同学去老外家聚餐,和他们谈起这件事,但他们却觉得不大乐观。因为我要出租的是客厅,除了熟人以外,如果有卧室的,肯定不会租客厅。冬季也不是留学生初次出国的旺季,因此找房子的人就不会很多。我听了之后,想想也有道理,就有些担心了。不过按照我那性格,以及那几天我那什么都提不起劲精神状态,我也没有进一步的行动,只是看了看我那帖子在论坛里不知道沉到多少页了,一个回复的也没有。现在想来,我也对我那时候的行动有些不解。本来找不到室友的话,我就要自己一个人承担每月 651 加元的房租和 50 加元的网费,是很麻烦的,不过我那时的心情是隐隐有点担忧而已,知道后果,但就是不想行动。现在说那时候有潜意识预知到今天的结果是有“事后诸葛”的感觉,但我当时确实是那么希望的,并也想到我之前的种种经历都是如此的──自己不用花心思去想解决方法,总会有方法水到渠成的找上我的。

后来的情况就和我那篇文章里说的一样了。C 同学在一天晚上 7 点左右给我打电话说想过来看房子。我问他为什么要搬,他说他们的合约三月份到期,他们公寓的管理员不咋地,他想换个地方住。我一厅这送上门来的好事,自然是乐得答应了。他说他二月份搬进来。

C 同学看完房子后没两天,在一个周末我接到 B 同学的电话,问我知不知道有睡在出租房子。我问他怎么了,他说和女友分了,刚从国内回来,正急着找房子,听他说这时候房子也不好找。我一合计,一月份还有半个月的房租要我自己承担,不如把他拉进来暂住,算是一举两得。于是就把他拉进来了,让他有半个月时间找房子。最终他找到房子后,就帮他搬家,而我在中间也成功的让他跟我合租我和之前的室友在健身房合租的储藏柜了,事情得到了圆满的解决了。

今天晚上我正在写作业,突然接到一个电话,是 A 同学打来的。他上来问我那客厅租出去了吗,我听了之后隐约感觉到了什么,告诉他已经出租给 C 了,但他还没有搬进来,然后问了他原因。果然如我所料,他这几天一直和女朋友吵架,想找地方搬出来。我心里想着“果然如我预料一般”,一面表示遗憾,一面说“过几天可能还有转机”,同时想到了和之前的室友的讨论。

我之前的室友和女朋友在国内认识的,一起来这边的,中间分分合合好几次,最后我室友毕业回国,他女朋友留在这里。他女朋友从来这里之后一直住在老外家里,我室友和我在语言班毕业之后一起租的房子。他说他一直没有和他女朋友一块住,就是因为当中的麻烦事太多,多数情况下都会闹翻。也确实,他在这两年之中,和他女朋友分分合合好几次,但到最后也算是在一块的。我们当时讨论这个话题,就是因为听说 A 同学和他女朋友搬到一块去了才开始的。B 同学的经历验证了这一点,今天 A 同学同样验证了它。

接连发生同样的事,让我有些好笑。更好笑的是我当初在找室友的时候都问过他们但都没有成功,结果现在他们又反过来问我,真是有些“沧海桑田”的感觉。我当时找不到室友的时候脑中隐隐的幻想可能是有熟人会来找我一起住,因为我之前几乎每件类似的经历都是这么顺其自然的完成的,在完成之前我固然也感觉过一些恐慌,但事实却就那么的发生了,那么的顺其自然。这次我也感觉到了恐慌,而且似乎这恐慌也比之前的每一次更剧烈一些。我甚至想到了“我之前每一次类似的事情都是顺其自然完成的,我感到很幸运,因为我不需要自己出力去选择或者去争取,事情的结果也都不错,我懒懒的就获得了好处,难道我一辈子都会这样幸运?这次会不会就是一次‘人生转折点’?从这次开始我要自己努力去获得我必须要的东西了?”结果事情依然是这样“顺其自然”的发生了,显然我又幸运了一次。不过我在写这些字的时候,也没有什么自信了,不知道下一次事情是不是还会像这次一样幸运的解决。

现在的整体社会导致我以及周围的年轻人的心智有低龄化的现象。我经常听到有人戏言“如果我们如果在旧社会的话,孩子都会打酱油了”,因为听过很多人说那时候人们十六、七岁就结婚生子了。哪怕是今天,我也经常听说“某某的小学同学已经结婚(甚至有孩子)了”的话,在感慨时间流逝的同时,也想过如果结婚或者生子的是自己,自己会是什么感觉。当事人可能会感觉很自然,但如果是我的话,心里想的肯定是“别开玩笑了,自己还是个孩子呢”,尽管经常从大人那里听到“你以为你还小啊”之类的话。

在国外,很多人都总结出男女没有真感情之类的话。尤其是我们这个地方,平日里给人的感觉远不如国内的一些大中城市那么有“都市感”,平均楼层的高度也不过两三层。生活本来就比国内冷清,再加上我们这些外乡人,就更冷清了。因此这边的一些“小两口”,基本上都是欲望的结合,因为一个人在这边太寂寞了,很容易“干柴见到烈火,天雷勾动地火”,两个人就好上了;但同时也经常听到某某和某某又分了。当然了,本来在一起就是为了泄欲的,结果两人低头不见抬头见,在异国一起生活其实就和国内的两口子一个小家庭差不了多少,而由于心智的低龄化,心理也远达不到长久过日子的程度,不久就分手也是正常的。

分分合合原本正常,不过在近期内就接连看到了两起,还都是自己身边的朋友,因为毕竟我周围的人平时也很少发生这种情况,所以感觉也有些奇特的。我身边还有比较尊敬的学长,同期的同学也有一起住的,我也不禁为他们感到有点担心。其实想象一颗不怕寂寞、自得其乐的心在异国他乡学习生活还是挺好的,虽然在外人眼里或许少了很多人生乐趣,但也少了很多红尘世俗中的烦恼。

昨天我照例去老袁的 blog 上找乐子,看到他新写了一篇文章《谷歌Android被Linux内核除名》,讲到了 Linux 把 Android 的代码树删除这件事,并借这件事,引申到了自己对 Google 的挞伐之中,并再次吹捧了 Windows。

老袁写的文章,我都是当笑话看的。看了以后就不管了,不过刚才翻 Google Reader 的时候,看到了阮一峰新写了一篇文章《Android,开源还是封闭?》。老袁写的笑话我可以不管,但阮一峰认真的写了这么一篇文章,我倒是对文章中的观点有些不认同。本来想在他的 blog 上留言的,但写着写着就觉得太长了,干脆总结成文章放在这里。

我觉得现在人们谈及 Google 必提“不作恶”,用这个词来规约 Google 的行为。这本身没什么问题,但我觉得这个词现在被过于“滥用”了。有时候众口难调,Google 不能满足所有人的时候,批判者就经常用“不作恶”来评判 Google。不同的人有不同的观点,所以事事都往"作恶"上面靠,让目前的讨论变得很空泛了,当然这只是题外话。

这篇文章里说的意思是,Google 的 Android 使用的是部分 Linux 的代码,按照 GPL 协议,Google 应该把所有的改动同样用 GPL 发布,以贡献开源社区。但事实是,Google 让硬件驱动运行在 userspace,这样这些驱动程序就不是 Android 的一部分,就不需要回馈给社区。Google 给硬件厂商提供了方便,使得他们写的驱动可以不用共享给社区,所以 Android 是个封闭的系统。

我觉得这样就有诡辩的成分在了。首先 Google 的做法是合法的。Android 本身是开源的,所以它没有违反协议。而硬件厂商给 Android 开发的驱动,版权并不属于 Google,因此 Google 自然也没有权利拿它们来回馈社区做好人。如果 Google 这样做了,岂不是和海盗湾的那帮传播盗版的人一样了么。当然,阮一峰是支持海盗湾的,可能他认为 Google 不这样做才是作恶吧。

文章中有一点挺有意思,还有些技术成分。Greg Kroah-Hartman 的文章里说 Android 为手机实现了一个统一的虚拟机,解决了程序的移植问题。阮一峰认为这是 Google 为了不贡献那些驱动而耍的小把戏,他说:"且慢,这真的是理由吗?传统的Linux系统,也并不依赖特定的硬件啊!只要把源代码根据不同的平台,分别编译一下,同一个程序不也照样可以在不同的硬件架构、不同的Linux发行版中使用吗?"

我觉得阮一峰可能对"平台"这一词并没有弄清除,或者是故意曲解了这个词。过去人们所说的 "C 语言具有良好的移植性","换一个平台,在那个平台上编译一次代码就可以了",这里面说的平台,可不是目前人们说的 32 位平台、64 位平台那么简单。平台之间的差异基本上到了 CISC、RISC 的差异那种程度上了,和目前我们想象的地址总线的数量不同了相比,显得更复杂。很多软件,在不同平台上移植,也不只是重新编译那么简单。比如说 Endian 的问题,光是要修改这一部分就要花费很大的功夫去修改。Mac 系统从 Power PC 平台迁移到 Intel 平台上的时候,发布过 Rosetta 程序,就是一个 Intel 平台上运行的 Power PC 虚拟机。很多软件,如 Adobe 的那些程序(印象里是 Photoshop,我们在 Computer Organization 课上讲过,现在记不清了),到最后也不是修改过去的,而是重头写起。像 Adobe 这样的大公司都是如此,手机上的软件开发着常常都是小团队甚至是一个人,要独立完成不同平台的移植工作,显然也是不容易的。哪怕是现在我们从 32 位往 64 位上过渡,经过了这几年都还没有搞完呢,更别提那些架构级别的移植了。

而 Java 通过虚拟机,算是彻底的解决了这个问题。如果像阮一峰想象的那样,重新编译就可以完成移植,那么当年 Java 还搞什么噱头?由于 Android 本身是开源的,而且手机硬件的生产成本又低于计算机,现在也没有统一的标准,所以在将来,我认为必然会出现千奇百怪的硬件。这些肯定不能通过简单的编译就解决问题。阮一峰的意思是为不同的硬件架构都做一个二进制包,这样一个软件,开发者就要为多个平台维护不同的二进制包,阮一峰总不会指望作者发布软件代码让用户自己编译安装吧?而如果 Android 想成为一个像 iPhone 那样的严肃作品的话,必然要有针对普通用户的一键式安装软件的机制。Apple 的 App Store 是一个很成功的先行者,而 Google 目前搞的 Android Market 也是在像这个方向努力着。而按照阮一峰的想法,当一个用户在安装软件的时候,被告知如果是 HTC 生产的硬件,就下载为 HTC 编译的包;如果是摩托罗拉的硬件,就下载为摩托罗拉编译的包。这样的手机,在普通用户眼里,也只能是"小打小闹",根本成不了气候。由于手机产生的平台可能会比计算机更多,那样的话后果说不定更严重。目前 Linux 在桌面领域已经是这个样子了,如果 Google 按照同样的策略去运作 Android,将来在市场上 Android 很可能表现还不如 Linux。面对 iPhone 平台,那样的 Android 只能是沦为几个黑客的玩具而已。

同样说道了市场,我的前提假设是 Google 做 Android 不是玩票,不是搅浑水,而是严肃的想涉足移动计算这一块。那么硬件的支持就是至关紧要的了。阮一峰的文章里也说明了,硬件厂商开放了自己的驱动的后果是什么。让那些硬件厂商把驱动吐出来显然是不可能的,所以迎合硬件厂商的要求也就是必要的了。其实仔细想想,这样的做法也并不算过分。对于用户来说,我们获得的还是一个开放的 Android,只是硬件的驱动是封闭的。开发者照样可以为 Android 平台开发软件。其实就算是桌面 Linux 用户,除了像 RMS 那样固执的人外,有几个会选择开源的显卡驱动呢?

所以,无论是从法理还是从情理上,我都觉得 Google 在这件事上没什么错。合理怀疑也是不错的,但把什么事都说成阴谋论就让人觉得不好了。尽管 Google 有"不作恶"这一说,但如果 Android 真得发展成了桌面领域的 Linux,那么它做不做恶都没有人关心了。

阮一峰在最后说:“Android必须变成一个真正的开源系统。如果像现在这样封闭下去,就会被开源社区抛弃,就一定不会成功,即使有Google的支持。”这口气让我觉得和老袁挺相似了。如果 Android 作为一个系统,这话还有可能说的过去,但作为一个商业产品的一部分,如此断言还是太过武断。

越来越喜欢 Java 了

| 3 Comments | No TrackBacks

周日晚上开始,大概是 11 点多以后了,我开始写这学期的《数据结构与算法分析》课程的第一次作业的倒数第二道题。题目要求是用 C 语言或者 Java 语言实现 Binary Heap、Ternary Heap、Quaternary Heap、LB-Tree、Skew Tree、 Binomial Queue 这几个数据结构,在程序开始的时候随机生成一个包含 10000 个正整数元素的数组,把这些数据存到这些数据结构中,然后把这写数从小到达取出来,统计进行内存操作的次数,来得到这几个数据结构的性能对比。

我之前和同学讨论过这个题目,对方说他花了不少时间,不过他是用 C 来实现的。我由于这次作业第二天早上就要交了,所以也就没有跟自己较劲,非要用 C 写。基于之前用 Java 的经历,我如果要从 C 和 Java 当中选一个语言来写这个程序,我毫不由于的选择了 Java。

我曾经一度非常讨厌用 Java,因为觉得语法太繁琐,要读取文件都很麻烦。在 C 之类的语言中几行就 OK 了。另外的原因大概是有些审美疲劳,虽然本事不怎么样,但那时却好高骛远,想接触一下 C++ 之类的语言以及 Ruby 之类的新型语言。Java 写多了,那时后的课程又没有什么难度,就有些小看了 Java。后来我的一下比较大的“项目”都是用 Java 完成的,我学了面向对象课程之后,对 Java 也算是有了新的尊敬。

我最近的几次大项目有点不大在状态。每次在截止日期之前都提不起兴致来,非要等到第二天就要交了,前一天晚上才用咖啡顶着,熬夜把项目不紧不慢的写完。每次大概花上夜里 8 个小时,也算是一鼓作气了。上学期《专家系统》课的学期项目是如此,这学期的面向对象的第一次作业飞机座位模拟也是这样,这次的数据结构也是一样的情况。每个程序的规模基本上在 2000 行代码左右。后来我总结了一下,发现 Java 实在是功不可没。要是让我用 C 语言或者 C++ 来在 8 个小时内写这么多代码,我中间的空指针就够我受的了。

我另外用 Java 写的项目是去年暑假上《软件工程》课的时候和另外四个人组成的小组做的学期作业,是一个自动生成歌曲列表的软件。我所在的小组完成的是底层的逻辑部分,似乎和对象的交互没什么关系。我在上学期也和另外一个人用 C 语言写过《计算机网络》课的学期项目,我之前也写过文章讲过相关的故事。那和 Java 比就完全不是一个级别的了,开始时我写 concurrency 的时候简直是一筹莫展。后来我是用的 C 写的游戏的逻辑部分,对方写了服务器和客户端的界面与交互,总算是完成了。不过在演示的时候还是出现了字符串的乱码,估计是一个某个地方有了一个“野指针”。不过打分的助教说这不是重点,于是我们也没有找具体是哪里有问题。

之所以把 C++ 排除在外,是因为我目前的 C++ 水平很弱。我曾经在 STL 流行之前觉得我对 C++ 掌握的差不多了,那时候我还在中学时期,现在想起来也是狂妄的可以。过去只知道有个 class 关键字,底层是怎么回事我是一点都不了解。现在学了面向对象课程,学到了 C++ 中的类不仅可以放在堆里面,也可以放在栈里面。这让我困惑了许久,两着之间的区别是怎么样我也考虑过很久。还有,过去光记得用 class 关键字来定义类,使用的时候也没记得要用指针。现在基本上在定义的时候前面加星号成了标准写法,也让我着实愣了一阵。我还没有用 C++ 写上几个 2000 行左右的程序,因此对于语言本身的掌控没有什么感觉。我用 Java 写这种东西,只要把题目搞清除了,从纸上设计好,就可以开始写了。类之间的组合什么的基本上不会有什么问题,顶多在检查空指针的时候查一些粗心错误。C++ 我就还没有这个底气。

我考虑了一下我为什么感觉喜欢 Java,我喜欢的到底是 Java 的什么东西?最后得到的结论大概还是自动垃圾回收以及隐藏指针吧。C++ 和 C 里面的指针分配,不管是 new/delete 还是 malloc/free 都要小心意义的,这些东西又不能自动递归执行,稍微有点嵌套的数据结构在释放内存的时候就要自己做许多事。Java 的自动垃圾回收虽然从效率上不如 C/C++,但以目前的机能来说,差距也不大,而节省下来的人力时间则不是机器执行时间可以比的。而指针隐藏和垃圾回收也有一定的关系,不用手动维护指针总是好的。虽然指针给了更灵活的操作,但也容易让人写出有隐患的代码。

总结出了这两点,我又检查了一遍,似乎还真没有别的我喜欢的地方了。相反倒是有我不喜欢的地方,就是 Java 没有一个好的调试器,或者说我还没有掌握一个 Java 调试器。我在上学期用 C 写项目的时候,终于对 GDB 有些开窍了,突然觉得它真是一个好工具。尽管我只会用它的很小一部分功能,但已经基本上可以满足我的需要了。我用 GDB 主要是程序有了 Seg Fault 的时候,进 GDB 运行一下看看空指针在哪里。或者就是程序有了奇怪的行为,去设个断点,分布执行一下,跟踪一下变量的变化。虽然不像我过去用的那种 FreePascal IDE 之类的调试器一样可以即时的显式监控变量的列表,但我也习惯了用 p 来查看变量的值。Java 的 SDK 里面有 JDB 这个 GDB 的模拟,我用过几次总是一头雾水。说是 GDB 的模拟,但指令基本上全都变了模样。也没有缩写了,指令本身也变了好多。我反正是一次也没有成功的用起来 JDB 过,所以到目前位置我还是在代码里面插入“人肉”断言来输出变量的值的。

基于上面说的那两点,我觉得应该有不少语言都满足这些要求,但我基本上都没有熟练到像 Java 那样子。而且 Java 也算是最流行的一个,我们老师课不让我们随便用 Ruby 写作业。或者我听说 Objective C 也不错,在 C 的语法基础上加上了自动垃圾回收什么的。不过对于他我还是一点没有入门,语法上也觉得颇为奇怪。就算是之前最熟悉的 Python,拿来让我写这种大项目我也是要愣一阵子的。

想到了这一点,我觉得应该可以找到一种适合自己的编程模式,来发挥我需要语言的特性。通晓了这一点之后,应该写千百个项目都不成问题了吧。

奇怪的 BZR 下载

| 4 Comments | No TrackBacks

几天前就知道了 Emacs 的代码仓库已经从 CVS 转到 BZR 上来了,但一直没有多像。今天突然想看看 BZR 里的 trunk 版本和 CVS 里的有没有什么不同。因为我目前用的 Emacs 是用的 CVS 里的代码编译的,不知道在 BZR 中的 Emacs 代码有什么更新呢?

我第一次听说 BZR 是在 2007 年下旬,中间一直没有实际 checkout 过 BZR 仓库里的代码。我平时自己的代码喜欢用 Git,与别人合作用的多数是 SVN,这两样基本上已经足够满足我的要求,也足够流行,所以我一直没有花时间去弄清楚 BZR 相对于这两个来说有什么不同。由于平时很少 checkout BZR 仓库里的代码,所以我连 BZR 客户端都没有装。今天想去下 Emacs 的代码,之后现下了一个客户端。

我首先下载的是 BZR 的源代码,需要用 Python 安装。不过我看里面有直接可以运行的可执行文件,就先用它试试。不知道是不是 Emacs 的 savannah 仓库的连接速度慢,还是 BZR 本身就慢,代码一直在下载中。说它奇怪是我看到下载的目录里面只有一个 .bzr 文件夹,而代码却不曾看见。我才应该是被放到什么地方缓存起来了吧。后来突然本子的风扇开始转了起来,我看了一下果然是 BZR 的这个 Python 进程的 CPU 使用百分比已经高了,由于正在上课,所以我只好杀死了这个进程。

中午的时候,我下载了 pkg 安装包,直接安装了二进制的 BZR,主要是想确保万无一失。于是又一次运行了 checkout 命令。当中经过了漫长的等待,终于风扇又开始转了。我这是查看了一下本地目录,还是一个文件没有。我猜是不是就在最后会把所有的缓冲的代码复制到本地目录里去啊。过了一会程序就运行完毕,果然文件都在本地目录里面,风扇自然也就不转了。看来我的猜测是正确的。

对于 BZR 的这种方式,我觉得不是很好。首先是界面太不友好了,命令行只提示了下载速度,而进度什么的都没有告诉。SVN 等工具会明确的显式正在下载的文件,这样下载是否正常也就一目了然了。而 BZR 的这种方式,在 checkout 像 Emacs 这种规模的代码时,就会让人觉得非常奇怪,也不知道下载是否顺利。而且在最后也会引起 CPU 使用过高的情况。

厨师应该是个好职业

| 2 Comments | No TrackBacks

这是我自己做饭半个月后的感受。

之前由于家里那哥们好把厨房弄的很乱,我平时又喜欢在学校的实验室里泡着,所以我很少在家里做饭。平时的三餐基本上是这样安排的:早餐不吃(既没有时间也觉得不饿);午餐在学校里一杯大咖啡两个蓝莓 Bagel(每天都是,弄的那里的店员每次都先问我一句是不是一样的);晚餐或者在学校的餐厅里吃汉堡,或者在回家路上去超市买熟肉。一个学期这样吃下来也觉得没什么。

上个月上旬我室友回国了,我之前预定的下个室友要这个月才能搬过来。正在考虑怎么消化这半个月的房租的时候,突然有朋友急着要找房子,我便“勾引”他在我这里暂住一阵子,边住着边找房子,半个月找房子应该够了。在这个朋友来了之后,我又开始了自己做饭的日子。我们去超市买了菜和肉,回家后发现我之前的室友在冰箱里还留了一下还能吃的肉,我们于是就先把它们做了。

前一阵子我们经常去做运动,回家以后就累的要命,也觉得饿。我做完饭之后就赶紧吃了,也没觉得有什么。这些天开始忙了起来,回家之后就不怎么想做饭了。有些时候到了吃饭的时间,但并不怎么饿,这种事情也是常有的,周末尤其是如此。不过既然已经决定要按时吃饭了,我也就自己做了。

之前的室友留下了一些鸡翅,我之前的几顿饭就是在炖鸡翅。做饭的时间都很长,主要是后期方料后要等很长时间,这样就导致我做完饭后就觉得不大饿了,也没有了做饭前那种期待的心情,吃起来很勉强。这事也发生了很多次了。我在 Twitter 上也抱怨过,有人回复说可能是我做饭做的太艺术了。我不确定对方是不是在说反话,是在说我做的饭太过艺术以至于时间很长还是说我做的饭其实是太难吃所以自己也吃不下。难吃是不至于的,我自己也比较喜欢吃,但主要是做的时间要很长,那段时间过后基本上就是“饿过劲儿”的状态了。

之后我就在考虑,怎么样才能摆脱这种状态。自己花时间做完饭之后,还能保持想吃的心态。在国内的时候,在家里基本上都是大人做饭,有时候就算是做饭之前就饿了,等到做饭之后还是觉得想吃。自己做饭如何能保证这种状态呢?后来得到的结论就是本文的标题。

答案就是自己做饭给别人吃。第一次做完饭的话或许自己并不想吃,但再做几次总会有想吃的时候。一个厨师身边总有吃到的机会,比方说总要常常味道如何的情况呀。或者到了正常吃饭的时间,吃一些之前做好的饭应该也不错。这样的话问题不就是解决了吗?

当然,因为我没有做过厨师,不知道做一天的饭会是什么感觉。上述都是空想。:)

下载了新书

| 2 Comments | No TrackBacks

coders-at-work.jpg这是上周一发生的事情。那天由于下雪,一天当中的第二节课取消了,我那阵子没事做。正好想到好久没有去书店翻书看杂志了,正好新学期开始,也去看看要不要买新学期的教科书。

我们这边的教科书都是老师推荐的,买不买在同学。不同的老师推荐的程度也不一样,有的老师就在第一节课提一下子,说这是本好书就完了;我这学期有位教数据结构和算法分析的课,好像挺有资历的样子,我曾经在图书馆借阅过他写的图论算法书,在这学期他推荐的书是 Mark Allen Weiss 写的《Data Structures and Algorithm Analysis in Java》。关于作者我好像有点印象,似乎书在网络上的评价也不错,不过我一直印象里算法方面的书应该是 Knuth 的嫡传弟子 Robert Sedgewick 写的 《Algorithms in C》更出众一些。我在国内几年前就买过它的影印版的,当时虽然英语不行,但也感觉从中领悟了不少东西,书中的一些插图更是点睛之作。而我们的这位老师在课堂上就一个劲的推荐 Weiss 写的那本书。不过推荐也就罢了,让我们买的话好歹给各样张看看吧?结果可能是因为他之前在与学校书店沟通上发生了问题,导致书店一直没有进这本书,我们想买的话只有去亚马逊了。加拿大这边的书动辄上百,买书之前不让我拿在手里仔细翻一翻我课不安心。

在书店的计算机专业课本的书架前转了一转,依旧是没有老师推荐的那本书。另一门计算机网络课和网络安全课倒是有课本。网络课是和上学期的同一本书,我因为它太厚,觉得自己也很难看很多,因此就一直没买。网络安全的课本上讲的知识上学期学的密码学已经完全涵盖了,因此也不用买。

不用买书,我转身又去了新到杂志的书架那边去翻翻。那天书架上的 Linux Journal 竟然没有了,可能是卖完了?Wired 杂志也不在上面。我一般去那边看杂志主要就是看这两种,它们没有了,我就只能去旁边的计算机课外书那边看看了。计算机课外书就两个小架子,还有很多入门书,因此好书不多,我主要是注意在开发类的那些书上。有些书倒真是不错,不过买了来估计我也没时间看,于是就没动心思。不过我从中间看到夹着一本 《Coders At Wrok》。之前我从网上看过有人介绍好像是相同系列的,不过讲的是创业者的故事,而我对开发者的经历更感兴趣一些。书皮上印了好多名人的名字,都是如雷贯耳的“巨擘”啊。我拿下来坐在旁边的椅子上翻了翻,上来看了一会对 Jamie Zawinski 的采访,看了他对 C 语言、Perl 语言之类的评价。当场觉得这本书应该是本相当不错的消遣读物。看了下价格,似乎也不是很贵,二、三十的样子,这样的厚度和其它类似书比起来已经相当实惠了。当时就有把它拿下来回家躺在床上看的冲动。

不过犹豫再三,还是把书放回去了。主要是考虑到这学期应该也没有什么时间看消遣的读物。书价虽然不是很贵,但总是一笔钱。等回去去网上搜搜,说不定能下载下来,甚至可能能找到中文版呢。于是我最终还是不舍的离开了书店。

回去后,我又开始了新一轮的图书搜索风潮。除了找到了 Coders At Works 这本书之外,另外两门课的书也下载到了,算法的那本书还是中文版的。虽然说看起来不是很方便,但想想为了省钱,应该是可以忍受的吧。毕竟在这边和国内没法比啊(在国内前几年我买书很少犹豫的,结果买回了一堆现在看来没什么用的书)。

温度啊温度

| No Comments | No TrackBacks

摄于十分钟之前,我目前家里的室内温度。我倒是能够忍受,但总有一种不爽的感觉。

temp.JPG

让 YouTube 暂停自动播放

| 1 Comment | No TrackBacks

youtube-logo.jpg当我第一次使用 Mac 上自带的 Safari 3 的时候,有一项功能我特别喜欢,就是 flash 视频都被暂停载入。举例来说,当我使用 YouTube 的时候,我喜欢用鼠标中键或者按住 command 键点击视频链接,在后台标签页中载入多个视频,然后一个一个的看。在 Safari 中,页面的所有元素都被自动载入,除了视频。整个显式视频的 Flash 窗口都会在我进入那个标签页的时候才开始载入。

在 Firefox 中则一直没有这个功能。如果我在 Firefox 中做同样的事情,YouTube 视频会在我还没有切换到那个标签页之前就自己载入播放,这样会导致多个视频同时播放,声音非常嘈杂,让我不得不一个一个的先把那些视频都暂停,然后才能开始看。这样非常麻烦,而且降低了观看视频的兴致。

我一直在觉得,为什么这个功能在 Firefox 中没有被实现?难道开发者都不看 YouTube?或者 Firefox 的开发者都没有尝试过 Safari?我周围多数的 Mac 用户都是使用 Firefox 的,我在一些 Firefox 官方介绍的视频中也看到他们用的是 Mac,所以这一点应该不成立。既然他们用 Mac 的话,总有机会试验一下 Safari 吧,就算不是所有人试用 Safari 的过程中会打开 YouTube,但总应该有一部分几率能让他们发现这一点的。我还怀疑是不是这个功能已经实现了,只是没有默认打开而已。不过我找了几次 Firefox 的设定窗口,都没有看到相关选项。当然,如果确实是因为我粗心没找到的话,也请不要嘲笑我。

昨天晚上,由于看到了 Firefox 3.6 发布的消息,我又去了一些 Firefox 相关的网站看了一看,主要是想了解一下 3.6 版本的新特性之类的。Personas 算是主要的一点,虽然我觉得对我来说没什么用,但实时性这一点来说确实很酷。改动的是整个窗口的 theme,我觉得实现起来应该有些难度,不同平台下的代码可能也不同。看这些的时候我顺便浏览了一下 Firefox 的 Add-ons。我在出国前用的 Firefox for Windows 中总要安装一堆的扩展,可能是因为那时候 Firefox 的功能还没有发展完整的原因,再加上我之前使用的浏览器是 GoSuRF,一个 IE 浏览器的外壳,里面的一些东西,比如说拖拽,我很喜欢。因此我后来换用 Firefox 的时候就弄了一堆扩展来模拟 GoSuRF 的行为。后来等我在 Mac 上使用 Firefox 的时候,Firefox 的功能已经很完整了。很多行为,都有了简便的方法来完成,不再需要那一堆扩展了,所以在 Mac 上,我的 Firefox 只安装了很少的扩展。主要使用的是 Adblock Plus、NoScript 和 del.icio.us 书签,后来为了完成作业安装了 Firebug。再往后看了李笑来的介绍文章安装了 Greasemonkey 和 GreaseFire,其它的扩展就都是微不足道的了。

昨天晚上我在浏览 Firefox 的 Add-ons 列表时,正好看到了 GreaseMonkey。我突然意识到,GreaseMonkey 不久是用来改变网页行为的吗,说不定可以让 YouTube 停止自动播放,满足我的要求。于是我打开了 YouTube,用 GreaseFire 找到了 20 多个 YouTube 相关的脚本,挨个看看介绍,就找到了几个有暂停功能的脚本。我选择了排名比较靠前的一个名为 YouTube Auto Buffer & Auto HD & Remove Ads 的脚本,由 JoeSimmons 开发。据介绍说它有三种功能,自动缓冲(变相的完成了我的需求)、自动高清播放、以及移除广告。后面两个功能都不是我需要的,但有了第一个功能,就能在打开一个视频时自动让视频暂停了。

说这个脚本变相的完成了我的需求,因为它并不是我原先假设的行为,但也可以用了。我观察了一下它的行为,当打开一个 YouTube 视频页面的时候,视频会播放大概有一秒种左右的时间,然后视频暂停,进度回到视频开始的地方。我估计这个一秒是脚本执行的延迟,影响不是很大。这种行为与我想要的行为的区别是:当我在 Safari 的后台标签打开一个 YouTube 视频页面的时候,Safari 并不载入播放窗口,直到我实际上进入这个标签页之后才开始载入并播放。这样当我在看一个被分成几部分的视频时,当我看完一个视频,我要做的就是关闭当前的标签页并等待新视频的播放。而在 Firefox 中,我需要点一下鼠标来手动让这个视频播放。

还有一点不同是在 Safari 中,所有的视频网站,包括 Vimeo、土豆等网站,都有同样的后期载入效果,而我目前的 Firefox 只对 YouTube 有效。我主要是想在 YouTube 上看视频,所以这个脚本已经可以满足我了。不过我觉得可能有人针对其它的视频网站也写了脚本,再用 GreaseFire 找找看看吧。

Mail.app 的 Junk check

| No Comments | No TrackBacks

mail-app-logo.jpg今天中午发现了一个相对比较严重的 Mail.app 程序在垃圾邮件检测时的问题。

在回复老师的邮件时,我突然想到了已经很长时间没有检查 Junk 文件夹了,于是就顺便过去看了一看。在往下滚动的时候,我看到了有很多我希望保留的邮件被标记为了垃圾邮件。不知是中文邮件,英文文件也有好多。其中最明显的可能是来自 Flickr 和 Orkut 的邮件了吧。我之前在曙光博客上的留言回复通知也被过滤了。还有之前我同学给我发送的邮件,以及上个学期我们《密码学》教授群发的邮件也被过滤了。Site5 发来的 Adsense 优惠码也被挡住了。

中文邮件我勉强也就理解了,但英文邮件竟然也被过滤就让我觉得不可饶恕了。难道苹果不会设定一个白名单吗?像 Flickr 这种大型社区的邮件,以及一些著名大学相关科系的邮件,是无论如何也不应该被过滤的。虽然这些邮件主要是通知我某人又把我加入好友列表了。也好在我教授群发的邮件没有什么关键性的内容,否则损失就大了。最主要的一封邮件,是关于今年学校注册部门给发来的保险认证邮件,也被档了下来。

除了白名单之外,Mail.app 也应该更智能一些。比如说 Google Mail 的垃圾邮件过滤是非常优秀的,那么一个帐号是 Gmail 的话,是不是就不需要再做一次过滤了呢?就算不是默认设定,那么针对某一个帐号的垃圾邮件过滤开关也应该提供吧。我找了几次也没找到。也许通过在命令行输入一些命令可以设置,但这种选项应该提供给全部用户了吧。

经过这次事件,我对 Mail.app 有一点失望。我当时在看 Mac OS X Snow Leopard 的演示视频的时候,印象最深的就是和 Mail.app 相关的几个程序。尤其是 Mail.app 和 iCal.app 以及 Address Book.app 程序之间的互通,让我觉得在日常应用之中应该会很方便。但在日常当中,这些日程安排的功能我用的都不是很多,因此现在也动摇了一些我的对 Mail.app 的信心。我看到过有些人在 Mac 上使用 Thunderbird,我当时有些奇怪──既然系统已经有了 Mail.app 这么一个非常好用的客户端了,为什么还要用第三方的?不过目前这种想法有些改变了。我可能会在未来试验一下其它的软件。

最后也要批评一下学校邮件系统的垃圾过滤系统。应该过滤的不过滤,不该过滤的反而过滤了。我在用 Linux 的时候用过 mutt 来收发邮件,后台用的好像是 getmail,没有设定本地的垃圾邮件过滤。学校的邮箱基本上一天到晚被各种各样的垃圾邮件充斥着,根本无法使用。这也是我用 Mail.app 的一个原因,就是它可以帮我过滤邮件。而学校的过滤系统确实曾经过滤过 Facebook 的邮件确认信。那时候(2007年)Facebook 还只能用大学的学校邮箱来注册,因此我只能用我的学校邮箱来注册。但却收不到确认信,后来才发现是被学校给过滤了。我当时在 Facebook 中说起过这件事时,收到很多人给我的信息,问我怎么样才能收到确认新,看来学校的这个垃圾过滤系统给不少人带来了麻烦啊。

Recent Comments

  • Feng Liu: 同步的话我觉得还是麻烦,也就是说我既要自己维护源文件,也要管理生成的 HTML 文件。你说的办法和 RAM-CMS 差不多,用 ssh 登录到主机上然后修改文件前台就有变化了,但 ssh 编辑的话对中文支持不好,也不是每台计算机都方便用 ssh。 read more
  • Yibie: 关于这个,可以用Dropbox或在线同步的服务解决。 不过,我也关注你很久了,所以我也大概知道你的要求,Vim于你而言,确实不是那么好… 一般来说,我就是用自己的电脑,所以倾向于本地的解决方案。 备忘录的话,为何不用Evernote?还可以和你的手机结合。 反正现在你也不准备公开你的wiki吧? read more
  • Feng Liu: 我倒是颇不赞同你的理解。看阮一峰原文的最后一句话,说如果继续这样,Android 会被开源社区抛弃,就算有 Google 撑腰,也绝对不会成功。这种话,你觉得他是在追求总福利最大化吗? “追求总福利最大化”怎么听起来这么像“共产主义”呢?学经济的人还在幻想“共产主义”吗?对于“追求总福利最大化”,也许只有“计划经济”才能做到。希望我们退化的“计划经济”吗?我觉得这不是阮一峰的原意。 read more
  • Feng Liu: 看了你关于 Vimwiki 的介绍文章,感觉应该是和 Emacs Muse (wiki-mode 已经改名为 Emacs Muse 了)是一样的东西。不过它们不符合我的要求。 read more
  • maxSonic: 我想我大概读懂了两篇文章的逻辑了。 阮一峰的意思不是google的商业模式如何如何,而是google的做法相当于帮助了硬件产商,即开源社区补贴了封闭的社区。无论怎么说,这不算是什么道德谴责。 而其所说的未来,我觉得以他经济学的出身,意思不是指开源一统天下,而是指在开发上的总福利最大化。也就是说,阮一峰是认为这样的做法使得它无法激励更多人去从事开源的活动。这个是从效率上面来讲的。 此博客上面所讲的则是另外一回事。 作者的意思是,第一,阮一峰对技术的了解不足够,即其对技术和相关法理的评论存在知识上的不足;第二,阮一峰对google的评论说的不是市场上的事情,缺乏足够的商业分析。 所以本文所说的东西其实和阮一峰说的是两回事。 也所以,在一方面,这篇文章说阮一峰的评论不懂得市场,但阮一峰说的市场不是产品盈利与否或者方案可行与否,而是能否激励更多人参加开源活动;而另一方面,由于本文作者在学识背景上和阮一峰不同,导致了理解上的曲解。 我觉得这里隐藏的前提太多了,两个人都必须说清楚才能使讨论比较清晰。 另外,这是我个人有点偏激的看法,我觉得阮一峰在经济学上的修养导致了他有一个自我默认的信仰(其实我也有),那就是不知不觉会考虑到整个市场的效率(即总福利最大化)。 希望我的理解没有错误。 read more
  • Yibie: 我用VIM的插件Vimwiki来架设自已的wiki,可堪用~ 可自动转换为HTML码 我不是很习惯web的wiki形式… 不过你是用Emacs的,为啥不用那上面的wiki-mode? 这里是我的一点理解,希望能抛砖引玉: http://www.gtdstudy.com/?p=1357 read more
  • lostsnow: 说句闲话 正文1.5倍的行距才好 现在这样太紧凑了 read more
  • Feng Liu: 多谢建议。不过我做饭基本上半小时之内都会做完,但我感觉主要是心理作用似的。可能是因为之前吃泡面吃惯了,超过 5 分钟就等不及了 :) read more
  • angiee: 你可以试着做一些不花时间的菜,10、20分钟就好的,比如炒时蔬之类的。 多利用烤箱。比如烤箱里面烤着牛排、鱼排,炉子上可以同时做米饭,炒个蔬菜,就很丰富了。 如果第二天想吃肉,前一天晚上就买好然后用料喂好放冰箱,第二天想吃的时候拿出来一弄就成了,顶多30分钟搞定。也省去不少准备的时间。 你如果学会同时做几个菜,那做饭就会很快啦~ read more
  • Feng Liu: 一般在 Mac 下安装这些 UNIX 软件可以用 MacPorts,它是 FreeBSD 下 ports 系统的 read more

Recent Assets

  • coders-at-work.jpg
  • temp.JPG
  • youtube-logo.jpg
  • mail-app-logo.jpg
  • irc-emacs-channel-kick-person.png
  • love-syndrome.jpg
  • lf-year2010-style.png
  • six-apart-logo.jpg

Find recent content on the main index or look in the archives to find all content.