2007年01月15日

批量反编译java类

——jad做java类的反编译估计人人都知道,但是每次只能反编译一个文件确实有点烦。仔细找了
一下网络,终于找到批量反编译的方法(其实看jad的帮助都可以找到的 -_-b)。

——解压jar文件,或者直接找到类的解压路径。然后运行类似的命令:


jad -o -r -sjava -dc:/src com/**/*.class

其中src是反编译后的文件夹路径,com/**/*.class是目标反编译路径。使用该方法后,会把整个
com文件夹下的*.class反编译到c:/src文件夹下。

由 Sunny 发表于 15:25 | 回复 (0)

2006年10月17日

Java on AIX

给自己留个备用:


Downloading AIX Java and fixes

* Java Download site - All AIX Java releases
http://www-106.ibm.com/developerworks/java/jdk/aix/service.html
* Java Download site - Linux including pSeries
http://www-106.ibm.com/developerworks/java/jdk/aix/linux140/
* Java Fix and Release FAQ
http://www-106.ibm.com/developerworks/java/jdk/aix/faqs.html
* Java Fixes from AIX Fix Central
http://www-912.ibm.com/eserver/support/fixes/fcgui.jsp -- Chose pSeries
--> AIX OS, Java, compilers
--> Specific fixes
--> AIX level --> Continue

Enter Search string of Java14.* or equivalent and click Go

Select fix and download

Articles on Running Java on AIX

* Java on AIX: download, installation and configuration
http://www-128.ibm.com/developerworks/eserver/library/es-JavaOnAix_install.html
* Getting more memory for Java in 32-bit JVM
http://www-106.ibm.com/developerworks/eserver/articles/aix4java1.html
* Part 2: JVM Memory models - 32-bit and 64-bit details
http://www-106.ibm.com/developerworks/eserver/articles/JavaPart2.html
* When memory segments collide
http://www-106.ibm.com/developerworks/eserver/library/es-segcollide.html

Java Performance Tips

* Maximizing Java Performance on AIX: Part 1 - The basics
http://www-106.ibm.com/developerworks/eserver/library/es-Javaperf1.html
* Maximizing Java Performance on AIX: Part 2 - The need for speed
http://www-106.ibm.com/developerworks/eserver/library/es-Javaperf2.html
* Maximizing Java Performance on AIX: Part 3 - More is better
http://www-106.ibm.com/developerworks/eserver/library/es-Javaperf3.html
* Maximizing Java Performance on AIX: Part 4 - What goes in
http://www-106.ibm.com/developerworks/eserver/library/es-Javaperf4.html
* Maximizing Java Performance on AIX: Part 5 - References and Conclusions
http://www-106.ibm.com/developerworks/eserver/library/es-Javaperf5.html
* Implementing and troubleshooting Java on AIX: Quick Reference
http://www-128.ibm.com/developerworks/eserver/library/es-javaonaix.html?ca=dnp-422

Garbage Collection

* Understanding the IBM Java Garbage Collector, Part 1: Object Allocation
http://www-106.ibm.com/developerworks/java/library/i-garbage1.html
* Understanding the IBM Java Garbage Collector, Part 2: Garbage Collection
http://www-106.ibm.com/developerworks/java/library/i-garbage2.html
* Understanding the IBM Java Garbage Collector, Part 3: verbosegc and command-line parameters.
http://www-106.ibm.com/developerworks/java/library/i-garbage3.html
* Fine-tuning Java garbage collection performance on IBM JVMs
http://www-106.ibm.com/developerworks/library/i-gctroub/?ca=dnt-44
* Guidelines for using the Java 2 reference classes
http://www-106.ibm.com/developerworks/java/library/j-refs/?loc=dwmain?

Problem Determination

* Problem Determnation Guides
http://www-106.ibm.com/developerworks/java/jdk/diagnosis/
+ Java 1.3.1 Diagnostics Guide
+ Java 1.4.1 Diagnostics Guide
+ Java 1.4.2 Diagnostics Guide
+ Java 1.5 Diagnostics Guide
+ HeapsRoots heap dump analysis tool
+ IBM Java Garbage Collection and Storage Allocation
+ http://www.alphaworks.ibm.com/tech/jca - Thread and Monitor Analyzer
+ http://www.alphaworks.ibm.com/tech/pmat - verbosegc trace analyzer

* L3Java Team: Collecting Data for Memory Issues
http://www-106.ibm.com/developerworks/eserver/library/es-javaonaix_memory.html
* L3Java Team: Data collection for debugging hangs, high CPU and other performance issues
http://www-106.ibm.com/developerworks/eserver/library/es-javaonaix_trace.html
* Data Collection for AIX core dumps from Java applications
http://www-106.ibm.com/developerworks/eserver/library/es-javaonaix_core.html

由 Sunny 发表于 12:06 | 回复 (0)

2006年07月30日

无意中在SF上面看到一个广告

http://sourceforge.net/powerbar/websphere/chi/

广告上面那只猫样子好有型

最后看真点原来是卖WASCE的广告……

由 Sunny 发表于 22:54 | 回复 (0)

2006年07月19日

居然给自家的东西耍了

——一个J2EE应用中使用了jakarta的common-fileupload组件作上传处理。在windows平台下
没有问题,部署到AIX的WebSphere v6后,发现使用IE上传时速度很慢(上传5M文件耗时50多
秒),但是改用FireFox上传速度很快(同样文件上传一秒不到)。同样代码部署到AIX上面的
WebSphere CE版上面,问题依然。

——结果多方考证之后,发现是AIX的网络配置要搞点小动作才行。
在AIX上以root身份操作:


no -p -o tcp_nodelayack=1

问题解决了…… kao,还害我亲手写了个测试代码弄了半天。

由 Sunny 发表于 11:59 | 回复 (0)

2005年12月28日

用了大半天搞Edge Component的Load Balance

——今天闲来无事,就跟同事一起搞搞WebSphere v6 Network Deployment里面自带的那个
Edge Component。这东西号称能够做Load Balance和Caching Proxy的。结果折腾了一个下
午,中途在VM里面安装这个东西,当使用lbadmin启动LB的管理界面配置时,总是会说执行器(Executor)
还没有启动,于是手工使用dscontrol executor start启动时(按道理这个东西是可以自动起来
的),抛出错误:内核未装入(Kernel was not loaded),试过使用win2000 pro,win2000
Server,还有Red Hat AS4的VM上面都是这个问题。结果打800请教,也是没有什么头绪,但是
对方建议使用真实的机器来安装,无奈下找了台Win2000 pro的PC来安装,结果一切顺利,什么
都搞定了。请求也能够正常分派的两台集群里面的WebServer。

——看来VMWare也不是做实验的万全之策啊。当然LB是一定装在真实机器上,但是在集群里
面的其他WebServer还是可以用VM来安装的。

由 Sunny 发表于 18:22 | 回复 (1)

2005年10月18日

民工血泪史——新版本不是随便追求的

——最近几天趁有空,作作实验,其中一部分内容需要用到IBM Tivoli Directory Server,结果
就找了个5.2的版本安装,因为IDS需要用到DB2,于是就找了个新版本的DB2 v8.2来装上去。
安装过程不表,但是结果IDS的LDAP服务老是有问题。在上面做不了增加或者搜索的操作。折腾
了两天,最后把8.2卸载换成了8.1,结果原来的异常情况消失了。后来跟前人确认,果然是IDS的
5.2跟DB2v8.2是连不起来的。分特啊~~

由 Sunny 发表于 16:30 | 回复 (0)

2005年08月01日

WINXP SP2+ROSE 2003的"MEM_BAD_POINTER"的解决办法

——今天不得不重拾多年没用的“肉丝”,退出的时候还是弹出那个该死的“MEM_BAD_POINTER”
的提示框。千错万错就是因为SP2跟某些软件比较低版本的shw32.dll冲突有关。替换掉
相应应用程序的这个dll就是了。

解决办法:

1) extract shw32.dll from the attached zip file.

2) locate the copy of shw32.dll that the affected program (the one
that's giving the MEM_BAD_POINTER error) is using. Rename this file,
or move it to some other directory for safe keeping. Note: this step
is not strictly necessary, BUT if you experience problems with our
new DLL, the first thing we're going to suggest is that you revert to
your old one.

3) with your old shw32.dll renamed or moved for safe keeping, install
the new shw32.dll where the old one used to be. Now run your app as
usual and verify that the error no longer appears.

4) if after step 3 you still see the MEM_BAD_POINTER error, search
your hard drives for any other occurrences of shw32.dll and replace
those (using the above procedures), one at a time, until the error no
longer appears.

Download file

由 Sunny 发表于 15:07 | 回复 (3)

2005年06月14日

使用IIOP访问Domino

参考了
http://blog.csdn.net/zhengyun_ustc/archive/2005/06/10/391542.aspx
http://www.xnovo.com/doc/html/aebbbgbgbbagaagimhcirpfj.html
还有IBM上面的一些教程,终于稍微尝试成功了。

注意,除了写代码之外,服务器那边也是要有一点设置才行的。

package com.sunnystudio.tester;

import java.text.SimpleDateFormat;

import lotus.domino.Database;
import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.View;
import lotus.domino.ViewEntry;
import lotus.domino.ViewNavigator;

/**
* DominoDataSnatcher description
*
* @author Sunny
* @version 0.1
*/

public class DominoDataSnatcher {

public void process() throws Exception {

final boolean NEED_REMOVED = true;

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

lotus.domino.Session nSession = null;

try {
/**
* 连接Domino数据库
*/


String server = "RONGZHIXIN"; //服务器
String user = "sunny/foresee"; //用户
String pwd = "foresee888"; //密码
String dbname = "Testdocs.nsf"; //数据库,注意与选择的模板有关系
String viewName = "($All)";

nSession = NotesFactory.createSession(server, user, pwd);

System.out.println(nSession.getUserName() + "connected.");

Database db = nSession.getDatabase(nSession.getServerName(), dbname, false);
if (db != null && !db.isOpen()) {
db.open();
}
System.out.println(db.getFileName() + " opened.");

View view = db.getView(viewName);
ViewNavigator viewnav = view.createViewNav();
ViewEntry ventry = viewnav.getFirstDocument();
while (ventry != null) {
if (ventry.isDocument()) {
System.out.println(ventry.getDocument().getUniversalID());
System.out.println(fmt.format(ventry.getDocument().getCreated().toJavaDate()));
System.out.println(ventry.getDocument().getItemValueString("Subject"));
System.out.println(ventry.getDocument().getItemValueString("Body"));

System.out.println("++++++++++++++++++++++++++++++++++");

if (NEED_REMOVED) {
ventry.getDocument().remove(true);
System.out.println("removed.");
};
}
ventry = viewnav.getNextDocument();
}

} catch (NotesException ne) {
ne.printStackTrace();
throw new Exception("Notes error: " + ne.id + " " + ne.text);
} finally {
if (nSession != null) {
try {
nSession.recycle();
} catch (NotesException ne) {
ne.printStackTrace();
throw new Exception("Notes error: " + ne.id + " " + ne.text);
}
}
}

}

public static void main(String[] args) {

DominoDataSnatcher dds = new DominoDataSnatcher();
try {
dds.process();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Program finished.");
}
}

由 Sunny 发表于 12:22 | 回复 (1)

2005年06月07日

Oracle JDBC驱动中对Date支持的改动

——一直我们在Oracle8i上面用的程序,昨天发现放到9i数据库上面,用9i的JDBC驱动
连接后,发现我们用Java的Date类型放入到数据库DATE类型字段的数据,没有了时分
秒的信息。但是在8i上面用8i的JDBC驱动是没有问题的。换了一个我们自己Patch过的
8iJDBC驱动连9i数据库,DATE型的数据又可以保存时间信息了。结论就是9i的驱动是
不能将Java的Date里面的时间信息放入到DATE里面。

——翻查了Oracle的FAQ,果然发现这个结论和相应的解决办法:

Prior to 9.2, the Oracle JDBC drivers mapped the DATE SQL type to java.sql.Timestamp. This made a certain amount of sense because the Oracle DATE SQL type contains both date and time information as does java.sql.Timestamp. The more obvious mapping to java.sql.Date was somewhat problematic as java.sql.Date does not include time information. It was also the case that the RDBMS did not support the TIMESTAMP SQL type, so there was no problem with mapping DATE to Timestamp.

In 9.2 TIMESTAMP support was added to the RDBMS. The difference between DATE and TIMESTAMP is that TIMESTAMP includes nanoseconds and DATE does not. So, beginning in 9.2, DATE is mapped to Date and TIMESTAMP is mapped to Timestamp. Unfortunately if you were relying on DATE values to contain time information, there is a problem.

There are several ways to address this problem:

Alter your tables to use TIMESTAMP instead of DATE. This is probably rarely possible, but it is the best solution when it is.

Alter your application to use defineColumnType to define the columns as TIMESTAMP rather than DATE. There are problems with this because you really don't want to use defineColumnType unless you have to (see What is defineColumnType and when should I use it?).

Alter you application to use getTimestamp rather than getObject. This is a good solution when possible, however many applications contain generic code that relies on getObject, so it isn't always possible.

Set the V8Compatibility connection property. This tells the JDBC drivers to use the old mapping rather than the new one. You can set this flag either as a connection property or a system property. You set the connection property by adding it to the java.util.Properties object passed to DriverManager.getConnection or to OracleDataSource.setConnectionProperties. You set the system property by including a -D option in your java command line.

java -Doracle.jdbc.V8Compatibility="true" MyApp

由 Sunny 发表于 09:55 | 回复 (2)

2005年05月25日

在P4机器上面打Oracle8.1.7.4Patch的问题

——最近要搞Oracle10g的数据库,但是本身有些项目是放在8.1.7上面的,因此本机的
客户端只好装个8.1.7.4的补丁,然后两边都可以连。但是在安装的时候点击setup居然
没有反应。原来是Oracle用的jre118跟P4 CPU的兼容问题,在安装文件目录下面查找
*jit.dll文件,然后删除或者改名,就可以跑那个setup了。

——PS:之后改装Oracle10g的客户端,竟然在分析相关性检查的时候,抛出一个“无
法确定主机IP”的错误,百思不得其解。于是将本机IP由DHCP获得改成自己输入的固
定IP,结果当然是成功啦。我分特,装了大半个下午的Oracle。

由 Sunny 发表于 15:29 | 回复 (1)

2005年04月07日

我目前在用的Eclipse插件

AnyEdit:编辑器工具,主要做一些字符的增值功能,例如Capitalize,to LowerCase, to UpperCase,还有就是直接将Tab和Space进行互换,行末空格去除。

checkstyle:不用说啦,格式检查必备。

findbugs:也不用说了,检查代码错误必备。

folding:也是编辑器工具,用了这个之后,俺代码里面能折起来的代码块或者注释块都可以折起来了,方便通篇快速阅读啊。

implementors:也是代码查找的好东西,在IDEA里面,我们能够直接在调用代码里面去到实现类的说明那边,eclispe就只能够去到接口的说明那里(N不方便,我看接口那里空空的方法有个P用啊)。这个插件就帮了这个忙,而且还可以找到继承关系的树,那么继承了谁,或者给谁继承了,都可以找出来了。

lomboz:web开发插件,不过用起来有点麻烦不舒服,顶多就是利用一下他本身带的jsp编辑器吧(虽然也是没有所见所得的功能)

quantum:不是量子,也不是以前那个硬盘的牌子。是一个数据库浏览的插件,有时候做疯了,直接在eclipse上面看数据库数据变化还是比慢慢开个数据库客户端要快的。

serialVer:生成serialVersionUID必备工具,你该不会乱做数字或者是用最土的办法先编译class,然后用sun的工具生成数字吧?

tomcat:Tomcat插件,好久没有人更新过了,不过也凑合着用吧,反正现在是最简单的web开发插件和方法了。

xmlbuddy:出名的XML编辑器插件了,不要贪心用xmlbuddy pro或者找破解了,这个free的xmlbuddy,已经足够你基本要求了。Free is the best。

easyexplore:easystruts插件开发小组的一个小工具,可以直接调用本地的文件管理器打开文件所在的本地目录窗口,有用的很啊。


另外还有的就是Together插件和MyEclipse的插件,装在别的地方,不说了。Together用来建模,而MyEclipse功能强大,但是我也没有用他的Web开发或者Struts开发那边的功能,我只是用他来帮我生成Hibernate的DAO和映射文件,寒吧?呵呵呵……

由 Sunny 发表于 11:49 | 回复 (1)

2005年03月15日

MozBackup !

——用上了FireFox之后真是一发不可收拾,不过大家有没有发现虽然FireFox很灵活,
有很多插件,但是如果你在家里用一套,在公司用一套的话,那么你不得不要在两个地
方都要重新上网找回那些可爱的插件才能两边都用得舒服呢?或者是某天你觉得不爽,
需要重装系统的话,那么你就必须找个备份工具进行这个导入导出了(因为该死的
FireFox不是那么支持你直接的复制文件的)。

——于是乎上网找一把,就找到了MozBackup,一个备份和还原 MozillaMozilla
Firefox
Mozilla Thunderbird Netscape 等软件的用户配置文件的工具。可以帮助
您备份邮件、书签以及其它相关数据。并且它是完全免费的。可惜的只是在今年的年初
他的作者已经决定discontinue这个冬冬的开发了,所以最终版本只是1.4 Final,而且
目前只有For Windows的版本(对于我来说已经够了,嘻嘻……)

——当然各地的有心人,还为MozBackup做了本地化的工作,其中简体中文的版本可以
这里拿。

——最后还是要向已经停止开发的作者致敬的:
原作者: Pavel Cvrcek jasnapaka@jasnapaka.com
主页: http://www.jasnapaka.com/

由 Sunny 发表于 17:06 | 回复 (0)

2005年02月04日

GMail疯狂下的蛋

——可爱的GMail的界面又稍微改了,然后今天跑到自己另外一个不算常用的一个帐号,看看现在
到底有多少个蛋,顺便贡献给gmail(at)isnoop.net吧。一进去傻眼了,居然有49个邀请,分特
啊!一下子贡献了10几20个给isnoop那边,呼呼 ^_^

——Google真是新一代霸主啊,底下招揽了一大堆的牛人,包括BEA的,还有负责FireFox的,
还给注册了个GBrowser.com,一直让人联想不断。做GMail的界面也是一绝,里面的理念和界面
风格成了不少网站的跟风对象,说实话,我们项目里面也偷了不少GMail里面的东西(非界面)。
反正之前在国内买的一个商务邮箱越用越不爽,又贵又小,功能也跟不上,等过多几个月到期了,
就不想在给那边续费了,反正现在google带动的1G邮箱热潮都已经让我不少免费邮箱升级到1G去
了,何况我还有GMail这个呢。右手边的那个地址图标真是越看越帅啊……记得以后给我发信,就发
到我GMail的那个邮箱吧……

由 Sunny 发表于 00:45 | 回复 (0)

2005年01月27日

LumaQQ

清华学生luma做的,LumaQQ 是一个独立的 Java QQ 客户端,具有可重用的纯Java核心和基于SWT的仿 QQ 界面。

http://lumaqq.linuxsir.org/main/index.php

连for eclipse的插件都有……

由 Sunny 发表于 09:53 | 回复 (0)

2004年09月06日

今天一个偶得的培训机会,看到了李维

liwei.gif

——今天一个偶然的机会,去了趟深圳,听Borland举办的《高质量的Java软件开发研
讨会》,主讲是他们的大中华首席技术官李维(最近怎么碰到这么多的大中华区首席
XXX的?)。一个胖子(嗯,印证了有压力的IT民工都是比较容易发胖的),不愧是做
过技术多年而且写过不少文章的,整个演讲都是很有条理,思路清晰,而且不乏幽默
的。(坚定我有空就写文字的决心)

——主讲主要是如何有效的使用Modeling开发和高效Java开发,当然辅助的工具自然是
Borland的两大杀手Together和JBuilder X了。他还用了个简单的范例场景讲述了用传统
的UML/OOA/OOD跟XP/TDD结合起来提高开发的一个实例。还提出了何时引入Design
Pattern如何引入Design Pattern的思考。呵呵,我们不需要刻意的为了用Design
Pattern而用Design Pattern,一边设计自然而然的就可以引用进去的了。看他一步步的
完善设计,里面也是一步步的在需要的地方引入相应的pattern,而且看上去跟我们自己
产品设计时使用的一些pattern方法都有不少相同的,呵呵呵。嗯,这次对于一个设计的
初哥来说是一次不错的机会。

给自己补充一下:

——在李维做整个范例的过程当中,他给我们主要是演示如何使用
Modeling开发,用到UML进行OOA/OOD,同时结合了XP和TDD,
特别在一步步的完善设计的过程当中,TDD显示对代码质量的作用,
当我们在代码和设计不断增多过程当中,保证我们之前的代
码没有收到影响。

——然后在整个演示的过程当中,他不断鼓励说,我们就是应该有时
候有些白痴的想法,这样才能推动我们的思想。就正如TY之前说
到的,当设计完配置文件的vo和他的manager之后,我们下一步
该怎么办呢?当然就是要找个人去负责拿配置文件里面的内容,
接着doTask,那么可能就需要在client那里new了两个manager
类,然后doTask,但是这样子,就会出现一个不好的地方,里面
的逻辑暴露给客户,而且万一有修改的话,所有的client也都要
进行改动。因此我们就需要引入一个facade的模式,在里面完成
这些new管理类,doTask的事情(我应该没有记错,是用这个模
式吧?),那么所有的模式的使用,都是很自然而然就带进去,
而不是为了使用模式而加入模式。这句话对我近期开始做设计工
作带来了一些启迪。


——还有其中一个片断,李维做了一个程序,看上去大家都认为没有
问题的,内容大致就是这样:在管理类里面建立一个iCount的成
员变量作为配置xml文件某个tag的计数器,这个tag在xml里面
出现多次的,所以用了一个ArrayList来存放,然后进行读取配
置,用了一个类似叫getTag的方法来每次取tag里面的配置信
息,然后里面iCount++,这个程序看上去大家觉得都没有问题
吧?运行也不会有错的。不过其实是违反了Java关于getter和
setter的规定,就是getter里面不应该对类里面的成员变量进
行修改。整个大厅里面基本上没有一个人知道有这个错。呵呵,
不知道了吧?当然这个错,是利用工具对代码进行分析知道的,
所以引入代码分析工具是很有必要的。

——在说最后的高效java代码的时候,反复强调了,java是Stack
Machine,大家在使用java的时候应该尽可能减少stack的那种
pop和push的操作,很耗资源的。这个道理估计大家都清楚。然
后最经典的一个错误例子就是Tomcat,Tomcat的4.0版本当中居
然要N多的String+String的语句,导致4.0版本效率很低,呵
呵呵,开源项目,遍布全世界好多好程序员开发的一样会有这种
错误。


还有李维一再强调,java程序应该“轻、薄、短、小”,这样的
程序才能更有效率。在虚拟机里面JIT会对程序进行优化,但是
这个优化过程时间很短,当你的程序很大很长,JIT来不及优化
就要运行程序,所以class文件的大小要控制。还是TY说的那
句:你善待JVM,他也会善待你写的程序。还有就是inline方法
的好处与不良使用,这个在C里面都有的了,我就不多说了。


还有一点,李维还跟我们展示了对程序的Metric功能,这个其实
对于如何衡量我们程序员的代码质量也是比较好的哦(好狠,一
说到绩效考核就 :( )

由 Sunny 发表于 23:19 | 回复 (1)

2004年07月20日

今天偶然又拾得一个blog

这个blog的主人是我之前订阅的《Java开源电子报》的作者jini。

点图片进入
 jini (99% jakarta) blogging

里面有不少实用性的东西

由 Sunny 发表于 14:59 | 回复 (0)

2004年07月06日

FireFox终于有MyIE2上面的功能了

——之前一直咎病FireFox没有我用MyIE2的时候的那种很方便的TabBrowsing功能,用TabBrowser Extension都可以了。

——有个动态切换Proxy的工具,Switch ProxyTools,呵呵,代理上网不愁了。

——今天无意上FireFox的Extension网站,居然发现了这个东西Super DragAndGo 0.2,呵呵呵,MyIE2里面很方便的那个拖拉功能终于有了,以后可以拖连接就打开新的tab,拖文字就google了,不错不错,正如里面一个comment写的“this extension bring a really cool feature just like MyIE2(a good IE shell browzer), and it works fine on my Firefox 0.9.1”,呵呵呵也找到同路的人了。

——可惜就是一直无法解决的字体怪怪的问题,唉,死穴。

由 Sunny 发表于 11:34 | 回复 (1)

2004年06月28日

Eclipse Project release 3.0 now available.

about what's new

Elipse这东西最早接触就是在2.1版本上,但是一直以来的升级,几乎是升一次他的插件就要改一次,而且那个土土的IDE界面也让我不爽,所以一直在等他的3.0 Final出来,原来悄悄的,在6.25他就已经推出了3.0。呵呵这次看看怎样先,虽然已经没有疯狂的追求IDE很久了。

由 Sunny 发表于 14:46

2004年06月10日

交作业

ATM小组完成了光荣的历史使命之后,就是要做个工作报告,可惜这些天来都是在傻忙,结果自己感觉上好像在交作业一样。留此作为存档吧。

ATM工作总结

——在公司这次进行CMM3的正式评估当中,我有幸成为ATM的一员,下面是对这段时间的工作总结。

——首先,从技能上面来说。经历了这七天的正式评估,基本上让我对CMM二级和三级相关的KPA做了一次很深刻的了解,因为我们工作上面的需要,我们遍历了Level 2和Level 3各个KPA,以及里面涉及到的每一个目标、活动、能力、度量、检验,而且经过主任评估师的讲解,对每个活动需要注意的地方以及一些基本的概念性的东西都得到了澄清。此外,因为要对公司几个项目进行证据上面的评估,因此也在整个流程上来了解了公司现有的开发活动的流程,同时也了解到我们先有一些项目开展过程中的一些优点和缺陷,也对自己日后的开发工作提供了借鉴。

——其次,我们按照SEI的评估过程进行我们的评估活动,整个过程可以说是像一个小项目一样的开展。我们为每天要开展的工作定好时间表,精确到每个时间段,并且在实际运作过程当中根据需要及时作出调整,所以我们的评估工作都是有序的开展,很少出现时间上面的失控现象。另外在评估过程当中,我们也引入了SEI的一些有趣的规定。例如在每个Observation通过的时候要投票Vote,出现意见问题的时候大家进行讨论直到意见一致。在团队工作的时候,如果有人有事或者太累需要休息,那么全队都需要停下来;如果有人需要吃零食那么也要提供给其他人一同分享。整个评估活动就是在这样和谐轻松的工作环境底下进行,所以尽管有些时候会比较紧张(例如做访谈记录笔记的时候),但是基本上不会感觉到工作的乏味和紧张。这样有张有弛的工作环境和团队工作的气氛,确实需要我们平常的开发活动进行学习。

——第三,作为我们的工作团队的组成,虽然人数上面没有达到预期的数量,但是我觉得是一支有经验的高效的团队。除了主任评估师之外,我们还有两位对过程改进有相当经验的SEPG,一位工作开展得很好,对整个开发过程以及产出相当了解的SQA,还有两位在开发过程当中有经验的开发人员和测试人员。所以工作开展起来的时候,遇到某些地方出现疑难都会有相关知识的人员出来进行补救。这些在我写SPE的Observation深刻体会到,因为SPE的过程定义就是我们Mini Team的成员最初做的,而且我们本身也身出在这个过程当中,完全熟悉公司先有的状况和CMM里面所描述的东西,所以写出来的Obervation绝大部分都可以一次通过了。所以说一只有经验的高效团队,对于项目的顺利开展也是很重要的。

——第四,这次能够顺利的通过也是全公司上下一心的结果,事前我们做了充足的准备,检查项目相关的产出,对评估人员进行培训,而且在访谈之前,也经过预演还有相关的交流培训以保证大家在进行访谈的时候能够表达到相关的内容。此外公司领导也给予了支持,为了本次正式评估,我们可以暂且放下手头上的工作,全力投身到评估这项工作里面,没有受到其他情况的干扰。

——通过这七天既紧张又轻松的评估,使我对CMM又有了更深刻的了解,同时也整体上了解了公司现有的工作流程。当然在团队工作和形式上面也学到了不少的东西。

由 Sunny 发表于 20:22 | 回复 (0)

2004年05月19日

传说中的Java CMS的规范

传说中的Java CMS的规范,发布了它的第一个public review版本

没仔细看,暂时no comment。^_^

由 Sunny 发表于 17:17 | 回复 (0)

2004年04月13日

补习一下HTML吧

下面是两个挺好的网站,一目了然

http://html-tags.info/

http://www.w3schools.com/html/html_reference.asp

由 Sunny 发表于 15:11 | 回复 (1)

2004年03月22日

死得了……

身陷Harvey的项目,完蛋了。

由 Sunny 发表于 18:21 | 回复 (0)

2004年03月08日

Internet时代的出版:从猫扑和Slashdot到内容集成

老大的一篇强文,不得不转…… Internet时代的出版:从猫扑和Slashdot到内容集成

由 Sunny 发表于 11:39 | 回复 (0)

2004年03月06日

越来越喜欢MT

呵呵呵,改一下css样式,我的Blog又换了一个Look了。
而且MT也有不少可以借鉴的地方……

由 Sunny 发表于 23:05 | 回复 (1)

2004年02月25日

Servlet/JSP服务器端的重定向

这个其实很简单,不过平常有时候用到,为了懒得去google,所以先放自己这里方便,^_^

通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。Servlet控制业务流转,JSP则负责业务处理结果的显示。此时,将大量用到重定向技术。

重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。客户端重定向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。本文主要探讨服务器端重定向技术的实现。


服务器端的重定向相关类


服务器端的重定向技术涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。



服务器端的重定向方式


服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法。下面对这两种方式进行介绍。

HttpServletResponse.sendRedirect()方法

HttpServletResponse接口定义了可用于转向的sendRedirect()方法。代码如下:






public void sendRedirect(java.lang.String location)throws java.io.IOException



这个方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http://java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。

RequestDispatcher.forward()方法

RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法,参见如下代码:






public interface RequestDispatcher {
void forward(ServletRequest request, ServletResponse response);
void include(ServletRequest request, ServletResponse response);
}



forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。

注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。


如何得到RequestDispatcher


有三种方法可以得到Request Dispatcher对象。

1.javax.servlet. ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。

2.javax.servlet. ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。

3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。

这三种方法的使用有细微的差别。比如,下面是一个应用的配置文件web.xml:






<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>org. javaresearch.redirecttest.ServletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>org.javaresearch. redirecttest.ServletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/firstservlet/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/servlet/secondservlet/</url-pattern>
</servlet-mapping>
</web-app>



其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的链接访问:

http://localhost:8080/servlet/firstservlet/

使用1中方法,例如在firstservlet可以写入下面的代码:






RequestDispatcher rd = request.getRequestDispatcher("secondservlet");
rd.forward(request, response);



此时控制权将转向到第二个Servlet了。

使用2中的方法,可以从Servlet Context中得到RequestDispatcher代码如下:






RequestDispatcher rd = getServletContext().getRequest
Dispatcher("/servlet/secondservlet");
rd.forward(request, response);



使用3中的方法,从上面的web. xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:






RequestDispatcher rd = getServletContext().getNamedDispatcher("SecondServlet");
rd.forward(request, response);



这样也可以重定向到SecondServlet了。


JSP页面中的重定向


JSP在解析后编译为一个Servlet运行,所以在JSP中也可以使用上面的重定向代码,并且,JSP还提供了更便利的操作,如下:






<jsp:forward page= "nextpage.jsp"/>



JSP页面执行到这儿,将终止当前的处理,将控制权交由nextpage.jsp。


如何选择


RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

由 Sunny 发表于 15:38 | 回复 (0)

2004年02月24日

当你要用格式处理的时候,请注意一下你的Locale

我们通常都很喜欢用SimpleDateFormat来做一些日期和字符串之间的转换,就是所谓的format()和parse()了,具体用法看程序或者是JAVA的API文档,这里不累述了。

但是往往我们忘记了,JAVA的国际化这个让人欢喜让人愁的东西。

下面出现一个问题:
以下程序段

    String dateStr = "17/Mar/2003 11:30:51";
SimpleDateFormat frm = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
Date date = frm.parse(dateStr);
 
 
SimpleDateFormat frm1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println("reformat : " + frm1.format(date));

这运行时会抛出异常java.text.ParseException: Unparseable date: "17/Mar/2003 11:30:51",显然程序不能parse到“Mar”这个英文月的缩写。但是按照java上面的文档显示,以上程序是没有问题的。一个典型的运行时异常。不用说考虑一下我们的环境。

当前程序编写的环境是中文winxp,jdk1.4.2,IDEA 4.0,呵呵,我们是中国人当然都喜欢用中文环境啦。问题出来了吧?看一下一段代码:
            Date date = new Date();  
SimpleDateFormat frm1 = new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss");
System.out.println("now : " + frm1.format(date));

输出结果是:now : 2004/二月/24 11:57:00

看到了,缺省状态底下,我们用SimpleDateFormat是按照我们当前系统的Locale(请恕我一直都搞不清楚他的中文翻译)的,也就是中文的Locale,但是我们要进行分析的日期字符串是英文的,当然就认不出来了。
ok,知道了之后,我们修改一下加多个locale进去,让SimpleDateFormat在构造的时候指定Locale(Java是很笨的,我们不说他怎么知道呢?)告诉他我们现在要处理的是英文的格式串
            Locale locale = Locale.US;
String dateStr = "17/Mar/2003 11:30:51";
SimpleDateFormat frm = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss", locale);
Date date = frm.parse(dateStr);
 
SimpleDateFormat frm1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", locale);
System.out.println("reformat : " + frm1.format(date));


程序正常了……
问题主要就是出在我们在不同环境底下对一些国际化处理上面的不小心或者容易忽略的地方,仅当作教训供大家一笑。

由 Sunny 发表于 12:10 | 回复 (3)

2004年02月23日

IDEA和OptimizeIt的集成

今天按照Neo老大之前的文章集成了一下IDEA和OptimizeIt!

顺道修改一下他的文章:

IDEA的webapp的配置和调试界面远比JBuilder来的清晰和简洁,但是OptimizeIt是Borland买下的,跟JB配合很好,而IDEA好像还没有这种插件,但是其实研究一下OptIt在Tomcat的启动脚本就可以知道其实这种集成是很简单的,下面给出要点:(假定OptimizeIt装在C:\Optimizeit\OptimizeitSuite55)

1、把C:\Optimizeit\OptimizeitSuite55\lib加入系统PATH变量中,OptIt需要在运行时加载其中的若干dll;(放到系统全局的path,不要自己当前用户了,方便)
2、把C:\Optimizeit\OptimizeitSuite55\lib\optit.jar加入项目的classpath(直接加或者用Library);在IDEA4.0可以在Global Libraries里面建一个OptimizeIt的Lib以方便其他项目使用(记得项目发布的时候不要把这个jar也捎上了,不过按照我的开发习惯和idea的做法,可以很方便把项目的jar和全局的jar分开了)
3、修改Run Webapp的配置,在Java VM Parameters中加入以下设置:
-Xrunoii:filter="C:\Optimizeit\OptimizeitSuite55\filters\Tomcat.oif" -Xbootclasspath/a:"C:\Optimizeit\OptimizeitSuite55\lib\oibcp.jar"
(这里的路径竟然不支持系统环境变量%OPTIT_HOME%这种,气愤)

记得勾选Include project classpath(这个选项几乎总是好的)

为了方便,建议把带OptIt启动Tomcat的配置和不带的分开,因为掺了OptIt的情况会慢很多。

好了,现在Run这个配置,你会看到:
Optimizeit Profiler 5.5 build 030503 Audit System.
(c) 1997-2003 Borland.
Port is 1470

这表示已经成功的把OptIt配置加到Tomcat中。现在可以启动OptimizeIt Profiler,Attach到服务器的1470端口,然后打开浏览器操作你的网页,就可以在OptIt中进行profiling了。

测试平台:windows xp sp1 en, jdk 1.4.2, tomcat 5.0.18, optit 5.5, idea 4.0

前提:对IDEA和OptimizeIt!的操作比较熟练,因为有些简单操作这里省略了(例如在IDEA里面建立Web App Run这些)

[原创byNeo,编辑bySunny,Thx to Neo...]

由 Sunny 发表于 15:09 | 回复 (3)

2004年02月20日

是不是只有中国网站才能写出这么黑的程序?

今晚上网去一个下载网站,忽然IE想死掉一样,不用说,一定是在下载一个巨大的Flash或者是一个巨大的控件了。果然,没有多久,出现一个框框,叫我安装个3721的什么什么东西。靠!又是3721! 这个死皮赖脸的破公司。搞个什么网络实名,生怕没有用户,把自己的控件散布到到处都是,随便一个网站,加段script,打开ie就弹出来要你安装个什么鬼东西。你不装?可以,下次你打开这个网站,继续提示你,让你烦个够。反正这个死皮赖脸(我找不到第二个贱一点的词了,所以再次使用这个)无所不用其技的要你安装。

甚至一点时间连一些专门做汉化软件或者补丁的工作者,在他们的程序里面也硬性的绑定安装这个所谓的3721。让人称快的是出现一些程序员在他们自己的程序或者补丁上面加了段很有趣的声明“如果你是3721公司人员或者相关人士,请勿继续运行安装我的程序”,哈哈哈。

另外一个死皮赖脸的就是百度,一样学着3721的损招,到处招一些网站加入他们的script来让人下载他们的控件。中国有自己的搜索引擎技术不是不好,你比google起步晚怕没有用户也是可以理解,但是也不用这样子去死皮赖脸的叫人下载你的东西吧?每次这样提醒,又占用了我的带宽和流量,IE象死机一样。就好像天河城附近那些扯着人腿讨饭的乞丐一样。


结果,这两家死皮赖脸的烂货居然还干上了一架(http://arch.pconline.com.cn/news/hotpick/hy/10309/214791.html),活象两个骂街的泼妇,丑剧。

对于这种垃圾的东西,也是很好对付的,在MyIE2里面有广告猎手的功能,可以使用网页内容过滤,把含有3721的脚本统统屏蔽掉!可惜就是最近MyIE也沦落了,居然默认的搜索引擎是百度,当然改他的配置没商量了。你越是逼我,我就越是不用!

反正商业就是这么贱的了,不过深夜闷热,借这两个厚脸皮的家伙来发泄一下,还挺舒畅的,脸上的痘痘又可以少几颗了。

哦,是了,其实不是中国网站才会弹这种控件出来的,国外不少XXX站或者是一些象黑你的网站都会,当然下载的那些程序是让你必死无疑的。这样看来那两个死皮赖脸已经算比较良心了。

由 Sunny 发表于 01:00 | 回复 (0)

2004年02月06日

先补补课,Something about MT

MT = MovableType,就是说呃…… 算了大家还是Google一下吧

有个不错的网站,上面也有些资源,够入门用的了,我也在看啊 >"<
Movable Type Ultimate Handbook

看懂的大家交流一下,俺比较懒和没有美感,正到处找适合的模板,有资源的麻烦说
一声。先谢了

由 Sunny 发表于 00:34 | 回复 (0)