星期二, 十二月 26, 2006

Django 学习笔记 - Apache2 + FastCGI

昨天开始学习Django站点的生产服务器(Production Server),尝试了一下lighttpd和Apache2,最后决定采用Apache2来搭建整个环境(其实lighttpd更为方便一些)。

虽然Apache2 + mod_python就可以跑Django站点服务,但是听说FastCGI有更优异的性能。

FastCGI applications are fast because they're persistent. There is no per-request startup and initialization overhead. This makes possible the development of applications which would otherwise be impractical within the CGI paradigm (e.g. a huge Perl script, or an application which requires a connection to one or more databases).
需要让Apache2支持FastCGI,就必须下载mod_fastcgi这个Apache模块。可以从http://www.fastcgi.com/站点下载,不过非Windows用户需要自行编译这个模块,其实也挺方便的。下面是我在 Ubuntu 下安装的例子:

apt-get install apache2-dev # 会安装Apache2开发相关的库
cd $mod_fastcgi_dir
apxs2 -o mod_fastcgi.so -c *.c # 编译
sudo apxs2 -i -a -n fastcgi mod_fastcgi.so # 安装到Apache2/modules里面去,同时会到apache配置里面加上一条加载语句

mod_fastcgi.so就这样完成了,下面需要配置你的Django站点。首先去下载 flup,然后写一个mysite.fcgi,这个在Django的站点上有介绍,里面需要指定Django应用的绝对路径。
#!/bin/bash

# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"

cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi

exec /usr/bin/env - \
PYTHONPATH="../python:.." \
./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
这个文件搁在你的Django应用的根目录里面,改成可执行属性。然后你每次只需要执行这个文件就可以将Django以FastCGI方式启动出来了,启动后你是不能够直接访问的,因为不是走的Web方式。

下面我们看一下Apache相关的配置:
# Connect to FastCGI via a socket / named pipe.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock

<VirtualHost 12.34.56.78>
ServerName example.com
DocumentRoot /home/user/public_html
Alias /media /home/user/python/django/contrib/admin/media
RewriteEngine On
RewriteRule ^/(media.*)$ /home/user/public_html/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</virtualhost>
$1处我遇到了一个奇怪的问题,因为用的是 Ubuntu,没在其他平台试过,/$1会指向硬盘的/media物理路径,很奇怪,所以需要修改这个路径为Django的站点目录,即将DocumentRoot的地址再写一遍。

这样一来,整个Apache2+FastCGI就完成了,的确比较费力气。

星期四, 十二月 21, 2006

Django 学习笔记 - i18n 支持

最近再用 Django 做东西,顺便写点笔记做下记录。

今天折腾这个 Django 的 i18n 支持着实费了点功夫,主要是一开始没理解 Python 做 i18n 的原理导致。废话不多说了,使用 Django 的 i18n 支持还是相当的方便的。Django 的官方文档上讲的很详细了,但是篇幅过长,我也是硬着头皮看了几遍才搞明白,下面我就简单介绍一下最快捷的方法。

首先,从配置入手,settings.py 里面有一个 LANGUAGE_CODE属性,这里设置了网站默认的语言。由于settings.py里面的属性支持重写,所以从官方文档上可以得知,默认情况下已经启用i18n支持了,我们需要加入一些middleware来支持动态切换语言。

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
)
注意顺序,LocaleMiddleware必须在SessionMiddleware下面,因为需要从Session里面获取一个语言类型,这些Django都有现成的了,很方便。

在urls.py里面配置一个i18n的辅助应用
(r'^i18n/', include('django.conf.urls.i18n')),
有了这个就可以自由的切换语言了,使用/i18n/setlang/?language=en这样的形式。

配置完成之后在项目目录底下建立一个locale目录,locale下子目录的样式有固定格式,如:
locale/<language>/LC_MESSAGES/
如果是中文,对应的目录就是
locale/zh_CN/LC_MESSAGES/
如果是英文,则应该是
locale/en/LC_MESSAGES/
以此类推。

为了在django里面使用i18n,po文件名必须为djang.po,编译过后必须为django.mo,那么翻译的内容就固定在po文件里了。一个典型的po文件类似一下样式:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-12-21 14:00+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "Home"
msgstr "Home"

msgid "News"
msgstr "News"

格式相对比较简单,也是键值对的形式。如果是多行的话,需要使用msgstr ""的形式,首行不写东西,在后续的几行写文本,翻译出来的结果会由程序自动把文字组合到一起。

编写完的po文件需要编辑成二进制的mo文件才可以被django使用,django使用了gettext来实现翻译,所以mo格式也是gettext要求的。

在linux下使用msgfmt -o django.mo django.po即可完成转换过程,相当方便,windows下需要下载poEdit这个软件。

翻译工作都准备就绪了,接下来就是体现到模板上去了,首先加载i18n,在模板文件的头部加入{% load i18n %},下来对于需要i18n支持的字段使用{% trans 'Key' %},这里的Key就是msgid,很简单吧。

这里仅仅介绍了Django i18n的一个快速上手配置,更详细的内容请参考
http://www.djangoproject.com/documentation/i18n/

星期三, 十二月 20, 2006

回到 Ubuntu 的世界

总算下决心把笔记本上的 FreeBSD 删了,我的确没这个耐心去打各种各样的补丁来支持我的硬件了。Ubuntu 对桌面的支持已经非常强大了,安装很顺利,我的所有硬件都认出来了,包括无线网卡和声卡,这是一件很愉快的事情。Linux 有着强大的用户群和开发群,这点和 FreeBSD 的应用哲学还有点不同,我们房东雨同学说 FreeBSD 是“爱用不用”,呵呵,桌面环境是有点难用了。

看到众多老大们在玩 Beryl,的确够玄,于是立即将机器的 Ubuntu Dapper 升级到了 Ubuntu Edgy,可以不用重新安装就升级,输入命令 gksudo "update-manager -c -d",会显示一个升级选项,要下载645M数据,升级过程大概2小时左右,还不错。

升完级就装 Beryl 吧,就可以玩到很酷的 3D 桌面了,一点都不逊于 Vista 哦。

星期二, 十月 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 宣传的这么好罢了。从合到分,从分到合,技术总是在不断变换中前进,大方向是好的,都是为了提高生产力,关于语言、平台方面的争论就少一点吧,与其无休止的口水战还不如踏踏实实的写好程序。

星期四, 九月 28, 2006

见到了 Java 之父 James Gosling

居然能和 Java 之父 James Gosling 一起合影这对于一个 Java Developer 来说是多么兴奋得事情!James 来公司作客,公司组织了一个讨论会,虽然很多同事都不是 Java 开发人员,但对于 Java 之父的到访还都是很感兴趣的,大家也都纷纷提问。我也凑了个热闹,提了个问题。

Q:As you mentioned functional programming, which gets ideas from mathematics. They have many language spotlight like continuation, closure and so on. Does java consider introducing these features in the future?

似乎 James 对这个问题也是颇有感触,他说 Closure 和 Continuation 的支持现在更多的是一场争论,似乎无穷无尽。函数式编程的确是一件好东西,可以有效地减少代码数量,但是同样他带来的一个缺点就是晦涩难懂。做 Java 的一部分开发人员其实并不是纯粹的计算机出生,所以他们并不一定有扎实的数学基础,对于函数式编程的理解可能比较困难,不自然。不过嘛,虽然 Continuation 没什么戏了,我们依然可以通过 Inner Class 或者 Anonymous Class 的方式凑活当 Closure 用吧。

会上还有同事提到一些关于现在高性能计算的问题,也是最近双核 CPU 的出现,大家对于双核甚至多核比较关注。根据 James 的介绍,Java 的线程方式对于多核的支持非常完善了,在数百个 CPU 上的多线程表现也算不错,但是在上千个 CPU 上的尝试还是不太理想,毕竟这么多 CPU 有很多无法预料的情况产生。当有人问及未来会不会出现一种具有更高生产力的编程语言是,他回答道如果未来可能产生一门语言在并行计算上具有压倒性优势的话,那么这门语言就是最有希望的。目前除了 Java 之外,FP 和基于消息的语言(类似 Smalltalk 的理想模型)是三种主流趋势,他看好 Java,毕竟后两种语言绕开了共享内存的缺陷,但是要想让大众接受比较困难一点。

时间比较短,而且大家也都是问得比较随意,没有刻意去准备,再加上 James 估计也就是走个过场,座谈会就匆匆结束了。

能够与 Java 之父面对面,还是一件很高兴得事情!

给笔记本装了个 FreeBSD

公司发了个新本 Dell D420,本身带的是 WinXP,我给分了一下,按个 FreeBSD 玩玩。

找了张 FreeBSD-6.0 Release 的盘把系统作了一下,因为 FreeBSD 需要一个主分区来安装,所以事先要预留以下。因为安装完后 FreeBSD 会把 MBR 重写一遍,所以理论上先装好 WinXP 再装 FreeBSD 比较好。

安装完启动 FreeBSD,进入命令行界面,默认是 C Shell,而且发现连个 ls 色彩都没有......在 FreeBSD 的世界里,自己动手吧。

给 ls 加颜色
vi ~/.cshrc
添加 alias ls ls -G

有了好看点的颜色之后,开始安装一些常用软件。FreeBSD 的 pkg_add 安装二进制软件包非常方便。X Window 默认已经安装上了,接下来按个 gnome 使用 pkg_add -r gnome2。装完之后执行 echo /usr/X11R6/bin/gnome-session > ~/.xinitrc,以后就可以用 startx 来启动 gnome 了。

进了 gnome 之后就开始装自己的软件吧,像 opera, thunderbird, openoffice 等都是必备的工具哦。

星期三, 九月 27, 2006

目前想学的东西

感觉自己现在又陷入了一个学习的谜团,暂时不做 Java 了,到了一个新的环境,想接触一些新的东西。大概整理了一下,觉得下面的一些东西将作为我目前阶段学习的目标。

  • FreeBSD - 虽然还是非常喜欢 Linux,但是在新环境里学习 FreeBSD 显然是一个更好的选择,有这么多高手可以请教,并且自己也很感兴趣,应该是个不错的选择。
  • PHP - 随着 RoR 的兴起,各种类似 RoR 的框架应运而生,CakePHP 是一个不错的 PHP 框架,目前业余时间拿它和 ShiningRay 一起做做有意思的东西。
  • Python - 一直是最喜欢的语言之一,虽然没有正式用它做过什么东西,决定看下网络方面的内容,譬如一些类 RoR 框架,如 Django。网络方面比较有名的 Twisted 有时间也想好好看看。
大概就这么些了,东西还是很多的,光是 FreeBSD 就是一个庞大的知识库,不过只要有兴趣在,我相信学起来还是很有意思的。

星期日, 九月 24, 2006

The Depth of Dream

昨天睡到中午12点才起,我妈来北京看我了,住我那,大早上的在帮我洗衣服,所以一大早我就隐隐约约的听到洗衣机和其他东西的响声,不过实在太困了,断断续续的睡着。

我睡眠一直不好,多梦,而且非常容易做梦,并且有些时候我都可以知道自己在做梦。做梦很累,尤其是当你发现原来你的梦其实可以具有 depth 属性的时候......

早上半梦半醒具体都梦了啥到现在已经都忘了,以后决定要把梦到的东西第一时刻记下来,挺有意思。不过让我记忆比较深刻的是我做梦醒来睁开眼看到了前面的门,但是有一点很重要,虽然我看到如此真实的一幕,可事实上这还是在做梦。我的梦中的场景和真实场景一抹一样,但是这的确是梦,我梦见自己睡在床上,并且是从梦中醒来,其实也就是我梦见自己在做梦,很奇妙的感觉。正像我朋友所说的,你在梦中看到的东西越清楚,你会发现醒来越累,毕竟你的大脑为了达到如此真实的效果进行了非常精细的渲染。我的梦中梦梦见了我在树林里玩,和我的好朋友一起,微微细雨,看看水面还有纹理效果。我还坐上过山车,坐真的过山车在进行360度回旋的时候我都不能清楚地记得那是什么感受,但是梦中梦却把这真实的一幕呈现给我,并且让我感到真实的失重,计算得如此精确。

早上醒过来真是特别的累,不过我还是喜欢做梦,或许梦能够给人一种精神寄托吧,毕竟这都不是真实的。

Organize your life

“Organize your life!” Palm 设备的经典广告语了,我觉得很有意义。忙碌的项目接近了尾声,现在比之前的两个星期稍微轻松了点。

其实很多时候我们每天工作8小时,面对着电脑,并不是8个小时完完全全是在工作,人毕竟不可能长时间集中尽力干一件事情,总有打岔的时候。就像大多数人喜欢上班时看看新闻一样,我在工作中也总是要抽点时间看看自己感兴趣的东西,譬如上上 TSS,JavaEye,Python 社区等等。

说实话,做某种技术一旦长时间不接触就会手生,我已经很久没写过 Java 代码了,不知道现在写会不会手生。虽然非常喜欢 Python,但是并没有用 Python 正经做过东西。现在就写 JavaScript 熟,但是毕竟 JavaScript 没有太多令人期待的功能。总是有很多东西想学,又总是感觉时间不够,其实细细想想,并不是时间不够,而是自己不会规划自己的时间。每天会在网上闲逛,看看帖子,总想着以“高手”的身份上去说教一番。如果能够合理的安排时间,那么每天会有更多的长进。手边放一本记事本,随时写写,对每天的8小时进行一下合理的分配,尽可能的按照自己规划的时刻表走,那么每天将会有更多的时间用来学习。

感觉合理规划时间是应该着手去做的,就从下周开始吧!

星期五, 九月 22, 2006

QQ 也太过分了

今天在 QQ 里面想向大家推荐几个 Ubuntu 的源,没想到输入 3322.org 居然会被屏蔽,很不理解 QQ 的这种行为!

我们需要动态语言因为它足够灵活

写了一段时间 JavaScript,感觉比写 Java 思维更开阔。虽然 JavaScript 提供了非常有限的 API,但是灵活的语法可以让人有更多的自由空间。

Java 的语法的确很死板,因为需要编译,并且是强类型的语言,所以类型问题经常能够困扰人。虽然也提供了 Hashtable/Map 之类的数据类型,但是严格的语法限制了人们发挥想象。

很多时候我们希望能够动态创建一些对象,因为对象的属性是未知的,这时候用 JavaScript 可以绝对的方便,当然我们还可以为这个对象添加额外的函数。

函数式编程可以有效的缩短代码长度,虽然 Java 也可以通过匿名类的形式模拟内嵌函数,但是对类型的依赖使得语法绝对不够灵活。

不需要明确声明类型有时候的确比较困扰人,但在很多场景中确是非常灵活的。JavaScript 灵活的类型使得整个编程模型异常简单,很多时候,我们只不过就是在几张变量符号表中操作操作而已,一切就是这么简单。

灵活的代价是缺乏规范,没有类型,没有接口,就需要良好的代码结构和文档来进行多人开发,这也是脚本语言开发的一个弊端。下面的一种方式我觉得很不错,从dojo里面看来得。
function swap(/* string */a, /* string */b) { .. }
或许有时候注释一下类型会让代码变得稍微清晰一点,当然了,多积累点单词,把函数、变量命名的易读一点才是正确的方法。

JavaEye 中一篇有趣的文章

原文在:http://www.javaeye.com/topic/24453
最近似乎因为 RoR 的缘故,上 JavaEye 总带着异样的眼光,这不刚去 Ruby 专区看看又有感慨了。
Render 一词毫无疑问翻译为“渲染”,在 Web 开发中用的实在常见,居然遭到质疑,不可否认怀疑的态度是好的,但是有点过了...

星期四, 九月 21, 2006

原来同时更新多个 Blog 如此简单

最近发现 email 真是好东西,不觉喜欢上了这个。于是乎学习 ShiningRay 同时更新多个 Blog,因为每个 Blog 都提供 email 更新,所以通过 email 相互发送更新成立了一件非常有意思的事情。

新的 Blog 足迹

很多朋友开始用 Blogger 了,居然可以用 Google 的帐号登录,很感兴趣!随着 MSN 的一次失败升级,那个糟糕的界面实在无法让人忍受了,迁移到 Blogger 上来啦!