To all my friends

昨天下午,奥斯陆市中心发生了大型爆炸事件,我经常经过的一条路两侧一片狼藉;随后在 Utøya 的青年夏令营发生了持枪屠杀事件。已有 87 人遇难。

我与家人目前都还安好,也在积极关注事态的发展,谢谢各位的关心。

可以想见的是,无论这两件史无前例的事件最终调查结果如何,都必然会对挪威造成非常深远的影响。作为旅居的华人,我也会在 blog 和 twitter 上继续介绍我了解到的情况。

2010 年终总结

今年是我的生活变化较大的一年:结束了三年的研究生学业,离开长待了六年之久的北京,到奥斯陆开始我的第一份工作。所以数起来从头到尾都过得很充实:一二月份是面试、确定工作,三四月份忙学位论文,五六月忙答辩和毕业的琐事,七月份搬家、开始工作,八月到十一月都在适应新的环境,学习新的体育运动 (骑车、攀岩、滑雪等),十二月底则花了一周去西班牙旅行。感觉这一年过得飞快,但偶尔又觉得很漫长。下面还是按照去年的格式,对今年作一简要小结。

总的说来,今年写 blog 少了,写 twitter 多了;花在游戏上的时间少了,出门运动的时间多了;浏览网页泡论坛 BBS 的时间少了,看书的时间多了;做自己个人项目的时间少了,花在工作上的时间多了;这些趋势并不所有都是好的,但至少多读书、多运动,有时间多走走看,正是我对明年的期望。

Mac OS X 下与 SSD 相关的优化

最近刚入手一块 Intel X25-M G2 80G SSD,使用效果不错,于是整理了下面这些跟 SSD 有关的优化经验:

安装

因为 SSD 比较小,而有些数据又不是那么需要快速的访问,所以我保留了 MacBook Pro 里自带的 320G 7200 RPM 硬盘,做了如下改动:

  1. 买了一个光驱位硬盘托架,最有名,也是最贵的一种要 $99,但山寨版可以在淘宝找到,对于 Unibody 的机器来说,找 9.5mm 高的那种型号就行,比如 Fenvi 的,建议买 100 以内的。

  2. 把 MBP 拆开,SuperDrive 取下,把原来的硬盘取出,放入光驱位硬盘托架,把 SSD 接在原来的硬盘所接的 SATA 口,然后把硬盘托架安装回原来光驱的位置。这种搭配是为了保证用 SSD 做系统盘 (挂载在 / 上) 时系统能正确的让硬盘休眠。当然,如果你比较奢侈地买两块 SSD,也可以让他们组成 RAID0,这样性能就更夸张了。

  3. 给在 SSD 所在卷分区,只需要分一个区,安装系统。新的系统会把原来那块硬盘也列出来。这时修改 /etc/fstab,加入:

    /dev/disk1s2 /Users/jjgod/Downloads hfs rw
    

    这个做法是把原来那块硬盘挂载在我自己这个用户的 Downloads 目录,这样所有下载的内容都会放在这块比较大的硬盘上 (当然有用的我以后会转移到 SSD 上),考虑到 Downloads 主要起的就是一个临时的缓冲作用,这样还是比较方便的。然后重启机器,就能发现这块硬盘只被挂载在上述目录下了。

  4. 除了下载内容,我还在这个目录放以下内容:

    • VMware Fusion 的虚拟机文件,这是从别的机器复制过来的,直接放在这个卷的 /Virtual Machines 目录下,然后在 VMware Fusion 里打开就行了。需要注意的是以后 VMware 里创建新虚拟机的时候也得记住选择目录,别放在自己的 $HOME/Documents 下面了。

    • iTunes 媒体库,这个可以在 iTunes 的 Preferences -> Advanced -> iTunes Media folder location 选择。我是先在这里选好了,然后从原来的机器里导入以前的 iTunes 数据。

    • 其他下载软件的默认下载位置,包括 uTorrent, Transmission 和 aMule。

    • Steam 的游戏目录,这个可以通过创建符号链接到 $HOME/Documents/Steam Content 实现。

优化

上述安装过程后,系统已经能保证数据各自放在比较合适的地方了,参考 Mac OS X SSD Tweaks 这篇文章的介绍,我们还可以做如下优化:

  1. noatime 方式挂载系统盘,这样可以减少不必要的 I/O 次数,虽然 SSD 做这些操作非常快速,但考虑到最后访问时间这个属性其实很少用到,大家关心的一般都是最后修改时间和创建时间,所以完全可以关闭这个属性,这在 Unix/Linux 下是非常常见的文件系统优化选项。一个简单的方法是,修改 /etc/fstab,加入:

    /dev/disk0s2 / hfs rw,noatime
    

    重启后,系统盘的挂载就带上 noatime 选项了:

    $ mount | grep " / "
    /dev/disk0s2 on / (hfs, local, journaled, noatime)
    
  2. 禁用冬眠 (hibernate) 模式以节省空间。在 Mac 耗尽电池时,会进入“冬眠”模式,将内存中的所有内容写入磁盘,下次唤醒后从这些内容恢复状态。所以系统会在 /var/vm 维护一个和内存等大的 sleepimage 文件,考虑到 SSD 空间宝贵,而一般绝少会遇到耗尽电池的情况,可以禁用掉这个功能以节省空间:

    $ sudo pmset -a hibernatemode 0
    $ sudo rm /var/vm/sleepimage
    
  3. 减少临时文件的读写。

    • RAMDisk 是常见的性能优化手段,对于内存充足的机器,把频繁读写的内容放到一个用内存为存储的虚拟磁盘中,能大大加快速度。虽然 Macintosh Performance Guide 最近的一个研究表明 RAMDisk 并不能很大地提升如 Photoshop 这类软件操作的性能,至少投入产出比不是很经济,但至少用它来保存一些本来就可以随意丢弃的数据是个很好的思路。Mac OS X SSD Tweaks 提供了创建 RAMDisk 的脚本,他的做法是在系统启动时创建一个 256M 的 RAMDisk,挂载在 /private/tmp 上面。他还建议把 ~/Library/Caches 也放到 RAMDisk 里。最大的问题是,如果你长期不重启 (我一般的重启周期是 80 ~ 100 天),那有的临时文件,比如 ~/Library/Caches/com.apple.Safari/Webpage Previews/ 会增长到数百 M 甚至上 G。如果被它占满了 RAMDisk 的空间,那其他缓存数据就写不进去了。

    • 考虑到 RAMDisk 是个比较有风险的优化手段,也可以用以下方法禁用掉 Safari 的 Webpage Previews 以减少临时文件读写。如果你像我一样从来不用 Safari 的“Top Sites”功能,一定会很讨厌它凭空占用大量的空间。

      $ defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2
      
    • 关闭 Spotlight 索引也是一个有用的优化手段,如果你像我这样从来不用 Spotlight 的话。

结语

  • Macintosh Performance Guide 还提供了一些更奢侈的优化手段,这里不一一介绍了,因为我自己也没试过,有兴趣可以自己尝试。值得尝试的是它提供的 DiskTester 工具有一个 recondition 功能,通过大量写空白块来优化长时间使用后的 SSD 性能。

  • “安装”部分感谢草莓数码的 iBook 和 MacBook 的帮助。

  • “优化”部分大部分思路来自 Mac OS X SSD Tweaks

XHTML is dead, Long Live XHTML

The most important line from the XHTML FAQ published this week:

Regarding the XML serialization of HTML, the HTML 5 specification includes a section on XML serialization, as well as a section on text/html serialization. W3C plans to continue work on both serializations in the HTML Working Group. Thus, we expect the next generation XML serialization of HTML to be defined in the HTML 5 specification.

Just like Spock said: “The needs of the many outweigh the needs of the few…” I think that’s the best ending for XHTML, and it will continue to survive as a serialization form of HTML.