Archive for » 2007 «

埃布埃的思考

好吧,首先承认我是BTD.
埃布埃是一个阿森纳的球员,不过这里谈及的不是足球,而是SL重构时进行的思考–i不i?
当我们迎着web2.0的春风对SL进行小刀阔斧的重构时,一个很有意思的场景摆在我们面着,scholar,ischolar,conf,iconf,group,igroup,liter,ilter,凡此种种.
重构之初,我们的思想是把登录可见和非登录可见的信息分开–以一种URL及action的很纯粹方式–i or not i.
诚然,这样很带来一部分的优点,例如sidebar通过decorator更容易在URL级上进行方便的修饰.但是如果我们从资源的角度来考虑,在 group和liter这种需要public给用户大量资源的模块,可浏览的资源才是最重要的,在这些模块里,其实展示给登录用户和未登录的内容应该是大同小异的.我认为在这些模块中不需要i,一个内容区域的用户个人div展现就是登录用户与未登录用户的内容展现区别.
至于sidebar,我觉得完全可以以i的方式展现给所以用户,例如joinGroup,createGroup这种动作完全可以展现给所有人,同时恰恰这些是需要特别展示的,而不应该封闭在i与not i这两个内容大同小异的模块中.或许不久,我们就将提供一个ajax的登录框.
另外来谈谈 URL风格吧,应该说现在SL URL的风格逐渐趋向RESTful style–2000年以前静态网站的风格.从大的方面讲,这种风格能被google等搜索引擎快速检索,从小的方面讲,这种风格本身就能使人赏心悦目.将来做apache urlrewrite的时候,只需要在最后将"?id="rewrite一下就行了,原来URL风格urlrewrite需要做的工作可以看下我以前在 SL wiki上开的页面.

Category: SL  Leave a Comment

DP备忘录-Factory

三个概念:简单工厂,工厂方法,抽象工厂

简单工厂最常见的表现形式为一个Factory类中有一个static方法,例如createProduct(String type),根据不同的传入参数在此做不同new的动作。而返回的Product应该是一个接口(或抽象类),而ConcreteProductA, ConcreteProductB等是具体的Product实现者。

简单工厂的概念几乎每个人都知道,但是不能说简单工厂就是工厂模式,我觉得严格定义上的工厂模式应该是工厂方法和抽象工厂这两个概念。

工厂方法并不是针对工厂类来说的,是当Creator接口(或抽象类)有不同实现需求时,其提供的方法接口,而具体Creator实现者实现这个方法(肯定不会是覆写,上面括号里的抽象类只是为了不改变那些已有的具体代码)。这个具体的Creator实现者(可能会有多个)其实就是上面提到的简单工厂。工厂方法的实质在于本来是由一个对象(可以理解为抽象工厂,static亦可以这么理解)负责所以具体Product的实例化,现在通过一些实现者(或子类)来创建。

HFDP书中提到了平等的类层级这么一个观点,意思是Creator与Product是抽象级平行,而ConcreteCreatorA与ConcreteProductA是实现级平行。

具体的图示见HFDP P134。

对于抽象工厂,我的理解是:它是工厂方法的辅助,是当用工厂方法制造某个Product时需要依赖某些Ingredient时采用的,将抽象的IngredientFactory注入到抽象的 Product,以达到IoC的效果。实质上,它就是一种依赖注入方式,熟悉Spring的人对此(DI)都不会陌生。

对于抽象工厂,它与工厂方法的最大区别在于制造对象的需求不同:抽象工厂的应用场景是制造Product时比较复杂,需要一堆Ingredient,而对于ConcreteProductA和ConcreteProductB,它们所需的 ConcreteIngredient都不是不同的。所以就需要一个抽象工厂接口,然后不同的实现者。从制造对象的过程来看,工厂方法可以用static 方法制造也可以通过实例化工厂来制造;而对于抽象工厂来说,一般来说肯定是实例化一个具体工厂,然后upcast到工厂接口,然后进行具体的生产过程。抽象工厂更适用于组合一堆相关的原料以达到制造一个产品的场景。否则的话,例如只是生产不相关的原料,而不需要组合成产品,直接建多个原料工厂,利用 static方法返回原料对象即可。

Category: java  Leave a Comment

中秋

前几天看到一个朋友的签名档:我们错把月饼当成了中秋,却把月亮遗忘在城市的高楼。说得挺有意味的,于是乎,拿过来做了自己的QQ签名档。

看到吴晓波的这篇BLOG,转过来谨当中秋的纪念。

原贴地址:http://www.mindmeters.com/showlog.asp?log_id=6212

这个帖子就想写:中秋快乐。心思如法轮一转,念遍所有的朋友。

人生如同一篇作文,似乎总是活在不同的"段落"中。做了"过河卒子"之后,常常念及的是林肯的那句话,人在四十之前,容貌是父母给的,四十之后,就该对自己的容貌负责了。

近日突然觉得,现代人对生命的惶恐更加的残酷。譬如唐人自杭州赴长安赶考,单程就需6个月,骑驴翻山,撑舟过河,前程自如雾中晨星。百年之前,情人一别,千山万水或许从此天地两渺,那份思念在每个月圆星稀之时自可借酒力转化成无数美妙的诗文。人若绝望,便会从容,如海德格尔所说,人从墓碑处回望,就会对摇篮有焕然的观感。

而做了当代人,即便在万里之外也只需要一张机票而已,随时思念,只要拨按几个数字就能听到最低缓的呼吸声。思念有时候竟成了一个很虚幻的名词。一切都能"快餐",生命忙碌得想一根瑞士人做出来的秒针。有时候坐车,大堵,就听到司机破口大骂,似乎平时越是文雅的人,越是不能忍受交通的堵塞。我便常开玩笑,迟到片刻,莫非天就要塌下来?如果现在大家都在骑驴,该发生的不是还会照样发生?

还是多写了几行字。无非想说的是,中秋是个好节日,大家都慢下来,停下来,看一下月亮,想一下亲人,吃一口团圆的米饭。

Category: reading  Leave a Comment

A few keywords

从昨天到今天,心里的感觉总是乱乱的。研究生生活已经开始一周了,或许对我来说,这不过是六年制本科的延续,而我的思绪,现在究竟停在哪里呢?几个关键词的分析,或许能让自己的心情轻松一些。

充实

现在的我是充实的吗?从外表上来看,当寝室这个词越来越接近它的本义,我的生活也越来越有规律,那么几个固定的地方,总能在某个地方找到我。可是,忙并不代表充实,计划也并不代表效率。阅读时那种只可击节意会的感觉,若总遇不上,难免令人沮丧。

我希望能有属于自己连续的时间去阅读,而现在时间总被课表和一些责任支离。在一个人不多的自习室,听着IPOD,看一本自己喜欢的书,应该不是一件奢侈的事吧?

孤单

孤单,对于我这样一个生性乐观的人似乎是很遥远的词。可就在周一,实验室只有我一人的时候,我忽然发现,原来我也怕孤单。大学四年,我的交际圈子小得令人吃惊,我甚至不认识除了同学和同学女朋友之外的女生。或许这也跟我的性格有关吧,总认为有一个技术的圈子就已足够,现在却发现我对大学的定义过于狭隘,也留下了一些遗憾。诚然,当你思考时,或当你希望一个人待着时,孤单并没什么不好。但是,这时候的有些感悟并不完全是真实的,or make you confused,结果就是容易走一些弯路。

交流&分享

关于苹果与分享的故事和道理,大家都懂。在我身边,有一个能自由交流和分享的圈子,我们大家都乐于分享彼此的技术与感悟。这与我大四实习时工作的圈子完全不同,实习的时候我只是去执行,最多考虑的是优化。相比于学校,则少了太多的发现和创造。或许如果我现在已经在工作,可能不会有人跟我分享例如饭否这样的web应用。而现在,当晓光师兄在邮件列表里分享这个东西的时候,我们却可以说他火星了。

我很庆幸我拥有这么一个可以自由分享和交流的圈子,可这似乎仅限于技术。上周团队训练中的一个小故事又把我的思绪带回了五月,一个万念俱灰的失望时段。现在我试着不去思考爱情,可每每却有一些感悟自然地迸发。一场轰轰烈烈的爱情,很有震撼力的一个词。可之于我,之于我现在所在的阶段,爱情是奢侈的。我不知道一年后的我在哪里,更不知道两年后的我在哪里。而为了知道这些答案,我想我应该知道要做些什么。而这些自然的对于爱情的思考,我知道,和技术一样,我也需要交流和分享。

SL

当某些似是而非的问题出现的时候,你当然可以违心地认为它是没道理的。可每个问题总有它出现的原因,这些隐患,你无法释然。当你没有fix前一个问题而另一个问题又接踵而至时,它也在公然挑战着一些东西,比如说信心,耐心,权威。诚然,terminator的角色是不应该存在的,而在这个特殊的时刻,I have to be。

SL对于我来说,不是一个能不能做好的问题,而是一个必须做好的问题。我想,这其中的过程会对我磨炼很多,而我收获的相对于我失去的,不会让我后悔。

时间

今天上午上运筹学,越发感到自己对管理知识的需求,甚至有了一种想重新选择专业的冲动。而对于时间的管理,则是我从自身感到最重要的,也是比较缺乏的。从现在到实习找工作,不到一年的时间,大三的时候我可以说我没有准备好,所以选择了保研,本科是一个可以允许我犯错的,可现在,是低容错的。任何人都不会为我自己的些许颓废买单,只有我自己。或许计划有时不能被正确地执行,有时也会被突来其来的事情打断,但没有计划的生活则会让自己都不知道做了些什么。时间流逝了,自己却停滞了。

无废话Spring i18n

ScholarLink展现层用的是Spring的MVC,JSP页面全用的是JSTL。做国际化的话,无外乎以下两个方面。

JSP的国际化

由于采用的是JSTL,所以用<fmt>标签就能很好的解决JSP页面上的国际化问题。

Java文件中的国际化

参照Spring2.0的reference,利用MessageSource处理。通过request.getHeader ("accept-language")可以得到浏览器的语言,new一个Locale对象,放到session中,作为 resources.getMessage()的一个参数。当然不可能在每个set中文的地方都调用这么一堆方法,目前的做法是写一个 i18nAction,当${empty locale}时候就被header.jsp include进去,暂且这么做吧,这样session中对locale的设置只会在浏览器打开的时候设置。

苦力活

当然还少不了各语言之间的翻译工作,对resource文件的操作强烈推荐http://www.guh-software.de/jinto.html ,非常方便。

总结一下,现在的做法是当用户登录(匿名),根据他的浏览器信息判断它的首选语言,进而展现相当语言的网页。这时候如果他登录或者注销都保持这种语言,如果关闭浏览器,session失效,判断语言的代码将重新执行一次。待增加的内容包括可以登录进来之后选择语言种类,有可能有一种需求是:用户游览器是en -US,但他选择语言是zh-CN,按照现在的效果这时候如果他关掉浏览器因为session没了再展现给他的还是en-US。如果这个要改进的话可以在数据库user表里加字段,不过我看secondlife和其它网站选语言时都只是转向一个二级域名, cn.secondlife.com等。所以现在这个问题的优先级是比较低 的,现在待解决的问题就是大量中英文翻译。

Category: SL, java  Leave a Comment

mylyn试用笔记

首先下载eclipse3.3版本,然后下载mylyn包和JIRA Connector。

http://www.eclipse.org/mylyn/downloads/

把两个压缩包里plugins中的jar全部copy至eclipse plugins目录下。

重启eclipse,你将会看到welcome页面会有

然后Add Task Repository,选择

接下面的页面按照要求填写即可。不可如果JIRA的远程API调用功能没打开的话,会出现一个envelop tag的错误,以管理员身份登录JIRA,把OFF改成ON即可。

接下来就可以用mylyn来工作了,mylyn并不只是JIRA在eclipse的一个插件,更像是对开发工作、行为、习惯的一种管理。具体可以详见dw上的一篇文章。

http://www-128.ibm.com/developerworks/java/library/j-mylar2/index.html

而目前我只玩了玩mylyn作为JIRA插件的一些功能,不过有些功能并不能和JIRA一一映射上。

例如在创建task的时候Due Date不可设置,Affected Versions不能多选,,还有一个比较恶的是在创建的时候不提供把任务指派给谁的选项,默认是指派给项目负责人,so要是大家在SL里都用这个来创建的话,那么liushi就废了。。。要是想指派给具体的人需要在创建完任务后在actions的reassign to里设置,我测试的时候只能填写具体的用户登录名,没有下拉框可供选择,不清楚是不是由于只有这一个人用mylyn的缘故。

不过在创建完task后在这个task界面上基本都有可以相对应的属性配置。

mylyn的Task List view是这样的

如果有新的未读任务创建,会在屏幕右下角弹出窗口提示,很cool的功能。

剩下的功能大家看看就知道了,用过JIRA看一眼就明白了。

总的来说,初次用mylyn的感觉丝毫不亚于当年在eclipse体验CVS的感觉。除了方便,其实也是对项目管理的另一种推进。

Category: java  Leave a Comment

门槛总会有的

还记得在实习的时候goodsheep跟我说的一句话:“你研究生可千万不能再搞Java了。”当然从这句话表面上来看,是totally stupid的,不过我能听出他的意思,他也知道我明白他的意思。技术的门槛不是思索或者报怨就能创造出来的,在这个容易浮燥的年代,我们更应该保持一颗冷静的心。

今天在JavaEye上的一篇贴子看到的两个回贴令我受教了:


技术是需要积累的,门槛也是需要积累的,
我想有几个方面值得积累:

1.系统构架,我指的并非单单是J2EE体系构架,设计模式或者是REST风格、MVC、Ajax等等,这些东西当然重要,但是当一种结构已经有了专用术语的时候,恐怕这些系统已经是任何人都可以构造出来的了。而往往很多系统并非如此简单,重要是是领会这些架构产生的根源,它们所应对的问题,它们的权衡,从而在遇到一个更大的非一种架构能解决问题的时候,或者处理一种无法在书本上找到的架构时具有敏锐的洞察力,并且可以用实证的方法去验证它。俗话说,千军易得,一将难求,很多公司往往缺乏这样的人手,从而导致缺乏竞争力,产品大量同质化,基本上在同一个档次上。

2.某一方面的专业技能。这个是我们最认同的门槛,这方面的人才和公司,是需要非常静得下心来、耐得住寂寞的。除了极少数的一些公司外,中国可能很少有公司能在这方面能够做得比别人做得更好。而且通常可以通过购买或者开源软件得到。

3.比较广博的知识,用最合适的工具处理手头的工作。譬如语言无关论可以认为是一句废话也可以认为是一句真理。说有关,是每一种语言绝对有它自己的专长,选好的工具就能够高效地开发,提供给用户好的使用方式,说无关,是你应该不拘泥于一种语言,而是成为语言的驾驭者。而这一点往往会成为你公司或者个人一个非常重要的竞争优势。

所以头不妨抬高些,眼光不妨放长远些,心不妨放低些,耐心积累,总会有厚积薄发的一天,门槛总是会有的。


至于管理,就更加是如此了

总是要先遇到挫折,然后才会有有一种理想(或者期待),或许你运气好正好知道有你理想中一种好的方法,然后上下求索,不得安宁,整天想这样去做。

如果在无法完全引入的一种新方法的情况下,你完全可以渐进地去做一些事情,少说,多做,效果会更好。

但就算这样作了,你可能会碰到新的问题,或者落入教条主义。你必须在理解这些好方法所要应对的问题的情况下,针对你自己目前的情况进行定制。

所以敏捷说,每一个项目都有自己的方法学,我要说每一个公司都有自己的方法学。所以敏捷说,敏捷不是敏捷实践,敏捷是不可以认证的,因为可以用考试得到的,那就不会是敏捷的,所以我说敏捷的关键是要有敏捷的神,要有敏捷的心。”


收藏之。

Category: reading  Leave a Comment

他们的生活

昨天老妈告诉我儿时的一个邻居高考考了理科全县第一,真快,当初那个每天跟在我屁股后的小孩居然也高考了。

记得有一次他非要跟我去游戏机厅玩,我不想带着他,就在前面跑,想甩了他,到游戏机厅门口往后一看,还是跟着死死的。没办法,只好带着他进去。我挑了个位置津津有味地看着四个中学生在打着忍者神龟,他也要跟我站一起,不过太挤了,他实在挤不过来。我说你就站那边看吧,说完不管他,继续看着。没想到过了一会,他从机器的后面钻了过来,跑我身边来了,这一钻不要紧,把电源给踢掉了,然后就听见那几个中学生大喊:老板死机了。在他们没发现原因前,我立马给他带回家了,心想:带个小弟还不够捣乱的呢。。。后来他家搬走了,一时间当我发现我每天都会去逛逛的地方住着新邻居的时候,还真是很不习惯。

有时候经常在想这些儿时的伙伴现在生活的样子,彼此在孩提时代的生活交集似乎是很有意思的东西。在这个毕业的季节,任何回忆的东西总是特别能勾起一丝感慨。只不过有些是苦的,而有些是甜的。其实,他们都有了他们自己的生活,在每年回家偶尔能碰上的时候除了怀念在一起玩闹的日子外,或许还会有一些羞涩。在这个信息年代,有些发小我甚至都没有他们的联系方式。不过也无所谓遗憾了,不用去在乎未来的生活有没有交集,就像儿时的无忧无虑一样,把握好现在的生活,已经足够。

Category: memory  Leave a Comment

写在决赛之前

或许在脑海里,里肯那张稚气未脱的脸还是昨日的情景,可岁月镰刀却已把欧冠在年轮上刻上了十年的烙印。从初一到大四,十年了,很多东西都变了,而那份红黑情结,不会变。

扎切罗尼,米兰历史上第三位第一年上任就获得联赛冠军的教练。可那次联赛冠军的成色,更多的是幸运。那时的米兰,在人员配置上显然还不能在欧冠这个大舞台上翩翩起舞,与切尔西,柏林赫塔,加拉塔萨雷同分一组,却只能小组垫底,你显然不能对扎克有更多期待。而在次年,舍瓦在终场前罚进那个只能逼平拉科的点球时。扎克,是走人的时刻了,感谢你带来的那个联赛冠军,但你在乌迪内斯与比尔霍夫的甜蜜蜜月却不可能延续到欧冠上。

之后,无论是老马尔蒂尼的救火,还是那个土耳其人的信心满满,都只能疲于应付联赛。

2003年,要说这是米兰在欧冠的分水岭,绝不为过。

安切洛蒂,这个曾和马尔蒂尼,科斯塔库塔并肩作战的人,开始了他在米兰欧冠的首演。提到马队,比利,就不能不提另一位个米兰的老人,你猜对了,阿尔贝蒂尼。这个曾经在安切洛蒂在球员时代有过矛盾的,多么想终老圣西老的米兰战士,却被告知队里没有他的位置。从马德里竞技辗转到巴塞罗那,最终结束租借,也没能在米兰换来一个替补位置。阿尔贝蒂尼无奈地选择了转会拉齐奥,转会,这个字眼,我想,就像马队和比利一样,从来不曾出现在他的字典里。阿尔贝蒂尼是一个让我动情的球员,就像皇马球迷对耶罗的感情那样。米兰欠他的。

安切洛蒂对阿尔贝蒂尼的无情驱逐,却造就了另一个天才后腰的诞生,没错,皮尔洛。当时的“四10号”中场,被证明是米兰复兴的基调。2003的欧冠还是双阶段小组循环赛赛制,而很令人吃惊的是,不管是与拜仁,拉科同组,还是和皇马同组,前四场全胜,提前锁定小组第一,是米兰向欧冠发出的信号。因扎吉,在舍瓦大部分时间受伤缺席的时候,成了一个“现象级”球员。在他进球后狂奔,怒吼的时候,我总感到自己的肾上腺素在加速地分泌。那时候,我正读高三,中午是 11:55下课,每天下课总是骑自行车飞奔回家看体育新闻,遇上有老师拖堂的时候,感觉要抓狂了。那一年的米兰,虽然有的时候有些“1:0主义”,但从来没令人失望。与尤文图斯在老特拉福德的决赛,本可以不用持续到点球大战,舍瓦的进球被证明是个误判。

之后的几年,安切洛蒂在欧冠的表演证明他在米兰欧冠的首演绝非偶然。虽然,逆转是主旋律,从伊鲁埃塔自己都不相信的里亚索奇迹,到几乎被一个韩国人搅翻的飞利浦,再到伊斯坦布尔的惊天大翻盘。米兰总是让你在任何时刻都绷紧了神经。有时候,人总是会想,失去了什么什么,其实失去与获得并不是那么的绝对。我想如果今晚出征雅典的米兰战士能仔细去舔一下前年受伤的伤口,难道还有什么比意志更能激发人的吗?沉淀之后再出发,当你发现你再一次回到原点时,实际上你的高度已经提升了一层。历史总是在螺旋中前进的,不是吗?

当然,一切的一切都可以用“足球是圆的”这句话来解释。所以即使今晚失利了,在体会失去的同时,也应当去体会收获了什么。即使最后受到对方的嘲笑,take it easy。这只是一项体育运动,一笑而过吧,没必要搞的剑拔弩张或是冷嘲热讽,这不应该是足球带给我们的。不过在看中国队的时候,我却没法做到这么淡然,失望之后总是寄予又一次的希望,国家转到国奥,国奥转到国青,如此反复,呵呵,很有意思的事情,有点无法解释。

有时候,自己问自己,为什么会对米兰这么情有独钟,喜欢了十年却从不变心。心里想想,忠诚,这两个字应该是最能打动我的。当你多年以后想起那个6号和3号,还有穿着皮衣在圣西罗挥手告别的背影,阿尔贝蒂尼告别赛上留下的泪水,有些东西,已经深深地印在脑海中了,而那种感觉,叫做喜欢。

我也会祝福那些从米兰离开的人,一路走好。只不过,走了就不要回来了。感情不是回来的砝码。

PS:写得有点乱,前天很无奈结束了一段四年的感情。不过,自己却很冷静。You will never walk alone。很喜欢这句话。

坚持

来北京之后就没怎么写过BLOG,却不代表没发生什么。

实际上,发生了太多的事,有的已经不是语言能表达的了。郁闷的生日,丢手机,繁重的工作,第一次out of momey,最后,甚至在感情的路上迷茫。

多希望第一次就代表着永远,那张所谓的爱情证书此时看来仍然遥不可及。

漂在北京,每个外乡人都有自己的阳光时刻和灰暗瞬间。漂或曾漂,漂在北京,比别人付出更多的努力去奋斗和拼搏,是为了一个叫梦想的目的么?还是为了生存?为了体验?为了纪念?甚至仅仅就为了漂……

漂,是生活状态,但更是生活态度,麻木之外更多的还是追逐。

颓废不应该是我现在的主题,更何况是对于我这样一个天生乐观的人。可当触碰感情的时候,但是忍不住会胡思乱想,写一些灰色的文字,当然,这些是不能发上来的。

来北京后,一直是早上八点出门,一个多小时,公交,城铁,地铁到宣武区财政局,晚上八点下班,一般都要加班,九点下班,十点办能到寝室。一周六天,基本天天如此,搞得我又是向爸妈抱怨又是向同学抱怨。现在想来,当时那些苦也能算是身累,甚至身累都算不上。而当心真的累了,却无处诉说,更是不愿诉说。

有词为证:

少年不识愁滋味,爱上层楼,爱上层楼,为赋新词强说愁。

如今识尽愁滋味,欲说还休,欲说还休,却道天凉好个秋。

人生就是这样,事情在变,人在变,最近总喜欢说这句在无印良品分手演唱会上光良说的话。其实,在我心里从来没将他俩分开过,不管是光良或是品冠,他们的歌总是归类到无印良品,当然,还包括他们以前的歌。从声音上来说,他们也是绝配,光良的高音加品冠的低音,有太多经典的曲目。可他们终究还是分开了,留下无尽的遗憾。