IUSR’s Unnamed Seraph Reloaded

April 30, 2006

Spring::NamespaceHandler

Filed under: 我来补充两句儿 — iusr @ 4:34 pm

Spring 2.0带来的一个比较便利的好处就是更加灵活的XML配置方案。由于Annotation在设计方面的特殊地位,决定了它不会完全取代XML配置文件,所以我认为很长一段时间内,Java的server端框架不会把宝都押在Annotation上。Spring 2.0也是这样,解析XML配置文件这一工作不仅没有随着Annotation的加入而停滞,反而添加了更加灵活的配置方案–自定义namespace。

当然,自定义namespace远非说起来那么简单,又得有合适的XML Schema,还要自己实现Spring中的比较核心的接口和抽象类。下午才和Leon抱怨过,因为我无法像使用python的tuple和字典类型一样方便的访问java.util.List和java.util.Map的对象里面的数据,比如aList[12]或者aMap[‘name’],这些东西虽然通过其他方法也能解决,但毕竟不太舒服。这个问题的起因比较简单:我把一些JDBC相关的配置写在了一个db.properties文件里面,用Spring 1.2.x的时候,我习惯的做法是用一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer来把几个.properties文件解析,然后使用${name}的方法来访问某个属性所对应的值,当然这还是不够方便,我这破记性让我经常取了一些重复的属性名,非debug而不能得也。今天翻Spring 2.0 M4得文档,发现了<util:properties/>这么个好东西,可以从location指定的资源读取符合属性文件格式的配置信息,以一个PropertiesFactoryBean使框架在引用这个bean的时候可以访问到解析了的Properties对象。这个让我比较高兴,因为可以不用像以前那样把一些没什么关系的.properties文件用同一个PropertyPlaceholderConfigurer装载了,.properties文件的关系得以区分,我也不怕再取一些重复的名字了。问题又来了,就是那个比较无聊的问题:如果我想访问一个.properties文件中某个键名对应的属性值该怎么办?再联想开来,很多动态语言都提供的用键名做下标引用键值的方法,以及类似tuple这样的类型,Spring好像并没有为这种引用方法提供方便,放在Spring 1.x的时候,恐怕也得自己实现一些FactoryBean,然后在配置文件中设置一些property才能完成,很冗长。

所以我就想能不能通过自己解析一个namespace提供的配置,完成这个事情,最终效果就像这样:

<util:properties id="dbConf" location="/WEB-INF/db.properties"/>
<my:map-accessor id="jdbc.url" eval="dbConf[‘jdbcUrl’]"/>

这对我来说不太容易。虽然我对Spring 1.2.x还比较熟悉,但对Spring 2.0来说只有不到10天的经验(要是按照8小时一天计算,那也就3、4天吧…),而且Spring 2.0还在milestone,文档也不完全,我兴冲冲翻到3.2.2. Extensible XML support这章,结果只看到一个TODO,而TODO中涉及到的"Write your own namespace handler"也是没找到踪影。

不知从何入手,无聊的时候在eclipse里面从Spring 2.0 M4的代码里搜util这个namespace对应的URI:http://www.springframework.org/schema/util,结果在src/META-INF/下的spring.handlers和spring.schemas找到了线索(你也可以看到,实际上搜这个URI是搜不到的,我后来搜索的字符串是 springframework.org/schema/util),util这个namespace是由org.springframework.beans.factory.xml.UtilNamespaceHandler这个类完成的,从这个类就可以找到抽象类NamespaceHandlerSupport和接口NamespaceHandler,这样一来总算由了头绪:^)

NamespaceHandler这个接口很简单,只有两个方法,分别是通过XML元素来查找BeanDefinitionParser以及BeanDefinitionDecorator,而NamespaceHandlerSupport则提供了用于在类内部注册这两种parser的机制,使得子类可以将XML元素的本地名和一个BeanDefinitionParser以及BeanDefinitionDecorator关联起来,这样DefaultXmlBeanDefinitionParser在解析XML配置文件时遇到某个namespace时就可以通过对应的NamespaceHandler实现类最终返回BeanDefinition和BeanDefinitionHolder,完成bean的生成和注册。这个过程和Spring 1.2.x中的对应过程相差不是很多,只是一些类和方法有了改变,方便了开发者实现自己的NamespaceHandler。

具体实现自己的NamespaceHandler的时候–图省事我还是用了NamespaceHandlerSupport,涉及到的类很多,除了上面提到的BeanDefinitionParser和BeanDefinitionDecorator,还有ParserContext、BeanDefinitionRegistry、BeanDefinitionBuilder以及FactoryBean/AbstractFactoryBean,当然,也许还包括org.w3c.dom.Element :^)

具体的实现就不再赘述了,以免有浪费大家带宽的嫌疑。我在做这个NamespaceHandler时,因为Spring提供的一些FactoryBean不太适用,所以自己实现了几个FactoryBean,折腾了一会儿,如果很熟悉Spring的bean注册过程的话,这些工作根本不算什么。一般来说,如果org.springframework.beans.factory.config里面的一些FactoryBean实现不够用的话,十有八九是得自己去实现了,当然,其他一些包里面也有一些FactoryBean实现,不过一般都是和Spring的某个方面结合很紧,比如AOP和事务,很少见需要自己处理–实际上如果觉得有必要添加一些特性时,更好的方法应该是向Spring开发团队提交这部分的代码:^)

NamespaceHandler也完成了,然后就是要编写一份XML Schema了。好在我做的东西比较简单,我所具备的XML Schema手艺还能让我完成这样一份简单的schema,如果稍微困难一些只好去啃那些XML大部头了–我一向对W3C很景仰,因为那里总是诞生出十分庞大的规范,可能使用了几年之后还是会被一些自己一直没有注意到的特性吓到,当然,W3C的规范的扩展性总是很强,这点不得不Orz一下。

都完成了,最后的事情就是让Spring在遇到我的namespace时知道去调用我实现的NamespaceHandler,这个让我比较郁闷,因为默认的DefaultXmlBeanDefinitionParser是用DefaultNamespaceHandlerResolver来接管namespace和NamespaceHandler的对应关系,而不指定资源文件路径作为参数构造出的DefaultNamespaceHandlerResolver只知道从"META-INF/spring.handlers"来读取配置,我暂时还没找到自定义这个配置的方法,不过最后还是通过ClassLoader.getResources()然后通过URL.openConnection去完成读取和加载的工作,也许可以做一些trick…谁知道,太晚了,回头再说了。

多种namespace和自定义NamespaceHandler的方式无疑为Spring的XML配置文件增加了更大的威力,Spring 2.0也已经把aop、transaction/tx、jndi和Web MVC等等配置放入单独的namespace中(从spring.jar!/META-INF/spring.handlers中就能找到)。老式的bean定义虽然可以适合绝大部分的配置工作,但是在一些特殊领域难免显得冗长拖沓,这些领域往往有自己的领域定义,继续沿用老式的bean定义除了会把人搞晕以外倒也没有其他恶行,这种情景之下,使用自己的namespace然后通过自定义的NamespaceHandler去注册bean可以使得编写XML配置的时候更加符合特定领域的语义要求,增强XML文件的可读性。

很想建立一个比如Spring Namespace Handler Repository的项目,使得Spring更能适用于不同领域。

Technorati : ,

微软即将大力投资中国

Filed under: 我来补充两句儿 — iusr @ 7:47 am

Google Reader的平面组织方式让我又漏掉了一篇Slashdot上面的文章:Microsoft to Invest Heavily in China

据说胡主席去Gates家做客以后,微软就宣布将斥资9亿美元投资国内的的软硬件公司。BusinessWeek的一篇文章–Microsoft’s China Card–介绍说,这一投资的目的主要是打击盗版,获得政府支持,等等,最终确立Windows在中国的统治地位。

打击盗版勿庸置疑,出了学校以后我也意识到盗版已经不像理想化的Warez组织们所希望的那样单纯–当然他们希望的并非盗版,但事情终归已经不是以他们的希望为导航来发展。而作为一个计算机工作者,我觉得要想别人尊重自己的劳动成果,自己也必须尊重别人的版权,但这不仅仅应该是计算机行业的从业人员才去遵守的准则,而且也不是只有软件才有版权。但是微软打击盗版是否就对它有利还难以确定。我觉得打击盗版会使得正在使用盗版的用户采取三种做法:换用没有版权问题的软件,比如免费软件、共享软件、开源软件、自由软件etc.;不理那套,继续盗版;缴费买正版。以概率来说,有2/3的可能对它不利,但实际上中国的盗版用户已经太多太多,而且大多数人没有能力或者时间去改变自己平时的使用习惯。我一直觉得微软"确立Windows在中国的统治地位"的说法感觉很可笑–这地位已经形成了啊,只是微软没赚到应赚的钱而已。

政府支持一直是国产软件比较大的支撑,而这次主席直接去了Gates家讨论Windows和微软软件,不知道国内那么多号称有自主知识产权的Linux、BSD等等OS变种的创造者们做何感想?从国家的支持力度和斥资行为来说,我认为政府已经没有任何值得指责的地方。和国家863计划等等有关的计算机软硬件项目所接受的国家投资,一般来说都是天文数字,目的一般都是要得到具备自主知识产权的不依赖国外技术的成果,可最后得到的都是些什么东西?我不觉得主席–或者政府部门中的任何一位官员–选择微软产品的动机是错误的。换位思考一下,如果强迫我每天都用国产的那些XxxXxxx Linux,我也早转到Windows上面了,即使用一会儿Win2k也能舒一口气。政府使用计算机不是为了高价回收普通老百姓都懒得用的垃圾,而是为了提高办公效率,而且支持了那么多年也够了,要指责的是那些拿钱不干事的人。

作为一个Java开发者,我虽然抱着坚定的Java信念,但对于微软加大对国内软硬件投资的影响,还是觉得有些不安。

Technorati :

FirefoxFlicks赢家视频

Filed under: 我来补充两句儿 — iusr @ 4:08 am
Firefox Flicks

FirefoxFlicks竞赛已经宣布了Firefox推广视频大赛的获奖视频,包括DareDevil, Wheee!, Fox Fever, This is HotGive me the soap。看完这些视频,我还是喜欢Wheee!This is HotThis is Hot制作比较好,而Wheee!应该比较合那些鄙视IE的人们的口味,剩下那些家酿的也很不错,只不过要做个选择的话……嘿嘿~总之也不能无视劳动人民的创意,尤其在4月30日。

如果在线观看速度比较慢,可以直接下载下面的.mov:
DareDevil: http://media.revver.com/broadcast/19326/video.mov
Wheee!: http://media.revver.com/broadcast/19542/video.mov
Fox Fever: http://media.revver.com/broadcast/21146/video.mov
This is Hot: http://media.revver.com/broadcast/20674/video.mov
Give me the soap: http://media.revver.com/broadcast/19836/video.mov

Technorati : ,

April 29, 2006

IE7b2

Filed under: 我来补充两句儿 — iusr @ 12:11 pm

刚装上了IE7 Beta 2,下回来好几天了,就是不太装,因为以前被不兼容的IE折腾过,搞到啥模式下都开不了机器。

界面还可以,貌似IE从4、5、6就一直没怎么改动过UI–4以前的版本有幸没有见过。右上角的搜索框并非我想象的只能用MSN搜索,这点让我很意外,看来微软已经有意在改变自己一直以来的霸道形象了。

IE7

恶心的是IE Dev Toolbar和这位新主子不太兼容,导致IE根本无法获取焦点,关都关不上…只好把Dev Toolbar卸掉,唉,这是IE上面为数不多的几个插件,而且还是我很喜欢的插件,还而且它是微软发布的。

然后,无论点那个空白来新建标签页,还是Ctrl+T来新建,一律一个下场:非法操作。我靠…一会儿卸掉。因为解决它的非法操作问题我把Google Toolbar都卸掉了,还是非法。

正式版出来之前我不太感兴趣去试了,吸引我的特性感觉几乎没有,我也不会上当被phish,RSS聚合现在也全靠Google Reader + Netvibes,sigh~

Technorati :

April 28, 2006

apache.projects[“Tomcat”].doRealse(tomcat_5.5.17);

Filed under: 我来补充两句儿 — iusr @ 3:16 am

Tomcat 5.5.17发布,挺快啊~

看了眼CHANGELOG,越来越坚信,CHANGELOG这东西对我来说除了意味着阅读时的兴奋,也意味着恶心:如果不马上更新,手下正跑着的那个版本竟然有这么多bug和不足:^|

Technorati :

April 27, 2006

λprobe|Tomcat绝配

Filed under: 我来补充两句儿 — iusr @ 7:25 am
λprobe是一个用来监控和管理Apache Tomcat的工具,以war文件发布,可以很方便的部署到Tomcat上面。用了不到一个月,感觉十分不错,没出过问题,Apache Tomcat的那个/manager基本可以不用了,如果不是非用Tomcat Admin来操作JNDI资源以及Tomcat用户等等的话,这个/admin也可以不用了
极力推荐。虽然没有BEA WebLogic、SUN AppServer以及IBM WebSphere Application Server的原味管理应用来得全面,但单就Tomcat平台来说,也是一个难得的选择了。Enjoy!

April 26, 2006

不愿自卑

Filed under: 我来补充两句儿 — iusr @ 4:00 pm

从同事的MSN Space里看到这样一篇《自卑的程序员,自卑的我们》。很明显我是不会自卑的,自卑要是有用那程序员们也不用费脑细胞学习了,对着计算机顾影自怜自卑一下就够了。

不知道这文章原作者是谁,大晚上的也懒得去Google,暂且以"他"指代,没有性别歧视的意思。首先奇怪的就是为什么别人配置点儿东西他都看不习惯呢?尤其Java,配置"JAVA的环境"配置IDE应该是小孩子都知道的前提了,配置一下这个就浮躁了?又提到TC就没花什么时间配置,我想他也许没怎么折腾过INCLUDE、LIB这样的环境变量–好吧我承认我已经不敢开发C++程序了,但相关的环境变量我还是知道干什么的。至于Spring、Hibernate等等,当然如果愿意靠代码来控制是完全没问题的,人家良好的结构也保证了这一点,不知道他有没有想过Spring为啥需要用大段大段的XML配置几行Java代码就搞定的东西呢?难道因为我们一直错误地"觉得国外的友人都是很有学识的",他们实际上蠢的可以,所以才这么兜圈子卖关子?

没错,写代码确实是很优雅的事情,每个程序员也都这么骄傲地认为,但是这样的优雅当然是有前提的,而不是"只要…就…"的关系,比如让一个刚会和world"优雅"地说hello的人去和Rod Johnson"优雅"地站在一起讨论代码的优雅问题,这只可能让我感到滑稽。我明白靠代码控制计算机会让人很有成就感,但还远没到讨论优雅的时候。

然后他开始悲伤大家不去研究算法、不去关心效率,当然他措辞很谨慎,不是说"没有人研究算法"、"没有人关心效率",而是说"没有足够"的人。多少算足够呢?我也知道现在浮躁的人很多,但也用不着伤心。首先别人不重视不说明他也不该重视,研究算法、关心效率是你的自由,只要别推脱说项目太紧、时间不够就行。其次,我知道这很滑稽,不知道能不能算是理由:难道别人研究算法、关心效率的时候都要来和他说一声:"报告XXX,我即将开始研究算法并进一步关心效率,请指导一下我这个算法的复杂度公式"?

外国人也是人,我不觉得因为一个人是外国人所以跟踪人家的技术就是丢人的崇洋媚外。什么是"同等人"?言外之意是外国人很高等或者很低等?如果"同等人"的意思实际是自己的同胞的话,听上去还有些通顺。那我就说一下我对"同等人"的作品的看法。国内开发者里能人很多,太多了,无论是浮躁的"想以最快的速度吧项目完成"的人,研究算法的人,还是研究效率的人–我要是像文中所说的那么容易自卑早就自己了结算了–都有很多很厉害的角色,但是,为什么还是有很多同胞用老外的东西?以开源为例,中国开发者领导的开源项目本身就不如老外多,而且大部分名气不是很大–知道mvnForum是越南人开发的时候我都惊呆了。国产的好东西当然有,比如我一直很关注但是没怎么深入接触的Buffalo,但是好东西数量上不多,而且没有像老外的东西那样面面俱到,而且很多国人的项目爱放卫星喊空话,一点也不自卑,完全一个自我感觉良好。在Java Web开发方面,老外的东西已经是full stack可用,覆盖了一个webapp的方方面面。只是用老外的东西稍微多一点,用不着就说是把老外捧成神了吧?(不过老外倒是有自己的"神",感兴趣可以搜一下一些老外是如何评价Knuth的)另一方面,如果人家的东西里有先进的技术,不真正地接触一下怎么才能学习到这些先进的技术?想学习一下IoC、DI的思想和实现,接触一下pico、Spring是理所当然,在这种事情上和老外死磕只能让人说是狭隘的民族主义。

下面的话让我这样一个刚工作的人来说可能有些妄自尊大的感觉,不过无所谓,这年头脸这东西是可有可无的……

中国人当然有智慧,只要中国人决定要开干了,我们把老外的东西全盘扔掉自己开发也没问题,照样full-stack,照样on rails。但是计算机作为一门科学,同时又是一个产业,在中国还是要发展延续下去的。产业因为有了商业利益所以浮躁,造成很多不求甚解的人竟然可以成功混日,而认真开发的人反而被忽视被压榨。但如果我们都优雅地穿着白大褂去做我们的学院派,告诉我,我们已经很可怜的产业怎么办?你该不会觉得我们可以厚着脸皮找国家要钱让我们继续厚颜无耻地优雅下去吧?只看到学院派的研究所起到的作用是不全面的。没错,软件产业头几把交椅上的大公司都设有数不清的研究机构,足以证明研究的重要,人人都清楚,但是又有没有人看到人家把研究成果产品化甚至产业化的能力呢?我们都看到Google的员工是科学家,而没有看到人家把科学研究产品化的能力;我们都看到微软亚洲研究院的研究员们厚实的理论积累,而没注意到他们在实际开发时也是高手,更没注意到还有亚洲工程院把研究院的科研成果孵化为核心产品。搞研究不见得就是优雅,立足产业也无需自卑,只有两条腿走路,计算机相关的产业和科学才能向前发展。偏重科学研究而毁了产业,计算机科学就失去了发展的必要;只追求产业发展而怠慢科学研究–就像我们面临的现状,计算机产业也失去了继续前进的动力。这个大家都明白。

想一想,如果所有从事产业一线的人都自卑地认为自己应该去学院派一下,没有人把科研成果实施出来,计算机应用就会停滞不前,大部分依赖于计算机的高科技研究随之停摆,生成力停滞甚至下降,环境恶化,人类逐渐灭绝,然后蟑螂就会统治地球……啊好可怕,我还是先睡觉去吧……

April 24, 2006

Code Monkey

Filed under: 娱乐 — iusr @ 5:29 am
从Slashdot上看到的,歌词太不错了~建议搞开发的都来听听。据说这个MP3是CC许可的,所以随便下回来听是没问题的。torrent文件在这里,eMule上也
附歌词:
Code Monkey get up get coffee
Code Monkey go to job
Code Monkey have boring meeting with boring manager Rob
Rob say Code Monkey very diligent
but his output stink
his code not functional or elegant
what do Code Monkey think
Code Monkey think maybe manager oughta write goddamn login page himself
Code Monkey not say it out loud
Code Monkey not crazy just proud
Code Monkey like Fritos
Code Monkey like Tab and Mountain Dew
Code Monkey very simple man
with big warm fuzzy secret heart
Code Monkey like you
Code Monkey like you
Code Monkey hang around at front desk
tell you sweater look nice
Code Monkey offer buy you soda
bring you cup bring you ice
you say no thank you for the soda ’cause
soda make you fat
anyway you busy with the telephone
no time for chat
Code Monkey have long walk back to cubicle
he sit down pretend to work
Code Monkey not thinking so straight
Code Monkey not feeling so great
Code Monkey like Fritos
Code Monkey like Tab and Mountain Dew
Code Monkey very simple man
with big warm fuzzy secret heart
Code Monkey like you
Code Monkey like you a lot
Code Monkey have every reason
to get out this place
Code Monkey just keep on working
to see your soft pretty face
Much rather wake up eat a coffee cake
Take bath, take nap
This job fulfilling in creative way
such a load of crap
Code Monkey think someday he have everything even pretty girl like you
Code Monkey just waiting for now
Code Monkey say someday, somehow
Code Monkey like Fritos
Code Monkey like Tab and Mountain Dew
Code Monkey very simple man
with big warm fuzzy secret heart
Code Monkey like you
Code Monkey like you
Slashdot上有个老兄的回复太搞笑了:

And then…

(Score:5, Funny)

by pope1 (40057) on Sunday April 23, @01:27PM (#15185372)
(http://www.darkaxis.com/)
CodeMonkey insert RootKit into corporate software installer.. give credit to Rob.

April 23, 2006

感谢RSS!

Filed under: 我来补充两句儿 — iusr @ 4:49 pm

用了一阵Spring 2.0 M2了,M3出来很久了,每次到Spring老巢时都会犹豫一下:该不该下M3呢?大家不要笑我的版本强迫症,习惯就好…

结果,幸亏没去下M3,因为我的GReader告诉我:

springframework-2 2.0 M4 released (Sun, 23 Apr 2006 12:16:33 GMT)

也就是今晚8点多。而截止到发稿时间,springframework.org上还没M4发布消息。记者的–哦ft,你才记者呢–这个经历告诉我们:Sourceforge的项目RSS真值得一订啊!为了跟上你倾心的项目的趟儿,赶快行动吧

实际上乜,就算不知道M4出来而下了M3,也无非几个小时之后删掉罢了,为个RSS至于这么兴奋么…

重命名MSNM联系人组

Filed under: 看图说话 — iusr @ 4:43 pm
babes
聪明的你一定猜到了,对,我就是传说中吃饱了没事儿干搬转头砸自己脚替别人数钱的人。
好多babes啊,YY中…嗯,如果你不幸是我的MSNM联系人…
哦对,为啥说时搬转头砸自己脚呢,因为刚才想和几个老同学群聊,结果忘了都属于哪个babes下…
Next Page »

Blog at WordPress.com.