Wednesday, October 21, 2009

老婆说有点像我

故事出处找不到了,内容如下:

从前,有位年轻的猎手,他枪法极准但总捕猎不到大雁,苦恼的他找一位长者求教。

长者把他领到一片大雁栖息的芦苇地,指着站得最高的一只大雁说:"那只大雁是放哨的,我们管它叫雁奴。它只要一发现异常情况就会向雁群报警,所以接近雁群往往是很困难的。但我有办法,你现在故意惊动雁奴再潜伏不动。"年轻人照做了。雁奴发现年轻人后立即向同伴发出警告,正在栖息的雁群闻讯后纷纷出逃,但没发现什么,便又飞回原地。长者让年轻人如法炮制了好几回。终于,几乎所有的大雁都以为雁奴谎报军情,纷纷把不满发泄在雁奴身上,可怜的雁奴被啄得伤痕累累。"现在,你可以逼近雁群了。"长者提醒道。于是,年轻人大摇大摆地走进了芦苇地,雁奴虽瞧在眼里但也懒得再管,年轻人举枪......

悲剧往往就是这样发生的:忠诚的人被误解,被误解的人不能坚持到底。

Thursday, October 15, 2009

Ubuntu9.04上看电影加载中文字幕乱码问题

最近在我的Ubuntu9.04上看电影总是加载中文字幕的时候出现乱码,后来发现是字符编码的问题,今天休假在家就写了一个小的字符转码的程序,目前来说满足我自己的需求了,代码如下:

import sys,io

if len(sys.argv) != 2:
print "Please input file path!"
else:
f1 = io.open(sys.argv[1], "r", encoding="cp936")
f2 = io.open(sys.argv[1] + ".new", "w", encoding="utf-8")

for line in f1:
f2.write(line)

f1.close()
f2.close()

Wednesday, October 14, 2009

Linux代理服务配置

1. 安装squid服务
2. 配置/etc/squid/squid.conf文件
acl all src 0.0.0.0/0.0.0.0
http_access allow all
由于我是内网使用,所以权限配置就全开放了。
3. 启动squid服务,默认的端口是3128
service squid restart

Sunday, October 4, 2009

《三杯茶》

我:你看那本《三杯茶》了没有?
老婆:看了。
我:怎么样?
老婆:挺好的,讲人性的。
我:啊,你看懂了,我看了一点咋没看懂。
老婆:那当然了,你没有人性么。

Saturday, September 12, 2009

搭建公司Hudson持续集成环境

一直说在公司搭建持续集成环境,前前后后拖 了有快一年了,总算是在昨天下午快下班前初步搭建出来了。说来也是偶然,本来是到下午快下班的时候感觉精神不太好,就随便找了点资料,没想到Hudson 这么容易用,三下五除二竟然就搭建起来了。昨天下班的时候已经可以初步运行自动测试脚本了。今天来又把Hudson的Slave支持给看了一下,真是感觉 越看越强大,很容易就可以搭建一个分布式的持续集成环境。下一步就是把我们目前我们在做的项目怎么一个一个加入到持续集成环境里,这样Dev就可以很方便 的测试每天的修改的代码了。但是到这里,说句心里话,还是有点担心,担心的不是Hudson能不能瞒住我们现在的需要,而是如果我把这个东西推广出去后, 按照现在Boss们这么激进的想法和做法,肯定会一窝风的推荐大家都去用,就像当初的Selenium一样,这样就有可能会每个组会有一套自己的东西按照 自己的想法去做,从而导致东西越用越复杂,越用越乱,就像我们的GUI一样,这样到最后很有可能出现意想不到的后果,真是难呀。

Sunday, August 16, 2009

perf4j vs. simon

1. perf4j的资料和例子要比simon详细一些。
2. perf4j和spring的集成要比simon好一些,simon现在还不能实现代理有参数构造函数的bean,此时simon会出现(Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given)异常(http://netfork.javaeye.com/blog/286215)。因此目前要想使用必须要么使用JDK自带的自动代 理,要么必须提供默认构造函数,要么修改spring的类。
3. perf4j和simon都提供了Annotation注解支持,但都依赖spring aop的实现,就是会有#2中的问题。
4. perf4j目前支持将日志信息写入日志文件,然后用命令行来查看结果。但是simon目前没有提供默认实现。但是可以通过callback来自己实现。
5. perf4j支持设置统计结果的显示步长,simon不能设置,但是simon提供了clear方法,可以清空当前内存中的统计信息重新开始统计,这一点perf4j默认实现不了,必须自己编程实现。
6. 目前项目中使用的是让perf4j来解析整个日志文件类来产生最后的结果,这样如果日志文件太大,统计分析会比较慢。

Spring AOP - Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

今天在集成perf4j和javasimon到代码里的时候发现一些问题,就是本来在自己的测试代码里运行好好的东西,在放到项目代码里的时候总是报以下错误:
...
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
...
比 较了代码半天发现在自己的测试代码里没有用到有构造参数的spring bean,而在项目代码中很多的类都是通过有参数构造函数来创建的。而spring在借助cglib创建目标对象子类时,并没有对有参数构造函数做处理, 而是使用的默认我参数构造函数,这就导致了以上异常的出现。这里有一个很详细的文章对这个问题做了描 述,http://netfork.javaeye.com/blog/286215

Friday, August 7, 2009

Struts2中Action的@BeforeResult方法被执行两次问题


这个问题通常会在两种情况下发生
第一种是在标注了@BeforeResult的方法中有异常发生,这个时候struts2会调用这个方法多次,这个问题同事有很多人碰到过,解决办法是在标注了@BeforeResult的方法中捕获所有异常,然后添加到ActionError中。
第二种是出现的情况是在两个有继承关系的Action中都标注有@BeforeResult方法,这个时候struts就好调用子类中的
标注有@BeforeResult的方法两次,这个问题可以从xwork的源代码com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor中发现问题所在。
public void beforeResult(ActionInvocation invocation, String resultCode) {
Object action = invocation.getAction();
List methods = AnnotationUtils.findAnnotatedMethods(action.getClass(), BeforeResult.class);

if (methods != null && methods.size() > 0) {
Collections.sort(methods, new Comparator() {
public int compare(Method method1, Method method2) {
return method2.getAnnotation(BeforeResult.class).priority()
- method1.getAnnotation(BeforeResult.class).priority();
}
});
for (Method m : methods) {
try {
m.invoke(action, (Object[]) null);
} catch (Exception e) {
throw new XWorkException(e);
}
}
}
}

实现中首先是找到所有的标注有@BeforeResult的方法,然后在子类的实现上依次调用找到的方法,所以就出现了调用两次的问题。解决办法比较简单就是避免这种结构出现在自己的类中,或者自己写一些代码检查是不是已经执行过@BeforeResult中的方法。

Monday, July 27, 2009

perf4j中使用Piped I/O Stream

这几天是在作JMX和 一些关于Performance的调研,由于JMX三年前在Perf中用过,所以这次重点不是JMX,二是怎样用JMX来管理,监控WEBGUI,另外就 是怎么把一些和Performace相关的接口暴露成JMX。今天做了一些perf4j,一个开源的performce工具的调研,其中碰到一个问题,还是给我自己上了一课。那就是在perf4j里有一个接口使用PrintStream作参数,然后perf4j把解析后的日志信息输出到 PrintStream,但是我有一个需求就是想要返回格式化后的日志内容,今天花了很多时间在找已有的JavaAPI和第三方的API,另外就是使用 PipedInoutStream和PipedOutputStream,最后还是没有找到太好的方案,这时突然想到,为什么我不自己写个类实现 OutputStream,内部用StringBuffer来缓存格式化后的日志内容呢,相到这,我就迅速的写了一个非常简单的类很轻松的实现了原本自己 的需求,代码如下:
http://code.google.com/p/garbagecan/source/browse/trunk/java/perf4jstudy/src/main/java/com/googlecode/garbagecan/perf4jstudy/LogParserUtil.java
另外在做这些调研的时候还试着使用了一下PipedInputStream和PipedOutputStream两个流
http://code.google.com/p/garbagecan/source/browse/trunk/java/perf4jstudy/src/main/java/com/googlecode/garbagecan/perf4jstudy/PipedIO.java

Monday, June 15, 2009

难用的ICM Performance JMX

今 天在公司有点感冒,本想下午请假回家休息,结果不知不觉弄一个Performance问题弄了一个下午。本以为ICM提供的JMX会有很大帮助,最后发现 他们给API都太简单了,不方便使用和统计。没办法自己想了想好像可以在原来ICM的ServiceFactory上做一个动态代理来代理所有的 ServiceClient,从而实现对方法调用次数和用时的统计,说做就做,由于在ServiceFactory里是使用的类,而不是借口,所以排除了 直接使用JDK的动态代理实现,而只能使用cglib来实现,原来做过这方面的东西,所以简单又查看了一下cglib的文档和例子(例子少的可怜也简单的 可怜),花了两个小时很快就弄了一个出来。同时也整理了一个文档放在google docs里以备以后使用。

Saturday, May 23, 2009

Bug Fix Plan

一个月前,Yi让我做了一个Excalibur Bug Fix Plan,自我感觉做的不错,邮件内容如下:
=========================================================

Just now, Excalibur_GUI and Unit_Test_Excalibur_GUI area has total 70 p1 + p2 bugs.

Note: This 70 bugs not includes the bugs that will be fixed once sprint2 project finish - 17 bugs

Sprint2 Bug fix plan:

Week

Dev Resource

Plan Dev Fixed

Plan QA Logged

Bug Number

(approximation)

Apr. 24 - Apr. 24

-

-

-

70

Apr. 27 - Apr. 30 (4 days)

1.5

2 * 1.5 * 4 = 12

3 * 4 = 12

70

May. 4 - May. 8

3

2 * 3 * 5 = 30

15 * 5 = 75

115

May. 11 - May. 15

10.5

2 * 10.5 * 5= 105

15 * 5 = 75

85

May. 18 - May. 22

10.5

2 * 10.5 * 5= 105

10 * 5 = 50

40

May. 25 - May. 29 (4 days)

10.5

1 * 10.5 * 4 = 44

10 * 4 = 40

???

Dev Resource:

Resource

Apr. 27 - Apr. 30

May. 4 - May. 8

May. 11 - May. 15

Chunlin



100%

Gang



100%

Jiangwei

100%

100%

100%

Lin



100%

Liyuan

50%

100%

100%

Chao



100%

Fanbin



50%

Hong



100%

Peng


50%

100%

Xiaodong



100%

Yong


50%

100%

SubTotal #

1.5

3

10.5

Note: The resource does not include Wanqing.

=========================================================
今 天看了实际情况和预计的差别比较大,主要原因是Dev一直有新项目来,不能保证有足够的Resource在Bug Fix上,实际上May 11-May 15这周只有3个人在Bug Fix上,粗略估计了一下,如果最后一周大家都在Bug Fix上,应该和当初预想的差不多。目前P1+P2有120个bug,如果能在May 11 - May 15这周再加上预期的7.5的resource,就应该是120-7.5×2×5=45左右,应该算很准了。

Tuesday, March 10, 2009

收购StarUML

今天在公司讨论关于画UML的图的工具的时候,想到了StarUML,一个被很多人遗忘的软件。其实这是一个很不错,不对,是相当不错的开源的UML/MDA软件。但是令人遗憾的是这个软件自从2005年底的release之后就再也没有新消息,在官方网站的Roadmap上可以看出还是有很多的feature想做的,但是不知道现在为什么没有新的动作!与其这样,还不如那个公司站出来把它收购得了,改吧改吧直接就可以卖钱了,尤其在当前经济危机的情况下。