niyue

Archive for March, 2005|Monthly archive page

jPdl参考手册

In java on March 29, 2005 at 8:30 AM

今天开始看JBoss的jBpm,看起来感觉也是比较简单的一个工作流系统,和osworkflow很像总感觉,过程建模的模型都很类似UML的活动图,都是以状态为核心,但是jBpm有泳道的概念,而osworkflow没有,两者都有split和join的这种概念.还有一个很相象的地方就是两者都有一个类似java.util.Map的这种机制来持续化变量.不过为什么感觉好像还没有达到我想象中的那种工作流系统的理想状况呢?花了一个下午时间把jPdl翻译了一遍,翻完以后看了一下感觉很多意思都损失了,有空的话还是看英文吧.jPdl参考手册.pdf

Advertisements

听深蓝之父许峰雄的演讲

In other on March 25, 2005 at 10:49 AM

昨天深蓝之父来学校做了个报告,去听了一下,真是牛人啊,sigh.不过感觉他的成功和周围的环境也有很大关系,做这种项目也能够找到一批志同道合的人是很不容易的,老师还会给予支持,要不是在卡内基梅隆大学的话估计这些都很困难,后面也就不可能取得这么大的成功了,

听许博士说,深蓝的棋艺的学习主要是和一个国际象棋大师进行对局.最开始的时候大师和深蓝下棋总是把自己最近输的棋摆给深蓝看,让深蓝来指出棋局中哪里下的不对可以进行改进,结果许博士发现这种方法不对头,深蓝的棋力并没有得到长进,反而合算了那个大师^_^.后来他们改进了训练深蓝的方法,还是和这一大师下棋,不过对局的方式有点特别,大师是可以悔棋的,一直悔到棋没下错的地方为止,这样下一直下到深蓝输棋为止,然后再从深蓝输的棋局中寻找可以改进的地方.

后面我想到假如让两台深蓝相互博弈会发生什么事,深蓝和深蓝下棋可以取得学习吗?我向许博士提了这个问题,许博士的回答是:两台深蓝对下的话并不会有一个固定的结局,不一定先手或者后手就定输赢,也不一定就会下成和棋.选择和大师进行训练完全是出于一种实际的选择,深蓝和深蓝自己下棋也是可以得到进步的,不过缺陷是,有一些棋如果是深蓝和深蓝对下的话是永远也不可能想到的

xalan处理xslt遇到的uri异常

In java, programming on March 19, 2005 at 3:13 PM

昨天在用xalan处理xslt样式表时遇到了以下异常:com.sun.org.apache.xml.internal.utils.URI$MalformedURIException: URI 中未找到模式.因为处理的这个样式表原来在Stylus Studio里面使用过,显示是正常的,这里应该也不会有什么问题,但是在重构代码的时候将xsl文件的读取由硬编码文件路径改成为用ClassLoader的getResource方法来进行读取了.

开始的时候丝毫没有意识到是这里出了问题,还以为是xsl文件中引用的uri出了问题(因为上面那个异常导致了xalan编译xsl样式表的时候无法找到import的locale.xsl文件,于是编译器又报了locale.xsl中定义的变量找不到的错误,就是这个错误误导了我好长时间而没有发现错误的源头),修改了好半天的xsl文件都没发现有问题,而且用xalan.jar直接进行xslt转换可以通过,弄了一个晚上也没搞懂到底是怎么回事,彻底没想法掉了那个时候.

今天放松了一天,回来继续看的时候去看了一下uri解析的源码,本来想看看这个uri到底是怎么解析而后出错的,好不容易找到这段报错在源码中的位置,但是看不懂这里到底怎么解析的,和其他部分源码的关联太高了,不过看的时候看到了解析的时候有关于slash符号”/”的解析,有种顿悟的感觉,因为前面ClassLoader的getResource方法给出的绝对路径是以”/”开始的(像/G:/src/xsl/folder.xsl这种形式),开始看着就觉得很奇怪,但是直接使用这个路径确实找的到样式表所以也就没去多想,但是实际情况是xalan如果用这种路径访问样式表对于样式表中import的样式表就找不到(异常显示说没有这种模式)!

不知道这算不算是xalan的一个bug呢?或者是jdk的一个bug,ClassLoader的getResource方法给出的路径为什么前面加上一个”/”要?呼,即使不是一个bug的话,也是在这两个api同时使用时会出现的一个问题,解决方法很简单,把getResource得到的路径前面的”/”去掉就可以了,xalan一下就通过了这一样式表的编译,其他地方对这一路径的使用也没问题.

Java国际化工具

In java on March 14, 2005 at 4:07 PM

Java 国际化和本地化 Toolkit 2.0Resource Bundle Inspector For Java

Resource Bundle Inspector For JavaTM enables initial verification and inspection of translated messages in resource bundles before product testing is done. These translated messages have come from different geographical translation centers. This tool helps testers to speed up the verification of messages before integrating them into any product. Bugs found in translated messages can be detected at early stage of product testing cycle; this helps in increasing the testing cycle efficiency.

Zaval Java Resource Editor (JRC-Editor)

The Zaval JRC Editor is best used for regular access to various resource files. You can add your own language support to the existing software if strings are not hard-coded to the software. One of the greatest things in the internationalization is that you don’t need to make code changes.

Another great area in this tool usage is resource bundle synchronization. Our tool can handle this task easily – it compares the files set and highlights all differences. It allows separating development process and resource management process. That’s why this tool can be used as part of your software pack to provide 3rd party localization.

Sawmill–日志分析工具

In programming, software on March 13, 2005 at 12:30 PM

Sawmill is a powerful, hierarchical log analysis tool that runs on every major platform. It is particularly well suited to web server logs, but can process almost any log. The reports that Sawmill generates are hierarchical, attractive, and heavily cross-linked for easy navigation. Complete documentation is built directly into the program.

Here are just a few of the major features of Sawmill:

这几天在使用Tiles+Struts搭一个portal的框架,使用的过程中发现很多debug信息都输出到Tomcat的标准输出流上去了,每次都要查看那个文本的log实在是不方便,满在google上面搜了一下想看看是否有这中工具,没想到真的让我找到了,功能很强大,Sawmill~

Java中的异常处理

In java, programming on March 12, 2005 at 5:18 AM

The Dilemma of Exception 来自 透明思考

现在的异常体系设计是:系统内部所有异常继承同一个基类BaseException,BaseException又继承RuntimeException。在一个层次(例如DAO层或者Business Service层)中有一个异常基类,对于每种具体的出错情形再派生一个新的异常类,例如UserCannotFound、HaveNoPermission等等。
这样做的好处是避免了在接口上出现异常签名,因为“抛出哪种异常”是方法的私事。如果接口签名上指明详细的异常信息,又采用Checked Exception,当方法内部实现改变时,接口就会受到影响;如果接口签名上只泛泛地标注一个高层次异常(例如Exception甚至Throwable),又起不到任何提示的效果。
但是接口上不留异常签名又带来另一个问题:client程序员要到运行时(甚至可能要过相当长的时间)才知道这个方法可能抛出哪些异常,给编写代码造成相当大的麻烦。我想的折中办法是:(1)方法稳定之后,在接口上标注异常签名,由于全部异常继承RuntimeException,即使接口异常签名改变也不会破坏client;(2)用一个拦截器把所有异常log到统一的地方,并提供足够的信息,方便调试。

ExceptionHandler 异常处理 来自 冰云@Blogging

我现在的异常处理和你做的差不多。每一层都有BaseUnckeckedException,但有时候也用CheckedException。以前在onjava看到过一篇讨论受它影响比较深。对于无法处理的异常,就用UnChecked,例如SQL错误,产生于DAL,对于系统的来说是致命的。交给BusinessLayer毫无用处,因此抛出DaException。如果是有用的可处理的例如处理用户登录的时候,UserNotExistException或PasswordNotVerfiedException就用CheckedException,交给Client去处理,显示不同的信息。 另外,在处理异常方面,我现在采用的是Struts1.1的ExceptionHandler机制。在ExceptionHandler捕获所有的Throwable,然后交给一个统一的或者按照module区分的Error.Jsp页面来显示。 另外有一个问题就是i18n在异常中如何处理。抛出的异常最终会显示到界面上。如果不做任何i18n处理恐怕不够友好。因此我让所有的自定义Exception实现一个ErrorKeyable接口。包含的Error就是i18n的key。如果我在ExceptionHandler中得到的Exception是ErrorKeyable的实例,那么就显示定制的错误信息。如果不是,就显示Unkown Error,呵呵。然后做个按钮在错误页让用户提交给admin。

早就想写一篇异常处理的文章。今天看到gigix写了一篇《The Dilemma of Exception》
基于他的观点,我也写了一点东西。基本上,思路是一致的。

trackback不能用真是郁闷。

我现在的异常处理和gigix做的差不多。每一层都有BaseUnckeckedException,但有时候也用到CheckedException。以前在onjava看到过一篇讨论受它影响比较深。对于无法处理的异常,就用UnChecked。例如SQL错误,产生于DAL,对于系统的来说是致命的。交给BusinessLayer毫无用处,因此抛出DaException。如果是有用的可处理异常就应该处理。例如用户登录的时候会产生UserNotExistException或PasswordNotVerfiedException,就用CheckedException,交给Client去处理,以显示不同的信息。 Gigix的异常签名方法看起来很好。下次可以试试看。将Exception标记在javadoc中也是应该考虑的事情。在处理异常方面,我现在采用的是Struts1.1的ExceptionHandler机制。用ExceptionHandler捕获所有的Throwable,交给一个统一的或者按照module区分的Error.Jsp页面来显示。 有一个问题就是在异常中如何处理i18n。抛出的异常最终会显示到界面上。如果不做任何i18n处理恐怕不够友好。因此我让所有的自定义Exception实现一个ErrorKeyable接口。包含的ErrorKey就是i18n的key。如果我在ExceptionHandler中得到的Exception是ErrorKeyable的实例,那么就显示定制的错误信息。如果不是,就显示Unkown Error,呵呵。当然,对于后台产生的错误以及Exception的Message,服务器的locale基本不变,并且log只有开发人员或网管才看。因此i18n毫无用处,所以内部的ExceptionMessage采用中文或者英文均可。我是采用英文,因为中的的话,不同的编译环境还可能导致乱麻。还不如英文呢简单。最后做个按钮在错误页上,一旦产生错误,就让用户按按钮将错误信息提交给admin以便记录。 后台已经有了log为什么还要这样做哪?以上的部分已经在项目中实施,基本上比较方便。不用看到Tomcat中蓝色Stupid错误提示。

JIRA破解

In java, programming on March 8, 2005 at 7:40 AM

JIRA可真是个好东西啊,自定义能力超强,虽然主要是用来做bug跟踪管理的,但是很容易的就可以改造成项目管理系统.只可惜是要收费的,为了使用它,sorry啊,只好下载了一个注册机.不过下载的注册机是JIRA3.0版的,现在的JIRA已经出到3.1版了.试了一下发现注册机不行用.几乎放弃了就,但是仔细分析了一下JIRA的包的结构,发现注册机不行用很可能是因为3.1版的包结构改变了,破解需要的那个licence包的位置变掉了.于是抱着侥幸心理把下载的注册机keygen.class反编译了一下,结果发现注册机没有被混淆过,很容易就看到了所有的代码,于是就将注册机import的包名改了一下,重新编译,呃,可以用了,真是对不起,做了错事了.

// Decompiled by DJ v3.7.7.81 Copyright 2004 Atanas Neshkov Date: 2005-2-26 22:13:16
// Home Page :
http://members.fortunecity.com/neshkov/dj.html – Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: keygen.java

import com.atlassian.License.LicensePair;
import java.io.*;
import java.security.KeyFactory;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;

public class keygen
{

public keygen()
{
}

public static void main(String args[])
throws IOException
{
try
{
long l = 267L;
long l1 = System.currentTimeMillis();
long l2 = System.currentTimeMillis();
String s = “”;
System.out.println(“Keygen for JIRA Enterprise Edition.”);
System.out.print(“created by mydaj[ROR].”);
do
{
System.out.print(“\nEnter your organization name: “);
for(int i = System.in.read(); i != 10 && i != 13; i = System.in.read())
s = s + (char)i;

} while(s == “”);
try
{
PKCS8EncodedKeySpec pkcs8encodedkeyspec = new PKCS8EncodedKeySpec(EncodedPrvKey);
KeyFactory keyfactory = KeyFactory.getInstance(“DSA”, “SUN”);
java.security.PrivateKey privatekey = keyfactory.generatePrivate(pkcs8encodedkeyspec);
String s1 = Long.toString(l, 10);
s1 = s1 + “^^”;
s1 = s1 + Long.toString(l1, 10);
s1 = s1 + “^^”;
s1 = s1 + Long.toString(l2, 10);
s1 = s1 + “^^”;
s1 = s1 + s;
byte abyte0[] = s1.getBytes();
Signature signature = Signature.getInstance(“SHA1withDSA”);
signature.initSign(privatekey);
signature.update(abyte0);
byte abyte1[] = signature.sign();
LicensePair licensepair = null;
try
{
licensepair = new LicensePair(abyte0, abyte1);
}
catch(Exception exception1)
{
exception1.printStackTrace();
}
System.out.println(s1);
System.out.println(“Your license key is: “);
System.out.println(licensepair.toString());
}
catch(Exception exception)
{
exception.printStackTrace();
}
}
catch(IOException ioexception) { }
}

static byte EncodedPrvKey[] = {
48, -126, 1, 75, 2, 1, 0, 48, -126, 1,
44, 6, 7, 42, -122, 72, -50, 56, 4, 1,
48, -126, 1, 31, 2, -127, -127, 0, -3, 127,
83, -127, 29, 117, 18, 41, 82, -33, 74, -100,
46, -20, -28, -25, -10, 17, -73, 82, 60, -17,
68, 0, -61, 30, 63, -128, -74, 81, 38, 105,
69, 93, 64, 34, 81, -5, 89, 61, -115, 88,
-6, -65, -59, -11, -70, 48, -10, -53, -101, 85,
108, -41, -127, 59, -128, 29, 52, 111, -14, 102,
96, -73, 107, -103, 80, -91, -92, -97, -97, -24,
4, 123, 16, 34, -62, 79, -69, -87, -41, -2,
-73, -58, 27, -8, 59, 87, -25, -58, -88, -90,
21, 15, 4, -5, -125, -10, -45, -59, 30, -61,
2, 53, 84, 19, 90, 22, -111, 50, -10, 117,
-13, -82, 43, 97, -41, 42, -17, -14, 34, 3,
25, -99, -47, 72, 1, -57, 2, 21, 0, -105,
96, 80, -113, 21, 35, 11, -52, -78, -110, -71,
-126, -94, -21, -124, 11, -16, 88, 28, -11, 2,
-127, -127, 0, -9, -31, -96, -123, -42, -101, 61,
-34, -53, -68, -85, 92, 54, -72, 87, -71, 121,
-108, -81, -69, -6, 58, -22, -126, -7, 87, 76,
11, 61, 7, -126, 103, 81, 89, 87, -114, -70,
-44, 89, 79, -26, 113, 7, 16, -127, -128, -76,
73, 22, 113, 35, -24, 76, 40, 22, 19, -73,
-49, 9, 50, -116, -56, -90, -31, 60, 22, 122,
-117, 84, 124, -115, 40, -32, -93, -82, 30, 43,
-77, -90, 117, -111, 110, -93, 127, 11, -6, 33,
53, 98, -15, -5, 98, 122, 1, 36, 59, -52,
-92, -15, -66, -88, 81, -112, -119, -88, -125, -33,
-31, 90, -27, -97, 6, -110, -117, 102, 94, -128,
123, 85, 37, 100, 1, 76, 59, -2, -49, 73,
42, 4, 22, 2, 20, 42, 50, -88, 30, 125,
-37, 118, -50, 20, -82, -63, 0, 8, -36, 106,
-9, -110, 124, 107, 68
};

}

Open Source Software in Java

In java, software on March 6, 2005 at 3:12 AM

ONJava.com -- The Independent Source for Enterprise Java

1. Open Source Java Directory

http://blogger.org.cn/blog/

2. Open Source Software in Java(tm)

logo

3. JavaToolBox

获取运行中的JVM系统属性

In java on March 4, 2005 at 4:24 AM

获取运行中的JVM系统属性

getProperties

public static Properties getProperties()
Determines the current system properties.First, if there is a security manager, its checkPropertiesAccess method is called with no arguments. This may result in a security exception.

The current set of system properties for use by the getProperty(String) method is returned as a Properties object. If there is no current set of system properties, a set of system properties is first created and initialized. This set of system properties always includes values for the following keys:

Key Description of Associated Value
java.version Java Runtime Environment version
java.vendor Java Runtime Environment vendor
java.vendor.url Java vendor URL
java.home Java installation directory
java.vm.specification.version Java Virtual Machine specification version
java.vm.specification.vendor Java Virtual Machine specification vendor
java.vm.specification.name Java Virtual Machine specification name
java.vm.version Java Virtual Machine implementation version
java.vm.vendor Java Virtual Machine implementation vendor
java.vm.name Java Virtual Machine implementation name
java.specification.version Java Runtime Environment specification version
java.specification.vendor Java Runtime Environment specification vendor
java.specification.name Java Runtime Environment specification name
java.class.version Java class format version number
java.class.path Java class path
java.library.path List of paths to search when loading libraries
java.io.tmpdir Default temp file path
java.compiler Name of JIT compiler to use
java.ext.dirs Path of extension directory or directories
os.name Operating system name
os.arch Operating system architecture
os.version Operating system version
file.separator File separator (“/” on UNIX)
path.separator Path separator (“:” on UNIX)
line.separator Line separator (“\n” on UNIX)
user.name User’s account name
user.home User’s home directory
user.dir User’s current working directory

Multiple paths in a system property value are separated by the path separator character of the platform.

Note that even if the security manager does not permit the getProperties operation, it may choose to permit the getProperty(String) operation.

Returns:
the system properties
Throws:
SecurityException – if a security manager exists and its checkPropertiesAccess method doesn’t allow access to the system properties.
See Also:
setProperties(java.util.Properties), SecurityException, SecurityManager.checkPropertiesAccess(), Properties

RDF的一些工具集

In semanticweb on March 3, 2005 at 4:27 AM