最近因为开发内核程序的原因,需要找一个很小的发行版,放在 qemu 虚拟机里测试。
找了找,发现 [Core GNU/Linux](http://www.coredistro.org/) 很不错,光盘启动安装,把硬盘挂载上,分区,执行安装脚本,chroot,装上 grub 就搞定了,总共也只用 200M 左右的空间,主要软件都是 bleeding-edge 的,很方便。
Random notes & thoughts.
最近因为开发内核程序的原因,需要找一个很小的发行版,放在 qemu 虚拟机里测试。
找了找,发现 [Core GNU/Linux](http://www.coredistro.org/) 很不错,光盘启动安装,把硬盘挂载上,分区,执行安装脚本,chroot,装上 grub 就搞定了,总共也只用 200M 左右的空间,主要软件都是 bleeding-edge 的,很方便。
网志改名,其实也早该修改了,这个 web log 的内容将不再以 web 标准的宣传为主题,事实上,很早就不是了。
之所以今天来改,是因为以前只是觉得厌倦,但现在发生的 XHTML 到 HTML 5 这件事情让我对“web 标准”的宣传感到恶心了,我不能理解为什么那些所谓的“专家”,上一分钟还在向人推销 XHTML 是多么的好,下一分钟就翻脸不认大唱 HTML 5 的赞歌。脸皮之厚,堪称神奇。
既然如此,我也懒得帮他们一起圆下一个谎,反正是浏览器厂商你方唱罢我登场,慢慢唱吧,我写我的程序去。
这个 blog 的长期读者也许读过我翻译的 [The Scourge of Arial](http://blog.jjgod.org/2004/10/06/arial-ooo/) 一文,其中介绍了 Helvetica 的由来。而今年年初,看到 [Helvetica: The Film](http://www.helveticafilm.com/) 的公开,忍不住将它称做“[年度最期待纪录片](http://www3.newsmth.org/bbscon.php?bid=460&id=250597)”。
目前它已经在[欧美各处](http://www.helveticafilm.com/screenings.html)公映,却没有看到在中国的任何一处上映的计划,如果你能提供帮助:
If you work with a film festival, museum, cinema, or arts group and would like to organize a screening, please contact us via email: helvetica (at) swissdots.com
因为,[我们想看 Helvetica](http://hlb.yichi.org/blog/2007/05/02/162),[我们不能错过它](http://lukhnos.org/blog/zh/archives/494)。
NetNewsWire 的作者 Brent Simmons 最近的一篇文章介绍了[如何有效的管理大型 Cocoa 项目](http://inessential.com/2007/04/25.php)。他的建议可以总结为下面几条:
为了改善代码的可读,可查找性,应该遵循:
1. 只对那些没有明显关系的对象之间的交互使用 Notification。
2. Key-Value Observing 也是很危险的,应该只对 Preferences 项目使用这一特性。
3. 只将 Binding 用于很简单的情形,复杂的 TableView 还是用 datasource/delegate 比较好。
管理代码时可以使用的技巧:
1. 用 `#pragma mark` 来划分代码的区域
2. 用 Ctrl-2 来列出当前打开文件的符号 outline。
3. 用 Shift-cmd-D 来快速打开指定文件。
4. 用 opt-cmd-T 来将当前打开的文件和左侧的目录树同步。
5. ctrl+double click 打开符号的定义,opt+double click 打开符号的文档。
6. 在文件系统中用平面方式组织文件,不划分多层目录,在 Xcode project 中用 group 来划分层级结构。
对于有 Cocoa 开发经验的人,尤其是管理过这种超过 200 个源文件的较大项目的人来说,这些经验是很有用的。
这里介绍在 Mac OS X 中如何用 mac, shntool 和 lame 来完成 ape – mp3 的工作,只需要一个命令就可以完成。
mac 用我以前贴的那个。
shntool 可以 `sudo port install shntool`,但它的来源网站似乎被 GFW 了,你可以自行下载编译:
$ wget http://www.vi.kernel.org/pub/mirrors/gentoo/source/distfiles/shntool-3.0.2.tar.gz
$ tar zxf shntool-3.0.2.tar.gz
$ cd shntool-3.0.2; ./configure; make; sudo make install
lame 可以用 macports 上的:
`$ sudo port install lame`
然后这样处理 APE:
`$ shntool split -f CDImage.cue -t ‘%p – %t’ -o ‘cust ext=mp3 lame –quiet – %f’ CDImage.ape`
其中 -t ‘%p – %t’ 是指定生成文件的标题,%p 表示 Performer,%t 表示 Title,都是从 cue 中读出的。’cust ext=mp3 lame –quiet – %f’ 表示输出文件用 lame 处理,默认参数,你当然可以在这里调整 lame 的参数。
举例如下:
$ shntool split -f CDImage.cue -t "%p - %t" -o 'cust ext=mp3 lame --quiet - %f' CDImage.ape
shntool [split]: warning: discarding initial zero-valued split point
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Summer.mp3] (6:25.32) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Going Out.mp3] (1:17.35) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Mad Summer.mp3] (2:55.13) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Night Mare.mp3] (1:50.52) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Kindness.mp3] (1:58.23) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - The Rain.mp3] (5:38.70) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Real Eyes.mp3] (3:16.52) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Angel Bell.mp3] (3:13.20) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Two Hearts.mp3] (2:01.33) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Mother.mp3] (2:13.57) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - River Side.mp3] (6:14.40) : 100% OK
Splitting [CDImage.ape] (40:14.15) --> [Joe Hisaishi - Summer Road.mp3] (3:08.38) : 100% OK
-f 参数指定读取切割点的文件,如果不指定则从标准输入读取,所以,如果 cue 文件是 GBK 编码的,我们可以:
`$ iconv -f gbk -t utf-8 CDImage.cue | shntool split -t “%p – %t” -o ‘cust ext=mp3 lame –quiet – %f’ CDImage.ape`
就完成了 GBK 到 UTF-8 的转码。速度还是挺快的,估计它用 pipe 来把 mac 的输出送给 lame,因此这两个进程可以并行跑,CPU 能跑到 120% 的样子。
这个办法的好处是非常简单,不需要另外写程序,唯一的缺点是只能依靠 cue 的信息,也没有自动加上 MP3 的 ID3 Tag,不太方便直接导入 iTunes 中,不过我们可以写个后期处理的程序 (比如利用 cue 给出的一些信息,或者用 shntool 输出的 WAVE 信息,调用 freedb/cddb 的服务,或者根据 mp3 来调用 MusicBrainz 的服务) 给它加上 tag。