Archive for September, 2007

Feeling lucky with Firefox

Thursday, September 6th, 2007

最近越来越多地发现经常要去一些项目的主页,这么多的主页当然记不住,然而书签也是越来越多,定位也就麻烦了。多是直接 Ctrl+K 定位到搜索栏,然后用 Google 搜索,再点第一个链接。唉,其实要是用 I’m feeling lucky 就方便多了。

我知道 Firefox 的搜索引擎是可以自己定制的,于是边去网上搜索相关的资料,无意间发现了 Firefox 的 keyword 搜索功能:就是直接在地址栏输入关键字进行搜索。它的优势在哪里呢?请看下表:

keyword 搜索 搜索栏搜索
定制搜索引擎 简单,只需要添加书签即可 比较麻烦,虽然有专门的扩展来辅助
便利程度 Ctrl+L 然后输入 lk Firefox Ctrl+K 然后输入 Firefox 并使用 Ctrl+Arrow_down 来定位到 “I’m feeling lucky” 的那个搜索引擎。按 Ctrl+Arrow_down 来一个一个地找显然不如直接输入 lk 来得方便。

总的来说,我还是更喜欢 keyword search ,当然还有一个原因就是我以前在使用 Konqueror 的时候就很喜欢它的那个功能,只是一直不知道 Firefox 原来也可以这样用的。

添加 keyword 搜索的过程非常简单,任意到一个搜索引擎,输入一个方便辨认的关键字,比如 foobar ,然后点击搜索。在搜索结果页面按 Ctrl+D 存为书签,在弹出的对话框里的 “Location” 一栏里,把刚才输入的关键字 foobar 替换为 %s ,并在 “Keyword” 一栏输入想要的关键字,例如 s ,保存。然后就可以直接在地址栏输入 “s something” 来使用刚才的搜索引擎进行搜索了。下面是来自 Youtube 的一个视频教程:

这个链接保存为一个书签,并指定关键字为 lk 的书签,就可以直接在地址栏输入 “lk Firefox” 使用 Google 的 I’m feeling lucky 功能直接到达 Firefox 的主页了。

最后献上几个小 Tip :

  • 当你在各个搜索引擎的输入框里点击右键时,会看到 Firefox 的弹出菜单里有一项 “Add a keyword for this Search…” ,想知道这是干什么的吗?赶快自己去试一试吧! ;)
  • Ctrl+L 之后发现想保留当前页面,怎么办呢?有办法!使用 Alt+Enter 在新标签中打开。
  • 是不是很喜欢 Safari 那个简洁的风格?有了 keyword 搜索,还不赶紧把自带的搜索栏去掉?再装一个 Compact Menu 2 扩展,把菜单栏也隐藏起来。就可以以假乱真啦!

Workflows of SCM

Thursday, September 6th, 2007

版本控制的概念从最初的手工加版本号(比如,为旧的文件加上 .orig 后缀)以及 RCS 开始,主要体现于各自本地进行版本控制。到后来 CVS 模式流行起来,出现了中央仓库的概念。而今天大行其道的分布式版本控制系统,似乎又把主角带回了各自的本地主机那里。然而于以往各自独立的主机不一样,作为各个分布式节点的主机,在相互独立的同时,又互相有紧密的联系,甚至会出现一个特别重要的节点,充当一个“伪中央仓库”的角色。

我在 Git and Subversion 这篇 Blog 里面曾经比较过 Git 和 Subversion 各自的优缺点。这里我列举一下现在存在的几个流行的版本控制的工作模式(资料来源于 bazaar 的文档,也就是说 bazaar 同时支持一下的所有工作方式)。

中央仓库模式

这就是 CVS 和 Subversion 所使用的模式。有一个单一的中央仓库,所有人从同一个仓库取出代码,并把自己的代码提交到那里。

中央仓库 + 本地提交

正如我在 Git and Subversion 中提到过的那样,中央仓库模式的一个缺点就是你的提交会影响到别人的工作,如果你提交了一些不能工作的代码,你的同伴也许会很恼火。但是有时候一些复杂的工作不能一次完成,在 CVS 或者 Subversion 里面常见的解决办法是新开一个 branch ,在那里进行你的工作,完成之后再 merge 回来。不过这样的办法对于小模块来说确实太复杂了,相比起来,本地提交是一种更轻量级的解决方案(可惜 CVS 和 Subversion 都不支持本地提交)。

分布式仓库 + 主仓库

这有些类似于前一种模式,只是侧重点不一样。前一种模式中主要是直接提交到中央仓库,在特定的时候才使用本地提交;而这种模式则主要是在自己本地的仓库里进行开发,当一个模块功能完成以后才网主仓库里面 merge 。

分布式仓库 + gatekeeper

这种模式下各个开发人员没有直接提交到主仓库的权限,gatekeeper 负责追踪各个开发人员(或者模块,甚至是下一级的比较小的一个 gatekeeper)的状态,并在合适的时候主动从他们那里 pull 。gatekeeper 可以自己充当主仓库的角色,或者另外有一个只有 gatekeeper 才能提交的主仓库,gatekeeper 在把 pull 过来的代码 review 并通过测试以后再加入到主仓库中。Linux 内核就是采用的这种方式,内核的各个子系统在完成一个开发阶段之后,便会通知 Linus ,他的代码仓库充当内核的主仓库(事实上,这并不是通过什么机制来强制规定的,从本质上来看,他的仓库和其他开发人员的仓库是同等地位的,只是人们都信任他,把他的仓库当做 Linux Kernel 的“官方仓库”而已),他将 pull 过来的代码 review 之后 merge 到自己的仓库之中。

这么多种管理模式?哪种适合你的项目呢?如果你所在的项目正在使用一种错误的让你感到相当痛苦的管理模式,那么不妨试试说服你的 Manager 让他变通一下。

Do write portable code

Tuesday, September 4th, 2007

最近遇到两个 bug ,都是因为代码写得不具有可移植性而造成的。Javascript 本身就由于浏览器的差异有许多需要注意的地方,写代码的时候一定要万分小心,多多测试。

数组常量值末尾多余的逗号

Javascript 里面用类似 [1,2,3] 的方法来初始化数组是众所周知的。但是有一个地方却比较容易犯错误。特别是对于熟悉 C 语言的人来说,C 语言里面明确说明,以下这种情况里面,多余的逗号是可以接受的:

int array[] = {1,2,};

然而作为一个弱类型的语言,语法相对会比较随意的 javascript ,在这里却有一个陷井。事实上,标准可以允许中间或着头部的位置出现多余的逗号,这样会把多余的 undefined 的对象加入到数组中。不过末尾的逗号却会因为浏览器的不同而产生不同的结果。例如

var arr = [1,2,3,];
alert(arr.length);

在 IE6 下会得到 4 ,而在 Firefox 2 下得到的是 3 。且不论谁对谁错,但这已经是不得不去面对的事实了。这次我就遇到了这个问题,事实上,我是在 rails 的 ERB 模板里面生成一个 javascript 的数组常量。大概像这个样子:

var data = [
    <% for entry in @entries -%>
        <%= format_entry entry %>,
    <% end -%>
    ];

这样产生了末尾多余的逗号,导致了在 Firefox 和 IE 下产生了不同的结果。最后对最后一个元素特殊对待才解决了问题:

var data = [
    <% for entry in @entries[0..-2] -%>
        <%= format_entry entry %>,
    <% end -%>
    <%= format_entry @entries[-1] %>
    ];

时间的格式

我要在 javascript 里面通过字符串解析出时间来。在 Ruby 里面的 Time 类有一个方便的 to_s 方法可以直接把时间转化为字符串,它得到的格式是这样的 Tue Sep 04 13:48:25 +0800 2007 。我便直接使用了这个格式,一直都是好好的,后来拿到 IE 下面去跑的时候,根本跑不出结果来。调试了很久才发现 IE 下面没有能把那个时间解析出来,IE 不认那个 “+0800″ 。最后我用 strftime 格式化成了一种通用的格式把这个问题解决了。