Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4

     摘要: 由于工作需要,今天简单的看了一下Java生成PDF的相关资料。综合看下来,除了使用报表平台和OOo的附带工具,目前使用较为普遍的有两个途径:iText和Apache的FOP。从实际出发,我们分别看看两者处理带有中文的PDF的具体用法吧。  阅读全文

posted @ 2008-10-05 23:28 laogao 阅读(13707) | 评论 (11)编辑 收藏


就在国庆大假这几天,Python 2.6 (final)悄然发布了,作为为Python 3000 (3.0)铺路的2.x更新版,2.6的发布颇具有里程碑式的意义。

Download: http://www.python.org/download/releases/2.6/
What's New: http://docs.python.org/whatsnew/2.6.html


posted @ 2008-10-04 21:29 laogao 阅读(456) | 评论 (0)编辑 收藏


动机

FX - 全幅当然是最大的动机
7 - 幸运数字 (D70s、G7、D700)
宝宝出生 - 要为宝宝准备拍摄工具
29岁生日 - 是啊,马上奔3了
反转冲印麻烦,越来越少,越来越贵 - 上海已经涨到25/卷(单冲),且各家风格、质量参差不齐
入门/业余 -> 高级发烧   - 原本玩EOS 5和Sigma EX系的人,怎么能停留在D70s
没有DX头负担 - 之前有兼容FM3A的考虑,所以手头没有DX头,FX可以无缝升级
双机双镜  - 其实加上小三是3机3镜(不含GR1S和G7)
手动头测光 - 其实手头只有一个35/2AIS是手动,不过今后会不会淘其他手动头玩呢?会不会ZF呢?呵呵
闪光灯同步终端 - "一代神灯"SB-16终于可以从热靴上解放了

感受

结实 - 之前有摸过D300,不意外,但仍然觉得够份量,外拍1天明显感觉手酸
色彩 - 饱满,还原真实,LCD预览已经很讨人喜欢
直出 - JPEG直出已经有很高质量,包括高ISO下的片子
对焦 - 坚决,很少出现"拉风箱",暗光条件下同样表现出色
顶极 - "N家顶极机身三大特性"占了两项 (机顶左侧拨盘、圆取景器)

总体来说D700很让人放心,有了它,不用再想D3了。


posted @ 2008-10-03 22:39 laogao 阅读(445) | 评论 (0)编辑 收藏


Uma Thurman一直是我比较欣赏的女演员之一,10年前的一部影片The Avengers中和Ralph Fiennes演对手戏,让人印象深刻。"The Life Before Her Eyes" (豆瓣) 是Uma出演的新片,讲述的是美国某中学一次校园枪击事件背景下,一个"问题少女"对生命、亲情、友情的反思、觉醒和抉择。

整个影片节奏张驰有度,看似随意的蒙太奇式的镜头切换,在影片结尾你终于明白整个故事时,变得完全顺理成章,完美的交织在一起。画面和语言的处理也十分见功力,是一部唯美而略带伤感的片子。在当下这个充斥着铜锈气味的电影大环境下,如此精雕细琢的作品,实在不多见,适合静下心来观看和回味。


posted @ 2008-09-07 23:09 laogao 阅读(389) | 评论 (0)编辑 收藏


通过Groovy实现邮件通知(其实是转发到ANT)十分容易,先上代码:

 1 ant = new AntBuilder()
 2 
 3 def mail(subject, body, attachment = [dir:".",files:[]]) {
 4     ant.mail(mailhost:"mail.com", mailport:"1025", user:"mailer", password:"123", subject:"${subject}") {
 5         from(address:"nobody@mail.com")
 6         to(address:"nobody@mail.com")
 7         message("${body}")
 8         attachments() {
 9             if (attachment.files) {
10                 fileset(dir:"${attachment.dir}") {
11                     attachment.files.each {
12                         include(name:it)
13                     }
14                 }
15             }
16         }
17     }
18 }
19 
20 attachment = [dir:"/tmp", files:["some.properties","some.sql"]]
21 mail("Test mail message at ${new Date()}""This is a test message.", attachment)
22 

这个简单的例子很好的展示了如下Groovy特性:
1- Groovy脚本可以不需要定义任何class,方法定义和实际调用也可以混在一起,十分顺手。
2- 定义变量不需要指定类型,只要赋值即可,不过运行期依然是强类型。
3- 方法参数可以有默认值。
4- List和Map的构建直接在语义层面提供支持,如[a:1,b:2]和[1,2]。
5- GString使得我们可以方便的在String中引用变量甚至是表达式,如"${a.b.c}"或"${new Date()}"。
6- 逻辑判断在true/false基础上有所扩展,[](0个元素的List)和null均做false处理。
7- Closure支持,方便我们在外围代码处“当场”指定处理逻辑,省去了大多数在Java中需要匿名内部类来处理的麻烦,如attachment.files.each { .... },只有一个传入参数时,可直接用it指代。
8- 与ANT的无缝集成,以及对Builder模式的良好支持,使得我们可以写出上述初看上去有些不可思议的代码。

P.S. 虽然Groovy自己已经bundle了ANT,可以直接使用其中的绝大多数功能,不过为了调用ANT的mail task,还需要将ANT发行版中带有的ant-javamail.jar以及JavaMail API对应的jar包(可以从Sun网站下载)加到classpath。如果你的JDK版本低于6.0,还需要activation.jar。


posted @ 2008-08-27 18:55 laogao 阅读(736) | 评论 (0)编辑 收藏


前一篇随笔提到目前计划系统学习Python和Groovy,有什么比实际使用更好的学习途径呢?1年多以前,我曾经在另一篇随笔提到:当ANT不够用时,可以用JRuby+Antwrap,这是一个可行的方案,并且经过了长期实战的考验。不过Groovy可以做的更好(感兴趣的朋友可以和Antwrap版对照一下):

 1 #!/usr/bin/env groovy
 2 
 3 ant = new AntBuilder()
 4 root = ":pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct"
 5 
 6 def checkout() {
 7     ant.cvs(cvsroot:root,command:"checkout -A","package":".",dest:"cvsoriginal",compressionlevel:"9")
 8 }
 9 
10 def update() {
11     ant.cvs(cvsroot:root,command:"update -A -d","package":".",dest:"cvsoriginal",compressionlevel:"9")
12 }
13 
14 def compile(project) {
15     ant.javac(srcdir:"cvsoriginal/$project/src",destdir:"cvsoriginal/$project",target:"1.5",encoding:"GBK")
16     ant.copy(todir:"cvsoriginal/$project") {
17         fileset(dir:"cvsoriginal/$project/src") {
18             exclude(name:"**/*.java")
19         }
20     }
21     ant.jar(destfile:"build/$project.jar",basedir:"cvsoriginal/$project",manifest:"MANIFEST.MF") {
22         exclude(name:"src/**")
23     }
24 }
25 
26 // to actually call your target
27 checkout root
28 

代码更紧凑,与Java的集成更无缝。只需要简单的培训,有Java基础的朋友就能上手,不必再额外学习和习惯Ruby的语法,不用gem install,也不用去monkey-patch个别文件来集成和打包Ant、Antwrap和JRuby,只需要一个groovy-all-x.x.x.jar加上自己的脚本即可轻松搞定。

[2008-08-26 19:25:00 更新] 经过实际环境测试,原来JRuby(1.1)+Antwrap需要24分钟完成的构建,改用Groovy(1.5.6)后,仅需要16分钟,对于需要经常处理构建的项目和产品来说,这8分钟还是相当可观的。


posted @ 2008-08-25 19:38 laogao 阅读(335) | 评论 (0)编辑 收藏


从开始专心学习Java到现在,已经7年了,非常幸运的,在这7年中,除了1年的“半工半读”和1年的.NET项目,累积有5年都是从事的Java为主的应用开发,应该说,Java伴随我走过了从入行到站稳脚跟最关键的几年。从某种意义上讲,我应该感谢Java。

然而,随着时间的推移,接触到的不同的东西越来越多,自己对不同问题的看法和解决问题的思路越来越成熟,Java虽然是全能型的语言,也变得越来越无法满足日常工作和娱乐的需要,在一些特定的场合,也越发别扭,有时我甚至会怀念学生时代的Pascal/Delphi和后来的C/C++。回过头去看自己,从刚入行时的Java fanboi,到现在这样一个pragmatist和purist的结合体,是多么有趣的转变。

在过去的2年多,除了Java和.NET,陆陆续续接触到并有过简单使用经历的编程语言,有bash、PL/SQL、JavaScript、PHP、Perl、Ruby/JRuby、Scala、Python/Jython、Groovy等等,不过都没有系统的学习过,基本就是拿来主义,什么好用用什么,解决手里的问题为主。

也许是工作性质的原因,日常要处理的非技术性任务越来越多,留给具体编程的时间现在一天比一天少,编程带来的乐趣和解决技术问题带来的快感,就显得十分珍贵。所以我下定决心一定要系统的学习1~2种和Java/.NET不同的编程语言。一开始这个选择并不容易,我曾经还半调侃式的和一个朋友讲:“Python, Ruby, Scala, Groovy, 一个都不能少”,经过一段时间的权衡之后,还是比较自然的作出了最后的选择:Python和Groovy。

Python这个选择其实并不难,留意Python这门语言,其实说起来也有差不多3年了,它完全符合“和Java/.NET不同的编程语言”这个条件,而且应用面很广,也十分成熟,功能也非常强大,加上大量现成的类库,能够胜任很多不同类型的编程任务。基本上这是一个不用任何思想斗争的选择。

Groovy这个选择相对没有那么直接,至少在我真正用Groovy上手做一些东西之前,对它并没有特别的感觉,甚至质疑它存在的价值,因为有Jython和JRuby的选择,为什么一定要Groovy呢?到最近开始接触Groovy,才逐渐了解到它的出身(Groovy的作者受到Python的启发,不过后来Groovy发展的越来越接近Ruby),和它在“兼容”Java代码的前提下为Java语言带来的巨大的表达力提升。对于有Java基础的人而言,Groovy十分容易上手,而且可以帮助我们简化很多繁杂的任务,比如自动构建和自动化测试,而这正是我目前需要处理的。

最后简单说说其他几个落选的原因(除了时间有限之外):
bash - 目前掌握的基本够用,发现不够时,完全可以用Python代替。
PL/SQL - 基本很少使用了,偶尔需要维护,今后深入用的机会也不多。
JavaScript - 对“网页”版的编程语言可能有天生的偏见,尤其是作为Java fanboi,当然对它“盗用”Java这个名字是有意见的。
PHP - 用的机会很少,而且过于quick&dirty,不是我喜欢的风格。
Perl - 虽然功能强大,但是感觉语法有些terse,不是很适应,能处理的任务,基本上Python也可以。
Ruby - 语法和设计理念还是有一些认同,但是对Unicode的支持和部署环境的支持都还不是很让人信服,另外,拿孟岩的话说,Ruby是一门魔幻语言,我不喜欢过于魔幻的东西,而更习惯具体直接的代码。
Scala - 也是一门和Java平台关系密切的语言,不过有些“学院派”,函数式编程固然是亮点,但短期内看不到太多的学习价值。

所以,综上所述,最后再点一下题,08年秋季的学习计划是:系统学习Python和Groovy。


posted @ 2008-08-20 00:33 laogao 阅读(833) | 评论 (0)编辑 收藏


在前两天刚结束的OSCON 2008上,MySQL AB的Brian Aker对外传达了一个很重要的信息:新的MySQL分支,代号Drizzle,将在现有MySQL基础上进行大刀阔斧式的改造,使之更模块化、更加适应新时代的计算环境,同时裁减掉现有很多“企业级”功能,如存储过程(对,你没有听错)、视图、触发器,构建出简单、可靠、易于管理的数据库管理软件。给人一种感觉,那就是Drizzle将更加亲近Web,而与“企业”运算渐行渐远,这似乎更贴合MySQL最初的vision和受众。

据悉Drizzle已经得到了不少MySQL核心开发人员的认可和支持。

我们大概还依稀记得当初Sun收购MySQL时,曾经信誓旦旦的要将MySQL从一个以支撑Web应用为主的市场慢慢渗透到“企业级”应用中,如今一支名叫Drizzle的fork版本横空出世,不知道这个“麻雀变凤凰”的美丽故事接下来还将如何演绎,让我们拭目以待。


posted @ 2008-07-30 22:24 laogao 阅读(364) | 评论 (1)编辑 收藏


Firefox不久前推出了3.0.x系列的第一个升级版3.0.1。周末的时候对系统做了一次升级,我用的Arch Linux完整只需要一个命令,方便的没话说,顺便也就把Firefox也升级到了3.0.1。

说点题外话,由于Mozilla对Firefox的分发有着很严格的要求,很多Linux发行版都有自己的命名,最有名的当然是Debian的"Iceweasel",一个"Firefox",一个"Iceweasel",倒也相得益彰。其余大大小小的Linux发行版则更多的使用另外一套可自由分发的代号:1.5是"Deer Park",2.0是"Bon Echo",3.0则是"Gran Paradiso",3.0刚出的时候,也用过非正式的代号"Minefield"。

升级很顺利,再次打开Firefox,已经是3.0.1版。不过这个时候有个小小的麻烦出现了:经常使用的MySocial 24x7插件(用它可以方便的查看和更新FriendFeed)和3.0.1不兼容,被disable掉了。呵呵,不过这可难不倒我,拿到官方的MySocial的xpi包,简单的检查了一下,便发现了问题所在:其实是MySocial插件本身打包的时候,指定了很具体的3.0.0.x这个最高版本,而我现在更新后的Firefox是3.0.1,难怪会报不兼容。1.5~3.0.0.x都是兼容的,3.0.1肯定没啥问题啦,所以就DIY一下吧,轻松搞定。

具体方法如下,供各位爱好者参考:
xpi格式其实就是一个压缩文件,打开以后,找到install.rdf文件,其中有一段
        em:minVersion="1.5"
        em:maxVersion="3.0.0.*"
修改em:maxVersion为"3.0.*.*",重新打包即可用来安装。

其实不光MySocial,其他插件如果遇到类似问题,也可以参照处理。如果你碰巧需要,又不想去DIY,这里是做好的版本,供下载使用,版本0.5,修改扩展名.zip为.xpi即可。


posted @ 2008-07-28 22:12 laogao 阅读(816) | 评论 (0)编辑 收藏


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

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

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

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

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

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

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


posted @ 2008-07-24 00:31 laogao 阅读(566) | 评论 (4)编辑 收藏


刚看完法国对意大利的比赛,准备下载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 laogao 阅读(785) | 评论 (1)编辑 收藏


或许多少和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 laogao 阅读(717) | 评论 (0)编辑 收藏


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 laogao 阅读(1508) | 评论 (1)编辑 收藏


最近在家休息,想来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 laogao 阅读(793) | 评论 (3)编辑 收藏


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 laogao 阅读(1397) | 评论 (0)编辑 收藏

仅列出标题
共34页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last