每年的最后一个月,一直到圣诞节前的 24 天,就会有大牛出来写点文章,一天一篇,叫做 Advent。最早是 perl 社区的 advent,后来 Catalyst 社区也来玩 advent。今年最热闹,下面列出几个我知道的:
Published on December 3, 2009 8:58 am.
Filed under: 开发 Tags: advent, catalyst, miyagawa, perl, perlchina, plack, psgi, rjbs
有机会去 Google 上海公司参加 GAE Camp 活动。本来没打算作演讲的,碰巧 vpnc 能连上,加上精美 T 恤诱惑,于是结合正在修改的内部工具 wax 的实现,讲了一把 Catalyst。照片还是在 picasa,点这里。活动相关的邮件列表。
Published on November 22, 2008 9:26 pm.
Filed under: 流水帐 Tags: catalyst, gae, google, picasa, vpn
原来的服务器硬件故障,拆了硬盘换到另一台测试机器上,竟然不认网卡,再挂到 FreeBSD 机器上,一写数据就断开了原先 mount 上的分区,好不容易 fsck 之后导出了 svn 仓库的数据,又发现若干文件有损坏,在另一台 FreeBSD 机器上配置 WordPress 又碰到 php5-mysql 编译出错,郁闷死了。 决定不能在 svn 一棵树上吊死。决定不用 WordPress 苟且偷生。 昨天花了点时间研习了下 git。没完全搞明白,不过暂时已经能用起来了。今天花了半天时间,把原来的 blog 里面的数据导出来,重新用 Catalyst 作了一个站,这就跑起来了。 出于格式自由的缘故,写了这个目前不算是 blog 的站点。我想适时的时候用 pod 或者 Textile 或者 wiki 格式写,同时不想让所见即所得的编辑器给我横加减些东西。出于对服务器要求自由的缘故,不使用数据库,直接将文章以文件的形式保存。这样另外有个好处,就 是我可以用 git 来维护这些文章,不必担心单点故障。也可以非常方便地发布成静态页面的站点,就像 MT 那样。 好了,回家休息。
Published on March 11, 2008 7:31 am.
Filed under: 东拉西扯 Tags: blog, bsd, catalyst, git, mt, pod, svn, textile, wiki, wordpress
本来在 Catalyst 的原生 web 服务下跑得很好的,在 Ubuntu 上装了 apache2 和 modperl2 之后,虽然能起来,但刚登录就出错,看日志发现:
[error] Caught exception in engine "Can't store CODE items at ../../lib/Storable.pm (autosplit into ../../lib/auto/Storable/_freeze.al) line 290, at /usr/local/share/perl/5.8.8/Object/Signature.pm line 19"
查了下 Google 未果。今早一问 Fayland,一语中的:
$ cpan install Tie::RefHash
升级一下搞定。很困惑为什么 Catalyst::Engine::Apache 的文档中不提一下呢,搞得我昨天很郁闷,一直到睡觉前。
Published on May 17, 2007 9:37 am.
Filed under: 东拉西扯 Tags: catalyst, cpan, fayland, modperl
为了提取垃圾邮件中的中文字串,并自动转化为正则表达式需要的形式,我写了一个 Web 应用程序。只要鼠标选中字串,然后按下某个键,即可通过 Ajax 提交到后端转化和测试。自然我用的是 Catalyst 和 prototype.js。
原本我设定的是 Insert 键关联提交操作。而现在,我需要在提交的同时指定被选字串的类型,比如说邮件地址用 e 键,或者手机号码用 m 键,等等。这在当时开发的时候就发现, FireFox 下, prototype.js 只能返回功能键的 KeyCode,如果是字母,则一律是 0。我自然是不愿意因此屈就去用 IE 的,更何况我现在 Ubuntu 下面也没有 IE。而我有不想用 Mochikit,虽然实验过它没问题。我怀疑是 prototype.js 的问题,不过本着 Agile 开发的精神,没有深究下去。
这次,我决定解决这个问题。当然还是看了番源代码,做了些测试,未果。于是 Google,仔细找了下,发现枫岩的这篇文章,点醒我梦中人。简单的说,在 FireFox 中,KeyCode 返回 0 就用 charCode。于是我猜想 Mochikit 也是这样实现的:在 Signal.js 里第 135 行起定义的 key 函数非但给出了健壮的封装,还有一堆注解。
Published on March 12, 2007 2:39 pm.
Filed under: 东拉西扯 Tags: ajax, catalyst, charcode, firefox, javascript, keycode, mochikit, prototype, xp
2005 年的版本,到了 2006 年出现了一个 Bug,会不断循环请求。于是就停了。及至后来官方站点修复了 Bug 之后,我都没有及时同步更新。这次整理,花了点时间,查原来更新到的 rev,然后看官方的 svn 的 changeset,逐个同步,现在已经完成,并且重新部署上线。竟然发现当时的 Day 24 还没有翻译。
http://catalyst.perlchina.org
现在默认还是转到 2005 年的 Advent,不过邮件组里面已经开始有人组织制作今年的 Advent, 从 12 月 1 日起到 25 日。计划这次依然同步更新中文站点。
Published on November 27, 2006 10:38 am.
Filed under: 东拉西扯 Tags: catalyst, perlchina, svn
正好项目中要定期运行一些计算工作,这才拿起 Catalyst::Plugin::Scheduler 的文档过了一遍。看起来很美妙,几乎和操作系统的 crontab 差不多了,于是立马上手测试。于是奇怪的问题来了,似乎设定的 schedule 事件并不是如期运行的,有时候就是不 run 有时候却意外的 run 了,查看最后运行时间也都不是设定的整点时间。于是怀疑时区设置,怀疑虚拟机的时钟,怀疑 yaml 的配置,怀疑模块本身有问题,总之试了很久都不行。那就改用 trigger 方式吧,那样还是需要用到操作系统的 crontab,而且似乎并没有运行设定的计划任务,返回用户登入界面了。
今天不甘,重新拿起来,发誓要克服掉。看源代码,总算静下心来看,才慢慢意识到,event 的执行是在每次 web 请求到来的时候被 dispatch 到的。这个时候这个 Plugin 才检查所有的计划任务,对照时间和授权,分别启动和执行。怪不得。然后重新阅读了文档,侧那,说得很明了,就是这么回事情,根本不是说你设定了 ‘* * * * *’ 就是每分钟准点触发运行的,作者假设你的应用系统基本上一直有请求到来,利用这个脉冲信号来触发计划任务的判断和执行。我原以为它是后台起了一个进程专门循环,每分钟看一下状态,然后触发的。所以这个定时的 schedule 看起来非常大兴,特别是像我现在的访问不均衡的应用。况且若干个 cron 之间的计算还有依赖关系,如果通过请求来触发的话,那就乱套了。然后还是回到 trigger 方式,文档中的例子,说是随便给你的应用一个请求,加上 scheduler_triigger=trigger_name 即可,不用管别的,好么,恰好我的应用根路径是一个重定向到用户登入界面,然后 cron 没有执行。试了一下其他的 uri ,非常顺利,通过。
经过一番曲折,到头来还是需要 crontab 定时发送一个 wget -q http://…./cron?schedule_trigger=trigger_name 的请求。anyway,解决了能运行就行。毕竟 cron 起来的计划任务是要用到 Catalyst 内部的 Model 什么的来写就的,换为普通的脚本,不但麻烦累赘,而且破坏了原来的 oo 接口。
Published on August 3, 2006 12:14 pm.
Filed under: 东拉西扯 Tags: catalyst, crontab, wget
新装软件的时候,总会看看常用的东西有没有升级。
Foxmail 5 是我用了很多年的客户端邮件工具。不过我的信箱中垃圾邮件泛滥,头痛不已。重新安装系统的机会,想看看有些什么其它的选择。Outlook 我是不用的,虽然很强大,但不是我喜欢的风格。试了下 Eudora 用户体验不佳,当下就删除了。无奈之际,还是 Google 了一下 Foxmail 站点,意外的发现已经推出了版本 6。看了下新特性,觉得非常不错,立刻下载安装。大致用下来,啧啧赞叹。Foxmail 团队确实是花了不小心力下去的。虽说自我学习的反垃圾策略和算法并不神秘,但这次的新版本都纳入了这些特性。此外,展示邮件的布局也作了周到的考虑,有些地方借鉴了 MSN Live Mail 的风格,使用日子作为邮件的分组,极为了然。我喜欢三竖列的布局,如此最少的点击即可看到最多的内容。如果是垃圾邮件,点“并非垃圾邮件”即可加到白名单,用户体验可圈可点。这次的进步不小,我很喜欢 6 的这些改进。
有时候需要上 irc 询问代码上的一些问题,用惯了 mIRC,5年多前曾疯狂地在 IRC 混,irc 简直成了那段光阴的代名词。去年和 PerlChina 的朋友通过 irc 聊天,希望使用支持 utf8 编码的客户端,很遗憾 mIRC 不支持。当时询问 irc 专家 Lodd 兄,也无解决方案。而今 mIRC 6 已经支持了 utf8 不禁令我欣然。
这两个用了许多年,伴随着我许多记忆的老软件,仍然能不断长足进步,给我很大的鼓舞。Catalyst 到今天也已经 5.66 ,每一个版本的变化都凝结着开发者的智慧。世界在进步,我呢,也要不断进取。
Published on March 29, 2006 11:40 pm.
Filed under: 东拉西扯 Tags: catalyst, foxmail, mirc
Published on March 26, 2006 9:59 am.
Filed under: 东拉西扯 Tags: captcha, catalyst, gd, perl, plugin
用户认证,通常是用户提交密码原文,通过 HTTP 协议,发送到服务器。然后程序或者直接比对密码原文,或者按一定的不可逆算法编码后和系统中预存的密码比较。进一步,为了在传输层上能安全传递,通常会选择 https 协议加密传输,不过这需要服务器端的配置。
现在有另一种方法,在客户端对用户输入的密码加密,然后再发送到服务器。这个工作交给 JavaScript 来做,看这里:
http://pajhome.org.uk/crypt/md5/
提供了三种(MD4,MD5,SHA-1)三种加密算法的 js 实现。拿来用就是了,很简单。Yahoo! 在它的非 https 的相关登入页就使用了这些脚本。
好,回过头来看标题,新出来的一个 Catalyst 的用户认证后端,名字叫 CHAP 。那么什么是 CHAP 呢?Challenge Handshake Authentication Protocol ,hoho,我也是 Google 来的,明白了,是一种协议,而且是认证协议。这里有些关于具体实现的介绍。不过我还是关心如何在 Catalyst 里面使用,看文档:
http://search.cpan.org/~rdrousies/Catalyst-Plugin-Authentication-Credential-CHAP-0.01/lib/Catalyst/Plugin/Authentication/Credential/CHAP.pm
大致上,由该模块负责生成所谓 Challenge 的字符串,输出登入页时,作为表单的隐含字段。用户填好密码后,由上面提到的 JS 库负责将密码原文和 Challenge 字符串相加后加密编码,然后发送该编码到服务器。该模块则提供相应的后端处理,你什么都不用管,照常用 $c->login 就是了。
Published on March 9, 2006 11:16 am.
Filed under: 东拉西扯 Tags: catalyst, cpan, plugin