Monthly Archives: August 2008

在 JavaScript 中使用 CPS 完成网站遍历

海维发到邮件列表的第一封邮件是非常值得仔细一读的,在那里我们可以看到 Lisp 程序员是如何思考的,特别地,如何通过显式调度栈的方式来串行化异步执行流。 昨晚我经过认真的思考之后,惊喜地发现,我们可以把海维的 continuation 用法进一步抽象到一种著名而且又很时髦的编程模式:Continuation Passing Style:    http://en.wikipedia.org/wiki/Continuation-passing_style 在海维的抽取案例中,我们遇到的主要问题是,timeout handler 的串行链条很长,而且更有趣的是,这条链接本身是动态构造出来的。如果保证这条链条不因中间某个环节出错而中断,如果很优雅地把这条执行链构造出来,乃是这里问题的核心。我们首先需要遍历省份列表,然后是市级行政区列表,县级行政区列表,最后是中学列表。如果用 EBNF 记法来表示的话,是下面这个样子:    top: province*    province: city*    city: district*    district: school* 这里 * 表示 0 次或多次重复。当我们出发时,位于 top 符号的位置上,然后我们经过必要的初始化操作,抓出所有的省份列表。对于每一个省份,我们进入到 province 符号,点击那个省的链接,过一段延时后再抓出 city 列表,再依次地处理 city,依此类推。这里使用正统的面向过程的编程方法的一大困难是,执行流本身不是顺序的,在每一步点击链接后,需要用 setTimeout … Continue reading

Posted in Uncategorized | Leave a comment

GHC 6.8.3 binary for older linux

I ran into the following error while trying to run a binary generated by GHC 6.8.x on our production machines with a not-so-recent linux installed (kernel 2.6.9).   $ ./restyscript   restyscript: timer_create: Invalid argument Evan building a pure static-linking … Continue reading

Posted in Uncategorized | Leave a comment

找出数据表中的“id空洞”

数据库中的 id 有时会产生大量空洞,有时是因为分批导入数据时漏了边界上的一些记录,有时则是因为数据有频繁的删除操作,浪费了大量在 id 对应的 sequence 空间。这时就需要找出 id 序列中的空洞,即记录 id 不连续的地方。 一般地,找出"空洞"区间的左边界列表可以使用类似下面的 SQL 语句:    select id from store where (id + 1) not in (select id from store); 基本原理是,枚举所有使用过的 id,然后测试 id + 1 是否被使用过。由此找到的 id 便是左边界。值得一提的是,这样的下边界本身对应的 id 是不包含在"空洞"中的。 类似地,洞的右边界可以使用下面的 … Continue reading

Posted in Uncategorized | Leave a comment

Filter::QuasiQuote 0.01 is now on CPAN

After reading Audrey’s blog post mentioning GHC’s upcoming quasiquoting feature (as well as that quasiquoting paper), I quickly hacked up a (simple) quasiquoting mechanism for Perl, hence the Filter::QuasiQuote module already on CPAN: http://search.cpan.org/perldoc?Filter::QuasiQuote I’m looking forward to using sensible … Continue reading

Posted in Uncategorized | Leave a comment