Archive for March, 2005

Echo2,该来的还是来了

Thursday, March 24th, 2005

我预计的不错,一个采用ajax思想实现的web框架,Echo2(http://www.nextapp.com/products/echo2),果然出来了。只是这未免太快了。

Echo2采用了跟Echo同样的渲染模型和事件模型(跟ASP.NET很像,组件机制跟Tapestry很像),不同的是事件的传递/调用/结果返回都是采用xml消息实现。因此,我宁愿称这个框架为Amowa的一个典型实现。

一些美中不足的是,消息发送之后,服务端还是返回整个界面描述;而不是仅仅发生变化的控件。这里面应该还有优化的余地。

Buffalo – 一个amowa的基础设施

Monday, March 21st, 2005

早上的时候,新添了一些代码,使Buffalo看起来稍微完整了一些。关于面向异步消息的web应用,我终于做出了一些实用性的东西——实际上,从去年2月开始,当我编写livechat版本1, 哦,确切的说是在03年底编写数据分析软件web客户端的时候,我就开始做这方面的思考与探索。livechat2.0的完成,使我在面向消息方面的应用方面大跨了一步;然而面向消息并不完整,当我试图完成buffalo原始版本,打算封装消息类型,并按照消息类型服务器端调用相应命令的时候,在数据序列化/反序列化上变得无趣。我坚信一定有更好的实现的——尽管我在Amowa的定义文档中指出xmlrpc可能是消息封装的一种方式,但是xmlrpc本身太琐碎了,而且java实现对数据类型的支持太有限。直到我春节期间发现Burlap, 这个优雅而轻量级的传输协议。

Bufffalo现在的版本包括两部分:面向服务器端的BuffaloService和面向客户端的buffalo.js, 服务器端现在能够跟Spring进行集成,使得任意的service暴露为Buffalo服务成为可能;客户端实现了Burlap协议,并能够调用任意服务器端的Buffalo服务,并将返回值包装为JS对象。Buffalo与其它WebRemoting方案的最大不同在于,它能够将服务器端的返回值——任意类型,没错,任意类型,包装为JavaScript对象。不仅仅是对象,对于返回值中存在对象引用关系,Buffalo也能够很好的处理,决不会造成内存泄露。例如,一个包含3个元素的循环链表,Buffalo能够很好的处理这种关系。

一个典型的调用方式如下:
Buffalo.remoteCall2(“commonService”, ["sum", 1,1], callback);

这中调用方式还是有些粗糙。Buffalo Binding组件将amowa的概念实现的更远。它允许直接将远程调用的结果绑定到HTML元素上,这一过程将是透明的,开发者无需关心内部实现。目前已经实现将结果绑定到input text,password, checkbox, radiobutton, 下拉列表,表格。这一切的绑定调用,甚至只需要一句话:

Buffalo.bindReply(“commonService”, ["now"], “timeInput”);

上面这句话将会调用远程的now方法,并将结果绑定到id为timeInput的控件上。

Buffalo将会走得更远,为Amowa做更多的工作。我期待的是有一天,这头大水牛能够自动辨认HTML元素中的bid属性,并自动将远程服务的操作结果绑定到html控件上,成为一个不需要java端编程的新型web框架。

Amowa Relaunched

Saturday, March 19th, 2005

如果不是看到ajax概念的提出,也许我会一直将“面向异步消息的web应用”这个概念始终捏在手里。原因也很简单,自从我去年提出这个概念后,却一直观者寥寥。当然这跟我在这个领域的影响力有关。但是自从ajax概念提出之后,却又那么多的响应与支持者。这让我多少有些难受。实际上Amowa的概念无论从外延的开阔程度以及内涵的深入程度,都超过了ajax。作为一种统一概念的说法,Amowa更能够体现这种web开发新思路。

www.amowa.net去年开通之后,一直被杂事困扰。也没有多少人关注,自己也渐渐失去了热情。但是这个ajax的提出,已经刺激到了我,目前我已经完成了BuffaloWebRemoting,一个更加健壮、更加完美的传输方案,加上以前完成的JSValidation, 现在只需要一部份binding的工作,那么我的Amowa无论从概念还是实际的技术,在这方面都已经跨出了大大的一步。

如同大多数程序员,我也不怎么宣传。没有raimundo和gigix的提醒,也许我会一直这样沉闷下去,一任西方舶来概念的侵蚀. 现在我应该多做一些工作了,向国内的开发者展示Amowa的概念和action. 作了一个TODO List, 用来监督自己工作:

整理文档工作:
* 面向异步消息的Web框架-AMOWA:重写。上一篇写得有些随意,这次整理一下,使其具备理论高度(想到什么ajax就郁闷)。
* Buffalo WebRemoting。这个已经做完,可以作为Amowa传输的基础。xiaogang和raimundo同志已经看过演示了,不知还有什么需求。
* jsvalidation. 这是早就完成的模块,作为一个新的web框架,校验必不可少。jsvalidation从目前的使用和反映看来,还是不错的。

新的开发工作:
* amowa.net站点更新
* Buffalo中各种bind方法的编写。现在的Remoting调用还是有些raw, 用bind直接将返回值与Html界面控件进行绑定,使用起来更方便。

需求征集:
* 原来打算按照Amowa的思路来实现一个新的论坛,后来发现这个案例不好,又大又没意思。征集能够体现AMOWA的典型用例(showcase),最好功能点突出并且规模不大。

任务没有完成最好的托词就是工作太忙。上帝保佑,我能够永远不用这个借口来原谅自己。

今天三月12日。

Sunday, March 13th, 2005

这种写法是来自于很久以前,有个人写信问我,我该有1米八〇了吧,实际上我从来都没有过,虽然我很努力的想。我还记起上学的时候,一个三月12日的下午,组织全班同学去西安灞桥植树。灞桥垂柳曾经是长安八景之一,但是我们去的时候那里一片沙滩,根本看不到风景的样子。也不知道现在那些树活了没有,应该没有活吧,因为我们走的时候当地人在嘀咕:这么浅的坑,树怎么活的了?!

新年来了之后视力更差了,医生说对着电脑的时间太长,眼压太大,让我注意休息。天知道我是不能休息的。昨晚头痛得要命,翻来覆去醒来好几次,早晨起来的时候终于好了一些。吃完早餐,走在红螺湖的岸边,清冽的春风深吸了几口,感觉又年轻了不少,头也不那么疼了。

让我在这个麻木的春天感到感动的,是收到Sue的信。Sue虽然移居海外,但是中文功底却让我汗颜。比中文功底更深厚的是字里行间的情谊。想起两年多前在西工大教Java的日子,那时候自己很单纯,环境也不复杂。那样单纯的环境里产生的单纯的情绪,应该是弥足珍惜的。一个人的工作如果在若干时间后还为人称道,这难道不是一种成就?

Pagani同志问我,为什么有一群像我这样的朋友,家不在西安,现在外地工作,却非常想回西安?我没有机会回答他。其实这应该是一种情结。在一个人最需要朋友最希望承认的年纪里——我是指大学时光,这段时间在哪里过,往往对以后的生活产生很大的影响。西安慢悠悠的生活节奏,对于我这样的人,总有一种很放松的感觉。这种放松的感觉使得我即便白天上班晚上讲课半夜备课,都不觉得累。而在这里,却很难找到。每天晚上下班,都有一种精疲力尽的感觉。

然而即便是感触,也不应该有许多。一年之计在于春,我定下的计划,每天都要看一眼,一定也要完成。

让异常信息更容易理解

Saturday, March 12th, 2005

花了15分钟的时间,给报表框架改善了异常信息的显示。当在xml定义文件中定义了某一位置的单元格,而在相应的Excel模板文件不存在该单元格时,以前的出错信息是:
ReportException: 单元格(2,3)不存在,请检查模板文件

这个2,3并不容易理解,很多报表的开发人员都无法一瞬间定位到这个单元格。我将Excel中的横向坐标(用A-Z表示)加入了其中,改善后的异常信息如下:
ReportException: 单元格B3不存在,请检查模板文件中对应单元格

这下清楚了,开发者一下就可以看到哪个单元格出了问题。

ps. 关于这个报表框架,还有一个有趣的事情。有一位同事拿代码去测试,后来问我:为什么你的代码没什么问题?我说,因为我自己的单元测试比你的测试更细致。他不信,于是我把满满的单元测试用例给他看,当他看到setUp中建立模拟数据,tearDown中删除数据,以及单元测试方法中大段大段覆盖率极大的assertXXX语句时,他不说话了。单元测试确实能够增强代码编写者的信心,我越来越坚信这一点。

好的软件是磨练出来的

Friday, March 11th, 2005

Jol on software,前些年经常看到他的文章,他的经典之词《行进中开火》,被称为勤能补拙之软件开发实现。他自己的小公司FogCreek,自己的小软件FogBugz缺陷管理工具,自从前年获得Jolt奖之后,不断改进,现在到了4.0版本,软件界面更加合理,更加易用了。如果说有哪些软件能够这样的发展的话,除了FogBugz我看不到其他的软件。这个小小的缺陷管理工具处处用心,处处让你感受到“易用性”。当然,这些是不断的琢磨、不断的修正、不断的需求、不断的调整过来的。

中学语文课上有一篇课文《挑山工》,里面有一句话,不怕慢,只怕站。软件开发也是如此啊。相比我做过的大多数项目,都是一锤子买卖,做完后往往无法更新,没有回应;甚至也许没有人用。这也许是国内电子政务、MIS系统现状造成的。但是,作为一名程序员,我是何等的希望自己参与的软件能够不断的发展,不断的变得更加人性化、更易用啊。如同抚养一个孩子,能够在自己与客户的呵护下变得越来越好用,越来越成熟,那种成就感与荣誉感,岂非是每一个程序员梦寐以求?

NoClassDefError – 留意编译环境与运行环境JDK是否一致

Monday, March 7th, 2005

又是一个IBM JDK的问题:一段代码,其中包含了静态加载的部分代码:

static {
loadProperties(“/Abc.txt”);
}

编译完成后部署在WebSphere 5.1上,结果发现这段代码出现NoClassDefError错误。仔细检查代码后,发现WSAD中,项目在Sun JDK1.4环境下编译,而运行在IBMJDK1.4环境下。将代码重新在Webspehre自带的JDK下编译并重新部署,问题解决。

看来各个厂商实现的不同的JDK二进制代码并不一致,IBM JDK就是一个例子。我记得JDOM0.9版本不支持websphere, 以前一位同事在将JBossCache引入项目的时候,都被这个问题折磨的死去活来。现在看来,问题解决的办法就比较简单了,找到代码重新编译打包就行了。

沟通与交流

Monday, March 7th, 2005

当我兴冲冲的把我最近研究成功的burlap web异步调用方案给PM演示时,他一脸茫然:这是什么东西?怎么实现的?

我意识到自己犯了一个错误:在没有事先描述语境的情况下就展示一个创意。于是我开始跟他描述在目前的系统中传统的页面切换方式无法实现动态授权,需要一种页面停留不刷新的方式来调用后台API。这种方式称为异步web远程调用。目前有很多种实现方式,但是burlap协议概念最完整,最适合使用,我将其与现有框架结合,并编写了客户端序列化/反序列化的代码,使之更加完整。等等。等我将这个过程描述清楚了,他才明白:原来是这么回事。

一对一,一对多的交流中,交流的内容其次,营造一个相互理解的语境往往占据了更多的时间。如何清晰、简短、快速的构造这个交流环境,以留出更多的时间来进行更有价值的交流,是应当深思的。

JSValidation准备放到GRO上

Friday, March 4th, 2005

找来找去,速度快服务又完善的只有GRO了。昨天下午注册了项目,回复的邮件说6小时内Shell账号就应该开通,24校内域名就可以访问。一天过去了,我使用SSH客户端还是无法登陆shell.gro.clinux.org, SSH, SSH2的公钥已经传到个人设置里面,但依然无法登陆,报错:

Server responded “No further authentication methods available”
No more authentication methods available

郁闷啊…

Blog搬家

Tuesday, March 1st, 2005

感谢冰云同志让我的blog有了容身之地。原来的Blog实在太慢,而且不稳定。

花了一个上午,将原来的blog全部一篇篇贴到了这里。这让我对MS程序多添了几分愤恨之情。如果不是数据那么难导出,我也不会采取如此笨拙的方式进行数据移植。不过懒人有懒福,去年4月份至今只写了70多篇blog, 还不算太多。看着这么多blog,我居然有一种小心翼翼的珍爱之情。文章和为时而作,这些文字记录了我的思想,对我来说,是宝贝。遗憾的是,blog的评论全部都丢掉了…

今年我的www.jzchen.net域名也要到期了,到时候jsvalidation, redialog也没地方放了。我也没有继续购买的意思。毕竟积累有限,还是不跳脱衣舞的好。