What I’ve done with my MBP

算来买到 MBP 距今也有 4 个月了,这四个月里我主要做了哪些 hack 工作呢?这里罗列出来,或许你会有兴趣:

* 因为 OS X 上没有一个文本编辑程序 (ok, let’s forget vim and emacs) 支持自动的编码探测,所以我在 jserv port 的 Mozilla 的[编码探测技术](http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html) 的 [charset-detector](http://blog.linux.org.tw/~jserv/archives/001672.html) 基础上稍作修改使之能在 OS X 下工作,并打算修改 open source 的 Text Editor 的代码,使之能够自动探测选择常见的编码。这个工作前一部分已经完成,后一部分打算在这个周末做一做,包括 pack charset-detector 为 Framework 等等。[link](http://www3.newsmth.org/bbscon.php?bid=719&id=126786), [binary](http://www3.newsmth.org/att.php?p.719.126786.891.bz2), [source](http://www3.newsmth.org/att.php?p.719.126786.69633.bz2).

* 因为突然要听 APE ([Monkey’s Audio](http://www.monkeysaudio.com)),但 OS X 下把 APE 转换为 MP3/Apple Loss less/AAC 必须先用 MAC (Monkey’s Audio Console) 将 APE decode 为 WAV 格式。但却没有人提供 Universal Binary 的 MAC。所以就自己修改、移植、编译了一份 MAC for Intel。[link](http://www.newsmth.net/bbscon.php?bid=719&id=128445), [binary](http://www.newsmth.net/att.php?p.719.128445.458).

* 将 Apple 提供的输入法例子 BasicInputMethod 修改为 Intel Macs 下可编译。[link](http://www3.newsmth.org/bbscon.php?bid=719&id=128237), [source](http://www3.newsmth.org/att.php?s.719.128310.380.gz).

* 因为想玩《金庸群侠传》,但 OS X 下先前别人编译的 [DOSBox](http://dosbox.sf.net) UB 版本却一跑“《金庸》” 就崩溃,于是自己编译了一份新的 CVS 版本。[link1](http://www.newsmth.net/bbscon.php?bid=719&id=140864), [binary](http://www.newsmth.org/att.php?p.719.140864.482.gz).

* 修改 gVim for Mac OS X,提供完整的中文支持和 ATSUI 渲染功能。并改进对部分中文输入法 (QIM) 的支持。这是最近几天做的,也是最复杂的一个。[link](http://www3.newsmth.org/bbscon.php?bid=719&id=145814), [patch](http://www3.newsmth.org/att.php?s.719.145814.1526989.patch), [binary](http://www3.newsmth.org/att.php?p.719.145947.419.bz2).

还有几个未完成或者未 announce 的 project 🙂 上面这些项目我都是在一完成后就在 newsmth.org 的 [Apple 版](http://www3.newsmth.org/bbsdoc.php?board=Apple)发布,我也时常在那儿停留,参与讨论,如果你有兴趣也不妨来逛逛。

Hacking 真是人生最大的乐趣 😉

现有的 JavaScript 实现概览

严格来说,JavaScript 其实指的是 Netscape/Mozilla 对 ECMAScript 标准的实现,但考虑到习惯因素,这里就不咬文嚼字了。

目前仍然在开发中的 JavaScript (ECMAScript) 开放源代码的实现包括:

#### JavaScriptCore

Apple 开发的 JavaScript 引擎,以 Mac OS X Framework 的形式提供,与 WebCore 一同结合而成 WebKit Framework。JavaScript 是基于 KDE 计划的 KJS 库和 PCRE 正则表达式库开发的。

特点:

* 强大的垃圾回收器
* 使用 C++ 开发
* 基于标准 C/C++ 库和 ICU (IBM 的 Unicode 库)
* Mac OS X 程序调用它比较方便
* 采用创建语法树并执行的形式,而不是生成 bytecode 再执行
* 提供 C, Java (JNI), Objective-C, Qt 的 binding
* 跨平台,可在 win32 下使用

网站:

* [The WebKit Open Source Project](http://webkit.org/projects/javascript/index.html)
* [Trac](http://trac.webkit.org/projects/webkit/browser/trunk/JavaScriptCore)
* 提供代码 (Subversion), Bugzilla

KDE 提供了 kjsembed 库,也是基于 KJS 的,但依赖 Qt (和 KDE)。

#### SEE

是 Simple ECMAScript Engine 的缩写,提供了 ECMAScript 的解析器和运行时环境。提供到 JavaScript 1.5 (ECMAScript 第 3 版) 的兼容性。

特点:

* 不直接提供 DOM,但 API 设计时是考虑到了支持 DOM 绑定的
* 关注正确性与可移植性

网站:

* [SEE](http://www.adaptive-enterprises.com.au/~d/software/see/)
* 提供代码的 snapshot, Subversion, 邮件列表和 Bugzilla

文档:

[Using SEE](http://www.adaptive-enterprises.com.au/websvn/filedetails.php?repname=SEE&path=/see/trunk/doc/USAGE.html)

#### DMDScript

Digital Mars 的 ECMAScript 实现,作者是 D 语言的发明者。

特点:

* 声称要比其他实现都快
* 有 D 语言实现也有 C++ 语言实现
* 混合 License (开源软件可以使用 GPL)
* 加上了 Microsoft Jscript 扩展

网站:

* [DScript](http://www.digitalmars.com/dscript/)
* 只提供单独的[源代码压缩包](http://ftp.digitalmars.com/dmdscript.zip)下载。
* 有邮件列表,没有版本管理库。

#### SpiderMonkey

Mozilla 的 JavaScript 参考实现,支持到 JavaScript 1.7。

特点:

* 使用者数量众多,对 JavaScript 和语言扩展支持最快
* 专门为单独 (standalone) 编译考虑,不需要依赖任何其他的 mozilla 软件/库
* 要保证线程安全则需要 NSPR 库
* 向 Adobe 贡献的 tamarin 引擎转移的步骤进行很慢

网站:

* [SpiderMonkey](http://www.mozilla.org/js/spidermonkey)
* 代码提供压缩包 (从 FTP) 和 CVS。有 Bugzilla。有[新闻组](http://groups.google.com/group/mozilla.dev.tech.js-engine)。

cmake

我以前总说 autotools sucks,以为只用 make 就能解决一切问题。

最近终于开始做一套比较实用的 (或者说 Insdustrial-strength) 的程序,涉及好几个平台和库,于是 make 的局限性就显现出来了,为了在几个不同的平台下都编译使用,不得不在 Makefile 里写大量判断。

于是开始找跨平台的编译工具,其中最有名的两个是 [cmake](http://www.cmake.org) 和 [scons](http://www.scons.org),cmake 之所以出名估计是因为 KDE 4 从 autotools 转向用 cmake 来编译。而 scons 则是 [lighttpd](http://www.lighttpd.net) 原来用的编译工具,它现在也转向 Python 了。cmake 和 python 大概代表了新一代跨平台编译工具的两种方向。第一种 (cmake) 是延续并改良传统 automake, autoconf 工具链,将之合为一体,但最终仍然生成 Makefile, Visual Studio 的 .sln,Xcode 的 .xcodebuild 文件,依赖现有编译工具 (make, nmake, vcbuild, xcodebuild) 来编译;第二种则是完全消除现有编译工具的调用,直接调用编译器,scons 就属于这一类 (scons 还有一个特点是完全不用专门的语言,控制编译的脚本就是 Python)。

从[人气](www.googlefight.com/index.php?lang=fr_FR&word1=scons&word2=cmake)上来说,反倒是走改良路线的 cmake 比 scons 好一些,有几个原因:scons 基于 Python,可能有些代码不是很照顾速度,于是类似 KDE 这样的大项目编译起来会很慢;scons 开发比较慢,最近一直只是 bugfix。不过相对 cmake,scons 的优点是文档非常细致可读,而 cmake 的文档则非常少,可以在网上找到的只有几篇介绍性的文章和参考手册,不像 scons 有一本 User Guide。

与之相关的工具还有 Jam (包括它的变体 FTJam, Boost.Build), [Waf](http://www.freehackers.org/~tnagy/bksys.html), [Bakefile](http://bakefile.sourceforge.net) 等。其中比较新的 Waf 是一个 scons 的改进,在它的提供的 [benchmark](http://www.freehackers.org/~tnagy/bench.txt) 中,显示通过缓存方式可以大大改进编译的速度。不过因为这个项目还很新,目前没有什么软件用它作为编译系统。

Bakefile 走的则是 cmake 的路子,从名称上也可以看出,它最终也是通过生成 Makefile 一类的文件来完成编译的。不过不同的地方在于 cmake 用的语法很像 autotools 用的 m4 的传统语法,而 bakefile 则完全用 XML 来定义编译规则了,这一点倒很像 [ant](http://ant.apache.org/)。Bakefile 倒是有不少著名的项目使用,比如 wxWidgets, WebKit, VCF, libxml。

我自己挑来选去,最终决定用 cmake,不过选择的过程写下来,希望能对遇上同样问题的朋友有用。

说说 TextMate 的不开源

Rands In Repose 上有一篇 TextMate 主创者 Allan Odgaard 的 [Interview](http://www.randsinrepose.com/archives/2007/01/26/interview_allan_odgaard.html),提及了一个敏感的话题:TextMate 会开放源代码吗?Allan 的答复是,他最终还是决定开公司,不开源,他的观点是:

1. TextMate 已经是部分开放源代码的 (Bundle 部分)。
2. 他本人喜欢设定一个确定的目标,得到一个确定的结果的方式,如果采用开源软件的开发方式,他无法要求参与的开发者都按照他的意愿工作,所以他宁可开个公司。
3. 他还是担心开源了就赚不到钱。

虽然让人有点失望,但这也是正常的思路,你不可能指望所有的编辑器作者都像 Bram Moolenaar 那样去救助乌干达的可怜儿童,所以 InType 早在没有出 Alpha 之前就说他们是[肯定要卖钱](http://intype.info/faq/#faq-basic-3)的,而虽然早有人说靠 TextMate 40 欧元每份的价格,Allan 早已赚得盆满钵满,但还是舍不得开源。

作为一个购买了 TextMate 的用户,我关心的是什么呢?

1. 我提的问题是不是有人回复
2. 如果没有人回复,我能不能自己去改进它

我最热爱开源软件的地方正是第二点,我可以完完全全地按照自己的意愿去改进它,如果我的改进能被主干接受当然更好,如果不接受也没关系。就拿 TextMate 为例,我被它处理正则表达式的问题困扰,但因为 Allan 去旅行了两个半月,没有人能回答我的问题,结果我只能坐着等 (事实上,Allan 今天刚刚从旅行回来,我甚至根本不知道我两个月前提的问题他会不会看,一想到这一点我就抓狂),如果困扰我的是 Smultron, Vim, 这样的问题早就解决了。

如果开公司,是可以保证比较稳定的客户服务,但无形中失去了很多程序员的业余贡献,比如我的主业是 Linux 内核驱动的开发,如果 TextMate 开源,我倒是乐于贡献,但要让我去做一辈子编辑器,恐怕就不会原意了。

当然,开源也有很多弊端,软件项目管理本来就是一件很难两全的事情。

CSS: The Definitive Guide, 3e 和“犀牛书”, 5e

将在 2 月份出版。([ebook](http://www.cnshare.org/index.php/2006/12/css-the-definitive-guide-3rd))估计是影印版本,希望最迟 3 月份能拿到。

除此之外,今年期待的书还有:

* 海因莱因的《异乡异客 (Stranger in a Strange Land)》,不知道什么时候出版,不过按照科幻世界的效率,应该不会太久。
* 乔治 R.R. 马丁的《冰与火之歌》第三卷《冰雨的风暴 (A Storm of Swords)》,月底出版。
* O’Reilly 在 4 月份出版的 Fonts & Encodings。
* 凤歌的《沧海》,已经在卓越上订了第一册。

今年已经看完和正在看的书有乔治 R.R. 马丁的《冰与火之歌》的一、二卷《权力的游戏》和《列王的纷争》,尼尔 盖曼的《美国众神 (American Gods)》。