Ajax

同步 CPAN 的时候,再次发现了名为 Catalyst::Plugin::Ajax 的模块,究竟 Ajax 是一个怎样的模块呢?

察看 pod 文档,略有了解,在 html 模版中引用模块中 __DATA__ 数据区的一段 javascript ,然后在模版中可以通过 javascript 请求其他 URL 并将返回的内容应用到当前的页面中。简单的说,你不再需要刷新整个页面了。

以前做客户的订单系统的时候,客户说,能不能在我输入前几个字母后,把对应的那些列表显示出来,然后直接选择就可以了?我说不行,因为数据量很大,每一次 key 变化都要请求服务器查询,不太现实。当然我知道这是可以做到的,只不过意义不是很大,而且要结合 iframe 和 javascript 一起实现。

以前在 Gmail 中也看到过,输入用户邮件地址的时候,如果以前曾经输过,则自动跳出来,省却再次输入的麻烦。当时没有细究,我猜想应该也是使用类似的 iframe 技术。

Catalyst 确实很有趣,它的例子中的 Ajax 应用,就是让你在编辑文本区域(特别像 blog 那样的系统)时,一旦发生 keyup 事件,即可提交修改内容,并把响应返回的文本重新复制到编辑区域,这样,就不会因为客户端的程序意外终止而丢失正在编辑的内容。而在我的系统上,一旦在中文状态输入下划线(就会变为破折号),就会程序错误,意外终止。我吃过很多这样的亏了。

为什么叫做 Ajax ?还是来请教 Google 吧。

Ajax 即是「Asynchronous JavaScript + XML」,说的在具体点,就是应用 JavaScript 中的 XMLHttpRequest 对象。结合 DOM 来控制页面上的元素的内容和行为。

看来在以后自己的应用中,该要着手用这个技术了。比如说:邮件地址 auto complete;信件内容自动定期保存;表单数据校验;等等。

更为具体的介绍,可以看看这里:

http://www.adaptivepath.com/publications/essays/archives/000385.php

Seaside? Squeak? Smalltalk?

在整理硬盘上的文件的时候,发现一个名为 Seaside-12-1-2005.zip,不知何物,不过肯定是之前在 IRC 中听说的东西,有心就记下了去下载了。打开 zip 文件,却只有一个 .image 和 .change 文件,看了文件头,都不是压缩包。

于是用 google 搜了一下,找到官方站点:http://seaside.st/ 才知道这是个 Web 应用框架,不过却是用 Smalltalk 来写的。早就对这种语言有所敬仰,不过实在没有机会和需要去接触它,心里面总有高高在上,不可近观的感觉。从站点中的内容了解到,Seaside 的运行需要一个叫做 Squeak 的东西,好像是一个开发环境或者开发工具,再辗转到它的官方站点:http://www.squeak.org/ 下载了一个 windows 版本的 zip 包,打开径直运行其中的 Squeak.exe ,出来一个窗口,窗口里面却是另一番天地,有很多可伸缩的导航条,工具栏,左键,右键都可以呼出复杂的菜单。样式有些 Linux 下面图形界面的感觉,色彩充满了童趣。随便走马观花,也没看出什么究竟来,倒是点出了一个像是幻灯片一样的东西,不但可以浏览,还可以修改编辑。不知所以然。

回过头来继续看,大致上 Squeak 是一个 Smalltalk 写的虚拟机,也就是 Virtual Machine 。介绍说它是个容易调试,分析和改变的系统,并且充分体现了 Smalltalk 语言的哲学理念。而 Seaside 只是一个 Smalltalk 的类库,一个用于构建 MVC 结构的 web 框架类库,要让它跑起来,就需要虚拟机 Squeak 了,以便集成其他的类库一起工作。

按照 http://beta4.com/seaside2/tutorial.html 教程中阐述的步骤,在 Squeak 中安装了若干类库,以及 Seaside(好像没用到之前下载的 image 文件哦),然后在 Workspace 窗口中年铁一段代码,并 do it,然后通过 http://localhost:9090/seaside/counter 访问,果然,http 服务起来了,并且看到了简单的计数器的功能实现。

事情并不就此为止,在看到的页面下方还有一条工具栏,点击上面的东西衍生出来极为丰富的功能:你可以配置这个组件(姑且先这样称呼),或者 Halos (你会看到一些页面元素被边框包容起来,可以对包容起来的东西做一系列的操作:察看源代码,渲染;在 web 页上对该组件半自动编程,设置等等),或者查阅内存消耗情况,代码的内部执行过程(Profile)等等。之前所讲到的“容易调试,分析和改变的系统”,可能就是指这些吧。

由于时间问题,我没有在深入下去,不过觉得非常有意思。在回过头来到 Squeak 里面,这次知道了它是虚拟机的概念,并可以在其中启动 KomHttpServer 来提供对 Seaside 所需的 web 服务之后,看待它的感觉又有所不一样了。Squeak 更像一台独立的操作系统,你可以在它上面做任何事情。这回仔细看了看下方菜单栏中的 Widgets ,选了 Movie Player ,然后选择一段 windows 文件系统中的视频文件,hoho,顺畅的就播放起来了,看来 Squeak 确实非常有意思,空闲下来该要好好把玩把玩。

先记下这么多了,还算蛮有收获。就像 Seaside 能够 backtrack 一样,我也要继续整理硬盘了。

Google Ads

有点不爽

今天 XP 方式写出来的代理平台,老板没有仔细看就不满意,诸多意见和牢骚,我心里自然有些不快。不过他提出的问题确实应该改掉,只是费了极大的一番心力写出来的东西,让人毫不珍惜,横加指点,多少有些受挫。不过也没什么,本来么,就该更好的,老板就是我的客户,客户第一,市场第一。不过幸而是 XP 开发出来的,否则,呵呵。

没关系,改么,总是要不断改进的。对自己而言,今天的时间利用率还是非常高的。只是手中的任务繁多而杂,有些疲惫和凌乱。

这两天下载了一些美国的剧集,感觉不错,先刻下来,回头累了就看一集作消遣。只怕会上瘾,那就不好了,呵呵。

每天都有惊喜

是啊,每天都会有惊喜。

昨天使用 Catalyst ,突然发现它变了许多,越来越像 Rails 了。安装好,用一行命令即可构建一个应用的所有基础目录结构和文件,然后运行 test ,马上就可以访问和使用了。自己要做的就是把业务逻辑写出来放进去就行。心中喜悦不已。顺便上了 irc.perl.org 的 #catalyst,又发现了一样东西:pastebot ,这是用 Perl 写的,基于 POE 的一个 IRC bot 程序,目的是让聊天的人们可以方便地共享一些代码片断,不用在聊天室里面刷屏,这对于像我们交流程序实作的人来说,应该很有助益。

最近 PerlChina 社区也越来越多的涌现出有关 Perl6、Pugs、Haskell 等的资料,虽然质量上面有待进一步提高,不过带来的却是激动人心,我们看到了最前沿的一些东西。只是遗憾目前自己的精力有限,不能爽快地投入其中一起学习,进步。

另外,有计划使用 Catalyst 构建 PerlChina 的站点。

Amor 模块改造

使用自己的 Amor 框架构建 web 应用程序,尝到了快速开发,高度复用的快感。对于复杂的应用系统,都可以在短短的几个小时内,搭建出相关的程序和页面流程。非常之好。

于是,终于有机会在同一个 web 服务器内同时开发或者使用三个应用。当然,开发环境下,使用 mod_cgi 方式,毫无问题。如果都在 mod_perl 下面跑,呵呵,问题具现了 — 第一个应用可以跑,没有问题,这个时候再访问第二套系统,看到的是第一个系统的界面。原因很简单,他们都是用了同一个框架 Amor,一些应用范畴之内的变量和设定都使用了 Amor::Context 的类变量。mod_perl 下面各次请求共享同一个 Amor 类,发生这样的问题也就不奇怪了。

哎,当初写 Amor 的时候竟然忽略了这一点,实在有些说不过去。为了支持 mod_perl 从 jit_core 改写为 Amor ,而如今,为了支持 mod_perl 下面多个应用同时运行,又必须对 Amor 动手术。

动手术的过程从前天下午开始,历史三个小时,以失败告终。手术方法比较简陋,尝试将所有应用相关的变量或者设定统统放到应用程序的主要包内。发现当时的写法终究还是有些凌乱,用丑陋的写法改造时候,restart apache ,妈的,Apache 竟然程序意外出错终止。怎么弄怎么失败。我不知道究竟问题出在什么地方。只好把这些修改打包后,回溯到开始修改前的代码。

一夜无眠,第二天一早,便又准备开始第二次手术。参考了 Cataylst 的写法,觉得他的思路非常清晰和简洁,于是先按照他想法来改造我的 Amor。其实很没有面子的,大多数的东西基本上从 Catalyst 直接搬过来。不过有两项地方不同:

1。增加了应用开始需要装载的额外的模块:Amor::View::* ,读取 cdbi 相关的 relationship 的设定,并装载相应的模块。
2。改变 Action 的构造和运行方式。虽然可能他的做法更为简洁和优秀,不过为了我已有的代码不用作大的改动,就可以在新的 Amor 上面继续运行,还是做了这方面的修改。

历史一整天,直至晚上九点,终于全面宣告完成。其间出现了与之前一样的 Apache 意外终止的情况。问题出在 Class::DBI::Loader 初始化的时候,而在 Apache 配置文件中使用了类似 PerlModule xa 这样的一行,就会出错。注释掉之后就没有问题了。

后来调整 Action 相关的代码到没有花费太大的力气,却是在后来对 Session 的改造有些麻烦。笔记本的速度实在糟糕,怎么调试怎么出错。最终发现 mod_perl 和 mod_cgi 方式下读取 cookie 的 SESSION_ID 方式不太一样。

以后可能还是要完全调整到 Catalyst 框架下开发比较好,为了迎合自己的需要,可能需要写点儿 Plugin 之类的东西。好了,继续应用程序的开发。怎么说这次改造也算是一个小小的里程碑吧。

回过头来看待自己这个生命个体

其实过完春节回来我就有些这种想法了。

长久一来,一直觉得自己不够快乐,整天生活在无止境的围城和循环之中,无限的抑郁。哪怕出去旅游,看一场电影都不再可以感受到以前的那份放得开的轻松和快乐。

是不是人的一生就是这么回事情呢?你甘不甘心一辈子这样下去,然后老死,然后归于混沌宇宙之中?

我是谁?我怎么来的?我要到哪里去?我每天都在做什么?我每天做的那些又是为了什么?

用理智的脑袋去思考的话,我是人类这种动物的一个个体,动物的自然繁衍衍生出了我这个个体,而我也会衍生出其他的个体,最终我这个个体就如同身边看到的死狗死猫一样失去活力,归于腐朽。我哪里都不去,我出生在地球上的某个角落,到目前为止也仅仅在这个角落附近不太远的地方逗留过一点点的时间。而我最终也会在这个星球上死去。我每天都在为了自己的欲望而不停的做着喜欢或者不喜欢的事情。欲望很简单,我要吃东西,我要睡觉,我要玩,我要虚荣心,我要兴奋。最重要的,我要快乐。快乐也是欲望,人生就是在不停的满足自己的欲望中度过。

用理智的脑袋思考得出来的结论,常常会因为现实的因素而导致你不那么快乐。为了生存,负担很重;为了颜面,负担也很重。负担很重的时候,就会心事重重,儿时的那种无忧无虑早就当然无存。这些阻挠自己快乐,回归自然的东西好比气功入静时的杂念。气功里面把这些杂念称为贼。你要入静就是要进到浑然无我的虚无状态,简单的说就是意识空白。入境之前有很多杂念,入境就是要求你不要想任何事情,而要求自己“不要想任何事情”这种想法本身就是贼–贼喊抓贼。所以要回到儿时的无忧无虑,回归自然的轻松,就需要“入静”。

人的观点通常也由看问题的角度出发的。“盲人摸象”便是一例。我们现在是在生命的过程当中,是进行时。常常因为世俗的一些东西,也就是杂念,令自己困惑和干扰。而当生命终结前的刹那,你会怎么想?你会想些什么?是不是会有很多遗憾?是不是觉得还没有活够?是不是依然还是不那么满足,不那么快乐?如果真的这样又该怎么办呢?

人只有在失去的时候,才会懂得珍惜。生命抑或不是如此呢?到生命终结的时候,再不断得抱憾,还有什么意思?

我们换个角度来看问题。

假设我们已经完成了生命历程,到达了最后的阶段。在最后这个濒死的时间点上,你的大脑让你快速的回忆着一生所经历的每一幕。当然我们这里说是快速的,但假如我们有能力把它放慢下来,慢到过去的每一分每一秒恰好等于实际的每一分每一秒呢?会发生什么?

如果我们现在的生命过程恰好就是在濒死的时候,大脑中的回忆过程呢?

这就是–回过头来看待自己这个生命个体。

你会从空间中的其他地方看到自己这样一个可以四处游走的生命个体。你的视角不再是从自己的双眼去看周围的世界,而是在这个世界里去看你这个生命个体及其周围的一切。你会有什么感觉?

哦,那是年轻时的我。瞧,我在赶着去客户的公司交付代码,虽然客户很难搞,代码也很复杂,不过我还是去做了,并且最终还是吃下了这块硬骨头。累?当然很累,但那已经过去了,累的是过去的我,而不是现在的我。现在的我正在享受着最后成功的喜悦。这点累算不了什么,怎么说都是我来到这个世界上,实实在在做出来的东西,而它正在影响着其他像我一样的生命个体。挺有意思的。瞧,我去跑步了,跑步过程中满脑子的想法,数不清的想退却,不过幸运的是,我坚持下来了,坚持下来的效果很明显阿,双颊烧烧的,感觉很好啊,出一身臭汗,痛快淋漓!累?那又不是现在的我受累,无所谓。

生命到现在为止已经到头啦,过得真快,最宝贵的就是生命中的每一分每一秒了。hoho,看哪,我坐在桑拿房受着酷热,享受着跑步运动过后的片刻宁静,身体的每一块肌肉都松弛下来了,生命那么宝贵,我就在花着这宝贵的一秒秒钟,享受着生命带给我的轻松和欢愉,真的很可贵阿。我很满足。

……..

哎呀,一天天我都过得很充实,没有浪费属于我的每一寸光阴,这么快就变老了,我的一生真的很精彩,没什么遗憾的了。我很开心,我也很满足,死亡只不过是我这个生命个体的一个终结,没什么大不了的。因为直到现在我依然还是很满足,没什么遗憾。这就够了。

话说回来,我还有另一种看待自己个体的假设性角度:我是来自遥远的星球,在那儿有我原来的生活,现在我以某种特殊的形式(以人这种动物的一个个体的形式)来到地球度假,整个度假的过程是要体验人类一生所经历的繁复,个体的死亡只是意味着度假的结束,然后回到原来的生活,继续那边的快乐时光。而我现在正在地球上度假,不过我随时都有可能会因为一些特别的原因而回去,可我不知道这会在什么时候到来,可能是明天,也可能是几十年以后,不过在这里度假的时间是有限的,而浪费了总是很可惜的,所以在这里度假的每一天我都要好好地玩,做我想做的事情,完成自己达成的目标。累一点,苦一点无所谓的,只要不浪费,毕竟好不容易才来这里度假一次的。天知道什么时候会突然中止这次的度假呢?

这就是我现在脑袋里的想法。为了寻求生命的意义和快乐而不断追求,苦苦思索,得出的一点点解决之道。现在回过头看来,免不了一些阿Q的影子。和宗教中所说的轮回也有几分相似。麻痹自己?欺骗自己?即便如此,大多数人还是会选择接受,因为这样可以给自己带来安宁与和谐,轻松和快乐。我自己的上面这些,又何尝不是如此呢?

跑步

已经坚持了三天跑步了。

从买了健身卡之后,最低限度的,对得起每日平均费用十元,我都去了美罗城的舒适堡锻炼。锻炼的项目很简单,跑步,不过为了减肥,规定不少于三十分钟。当然,减肥不是唯一的目的,长久以来一直缺乏运动,身体各项机能处于非常差的状态,所以强化心肺功能也是目标之一。先回到活力充沛的阶段,然后再作力量和形体的锻炼。所以目前只是跑步。

第一天,给自己的目标是一个小时。因为新东方的老罗就是每天跑一小时。他说他坚持了58天,结果减掉了几十斤赘肉。不过我更关心第59天究竟发生了什么事情。话说回来,目标是一个小时,实际跑了45分钟,cool down 又用了5分钟。cool down 就是让你一点点慢下来的,自动控制给你5分钟,既然有这样的安排,那就从了吧。跑步机就是这点好,帮你掐秒表。累计5公里多些。

第二天,因为第一天一下子大运动量上来,有些不太适应,所以调整目标为 45 分钟,和前一天的实际时间相当。显而易见的,没了第一天的虎气,实际只跑了30分钟,cool down 了半分钟。算是调整吧,出来的时候脚底板僵硬酸痛,大腿两侧也是酸酸的。

第三天,也就是今天,没什么具体的目标,只要不低于30分钟就行。今天状态还可以,基本上始终保持着平视,跟着音乐节奏踩点,脑子里面想自己的事情,这时候大多会忘记流逝的时间,回过神来的时候会突然发现一下子跳跃了5分钟,所以心理上的负担和劳累比较少。况且踩着音乐节拍跑步,始终保持着匀速,所以不是特别的吃力。到了30分钟的最低限度,感觉还有点力气,那就再跑吧,又多了5分钟,然后就不想跑了,cool down 了5分钟,算起来不好不坏–比昨天的好,比前天的坏。其实只要坚持每天跑,比起每天跑一样的时间,要重要的多。

结论,目标会随着意志力的减弱而变低,而实际情况永远不会达到既定的目标–总是比目标完成的少。有很多的理由可以找:身体要有个适应过程、到极限拉、有人来等我碰头了,没时间了等等。高目标订立了,因为允许可以不达到,所以实际情况总是没有达到,这大概就是人的惰性吧,但是最低目标30分钟订立了,至少目前我还是都达到了,所以人也是很贱的,因为最低目标不允许达不到。所以进一步的推论是,最高目标形同虚设,必须逐步提高最低目标。

放到工作上来也是如此,常常计划好的事情会逾期,原因各种各样,但通常我们给自己的说法是:最好我能够在接下来的这段时间内完成这部分工作,这是理想计划,如果实在不行,那就只好后延了,当然我会努力做到,尽量不逾期。然后问题就出现了,实际结果肯定逾期。不是计划制定得有问题。问题出在给自己的说法中那句“如果不行…那就只好…当然…尽量…”,这就是给了自己退路,给了自己可以失败的空间。人只要有了这样的空间,就会在计划中做不到百分之百的使力,结果多半不会成功。但假如断了后路,那就只有往前冲了,使出浑身解数,充分利用每个时间片断完成各项任务,那么成功完成计划的几率就要高很多。

不过人究竟还是人,写到这里,我差点想说,希望我可以坚持下去每天跑步,可以坚持下去每天在工作项目上有所进展,本性懒惰有一次暴露出来了,还在寻找退缩的空间。从上面的结论,应该改说:我必须坚持每天跑步。

新年工作的第一天

春节长假一点也不长,喝口茶的工夫就过去了。整整七天法定的休息日,我怎么都不想做工作上的事情,虽然进度很紧,事情很多。可还没怎么舒坦下来,初八就到了。上班。

新年的第一天上班,杂事非常之多,既定的项目只能顺延到下班前的两小时才开始动手,不过还好,完成了一块功能。不算很难,但也不简单,挺繁杂的。不过一天都没有浪费时间,这使得我自己很满意,怎么说也是完成了好多既定的任务的了。时间要充分利用了才会体现出价值来,所以感觉也挺好的。独立的办公室靠着窗,开了一天的窗门,虽然有些冷风,不过春天的冷风,吹在脸上,却会觉着有些暖洋洋,不是冬天里的那种渗透进骨头里面的刺痛,只是轻轻拂过皮肤表面的凉意而已。老婆前天给我办的舒适堡的健身卡,今天第二次去,愣是跑了三颗钟,10多里路,浑身上下全是臭汗,不过倒也痛快淋漓,后来在街上,感觉呼吸顺畅许多,可以吸得更饱满,呼得更彻底。既然老罗可以有恒心减肥,我想我也可以。活着是要为自己活,一定要精彩,一定要充实。现在跑得累,那是为了以后在平时都可以身体轻松,精神饱满;现在活儿干得多,那是为了以后可以自由驰骋,享受体验高质量的生活。

回到家,作了些 perlchina 方面的工作,双颊不由得烧红起来,很舒服,很享受。突然想说些什么,于是来此随便写点。不罗嗦什么了,继续消安的项目。

Catalyst 释出 2.99_12 版本

什么是 Catalyst ?

引用作者所说的,这是基于 Maypole,并以创新的方式增加了各种 Ruby-on-Rails,Struts,Spring,Tomcat 等框架或应用的特性。似乎挺激动人心的。

作者 Sebastian Riedel 是 Maypole 的第二任维护者,由于对 Maypole 后续版本提出了若干修改意见,遭到了 Simon Cozens 和其他人的一些反对意见(Maypole 不应偏离原来的设计思想太多)而自立门户,开始了这个项目。

日前释出的 2.99_12 版本,真正体现了 MVC 的框架结构。在他的 cpan 站点上列出了众多相关的模块。绝对应该好好研究分析。期望他能够比 Rails 更为方便和强大。

心急好奇的我,参照 intro 文档,写了一篇短文:初见 Catalyst,发表在 wiki.perlchina.org 上,写得老眼昏花。

小试 Ruby on Rails 有感

先是阅读 joe jiang 的 Blog,再次看到了 Ruby on Rails, 这篇文章篇幅虽然很长,不过大多是些插图,原本想拿来翻译一下的,不过忍不住边读边试了(机器上已经有了 ruby 环境)。非常简单,按部就班的跟着文章中的步骤做,就像在一层层拨开面纱一般,Rails 的功能和简便的特点渐渐的浮现出来,并深深为之震撼,在不断的点头,发出“哦…哦…”的过程中,领教了 Rails 这个绝对不可错过的 MVC 架构的 web 应用开发框架。

之前也看过 Perl 写的 Maypole, 我觉得他们有些异曲同工。不过 Maypole 做的没有 Rails 那么到位和全面。很多地方,他们都有着相似的概念。首先都是 MVC 架构。其次都有个很方便的数据库后端,可以直接将数据库表映射到类,然后每条表记录就是该类的不同实例。写程序的人用起来非常方便。不过 Perl 里面用的是 Class::DBI ,它本身还有许多扩展模块,所以安装配置比较麻烦。用起来还是有些接近的,Class::DBI 里面的 $obj->retrieve_all 到 Rails 里面就是 obj.find_all 。Rails 用 Ruby 写就,所以读写起来就好比在读写伪代码,书写上比 Perl 更为简洁。所以 Rails 官方网站上说,一个人用 10 个小时就可以完成一个普通应用站点的制作,并声称比起 Java 的开发要快上 10 倍。这一点都不夸张,Java 本来就够啰嗦的。Perl 还好些,不过要方便的使用对象数据存储器,而非 hash 引用对象数据,你就要应用 Class::Accessor 等模块。或者你要做设计模式方面的考虑,还有更多的,一大堆的 Class::* 等着你发掘和实践。所以学习和应用曲线比较高。Ruby 是后起之秀,自然明白孰优孰劣,所以写起来简单便是它的一大特点。

今天回到公司,下载了官方站点的一个 mov 演示,大体上和那篇文章的内容相当,我敢保证,看过之后一定会给你一个 shock 。其实,回过头来,这种用户的简单,是建立在 Rails 框架开发小组的繁复劳动的基础上的,所以,我们仅仅是有一次站在了巨人的肩膀上而已。

和 Maypole 一样,在我看来,这些介绍文章所谈到的内容,对于一个真正的,实践中需要的系统,还是有些距离的。客户的要求会很个性化,列出的清单,可能需要排序,和搜索,也需要分页,实际的系统还可能结合更多的 javascript 来做些控制,错误的处理,国际化的特点等等。表与表之间的连接关系可能极为复杂,每次删除或者什么操作,都可能需要做连带的处理,这可以通过数据库的存储过程来做,不过我更希望通过应用程序本身来做。Class::DBI 就可以定义一系列的 trigger 。Perl 里面还有个模块 Class::DBI::Loader::Relationship ,允许你使用一句普通的英文句子来定义表与表之间的映射关系,用起来非常方便(不必在A,B内各自定义,Rails 里面确实需要两者内部各自定义的,参见 mov 录像)。这也是我欣赏 Perl 的地方 — 它可以让人自由发挥 — 当然这种思路和语言无关,我想 Ruby 里面同样可以实现,只是目前 Rails 不是这样的,或者我还不知道罢了。

anyway, Rails 是样好东西,不管是学习也好,还是应用,都该好好研究一下。