niyue

Archive for the ‘java’ Category

Leopard Java Sucks

In javamac on 11月 11, 2007 at 9:40 下午

Leopard发布的那段时间,看到最多的消息就是批评Leopard没有对Java 6的支持,但是没有想到它对Java 5的支持也倒退了一步.

在升级到Leopard之前,在Tiger上一直使用jVi + Netbeans 6 Beta 1,用着感觉非常爽,比Eclilpse下面那些vim的集成或者插件都感觉要好.但是在升级到Leopard之后,使用了Netbeans Beta 2,发现有一个最基本的功能失效了–用”:”切换到命令模式下无法使用回车键执行.开始还以为是jVi对Netbeans Beta2的支持有问题.等了一段时间,直到jVi和Netbeans 6都发布了新版本之后,发现用最新版本还是不行,这才到jVi的论坛上面去看,结果发现有其他人也遇到了相同的问题,是Leopard的Java 5问题导致的.还不知道有什么work around或者Apple什么时候才能完全支持Java 5,只能天天用Command+S来保存文件了,真是郁闷.

唯一值得欣慰的是Apple还没有把Java给完全抛弃,希望猜测是对的.

Update: 有人高兴有人愁。可惜我不喜欢all in one的一站式采购。

可视化Java的Call Stack

In javaprogramming on 7月 1, 2007 at 5:14 下午

Debugging DFC实在是很痛苦的一件事情,因为DFC类库十分庞大,API的层次很深,很多层次都是非常薄的对下层的一个封装。如果是DFC的使用者,只要考虑其外部接口还比较容易,但是作为API的开发者来说的话,尤其是作为一个刚入门还不太了解其内部结构的新手来说,每次都要花费很多时间在debugger上,仅仅是为了看一下一次访问的整个层次结构是什么样的。于是利用前段空下来的时间,写了一个小工具(InvokeVis)来进行Java的Call Stack的一个可视化。

目前这个工具支持四种可视化的输出格式:

普通文本格式
很简单的格式,仅仅使用缩进来表示不同层次的调用。
GraphViz Dot格式
这一格式可以使用GraphViz中的dot工具来进行转换,可以输出为gif, jpg, png, post script等多种格式。
HTML格式
这是基于Yahoo的YUI的一个HTML格式,Call Stack被可视化的表示为一颗HTML树。
XML格式
这一格式可以使用SpringGraph来进行浏览,用户可以通过Flash来交互式的浏览Call Stack。目前的代码库中自带了一个定制的SpringGraph的flash,可以查看InvokeVis输出的XML格式。

最开始我考虑支持的最主要的格式其实是Dot格式,只希望能够输出为一般的图片就可以了。但是后来发现Dot格式输出的图片的可扩展性不是很好,尤其是对于DFC这种超级巨大的类库而言,一个简单的小程序就会输出几千个节点的图片(在用GraphViz Dot工具转化成jpg时甚至因为节点过多无法输出,只能转化成gif),要想看清图片的细节,只能局限与整个图片的很小一部分,仅仅是窥豹一斑。于是就考虑输出为HTML树这种可以动态变化的方式来进行浏览,扩展性确实得到了很大提高,基本不管多大的节点数都不会有什么扩展性问题。但是又觉得HTML树看起来的时候的可视化效果不如dot格式转化出的图片出色,最后转而想到flash格式的输出,应该来说最后得到的flash的效果还是不错的,但是有部分功能还需要进一步完善,尤其是对现在这一flash中输出的是无向图而不是有向图(方向表示方法调用的发向, caller method -> callee method)这一点很不满意,如果有时间的话会把这点先改进一下。
输出效果图:

Dot format, converted by GraphViz? into gif format:

HTML format:

XML format, visualzed with SpringGraph? flash:

多核对java的影响

In javaprogramming on 11月 23, 2006 at 10:45 上午

今天看到一篇文章, Multi-core may be bad for Java, 里面讲到:

The trend towards multicore is moving along at a fast pace. Architectures like Suns Niagara seem to be getting copied by the other CPU vendors. The architecture is basically lots of cores but low clock speed per core.

This is a problem for Java as:

  • Java likely has a longer path length than languages like C and clock speeds won’t help with this.
  • JavaEE promotes a simple threading model for applications
  • Garbage collection remains heavily dependant on clock speed for small pauses.

对与第三点,其实早有大牛Amdahl定律在前头.按照前文的评论中的数值,垃圾回收一般占CPU时间的5%.根据Amdahl定律,s = n/((b*n) + (1-b)),如果处理器的数目足够多(n>100),基本可以认为满足Amadahl定律的极限值,也即s = 1/b, 所以,大概估算的话, 100核的处理器大概可以提高Java平台20倍的性能(这里仅考虑gc是瓶颈). 不知道这个数值算达到了什么程度, 感觉还是比较高的吧.

参考文献:

  1. The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
  2. multi-core may be bad for java
  3. Amdahl定律@wikipedia

Painting in AWT and Swing

In javaprogramming on 7月 23, 2006 at 10:24 下午

Java在desktop端好像一直没有得到过很大的应用,据说Mustang会在此做出很大的提高,不过不知道什么时候才可以正式release.最近想写一个Swing的程序,发现从server端换到desktop端写的东西还是有很大不同,尤其是Swing里面的painting实在是让人很疑惑–看不大懂那些API应该怎么组合才能正确的使用.网上search到的东西又都是很早的时候的东西(很多都是AWT的,在后来大家都发现java在desktop没前途转到server side去了).
找了一些tutorial和code eg是五花八门,在painting的时候就会用到好几个方法:

public void paint(Graphics g)
public void update(Graphics g)
public void repaint() 
protected void paintComponent(Graphics g)

到底overwrite哪些方法,其间又有什么不同呢,实在是很复杂的问题,好容易在sun的网站上面找到一篇文章,很全面的介绍了AWT和Swing中painting的机制,把这些问题都讲清楚了,可以参考一下.

Jetspeed心得随笔

In java on 1月 18, 2006 at 6:46 上午

最近开始看Jetspeed2的相关资料,下面的心得随笔是在Javaworld Taiwan的论坛上面找到的资源,感觉写的很不错。对入门很有帮助。

另外,这里也有很多Jetspeed的资料可以参考,不过是法文的,可以通过Google Translate来进行翻译阅读。

jdk 1.4.x与w3c dom实现

In javaprogramming on 8月 3, 2005 at 10:07 上午

今天碰到一个怪问题,从Subversion checkout的相同代码居然在两台电脑上运行结果不一样,一台电脑是jdk 5.0,一台电脑是jdk1.4.2,运行单元测试的时候1.4.2的那台无法通过,说缺少类: NoClassDefFound: org.w3c.dom.ranges.DocumentRange,类路径什么的都设置一样,但是两个环境就是运行结果不同,后来终于找到原因,jdk 1.4.x虽然号称实现了w3c的dom api,但是是一个不完全实现,其中并不包含org.w3c.dom.ranges.DocumentRange这一接口的实现,而jdk5.0中已经包含.而使用像xerces.jar这些xml解析工具时就可能出现这种问题.

解决方法:

  1. 如果还是使用jdk1.4.2的话,区下载xmlParserAPIs.jar包,里面包括了对这一接口的实现
  2. 或者直接升级jdk版本到5.0

Jbpm和Shark比较的feature list

In javasoftware on 6月 21, 2005 at 7:19 上午

前一段时间做的一个jbpm和shark的feature对比,今天整理笔记突然又看到这张记录纸了,so post here and drop the paper.作比较的时候Shark是1.0版本,而Jbpm是2.0版本(现在已经出到3.0了)

 

Shark

Jbpm

持久层 Shark自己的一个ORM的方案DODS,感觉不是很好 大名鼎鼎的 Hibernate(Jbpm2中使用的是Hibernate 2.1,Jbpm3种使用的是Hibernate3)
灵活性 Shark给人的感觉就是庞大,需要独立的运行一个工作量引擎服务 相对更加灵活,和OSWorkflow有的一比,也可以作为嵌入式的工作流引擎
后台管理 其实这点和上面一点有点相对应了,灵活性差其实是由于提供的功能太多的缘故,Shark自带了一个管理程序,界面虽然差了一点,但是功能满全面的 Jbpm2中没有提供后台的管理,Jbpm3还没怎么用过,好像是有的,不知道具体功能如何
流程定义的图形设计器 Shark使用的WfMC定义的XPDL语言定义流程,有一个JaWE来图形化定义流程,不过XPDL是在是看起来很难懂 Jbpm2中没有流程图形定义器,不过Jbpm3中已经有了,是基于Eclipse的一个插件,可以使用它定义Jbpm使用的JPDL,而且不仅是插件形式,后面还会出stand alone的版本
表单定制 这个Shark可以借助XPDL来进行表单定制,没看太懂就是了 Jbpm2不支持,原来看了Jbpm的MailList里面说在考虑Jbpm3中会加入这方面的内容,现在似乎没有看到还
用户模型 好像必须采用Shark中的用户模型 灵活性的体现,任意的用户模型。Jbpm3.1的roadmap里面考虑自带一个简单的用户模型供使用
异构系统交互 Shark可以开CORBA的服务,这个方面的功能很强大 只能通过Java和异构系统的交互似乎,Java能做的Jbpm就行
学习成本 Shark使用的XPDL很难看懂… 相对简单
文档 感觉是一片空白,给的那几个pdf都不顶什么用,用两三个小时就全部看完了,组织的不是很好而且。相对其他的方面,这个是最大的缺点了 挺全面的文档,一个chapter一个chapter的,看起来也方便

JADE 3.3的bug

In javaprogrammingsemanticweb on 5月 13, 2005 at 9:34 上午

这段在做一个Agent的原型系统,希望能够做成一个rss的搜索引擎.Agent的平台用的是JADE,现在已经出到3.3版了,应该算满成熟了吧,不过我使用的过程中发现似乎还是有bug.在创建Agent容器的时候发生错误:ContainerController containerController = runtime.createAgentContainer(profile);

一直想不出这里为什么会找不到主容器,看了JADE的源代码,发现这里可以把日志输出到文件,仔细看了一下才发现原来是JADE的url的解析似乎有些问题,目录中包含的空格被当作了url的分隔符~,解决方法:将目录中的空格去掉^_^

jade.core.IMTPException: RMI exception [nested RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.net.MalformedURLException: no protocol: 5.5/webapps/agent/WEB-INF/classes/]

DbUnit的相关资料

In javaprogramming on 5月 1, 2005 at 12:00 下午

用 DbUnit 和 Anthill 控制测试环境

Effective Unit Testing with DbUnit

用DbUnit进行SqlMap单元测试

雇用dbunit来维持你的数据环境稳定

iBatis多键值查询

In javaprogramming on 4月 27, 2005 at 10:04 上午
摘自iBATIS SQL Maps 开发指南
Clinton Begin 著
刘 涛 译
Map类型输入参数
假如没必要写一个Java Bean作为参数,而要传入的参数又不只一个时,可以使用Map类(如HashMap,TreeMap等)作为参数对象。例如:
<statement id=”insertProduct” parameterClass=”java.util.Map”>
select * from PRODUCT
where PRD_CAT_ID = #catId#
and PRD_CODE = #code#
</statement>
可以注意到mapped statement的形式完全没有区别!上面的例子中,如果把Map对象作为输入参数去调用mapped statement,Map对象必须包含键值“catId”和“code”。键值引用的对象必须是合适的类型,以上面的例子来说,必须是Integer和String。Result Map(参见以下章节)也支持使用Map类型作为结果参数。要获得更多信息,请参见“Result Map”和“使用SQL Map API编程”部分。
Map类型也可以使用别名。例如,可以用“map”来代替“java.util.Map”。这些别名参见下面的“支持Parameter Map和Result Map的数据类型”表格。

复杂类型集合的属性
Result Map还可以装入代表复杂类型对象集合(List)的属性,用以表示在数据库中相互关系为多对多或一对多的数据。拥有集合属性的类作为“一”的一方,而在集合中的对象作为“多”的一方。用来装入对象集合的mapped statement和上面例子一样。唯一的不同是,让SQL Map架构装入复杂类型集合(List)的业务对象的属性必须是java.util.List或java.util.Collection类型。例如,如果Category拥有Product对象的List,mapped-statement就像下面的例子(假设Category类有一个叫productList的属性,类型是java.util.List):
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
<result property=”id” column=”CAT_ID”/>
<result property=”description” column=”CAT_DESCRIPTION”/>
<result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
</resultMap>
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
<result property=”id” column=”PRD_ID”/>
<result property=”description” column=”PRD_DESCRIPTION”/>
</resultMap>
<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
select * from CATEGORY where CAT_ID = #value#
</statement>
<statement id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>