Read Sean

Read me, read Sean.
posts - 439, comments - 521, trackbacks - 9, articles - 2

2008年7月24日


不知不觉已经1个多月没有更新了:工作占据了大量的时间和精力,没时间写随笔,没时间看Google Reader,甚至连Twitter、FriendFeed等快餐式的文字也被压缩掉了,真想好好喘口气。题外话先说这么多,和大家聊一件鸡毛蒜皮的“小事”。

上个周末的时候,我家所在的小区统一进行天然气改造,其实具体到每一户,并不是很大的工程,无非是热水器和炉具的燃气喷嘴需要更换。不过由于生产厂家采用的工艺配件等各不相同,这次改造首先是登记了各户的热水器和炉具的品牌,然后安排联系厂家在统一的时段上门进行改装。正好我家两样东西分别来自一家本土企业和一家外企,于是就有了下面的简单比较(“本”代表本土企业,“外”代表外企):

[进门]
本:你家是XXX室吧?我来换XX的。然后就进来了,赤脚。根本来不及说的。
外:您好,您家的XX是XX品牌的吗?我是XX的工程师,负责帮您更换XX。然后从自己包里拿出准备好的鞋套,在我的示意下进入厨房。

[改造过程]
本:你家这个怎么是这样装的?这样不好的,有什么问题不方便检修,如此云云。然后不管是喷什么除锈剂,还是需要敲打什么的,根本不管你家是否有小孩、孕妇、老人什么的,直接上手就干。甚至我开个窗他也要管:这个只是除锈剂,又没毒的。。一副不耐烦的样子。
外:整个过程都很注意安静,时不时还跟我讲解这次改造需要注意的一些事项,只要是和他们产品相关的,都一一介绍到。

[签收]
本:改装完了之后,大楼的天然气还没有通,于是就告诉我,等天然气来了,试试这样做,如果火不够大,就动一下这个机关,就好了,说着就拿出一个沾满油渍的本子,放在餐桌上,让我签字,然后就匆忙离开了。
外:改装完以后,由于大楼还没有开始供气,于是就先离开了一下,等到供气开始再回来检查是否能够正常使用,以及是否存在漏气的情况,所有这些做完之后,才拿出保修卡让我签收,并且介绍保修的细节。

如果换作是你,你更喜欢哪个工程师呢?这次也许是个特例,但也从一个侧面反映出本土企业和外企相比的一个具有普遍性的差距:这不仅仅是专业程度上的差异,甚至可能从专业角度,那个本土企业的工程师,效率还相对更高一些。我想更重要更核心的还是企业的服务意识,尤其是一线员工的服务意识。外企通常宁可多花些代价在细节上,比如培训、比如配套的奖金/晋升制度,而中国的很多本土企业,则更加强调成本控制和所谓的“规模效应”,殊不知这样杀鸡取卵、一味追求成本和规模的方式,从长远看,肯定是要付出代价的。

为什么相当数量的本土企业会在竞争中输给硬件实力相当、甚至不如自己的外企?为什么许多人对不少洋品牌会形成强烈的信任感,甚至近乎崇拜的心理,而对国货却总有那么多不屑和排斥,完全不管洋品牌的定价存在多大的暴利?不知道像这样的学费,我们还需要付多少,还需要用多少代人的青春去换。


posted @ 2008-07-24 00:31 大胃 阅读(57) | 评论 (0)编辑 收藏

2008年6月18日


刚看完法国对意大利的比赛,准备下载Firefox 3,结果你猜怎么着?Mozilla英文官网上提供的链接,到现在仍然是2.0.0.14,尽管图标已经更新成了Firefox 3,而Mozilla中文官网,干脆就连不上了。(实际上是mozilla.org.cn连不上,不过貌似中文官网不知什么时候已经改成了mozillaonline.com,但提供的仍然是RC3。)

其实在昨天,就已经有人对Mozilla选择在PDT 10:00 AM开始Download Day提出了异议,因为既然Firefox是面向全球的粉丝,这次下载活动也是全球范围内进行,为什么要选择在大半个欧洲都处于当天深夜,大半个个亚洲都已是第二天凌晨的时候启动呢?

好吧,我们尊重Mozilla的选择,但是看来好事多磨,在PDT 10:00 AM,也就是北京时间凌晨1点过去4个多小时后,仍然没法顺利下载到正式版。

来自CNET的跟踪报道:
http://news.cnet.com/8301-10784_3-9970628-7.html

[更新|2008-06-18 06:15:00]
决定DIY一下,不等官网刷新了:
http://download.mozilla.org/?product=firefox-3.0&os=linux&lang=en-US
注意后面的参数,根据需要,os可以选择linux/osx/win,lang可以选择en-US/zh-CN等等。


posted @ 2008-06-18 05:30 大胃 阅读(197) | 评论 (1)编辑 收藏

2008年6月17日


或许多少和Python/Django这个社区的人们比较内敛、慢条斯理、喜欢埋头做事有关,Django一直以来版本号更新都很保守,到现在还是0.96。什么时候才有1.0这个问题被人提起无数次,这让很多对它有兴趣的朋友处于长期的观望之中。眼睁睁看着隔壁Rails如火如荼的都出到了2.1.0,Django终于要有动作了:

http://code.djangoproject.com/wiki/VersionOneRoadmap

根据这份线路图,今年7月,Django会推出1.0的第一个alpha版本,接下来在8月会有两次beta和一次rc,如果一切顺利的话,让许多人望眼欲穿的Django 1.0将有望于今年9月正式同大家见面。


posted @ 2008-06-17 18:14 大胃 阅读(142) | 评论 (0)编辑 收藏

2008年5月28日


JVM下的Ruby语言实现JRuby发布1.1版的第二个升级版1.1.2,这个版本最主要关注的仍然是性能,值得一提的包括:
1- 启动时间大大缩短。
2- YAML标记解析速度提高100x以上。
3- 方法调用在性能、线程和栈深度等方面的增强。
4- 其他bug。

主页: http://jruby.codehaus.org/
下载: http://dist.codehaus.org/jruby/


posted @ 2008-05-28 12:08 大胃 阅读(934) | 评论 (1)编辑 收藏

2008年5月2日


最近在家休息,想来Ubuntu新的LTS版本8.04已经出来一周多了,试试看吧,正好想给家里的服务器来一次升级,未曾想这一试让我彻底和Ubuntu说了bye bye。

我的主打机器是一台T43,在3月下旬,这台ThinkPad就彻底从Ubuntu变脸成了Arch Linux,运行至今,十分稳定,要速度有速度,要功能有功能,简单而强大,让人爱不释手。我家里有一台"老"机器,AMD Athlon 2500+ / 512M,先后装过SuSE、Fedora、CentOS、Debian、Ubuntu 7.10,由于很长一段时间以来都比较忙,没时间去折腾,在最后这次开刀之前,定格在了Gusty Gibbon。

说回这次开刀。趁休假有时间,我打算再整理/升级一下这台服务器,正好Ubuntu 8.04 LTS出来,冲着省事(平时难有时间去折腾)和LTS,我想这应该还是比较自然的一个选择。安装过程很顺利,该找到的硬件都找到,一切都还像是Ubuntu在7.10基础上正常的一次升级版,谁知刚配置完几个我常用的应用程序/服务,就遇到了严重的问题:系统会随机(通常几分钟时间)锁住,没有反应,键盘灯和鼠标灯还有反应,但是屏幕定格,Ctrl-Alt-Backspace或者Ctrl-Alt-F1等等,都不管用了,什么提示都没有。硬件问题?不像啊,之前的Gusty跑得很好。网上一搜,好家伙,还是普遍现象:

http://ubuntuforums.org/showthread.php?t=768200

没想到拿LTS的正式ISO安装,还是无奈的做了一次小白鼠,对Ubuntu印象因此大打折扣。算了吧,装回熟悉的Debian,一切又恢复安静。从今天起,我的Linux推荐榜调整为:公司服务器 - CentOS、个人服务器 - Debian、个人桌面 - Arch Linux。

So long, Ubuntu!


posted @ 2008-05-02 17:35 大胃 阅读(180) | 评论 (3)编辑 收藏

2008年4月5日


JVM下的Ruby语言实现JRuby正式发布1.1版,这个版本最主要关注的是性能,除此之外,值得一提的包括:
1- 支持将Ruby代码编译成Java Bytecode。
2- 将Oniguruma这个Ruby 1.9标配的正则库移植到Java。
3- 重构过的IO实现。
4- 更低的内存消耗。
5- 修复大量其他兼容性问题。

主页: http://jruby.codehaus.org/
下载: http://dist.codehaus.org/jruby/


posted @ 2008-04-05 23:01 大胃 阅读(896) | 评论 (0)编辑 收藏

2008年3月12日


一篇关于目前开发中的KDE 4.1最新进展介绍
http://polishlinux.org/kde/kde-41-visual-changelog-rev-783000/

看上去挺不错的,有了KDE 4的基础,从4.1开始,一些之前来不及polish的地方开始逐渐被弥补。


posted @ 2008-03-12 00:27 大胃 阅读(195) | 评论 (0)编辑 收藏

2008年3月11日


最近尝试把一个Oracle数据库,连同构建在这个数据库上的Java应用移植到PostgreSQL环境。在移植过程中,总结了一些要点,一方面作为笔记备忘,一方面也给有类似任务需要处理而又无从下手的朋友作为参考。

1- 首先是准备PostgreSQL环境。有条件的话,最好是找一台空闲的PC机作为测试服务器,安装Linux或BSD,然后从源码编译最新的PostgreSQL 8.3.0。编译时,通过configure指定--with-perl和--with-python以支持PL/Perl和PL/Python。因为绝大多数Linux发行版都已自带Perl和Python,不必额外安装。

2- 如果是Windows环境,又需要Perl和Python,则必须额外安装,Python的话,可以方便的找到2.5 for Windows的安装包,Perl的话,推荐ActivePerl,相对麻烦一点,为了后面用到的一些便利的功能顺利加载,Perl版本尽量选5.8.8。

3- 创建数据库和用户。通过initdb初始化数据目录,配置postgresql.conf指定主机IP、端口等等信息,配置pg_hba.conf指定访问权限,通过pg_ctl -D <数据目录> -l <日志文件> start启动postmaster,然后createdb、createuser创建数据库和用户。数据库建好之后,就可以createlang -d <数据库名> [plperl|plperlu|plpython|plpythonu]开启PL/Perl和PL/Python。具体命令行参数可通过各命令加--help查看。

4- 安装PostgreSQL客户端pgAdminIII,最新版是1.8.2,有条件的话,也可以下载源码自己编译。

5- 安装Oracle客户端,需要在PostgreSQL同一台机器,以便Perl用于连接数据库的DBI和Oracle驱动DBD::Oracle模块顺利安装。如果是Windows上的ActivePerl,则可以通过ppm install DBD-Oracle,如果是Linux/BSD,则可以通过CPAN来安装,如perl -MCPAN -e shell进入CPAN Shell,通过install <模块名>或force install <模块名>安装DBI和DBD::Oracle。

6- 数据库的移植,可以选择ora2pg来帮忙,目前的版本是4.7。ora2pg是一个用于读取Oracle数据库schema、数据,并生成PostgreSQL脚本或直接导入PostgreSQL数据库的Perl工具。用法很简单,就是通过.conf文件指定数据库连接信息包括NLS_LANG、需要导出导入的schema、table、view、data等等,然后执行一个pl脚本。这是目前相对比较成熟的一个方案,但是遇到schema复杂、约束较强的数据库,需要手工处理的地方还是不少。建议不要直接写入PostgreSQL,而是生成SQL脚本,验证无误后再执行。ora2pg默认会把Oracle中名称的大写转换成小写,因为PostgreSQL在解析SQL时,除非""括起来,默认都是转成小写。schema、table、view、sequence、data等等,基本用ora2pg,加上一些手工调整即可搞定。至于function、stored procedure等,还是手工移吧,偷不得懒。除了ora2pg,其实也可以配置DBI-Link,将Oracle数据库挂到PostgreSQL数据库作为一组独立的"schema",然后用create table xxx as select ... from ...这样的语法来倒表和数据。PostgreSQL的contrib包也附带有一个dblink,不过是连接其他PostgreSQL数据库的,如果需要连接非PostgreSQL, 还是考虑DBI-Link,任何可以通过Perl的DBI接口访问的数据库,都能link进PostgreSQL。

7- 接下来就是Java应用本身了,我这次移的这个应用是Spring+iBatis架构的,很多SQL语句都是明文,好在DAO层的基础部分(CRUD)的SQLMap是工具自动生成,且都是符合ANSI SQL92标准的,不需要修改即可使用。其余的高级查询SQL,需要调整的地方不少,一些常见的修改列举如下:

i. SELECT出来的column(包括子查询),如果有别名,必须加AS,比如 select null as some_column from some_table;
ii. PostgreSQL没有dual表,类似select 0 from dual的语句,写成select 0即可;
iii. DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;
iv. NVL()函数,PostgreSQL中相对应的是coalesce(),其实几乎所有主流DBMS都支持coalesce,包括Oracle,这才是标准写法;
v. 比较日期,在PostgreSQL中,建议使用date_trunc('day', SOME_DATE) = date_trunc('day', #enteredDate#)这样的写法,其中'day'位置可选字段包括有year、month、week、hour、minute、second等等;
vi. SYSDATE,对应到PostgreSQL是current_timestamp,可以根据需要使用current_date;
vii. ROWNUM,通常我们用ROWNUM都是为了限制查询出来的记录数,PostgreSQL没有这个关键字,需要改成在SELECT语句最后添加 LIMIT语句,如LIMIT 100;
viii. (+)这样的外连接写法需要调整为SQL标准的 table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);
ix. CONNECT BY ... START WITH ... 递归查询可以参考 http: //www.postgresql.org/docs/8.3/static/tablefunc.html 的connectby()函数.

最后再多提一点,PostgreSQL自带的过程语言是PL/pgSQL,在PostgreSQL上写function,除了用plpqsql,还支持sql、plperl(u)、plpython(u)等等。如果你对SQL天生过敏,看类似PL/pgSQL的代码都很吃力,别说是写了,你完全可以用你喜欢的语言来表达函数和存储过程的逻辑。有了PL/Python,你还怕什么呢?你几乎能做任何事。

[更新 20080313] 把JDBC驱动的部分漏掉了,移植Java应用时,除了改SQL,还需要拿PostgreSQL的JDBC驱动放到classpath下面,如WEB-INF/lib,然后修改数据库连接URL,改成jdbc:postgresql://<ip>:<port>/<dbname>即可。

[更新 20080323] 移植schema和数据时,比ora2pg更方便的一种方式是利用EnterpriseDB的Migration Tool,将Oracle的JDBC驱动ojdbc14.jar拷贝到EnterpriseDB安装路径下的jre/lib/ext下后,启动Developer Studio即可建立Oracle连接,选中schema后,可以通过右键Online Migration将schema、数据、函数包等等一次性通通导入EnterpriseDB。如果要继续往"纯"PostgreSQL移,从EDB做backup,然后到PostgreSQL下做restore,这样会丢掉函数包,因为毕竟EDB在PostgreSQL基础上做了相当改造以和Oracle兼容,不过函数包之类还是手工移比较稳妥。


posted @ 2008-03-11 23:04 大胃 阅读(404) | 评论 (0)编辑 收藏

2008年3月5日


啥也不说了,开心!


posted @ 2008-03-05 05:39 大胃 阅读(162) | 评论 (0)编辑 收藏


在JRuby得到Sun的认可并成功发布1.0,已经向1.1迈进之时,比Ruby应用更广、更早出现JVM运行版本的Python也终于得到了Sun的重视:

http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/

尽管Sun官方的说法是他们会更多的应用和扶持native版的Python,相信一直饱受冷落的Jython,也多少会从中受益吧。


posted @ 2008-03-05 00:07 大胃 阅读(188) | 评论 (0)编辑 收藏

2008年2月29日


就在2月的最后一天,Apache Harmony发布了5.0的第5个milestone: http://harmony.apache.org/

为默默耕耘的人鼓掌。


posted @ 2008-02-29 23:28 大胃 阅读(188) | 评论 (0)编辑 收藏

2008年2月24日


本赛季状态渐佳,外号"禁区之狐"的阿森纳小将Eduardo在英超客场对阵Birmingham City中惨遭暗害:

(由于实在太过血腥,不忍心放在首页,请点击查看)

在此强烈谴责Martin Taylor这次不负责任的野蛮铲球,只给你红牌实在太轻了。让我们共同为Eduardo祈祷,祝愿他早日康复!也希望绿茵场上不要再发生类似的惨剧。足球应该是给人带来快乐的,不是人身伤害。


posted @ 2008-02-24 13:22 大胃 阅读(181) | 评论 (0)编辑 收藏

2008年2月7日


春节期间真是好事不断啊,继PostgreSQL 8.3正式release后,Grails也如约发布1.0版。作为受到Ruby on Rails启发开动的"Groovy版Rails"项目,它在设计哲学上和Rails,包括JRuby版的Rails,有着很大的不同,Rails是从头开始用Ruby完整实现从表现层到ORM所有功能,而Grails则是利用Java社区现有的成熟开源框架,如Spring、Hibernate等,在此基础上整合出一套完整的Web应用框架,有点类似Pylons和Django的区别。

之前一篇随笔也提到过,和其它在JVM中运行的动态语言如Jython、JRuby不同的是,Groovy对于有Java基础的人们来说,学习曲线几乎是平的,上手很快,如果你同时也熟悉Spring和Hibernate等,那么Grails更是不二之选。

官网: http://grails.codehaus.org/
Release Notes: http://grails.org/1.0+Release+Notes
下载: http://grails.codehaus.org/Download


posted @ 2008-02-07 10:47 大胃 阅读(215) | 评论 (1)编辑 收藏


经过1月3日和1月18日两轮RC后,PostgreSQL 8.3终于在本月初正式发布了。该版本有很多功能和性能上的重大提升,包括全文搜索、新的数据类型(XML、ENUM、UUID等)、并发autovacuum、异步提交等等,以及对Windows平台更好的支持,如SSPI和VC++等。

官方声明: http://www.postgresql.org/about/news.918
Release Notes: http://www.postgresql.org/docs/8.3/static/release-8-3.html
各版本功能对照: http://www.postgresql.org/about/featurematrix
下载: http://www.postgresql.org/ftp/


posted @ 2008-02-07 10:04 大胃 阅读(224) | 评论 (0)编辑 收藏

2008年1月27日


如果你有一定的Java基础,想快速的尝尝动态语言的味道,Groovy是个自然的过渡选择。今天无意中看到一篇介绍Groovy的文章,很短,也很有趣,从一个典型的Java程序开始,一步一步"Groovy化",最终改造成一个完整的Groovy程序:

http://java.dzone.com/news/java-groovy-few-easy-steps


如果你对当下动态语言的现状有所了解,那你多半已经知道能在JVM中运行的动态语言,远不止Groovy一种,那么什么理由会让你选择Groovy而非Jython、JRuby或者其他类似的语言呢?笔者认为主要还是编码习惯和风格,Groovy是这些语言中最接近Java的。Jython和JRuby都是从其他成功的动态语言"移植"过来,带有明显的Python、Ruby语法特征和习惯。选择Jython或者JRuby的朋友,我想大都是原本就有Python或者Ruby的基础,舍不得Python和Ruby的一些很方便的语法和编码风格/习惯/哲学,或者干脆就是为了将Python和Ruby世界的一些框架引入到Java中,或者说是让Python/Ruby应用能够更好的利用Java平台已有的资源。如果你在动态语言上没有这方面的需求,只是为了让你的Java应用更动态,选择Jython或者JRuby只能是凭空增加学习难度。要知道,Python和Ruby都是很有特点、很有个性的语言(其实Java又何尝不是),要从Java的思维和哲学,转向Python/Ruby的思维和哲学,并不是那么容易做到和做好的。


posted @ 2008-01-27 17:14 大胃 阅读(351) | 评论 (2)编辑 收藏