Archive for the Category »Uncategorized «

Protected: match

This post is password protected. To view it please enter your password below:


Category: Uncategorized  Enter your password to view comments

MOTD归来

就当奥运如火如荼地进行之时,新赛季的英超联赛上周末已经鸣金开战.so,每周末又可以下载高清的BBC Match of the Day(简称MOTD)欣赏了.

昨天晚上看了Day1,第N次感叹英超已经全方位将其他联赛甩在身后.随便聊聊看完的感受吧:

保罗因斯入主布莱克本,感觉执教能力和经验还差马克休斯一筹,本特利出走白鹿巷,实力整体有所减弱,不过圣克鲁兹还是可以依赖的.加上Paul Ince,曾经在MU效力过的英超现役主帅已经有4名了,还有Mark Hughes, Roy Keane和Steve Bruce(拜托布鲁斯同学不要再将名字缩写印在教练外套上了).

富勒姆首轮就输给了升班马,他们本赛季还是为保级而战,不知道本赛季是否还有上赛季最后一轮挤掉雷丁的运气.

阿森纳本赛季中场人员流失严重,而纳斯里的到来从任何方面来说,都是非常正确的选择.假以时日,"皮雷二世"将横空出世.

罗比基恩以2000万英镑的身代来到安菲尔德,我觉得这么高的价格有待商榷,尽管高佬已经出走朴茨茅斯.从第一轮的表现来看,小基恩表现得很积极,甚至有点过了头,将托雷斯一个空门补射给挡出…非常尴尬.托雷斯还是红军最可以依赖的,他已经不再是马竞那个hell boy了.

再来说说热刺吧.热刺一直是我非常欣赏的球队,老板非常有进取心,从这几年的经营,买人就可以看出,他们不甘居于第二阵营,不过打破传统四强的垄断,还是有很长的路要走.今年从阵容上补充了相当一部分有实力的球员,莫德里奇,本特利,多斯桑托斯.不过对热刺最伤的就是小基恩和贝巴托夫(虽然还未正式离开)的出走,而达伦本特不能被寄予过多期待.

最后来看看贝赫拉米.是的,这位前拉齐奥的右中场已经转会铁锤帮.我并不是说贝赫拉米有多强,但这种其他联赛准强队的绝对主力流失到英超的现象,却是耐人寻味的.而这种例子其实有很多了,上赛季乌迪内斯的蒙塔里就跳到了朴茨茅斯.这种信号已经很明显了,就看其他联赛能不能忘记历史,重新迎头赶上了.

伪问题 or not

来公司之后接到的第一个任务是把原来的一个数据库重构,中间遇到两个小问题.算不算问题?这是一个问题.

第一个问题可以抽象成这样:
表p(erson)和表a(ddress),他们原来都没有主键,表p的属性有p_name,表a也有p_name,是直接引用表p的p_name,然后还有些type,phone之类的.
现在要做的事情就是把两表都加上id主键,然后把表a的p_name改名为p_id,并通过其以外键的形式和表p关联起来.虽然我不知道出于什么原因这些表设计之初没有主键,无所谓是否把它看成一个伪问题,反正只是一条update语句搞定的事情.alter之后的表看起来像这样:

表person  
p_id p_name


表address      
a_id p_id(p_name renamed) type phone

注意现在address的p_id是原来的p_name改名改过来的,数据还是person的p_name值.
我首先想到的是update person, address set address.p_id = person.p_id where address.p_id = person.p_name.
悲剧,update操作后只能接一个表.所以想当然的把select中的思维拿来过做update是不行的.
再次试验,update address set p_id = (select p.p_id from person p, address a where a.p_id = p.p_name).
再次悲剧,提示update操作set的值必须是唯一的.
括号里的子查询结果确实是得到了正确的结果集,不过这样赋给p_id是不允许的.
最后的语句是这样的:
update address a set a.p_id = (select p.p_id from person p where a.p_id = p.p_name fetch first 1 row only).
特别注意这里有个first 1 row only是db2的方言,相应数据库应该换成取头一条记录的相应语句.

第二个问题就是在原来的表上更新id字段,因为以varchar作主键无法自动增长,所以先设成default为0.
这个问题你当然可以说改成integer或者bigint就完全不存在这个问题,不过牢骚归牢骚,问题还是得解决.
首先想到的是能不能用一条语句就搞定了.尝试了一下,也搜了一些db2的函数,不是那么容易,要做+1操作还得做转成数字的操作.一条语句应该是不行,或许写个存储过程能搞定.
然后想到的就是用N条update语句做了,因为update每次只能set一个value.手写N条语句是不可能了,最后实现的方法是用JDBC先把所有id为0的取出来,然后遍历,同时构造相应的domain对象,将其加入一个list.然后把数据库的id为0的纪录清空,遍历list,将每个domain对象插入.其实最后用的是insert操作而不是update,update的话还是有很多限制.
虽然这个方法看起来比较诡异,anyway,还是解决了需求.

最后来看看这两个问题,虽然你有一万个理由置疑这个问题为什么会出现,并牢骚满腹地抱怨为什么会有这种伪问题.但是,一再坚称伪问题也只能说明你不敢面对.只有当你如庖丁解牛地分析各种伪问题,并给出solution,才说明水平到了新的层次.

实训总结

这个总结本应该早就写了,不过本人码字能力实在有限,以前每次写篇总结都要花费大块时间,有时候觉得不划算,加上惰性使然,有时候一拖再拖就拖没了。。。言归正传,log,log,不及时记录“程序”出错了靠什么调试呢,所以还是得及时写。

这次实训做的来说效果还不错,做的项目也不是那种老掉牙的某某信息管理系统,每天从早做到晚,用了三周的时间,,还算比较顺利地完成了。

项目需求来源是从中软烟草办给国家烟草局做的数采系统中抽取的,做的主要是烟草数据的采集与分析,展现等。总的来说,这次的项目要分为三个系统:国家,省和地方。而系统间的信息和数据传递是通过消息中间件(MQ)来传递。项目进行过程中,我把遇到的一些问题都记在一个Q&A文档里,下面就把这些问题扩展一下,作为一个总结。

  • 项目分工及CVS
    这次的项目我是以项目经理的角色参与的,小组除了我还有九个组员。大家水平参差不齐,但都特别认真,用郭德纲的话来说就是:“我很欣慰呐”。一般说来,分工无外乎这么几种分法:垂直的根据逻辑层来分,水平的根据功能模块来分。其实我很希望按垂直的方式来分,三个人(或组)就够了,一个负责持久层和DAO,一个负责控制层和Serivce,一个负责页面展示和CSS等。不过这种分法只适合于配合特别好的团队,对于这次这个临时的团队,我还是老老实实地按水平方式来分吧。最终分成了四个小组,国家局和地方系统各三个人,省局系统一个人,MQ一个人。在各小组之间,有功能类似的地方,如果在俱乐部做这个系统,肯定这些代码就会抽取成通用的service,不过对于这个团队还是别勉为其难了。 
    CVS管理有一点小麻烦,因为这次是管理三个系统的代码。建三个CVS仓库看起来是最简单的,不过这样一些公用的基础代码更新就无法得到通知保证,当然类似把基础代码放在三个CVS中这种stupid的做法排除在外。最后采用的还是一个CVS仓库,基础代码和公用类作为主线(HEAD),在此基础上建立三个分支(BRANCH)。建完之后就等于是四个系统彼此独立(三个分支和一个主线),最后在三个分支上手动将基础代码部分切换到主线上。
  • 基础框架
    这次项目让我比较爽的一点就是我终于扮演了一把以前在DC实习时胜哥的角色,技术总监。系统的基本框架是在寒假时候搭的,花了三天的时间。我曾经很多次对自己的性格进行过分析,结果是我不擅长做类似项目经理这样的角色,我更喜欢把代码写得很整齐,很优雅,而对类似需求一类的事情不很感冒。而对开源的东西很感兴趣,毕竟能看到源代码能让人觉得很踏实。
    “我应该有一个自己的Appfuse”,这是我很早以前的一个计划,这个框架不必太大,但是尽量要可以接受“CHANGE”这六个字母的挑战,在不断的迭代中学习。不过遗憾的是一直都没有静下心来实行,今年寒假过年前利用一些时间静下心来鼓捣了一部分。参考了Appfuse和SpringSide的代码,用到的框架跟Appfuse SpringMVC的版本差不太多。
  • DB2
    一直很纳闷为什么给政府,金融这些部门做系统数据库是DB2和Oracle二选一,应用服务器是WAS和WebLogic二选一。难道Tomcat,Lighttpd,Apache,Mysql这些开源的产品只能飞翔在Web2.0风格的网站上么?承受不了大数据量?类似豆瓣,JavaEye这样的网站流量和数据量并不小。
    这次的项目也一样,强制使用DB2+WAS。用就用吧,DB2就当是MySQL用,没有足够时间研究它的高级特性。以下是一些Q&A:

    Q:db2连接时显示no suitable driver,但是单独写一个jdbc程序连接却可以成功。
    A:将db2的bin下的db2jdbc.dll拷贝到jdk的bin下即可。

    Q:安装db2时安装快结束时显示你的系统用户名没有权限执行某些操作。
    A:很有可能是你的系统用户名的实际名称和显示名称不一致(即任务管理器中的名字为A,但是欢迎屏幕上显示是B)。所以安装前最好在管理工具->计算机管理->本地用户和组->用户设置正确。

    Q:com.ibm.db2.jcc.a.SqlException: 运算 "=" 的操作数的数据类型不兼容。
    A:这个问题原因有很多种。我出现错误的原因是沿用了Mysql的数据逻辑,举个例子:A表的xx_id与B表的id主键有外键关联关系,在Mysql里用varchar存储xx_id没问题,一切OK。但是在DB2中,你就必须把xx_id设为integer,因为Mysql和DB2对表主键约束力不同。虽然主键都用integer存储,但DB2中如果id作为外键与另一个表关联时,另一个表的xx_id就必须是integer。而对于这个问题的发现及解决,得益于在开发中坚持了DAO层的测试先行,所以并未花费多少时间。

    在对DB2的操作上,虽然也有Quest Central这样的工具,不过掌握DB2命令其实是更重要的。因为图形化操作前端始终只能局限在windows上,而部署DB2或者Oracle的系统肯定是非windows系统(大多数是AIX)。所以泡在前端上沾沾自喜,觉得自己掌握了数据库操作的想法是比较幼雅的,嗯,以前我也挺幼雅的。。。
    另外,这次还发现了一个部署时的小问题。对于Ant,Maven这类项目构建工具来说,编译时必须注意一点,有可能你在windows上测试没问题,不过部署到类Unix机器上去,说不定就编译出乱码了。原因见之前的一篇文章

  • OpenSessionInView之怨念(待续)
  • 谁不会加减法(待续)

中软实训(流水篇)

年后到来北京之前的这段时间,都花在串亲戚上了,mini web也就没怎么鼓捣了。从16号从南昌坐了一个四位数的火车到北京,已经有一个多星期的时间了,最近两天终于是能上网了(不过是包含了N多限制的)。

实训基地是在中软的昌平基地,说自己在北京有点惭愧,因为貌似在北京市地图的昌平区找不到这块地方。。。实训为期三周,周六周日也算在内,给我们组分配的是一个类似国家烟草办的项目,具体需求来自中软的烟草办。实训第一天,我被稀里糊涂地被推到PM的位置,不过从我对自身的分析来看,还是不太适合做项目经理这种角色的。我更愿意安安心心地整个技术架构什么的,结果这一周大部分时间是在与需求博奕,这个惨。

而这个项目从技术上对我来说,有几个地方像WebSphere MQ,OLAP等,是我从来没接触的,而且带我们的老师很nice(是中软的某某CTO,具体CTO之前的定语不太清楚),也算是不虚此行了。不过比较遗憾的是在PM的位置基本没时间去尝试这些了,杂七杂八的事情太多,而且项目的基础代码都得我来写,action层以上才能放手交给其他人。

老师给我们作了几次讲座,发现企业关注的技术点和学校里还是很不一样的,毕竟我也不可能一辈子待在学校,所以接触这些企业中运用的技术在新鲜之余,也将会影响我的学习路线。

说到企业的东东,很难不与heavy,big这些词相联系。mysql和tomcat可能大家都玩得很溜,可当笔记本遇上WebSphere和DB2,这个就比较难了,基本就是被玩了。。。不过话说我现在用的是4G内存,这些就不是问题了,嗯,详见中软实训(小黑篇)。