Archive for 2010年5月

Git、P4merge 和 OS X

2010/05/27

Diff 是程序员最重要的工具之一。不过,除了在 mail 里发送 patch,我很难忍受传统 diff 的字符输出。在任何系统上开发软件,第一件重要的准备工作就是寻找趁手的 GUI diff 工具。GUI diff 工具的优势在于 side-by-side 的比较方式即能显示变化的部分,又不影响对每个版本的连续阅读。Linux 上比较好的是 KDE 的 kompare,也是我见到的第一种 GUI diff 工具。因为先入为主的看到 kompare 使用曲线来联系变化的对应关系,所以任何使用空行填充或者直线来显示对应关系的 GUI diff 工具对我来说也是比较勉强的 —— 可以暂时使用,但是仍然会不断寻找替代品。

平时工作用 Perforce 管理代码,它有个自带的 GUI diff 工具 P4merge。功能很强大(而且免费,虽然 Perforce 是商业软件,但是它的 client,包括 P4v 和 P4merge 都是免费的,而且 P4merge 可以完全脱离 Perforce server 独立使用),除了普通的比较两个文件(版本)之外还可以 3-way 比较(一般用来做人工的 branch merge,分别比较 branch fork 之前的原始版本,main branch 上的修改版本,和其它 branch 上的修改版本)。和 editor 不同的是,diff 工具操作的不仅仅是 check-out 的 version,而是 version repository 里的任意版本。所以 diff 工具要想和 version control 系统配合,简单的文件操作是不够的,一个成熟的 version control 系统必须在设计中考虑如何与外部的 diff 工具协作。

从上周开始用 Git 管理 Dict Mac 的 code base。用到昨天终于感到缺省的『 git diff 』不好用(类似『 diff -u 』的输出)。简单的 Google 一下就找到了答案:

git difftool …

原本以为只有在 Linux 上才会有缺省配置好的 GUI diff 工具和 Git 协作。在 Mac 上试过发现 OS X 上已经配置好了 opendiff 可以让 Git 直接使用。OS X 的 out-of-box 用户体验确实不是只用来蒙初学者的。连 developer 的工具也能准备齐全。但我还是最习惯 P4merge。于是试着配置:

git config –global diff.tool p4merge
git config –global \
difftool.p4merge.cmd /Applications/p4merge.app/Contents/MacOS/p4merge

然后运行『 git difftool 』,P4merge 是调用起来了,但是没有内容。原来 Git 缺省不会向 diff 工具传递参数,必须写到命令行配置里:

git config –global \
“difftool.p4merge.cmd \
/Applications/p4merge.app/Contents/MacOS/p4merge \”\$LOCAL\” \”\$REMOTE\””

这里还有一个陷阱,在某些 shell 里,『 $ 』是不用加转义的。不过在 OS X 的 bash 里必须加。

P4mergeOnGit.png

Dict Mac 到 Mac OS X 10.5

2010/05/25

把 Dict Mac 介绍给同事们之后遇到最多的回应是『怎么是 10.6 only 的?』我喜欢用最新的东西,加上在家里测试 10.5 也并不方便,所以开发的时候没多想就选了 10.6 SDK。没想到连公司同事这些 Mac 的重量级用户还有不少没升级到 10.6,于是今天中午花了一个小时把最低平台需求降到了 10.5。其间遇到了几个小问题。

第一是 NSApplication 的 delegate 在 10.5 之下没有类型,在 10.6 下则正式定义为 NSApplicationDelegate 接口。不过真正起作用的 selector 都没有变化。把 delegate 的基类从 NSObject <NSApplicationDelegate> 变成 NSObject 之后就解决了问题。第二个问题是 NSTextView 的背景色设置成 [NSColor clearColor] 在 10.6 下工作的很好,到了 10.5 下就变成了黑色,变成 [NSColor windowBackgroundColor] 才行。虽然效果相同,但是从正常思路来说我是希望让控件的背景透明,而不是让它『碰巧』和窗口同色,而且遇到那些背景色可以在运行的时候定制的窗口,非透明的控件还要多写代码来同步颜色。

上面两个问题解决之后,Dict Mac 就可以正常的用 10.5 SDK 编译了,在 OS X 10.6.2 上运行也一切正常。之后遇到的问题最离奇,程序在 OS X 10.5 上启动后就会崩溃,crash log 报告 selector [DictWindow awakeFromNib] 不存在。Google 之后发现遇到类似问题的人不少,唯一找到的 workaround 是把 [DictWindow awakeFromNib] 里的 [super awakeFromNib] 去掉(完全莫名其妙的改法,这是一个人记得刚刚升级到 Xcode 3.2 的时候并没有这个问题,然后从自己的 version control 找到当时的代码才得到的解决方案)。

降级 SDK 总会遇到一些小麻烦。也能从中看到 SDK 的每次升级都确实给开发工作减轻了不少负担,唯一遗憾的是用户们升级得没有那么快,新 SDK 的推出带来的好处要过上一段不短的时间才能让开发者受益。

Dict Mac 发布

2010/05/22

很多天没有更新 Blog 了,其间也有曾经想写些话题,不过大部分时间还是用来动手做被一件很久之前就想做的事情 —— 自己写个小工具。第一个完成的工具是我每天都离不开的 dict.cn 的客户端 Dict Mac。目前刚刚放到网上的只是 0.01 版。功能还不是很多。不过我自己已经完全切换到 Dict Mac 而不再打开 dict.cn 了。

从开发的角度说,这次也是我学习 Cocoa 的第一个实践项目。Cocoa 的 Interface Builder,以及控件对 URL 和 RTF 格式的处理都很好用。

支持 iPhone/iPod touch

2010/05/07

前两天把 WordPress 的 WP-touch 插件配好了( sipoint.wordpress.com 本来就支持这个插件,这次配置的是 techsingular.net )。这样有 iPhone/iPod touch 的朋友阅读就方便多了。

镜面屏的原理

2010/05/04

如今几乎所有用过笔记本电脑的人都能说出镜面屏的缺点和优点。缺点是反光,如果你的座位正后面有一盏灯,那么使用镜面屏是很痛苦的。优点是色彩艳丽。在顺理成章的接受这个优点的时候,很少有人想到色彩艳丽的根源。前些天看到有人在网上问这个问题,我突然想到原来镜面屏的优点就来自它的缺点。

非镜面屏能很好地应对使用者后方的光源,原因在于把光源发出的光通过漫反射平均的分散到各个方向。反过来说,如果你的侧后方有一个光源,那么非镜面屏就会把这个光源的一部分光反射到你的眼中,不管你如何调整角度,只要这个光源还在你的后方,反射到你眼中的光量都不会变化。这就是漫反射的特点。而镜面反射遵循入射角等于反射角的反射定律,所以镜面屏会把正后方光源的光线几乎 100% 的反射到使用者眼中。但是只要稍稍调整角度,让光源处于侧后方,光源的光线就几乎不会通过屏幕进入使用者眼中。所以镜面屏是通过牺牲对正后方环境的容忍度,降低了整个环境对显示效果的干扰。而非镜面屏以牺牲抗环境干扰的整体能力换取对正后方环境的容忍。