星期二, 十月 31, 2006

Nirvana Studio 有了自己的 Logo


Nirvana Studio 总算有了自己的 Logo,非常感谢 Tin 同学!

星期六, 十月 28, 2006

与 James Gosling 的合影



















比较遗憾的就是和 James Gosling 单独合影的照片一直都没有拿到!

星期四, 十月 26, 2006

常州发展史

4500万年前,人类祖先脊椎动物“中华曙猿”生活于溧阳上黄一带,比北非的“人类祖先”早800——1000万年。

6000余年前,原始居民聚居于戚墅堰圩墩村一带。

周灵王二十五年(公元前547年),吴王馀祭封季札于延陵,此为常州文字记载第一名称。

西汉高祖五年(公元前202年)改称毗陵。

三国时吴大帝嘉禾三后(公元234年)实行屯田,辖毗陵、武进(今丹徒)、云阳(今丹阳)3县农事。

西晋武帝太康二年(公元281年),废屯田典农校尉,改置毗陵郡,辖丹徒、曲阿、武进、延陵、毗陵、暨阳、无锡7县。自此至清代,常州均为郡、州、路、府所在地。

晋惠帝永兴元年(公元304年),因避东海王世子毗名讳,改称晋陵郡。

晋大兴元年(公元318年)侨置兰陵郡。

隋文帝开皇九年(公元589年),废晋陵郡,置常州,辖晋陵、无锡、义兴、江阴4县。

唐会昌四年(公元844年),升常州为望,列全国十望之一,辖5县同上(含武进县)。

昭宗景福元年(公元892年),建吴国,常州属吴,史称“三吴重镇”。

元世祖至元十四年(公元1277年),改置常州路,辖晋陵、武进2县和宜兴、无锡2州。

元惠宗至正十七年(公元1357年),改常州路为长春府,辖武进、无锡、宜兴、江阴4县。

明永乐七年(公元1409年),改长春府为常州府,辖县增靖江,计5县。

清雍正四年(公元1726年),常州府辖武进、阳湖、无锡、金匮、宜兴、荆溪、江阴、靖江8县,史称“八邑名都”。

1912年辛亥革命后废常州府,阳湖县并入武进县,城区一度称武进市,沿称常州,属江苏省。

1949年4月23日常州解放后,城乡分别设常州市和武进县,隶属于苏南行政区常州专区。

1953年,常州市升为省辖市。

1958年,镇江专区迁来常州,改称常州专区,辖常州、镇江2市和武进、金坛、溧阳、丹阳、扬中、句容、宜兴、溧水、高淳9县,隶属江苏省。

1983年1月,国务院批准江苏省实行市管县体制,3月起辖武进、金坛、溧阳3县。

2002年4月,国务院批准常州市建特大城市,撤县级武进市,设武进区,郊区更名为新北区;常州市辖金坛、溧阳二市和武进、新北、天宁、钟楼、戚墅堰五区。

星期三, 十月 25, 2006

尝试写一个类似 RoR 的快速开发框架(4)

这几天又继续完善这个框架,URL的分发采用FilterDispacther,处理Script使用RhinoServlet。框架使用了Phobos的类库,因为RhinoScriptEngine一类的东西Phobos都写得很不错,那来直接用就可以,没必要自己重新发明轮子了。

Phobos里面ScriptEnginePool被我扩展了,主要是用于在启动每个ScriptEngine的时候默认加载一个启动脚本,这个脚本只会在ScriptEngine初始化的时候执行一次,然后进入ENGINE_SCOPE里面。之后就可以使用这里面定义的一些公共函数了。

URL之后的Scripts处理就基本学习RoR的Convention了,layout和helpers的处理流程也基本好了,接下来就是要开始写一些helpers,重点可以转移到JavaScript编程上了。

星期二, 十月 24, 2006

JSR-223、Phobos、Glassfish

上一篇提到JSR-223改变之后,我从JCP网站上下载到了JSR-223提议的最终版本文档,06年8月10号的。光有代码还不行啊,还得找一下JSR-223的API包,Sundararajan 建议参考一下 Phobos 的代码,于是下了 Glassfish (2007-7-24),用上了里面的 jsr-223.jar。

考虑到写一个JsRails框架的问题,我需要在ScriptEngine启动的时候默认加载一部分类库,之前sun实现的RhinoScriptEngine并没有留有任何扩展让人可以作这个事情,很想改改sun的实现代码,但是毕竟人家是CDDL的,不好弄。于是从cvs中checkout下了Phobos的最终代码,发现同名的jsr-223.jar比Glassfish里面的新,这一份jar才是最符合JSR-223 PFD的。看看代码里面的注释,发现作者已经想到了预留的扩展,总算可以实现要实现的功能了!

星期五, 十月 20, 2006

JSR-223 中的 javax.script.http 被删了

今天就JSR-223参考实现里面的一个小bug给 Sundararajan 发了封信,结果很快收到回信了。他告诉我 DeTagifier.java 估计要删掉了,javax.script.http 已经没有了,难怪我下载 JDK6 的源代码时发现这东西没了呢,而且从网上也很难搜到相关代码。

在用JSR-223+Rhino是用到了javax.script.http,感觉设计上还是有一些强制性的,譬如HttpScriptServlet,实现这个应该是MVC框架的一个职责,目前我的代码里面对这个类重新实现了一下,不然无法达到RoR那种效果。

我又回了 Sundararajan 一封信,向他咨询一下 JSR-223 未来的一些走势,期待回信了。

PS:Sundararajan 看着名字很怪,从他的blog上看出来他是个印度人,对脚本语言也是相当的熟悉了,他的blog上有很多脚本语言的对比,譬如JavaScript,Jython,JRuby,Grooby等等,对技术的研究也是非常透彻和有深度的。

尝试写一个类似 RoR 的快速开发框架(3)

继上一篇讨论了Routers的问题之后,我有着手写了关于URL的处理,总结起来有如下步骤,比之前多了有关静态内容的匹配。

  1. 首先匹配规则
  2. 如果规则不符,检测是否以后缀结尾
  3. 如果有后缀,认为是静态内容
  4. 没有后缀,自然拆封,例如:say/hello -> Controller: say, Method: hello

按照这个流程我做了DispatchFilter来处理URL,当然还有很多预料之外的问题需要解决。

RoR 的 layout 特性我还没有想到好的实现办法,使用 FreeMarker 作为模版有一些问题解决不了,譬如类似 RoR 的 render 功能,可能我要考虑直接用 JavaScript 像 RoR 一样作为模版用了。

IE7 用起来真不错


时隔6年IE7总算出来了,装好用了一下感觉还不错。挺清爽的页面,去掉了传统的Menu bar给人一种很清新的感觉。

星期三, 十月 18, 2006

尝试写一个类似 RoR 的快速开发框架(2)

这两天又边看《Agile Web Development with Ruby》边写这个框架。开始着手处理URL到Controller的分配。虽然书上没有提到明确的URL处理流程,但看过几个程序之后大概的程序流程有点明白了。
RoR 通过 routes.rb 来定义自定义的 URL 影射规则,观察过 routes.rb、Cake、Django 的 URL 影射规则之后,我觉得在我这个框架里面最好的选择就是采用正则直接匹配。于是我可以考虑如下写法定义 routes.jsx:
Routing.connect('^/$', 'blog', 'index');
Routing.connect('^/articles/(\\d+)$, 'blog', 'show');

除了这个当然还有一个默认的规则,那就是根据url分割之后进行匹配:
/say/hello -> Controller: say, Method: hello
这样的 url 虽然没有经过 Routing 的定义,但是可以用默认的方式进行匹配,当然了,在hello后面的参数会追加到函数定义中去,譬如:
/say/hello/nicholas
function hello(greeting) { print(greeting); }
这种方式也应该要受到支持。

URL 的匹配还是挺复杂的一块内容,现在作了一个简陋的实现,还期待 ShiningRay 和 Tin 同学多提意见。

公安局称多户和用ADSL违法

从sohu上看到的消息,公安局称多户和用ADSL违法,中国电信已经下手开始封杀:
http://it.sohu.com/20061017/n245838475.shtml
看了这片文章觉得电信已经越来越不能忍了......

星期二, 十月 17, 2006

Web 开发,我推荐 RoR

最近一个朋友在学Java和JSP,想做Web编程,我极力劝他学RoR,虽然我还没用这个东西。

时间是很宝贵的东西,如果一个刚上大一的同学问我学Java还有前途吗,我会告诉他坚持学1-2年Java看看。毕竟1-2年时间够他看个几本大部头的Java书籍了。如果大3-4了,还刚想起来学Java(看到招聘信息很多招Java的),那么我只能劝他们放弃吧,时间宝贵,学一点更有用的东西。

有人说我最近怎么离Java越来越远了,的确,我已经好几个月没写Java代码了,但我自己也不用 RoR 进行开发,但我在用一些受RoR启发的框架,譬如CakePHP。学习一门新的技术也是一种投资,你学Java的时间就没法用来学习RoR,这就是所谓的机会成本。用RoR开发Web速度比Java快这是个不争的事实,学习RoR的难度也比Java小,既然可以用更少的时间学习更实用的技术来满足自己的需要,你所花的机会成本就越少,何乐而不为呢?

星期一, 十月 16, 2006

尝试写一个类似 RoR 的快速开发框架(1)

最近受 RoR 的影响颇深,导致人逐渐变懒......

同样是写程序,用 RoR 的确可以有效的减少代码量同时又可以快速开发出所要的东西,有什么不好呢?现在类似 RoR 的框架层出不穷,随着 JSR-223 的升温,使我感觉是否可以用 JavaScript 写一个类似 RoR 的快速框架出来呢,于是着手开始尝试。

JSR-223 和 BSF 实在太像了,以至于参考实现的代码基本上直接取自 BSF,虽然 JSR-223 提供了 http 支持,但是要用 JavaScript 实现一个类似 RoR 的框架,靠这点 http 支持毕竟还是有点局限,所以首先要在Servlet上下点功夫。

URL 是一个很重要的部分,RoR 里面使用 routes.rb 来实现自定义的 URL 规则,这一点在 Java Web 开发中能够做到的话也只能用 Filter 了。我的思路是通过 Filter 获取 URL,然后将 URL 分解,拆出 Controller、Method、Params 部分,然后用 RequestDispatcher 分发到专门处理 Scripts 的 Servlet 来处理,其中这些过程变量放在 request 中带过去。

ScriptServlet 部分应该是读取指定目录的 js 文件,按照 RoR 的约定,应该是在 app/controllers 目录下面按照 xxx_controller.js 开始找,然后根据 request 传过来的 Method 进行调用,最后搜索模版,路径在 views/xxx/ 目录下,用函数调用返回的结果渲染模版。

大致的流程估计应该是这样,下面考虑一下所用的框架。觉得很有可能需要自己实现一个基于脚本的 MVC 框架,除了 Filter 处理 URL 之外,还需要一个 ScriptsServlet 充当 ApplicationController 的角色,用来将请求分发给不同的 js 去处理,然后再加在模版进行渲染。模版引擎考虑才用 FreeMarker,虽然用 js 也可以做,但总觉得功能上不如 FreeMarker 来的强大。

大概思路先是这点,打算做做看先。

星期日, 十月 15, 2006

[转] 韩国学者竟称《本草纲目》是“韩国文化遗产”!

有时候我觉得韩国人也很可怜的,他们不知道自己真正的历史是什么,他们脑中的历史完全是政府强加给他们的。

[编者按]一家之言。

本人在韩国生活多年,所了解到的是韩国人根本就不认为韩医和中医有什么联系,他们认为韩医是 伟大的韩国的祖先们智慧的结晶,是神话中的医圣流传下来的。而所谓的医圣其实就是中国人都知道的尝百草的神农氏,因为据近年来韩国学者的“考证”,神农氏 是高丽人!甚至后世的李时珍也是高丽人!这就不难解释为什么韩国人把韩医、针灸、《本草纲目》都当作自己的文化遗产了。你要是和他们说“神农氏是华夏民族 的祖先”、“李时珍估计一辈子都没到过朝鲜半岛”,他们会觉得你看不起他们是在侮辱他们的传统文化,所以我在韩国基本上不和他们争论任何有关这方面的话 题。

而事实上你只要到韩国大邱的药材市场上走一走就知道这种韩医是韩国本土文化的论调是多么可笑 了,那里的草药都用中文标明名称,绝大多数的药材也都是从中国进口的,因为韩医中百分之九十以上的药材的原产地都是在中国的,可是韩国人不管这个,药材只 要到了韩国一律称为“韩草药”。在中国各大中医学院,有数以万计的韩国留学生在学习着中医课程,可是等这些人学成回国后,一律被称为“韩医师”,开出的中 医药方也成了 “韩方”,在中国学习的针灸技术也成了“韩国传统针灸”,这些“韩医”在韩国是很受尊敬的,收入也很高。

另外,看到有不少人说道韩国的太极旗,也想说说这个。韩国人从小受的有关国旗的教育是这样 的:1882年8 月,使臣朴泳孝和金玉筠奉王命赴日本谈判。途中,二人商议,作为一个国家的代表没有一面国旗是不行的,于是 ,他们依据韩国传统的太极图案设计了这样一面太极旗。这个所谓“灵机一动”的国旗诞生的故事在韩国是家喻户晓的。而为了证明太极图案是韩国人的传统文化, 韩国政府进行了一系列的运作,包括宣称发现了一口上古时代的梵钟,上面已经有太极图案了,证明太极是高丽民族的智慧结晶,可是这么一口令韩国人骄傲的梵钟 至今没公开露 面过。

实际上,在中国近代的相关书籍中很容易找到关于韩国太极旗的来历。历史很清楚的记载了一切: 1882年,朝鲜使臣朴泳孝和金玉筠即将出使日本,临行前向中国清朝北洋政府请求将中国的龙旗作为国旗使用,北洋政府回复称藩属国不能用五爪龙旗只能用四 爪龙旗。由于当时朝鲜当局对日渐没落的清廷已经有些不买账了,所以接受清廷的要求。其时奉李鸿章之命出使朝鲜的中国使节马建忠(中国近代大语言学家,当时 和其兄复旦大学创始人马相伯一起出使朝鲜)建议朝鲜政府采用中国传统的太极八卦旗作为国旗使用,这个建议得到了朝鲜政府的采纳,所以,最早的朝鲜国旗是一 面不折不扣的白底黑色图案的太极八卦旗。后来,一名英国驻朝鲜的使节用西方美学的角度为这面太极八卦旗做了修改,去掉了八卦中的四卦,把剩下的四卦斜向对 称拉伸,使整个国旗图案呈长方形,把阴阳鱼图案改为红蓝两色,这样才有了现在我们看到的韩国太极旗。

当然这面改进型的太极四卦旗的来历在 韩国一定要被忽略掉,大韩民族的国旗怎么可以是两个外国人设计的?所以才有了那个“灵机一动”的版本。

有时候我觉得韩国人也很可怜的,他们不知道自己真正的历史是什么,他们脑中的历史完全是政府 强加给他们的。近几十年来的飞速发展其实已经证明他们是一个伟大的民族了,他们完全可以籍此赢得世界的尊重,完全不需要靠伸手拿别国的历史文化来证明自己 的伟大,这样做反而会被全世界所耻笑。

转自《世界》

星期五, 十月 13, 2006

为 FreeBSD 手册在 Mozilla 上做了一个侧栏工具条


加到 Mozilla 浏览器的侧栏浏览器来比较方便,下载地址是:FreeBSD 手册侧栏工具条

设置 FreeBSD 的 Locale

今天上网搜了一下找到了设置 Locale 的方法,其实在 FreeBSD 的 handbook 上就有。

地址是:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/using-localization.html

设置全局的 locale 参考下面方法:
vi /etc/login.conf

最后增加这个:
chinese:Chinese Users Accounts:\
:charset=UTF-8:\
:lang=zh_CN.UTF-8:\
:tc=default:

然后修改你的passwd文件,使用vipw命令

user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh
language位置写入chinese,关联上你的locale。
需要更新一下数据库,使用 cap_mkdb /etc/login.conf
登出再登录,使用命令 locale 就可以看到你的 locale 已经修改完成了

为 FreeBSD 用上漂亮的中文字体

因为宋体的版权问题,很多 FreeBSD/Linux 用户选择了开源的“文泉驿”字体,试过之后发现还是不太理想......,字体不是很好看。偶然发现了另一个字体 firefly ,用上之后发觉挺不错的。

下载目录是:
http://www.study-area.org/apt/firefly-font/

同时 FreeBSD 的 ports 里面也有这个。

星期三, 十月 11, 2006

JSR 223: Scripting for the Java Platform

最近由于 RoR 的盛行,SUN 收编了 JRuby 的两名作者,决心在脚本语言方面做点文章了,于是 Java 6 中间加入了 JSR-223 的支持。看了一下 JSR-223 的相关内容,发觉这东西不就是把 BSF (Bean Script Framework) 规范化了吗......,不同的是 BSF 是 IBM Alphaworks 贡献给 Apache 的,而 JSR-223 是一个规范。

这个 JSR-223 其实就是定义了一些接口,用来衔接使用 Java 实现的脚本语言和 Java 本身通讯,是 Java 与 Scritps 互操作的一个桥梁。主要职责差不多是让 Java 执行动态语言脚本,访问动态语言执行中产生的变量、函数等,同时让动态语言能够在它的范围内访问到 Java 空间里面的指定变量,达到互操作的目的。

JSR-223 除了一个标准的给用户使用的接口之外应该还有一部分给 Scripts Provider 让他们将自己的实现符合这个规范,达到一致的目的。

BSF 自 2003 年就已经 release 2 了,翻了翻以前老外讨论 BSF 的邮件列表,发现他们主要的问题集中在性能,觉得在 JVM 上面用 Java 再来解释一种脚本语言效率实在不行。不过近年来随着 RoR 的出现,似乎让大家的重点更多的转移到了速度上来,毕竟不是所有场合都那么追求高性能,能够提供更高的开发效率才是大家所需的。

星期二, 十月 10, 2006

终于让 FreeBSD 支持 SigmaTel 9200 的声卡了

翻了半天 FreeBSD Mutilmedia 的邮件列表,尝试了一些驱动,总算发现官方的代码在逐渐出来,找到了一个官方的 PR:
http://www.freebsd.org/cgi/query-pr.cgi?pr=104011

里面指向一个地址:
http://lists.freebsd.org/pipermail/freebsd-multimedia/2006-September/004864.html

从这个地址里面下一个 patch 出来,我用的是 6.1,所以下6系列的 patch,按照上面的方法 make 了一下,然后用 kldload 加载出来就可以用了,真不错!

下一步就是 WiFi 的支持啦!!

终于让 FreeBSD 支持 Dell D420 的宽屏了

都怪 D420 太新,以至于 FreeBSD 没有能够提供关于显卡的驱动,疯狂 google 了一下发现一个叫做 915resolution 的东西,0.5.2,1 版本能够把 D420 的 945GM 显卡 BIOS 中的模式列出来,然后 hack 一下变成 1280x800,同时修改一下 /etc/X11/xorg.conf 让他显示 1280x800 的分辨率就成功了,着实让人兴奋了一阵!

调整 xorg.conf 中关于 Monitor 部分可以参考 /var/log/Xorg.0.log 中打印出来的信息,里面有设置 ModeLine 参数的详细数据,不明白就 google 一下吧。

从房东雨同学那得知在 /etc 中建一个 rc.local 脚本可以放置系统启动时需要的脚本,于是将 915resolution 的命令直接放置到这里,reboot,以后直接 startx 就行了!

下一步,解决 D420 的声卡问题!!!

星期一, 十月 09, 2006

由 CakePHP 想到的......

做了一段时间的 CakePHP 开发,一个类似 RoR 的 PHP 框架,让我对 Web 编程又开始感兴趣了,之前用 Java 开发 Web 程序着实让人失望。静下心来总结一下,其实 Java 开发 Web 应用也可以模仿 RoR 的,虽然类似的框架已经有一些了,但是我还是觉得应该尽可能的简单......

采用一个非 JSP 的模版引擎。大家喜欢使用 JSP 当模版,当然了,默认就是这样的。不过 JSP 第一次编译着实让人很烦燥,我觉得 Web 开发的速度优势不明显了。开发 ASP/PHP,边写程序边刷新页面是挺实用的方法,页面有太多的布局、UI元素,需要频繁的刷新来进行调整,这点 JSP 让人调的很麻烦。所以选择一个好的模版引擎可以省不少事情,我最喜欢 FreeMarker,当然还有 Velocity 可以用,还有一个有意思的东西,Antlr 配套的 Stringtemplate 也可以拿来用,非常不错。

使用动态语言编写 Controller。Controller 的职责出要是处理一些控制逻辑,数据库的操作它不需要来负责,所以 Controller 随着 View 的不同改动太大了,但也都是微调。因为经常需要改变,所以每次都编译一边实在恶心。当然了,各种框架几乎都提供了容器外测试的环境,我个人觉得后期可以将稳定的 Controller 写回静态类以提高性能并进行详细功能测试,但一般来说大可不必。采用一种好的动态语言可以省不少事情,譬如 Java 提供了统一的 BSF 可以选用很多动态语言,譬如 JavaScript,Jython,Groovy, BeanShell,JRuby 等等。初期效率不是最关键的因素,再说 Web 应用的性能瓶颈往往在数据库,Web 框架没必要太复杂。


业务、数据层可以脱离容器开发。这一层是 Java 的强项,完全可以脱离容器开发,进行单元测试,这对于 Java 开发人员往往是最得心应手的工作。

如果有时间到想用 Java 做一个这样的东西玩玩,似乎还漏了最重要的一点,Convention over Configuration,有了这个 Magic,效率才可能有魔术般的提升!

天下大势,合久必分,分久必合

永远无休止的 Web 框架之战,几乎主流的编程语言都涉及了 Web 开发,从 ASP/PHP/JSP 的兴起,从 Model1 到 Model2 的转变,几年间大家从简单的 ASP + ADO + XXX 到使用各种框架,框架优劣的讨论几乎成了争论的焦点。

我也是从 ASP 时代过来的,记得高中用 ASP 写了第一个留言板程序之后发现编程原来竟可以这么简单,随之接触了 Linux,接触了 PHP,接触了诸多开源的东西,至少那几年来写 Web 程序从来没有涉及过框架一说。直到用起了 Java,接触了 JSP,才逐步从 Model1 向 Model2 转变。JSP 一点都不比 ASP/PHP 简单,甚至开发速度也很慢,从一开始接触 Struts 就没发觉那点好,也从来没用 Struts 正经做过什么东西。从 Struts 诞生到现在5年多了吧,其间大大小小的框架层出不穷,似乎代码的 copy-paste 开发散发出不好的味道,大家纷纷追求更高层次的代码重用,掌握各种各样的框架成了求职的必备技能。不知不觉我们在走向一个极端,Java 各式的框架是在太多了,光是 Web 框架就够让人看花眼的了。

并不是所有时候框架都能带给开发者方便,当我在用 Java 开发 Web 的时候总是第一感觉想到我熟悉的 Spring-MVC,想到 Spring + Hibernate,自己动手搭建这么一个环境大概20分钟就过去了。就算能够开始写东西了也无法快速的看到原型,层次太清晰了,以至于不得不一层一层写,一层一层测试,写到 Web 层的时候发现自己写的一大半代码都是重复的。在这点上,脚本语言要方便得多,写 PHP 的 ShiningRay 写一个相同功能的程序甚至只需要 Java 版本的 50% 代码行数还不到,而且速度可以快上1倍,这还是保守估计。

于是太多的 Java Developer 投奔 RoR 的怀抱了,虽然我没有亲自试过 RoR,但是用过类 RoR 的框架 CakePHP,开发效率的确很高,框架的作用被很好的隐藏起来了。Convertion over Configuration,着实 Pragmatic。想当年大家都在写 Model1 的 Web 程序,Model2 的出现促生了无数 Web 框架诞生,各种各样的新鲜想法诞生了,出现了一批优秀的 Web 框架,但都自成体系。时间长了,大家都累了,学一个框架已经远远不够了,至少也要了解另外几个才行。RoR 推行的概念很好,抛开其他因素,按照约定俗成的规范来写程序。可能在 DHH 之前已经有很多人这么做过了,只是没有能够像 RoR 宣传的这么好罢了。从合到分,从分到合,技术总是在不断变换中前进,大方向是好的,都是为了提高生产力,关于语言、平台方面的争论就少一点吧,与其无休止的口水战还不如踏踏实实的写好程序。