Eclipse 3.5 在Ubuntu 9.10 下遇到的问题

今天想做一下Drools 5.0,在Eclipse上安装插件,发现从Help -> Install New
Software那里无论如何添加Available Software
Site,下方的可勾选列表中都为空。重做几遍不觉得是自己操作的问题,在空白框里面乱点,发现下面的说明文字竟然有变化,看来只是看不见而已,勾选依然
是有效的。

忽然想起是不是因为为了让eclipse里面的控件显示的细一些,配置了~/.gtkrc-2.0的问题,清空该文件后重启eclipse,问题仍为解决。

Google长时间无效,想到刚好eclipse在Ubuntu9.10里面对话框鼠标点击确认有问题,以前都是用回车或者空格凑合的,刚刚搜索这个问题时好像碰到类似的问题,邃决定先解决鼠标点击的问题。

新建脚本文件,内容如下:

# /bin/bash
export GDK_NATIVE_WINDOWS=true
<eclipse path>/eclipse

重启celipse,发现不仅鼠标问题解决,连安装插件的界面也使用正常了。

Ubuntu 9.10 解决Xmark被墙

重装 Ubuntu 9.10 时才发现 xmark 已经被墙了,而且19号就被墙了……(我这几天的书签阿 囧囧),可恶的GFW……懒得骂了我。

说归说,书签同步还是要的。首先修改hosts文件
sudo gedit /etc/hosts

添加如下
64.147.188.86 www.xmarks.com

64.147.188.92 api.xmarks.com

64.147.188.89 login.xmarks.com

64.147.188.87 sync.xmarks.com

64.147.188.86 static.xmarks.com

64.147.188.86 download.xmarks.com

64.147.188.86 my.xmarks.com

后在xmark中选择全部加密


TEA加密算法 Java实现

最近在使用Java实现QQ的基本通讯协议,QQ的通讯协议中使用MD5算法两次加密密码,并将通讯中的所有数据包使用TEA算法进行加密。MD5加密可以通过Java API提供的MessageDigest直接进行,而TEA加密则需自己编写。

TEA加密每次使用128bit密钥加密64bit数据,生成加密数据亦为64bit,为典型的对称加密算法。该算法使用C语言实现非常简单,但使用Java进行实现时,受制于Java的特性,在实现上稍有复杂。

代码如下:

public class TEA {
/
value is 0xffffffff <br> filter long to unsigned int
*/
public static Long UIFILTER = Long.decode("0xffffffff");
/

value is 0xff <br> filter short to unsigned byte
/
public static Short UBFILTER = Short.decode("0xff");

/**
Encipher method <br>
<p>64bit plaintext, 128bit key @param v Plaintext
@param k Key @return
/
public static Short[] encipher(Short [] v, Short [] k)
{
Long[] vL = shortToLong(v);
Long[] kL = shortToLong(k);
Long[] wL = new Long[vL.length];
Short[] w = null;
long y = vL[0];
long z = vL[1];
long a = kL[0];
long b = kL[1];
long c = kL[2];
long d = kL[3];
long n = 0x10; /
do encrypt 16 (0x10) times /
long sum = 0;
long delta = Long.decode("0x9E3779B9"); /
0x9E3779B9 - 0x100000000 = -0x61C88647 /

while (n– > 0) {
sum += delta;
sum &= UIFILTER;
y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
y &= UIFILTER;
z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
z &= UIFILTER;
}

wL[0] = y;
wL[1] = z;
w = longToShort(wL);
return w;
}

/**
Decipher method <br>
<p>64bit ciphertext, 128bit key @param v Ciphertext
@param k Key @return
/
public static Short[] decipher(Short [] v, Short [] k)
{
Long[] vL = shortToLong(v);
Long[] kL = shortToLong(k);
Long[] wL = new Long[vL.length];
Short[] w = null;
long y = vL[0];
long z = vL[1];
long a = kL[0];
long b = kL[1];
long c = kL[2];
long d = kL[3];
long n = 0x10;
/
sum = delta << 4, in general sum = delta n /
long sum = Long.decode("0xE3779B90");
long delta = Long.decode("0x9E3779B9");

// use filter to get unsigned int
// use ~x +1 instead -x
while (n– > 0) {
z += (~(((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d)) + 1);
z &= UIFILTER;
y += (~(((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b)) + 1);
y &= UIFILTER;
sum += ((~delta) + 1);
sum &= UIFILTER;
}

wL[0] = y;
wL[1] = z;
w = longToShort(wL);
return w;
}

/
convert bytes to longs, put every 4 bytes to 1 long <br> <p>use long instead unsigned int<br>
use short instead unsigned byte @param source - the Short [] that save unsigned bytes to convert
@return the Long [] save unsigned int /
public static Long [] shortToLong(Short [] source){
int sourlen = source.length;
int turn = sourlen / 4; // how many turns
int remainder = sourlen % 4; // how many bytes in first turn
int tarlen = turn + (remainder == 0 ? 0 : 1);
Long [] target = new Long[tarlen];
for(int i = 0; i < target.length; i++){
target[i] = Long.parseLong("0");
}
int iter = 0;
int turnIter = 0;
for(turnIter = 0; turnIter < tarlen; turnIter++){
for(iter = 0; iter < 4; iter++){
target[turnIter] <<= 8;
if((turnIter != turn - 1) || ((turnIter == turn - 1) && (iter < remainder || remainder == 0)))
target[turnIter] += source[turnIter * 4 + iter];
}
}
return target;
}

/

convert longs to bytes <br> <p>cut 1 long(32bit valid to instead unsigned int) to 4 short(8bit valid to instead unsigned byte) <br>
use long instead unsigned int <br> use short instead unsigned byte <br>
@param source - the Long [] that save unsigned int to convert @return the Short [] that save unsigned bytes
/
public static Short [] longToShort(Long [] source){
int sourlen = source.length;
Short [] target = new Short[sourlen
4];
int turn = target.length % 4;
int iter = 0;
int move = 0;
for(iter = 0; iter < target.length; iter++){
move = 8 * (3 - (iter % 4));
target[iter] = Short.parseShort(Long.toString((source[iter / 4] & (UBFILTER << move)) >> move));
}
return target;
}
}

代码中需要注意的几点如下:

1. 由于Java种没有无符号数的概念,故如int, long, byte等基础类型其最高位均为符号位,故不能使用该种类型进行无符号运算。本代码中使用long代替unsigned int,使用short代替unsigned byte。
2. 相
对C语言代码,在解密时不使用减法,而是用取反加一的方式将减法转换为加法。这是由于Java中Long类型是有符号的,其进行的计算亦为有符号计算。若
被减数小于减数时,减法结果将为负数,这不符合无符号减法的规则。转化为加法运算后,将其高位溢出,则可得无符号减法的结果。
3. 由于Java中不允许高位溢出,会抛出异常,故高位溢出需要手工完成,即将运算结果与0xffffffff或0xff进行与运算(视具体类型而定)。
测试类如下:
public class TestPoint {
public static void main(String [] args){

Long[] keyLong = new Long[4];
//加密解密所用的KEY
keyLong[0] = Long.decode("0x789f5645");
keyLong[1] = Long.decode("0xf68bd5a4");
keyLong[2] = Long.decode("0x81963ffa");
keyLong[3] = Long.decode("0x458fac58");

Short[] key = TEA.longToShort(keyLong);

Short[] info = new Short[]{
1, 2, 3, 4, 5, 6, 7, 8
};
System.out.print("原数据:");
for(Short i : info)
System.out.print(i + " ");
System.out.println();

Short[] secretInfo = TEA.encipher(info, key);
System.out.print("加密后的数据:");
for(Short i : secretInfo)
System.out.print(i + " ");
System.out.println();

Short[] decryptInfo = TEA.decipher(secretInfo, key);
System.out.print("解密后的数据:");
for(Short i : decryptInfo)
System.out.print(i + " ");
}
}

ADF 11.1.1.1.0中javax.el.PropertyNotFoundException

最近在将原开发项目由11.1.1.0.2升级至11.1.1.1.0,遇到一个原.2上开发的VO绑定问题。

原.2上开发项目某页面有这样一种应用:在对应VO上有一属性A,其Control Hints中Display Hint设置为Hide。
设置Hide的原因为页面上将该VO作为一个ADF Rich Table的绑定使用,并在该ADF Rich Table外使用Panel Collection控件以提供Rich Table的扩展功能如列选择。
在原.1或.2版本上,若VO该Attribute的Display Hint不为Hide,则在ViewController中将其绑定后,可通过上示列选择功能选出。

1.0版本中,当VO该Attribute的Display
Hint设为Hide时,尽管ViewController中可为其添加绑定,但在RichTable中使用形如
{row.bindings.attribute.inputValue}进行访问时,会导致
javax.el.PropertyNotFoundException: Target Unreachable, ‘attribute’
returned null异常。

通过修改VO该Attribute的Display Hint为Display,问题解决,且发现1.0版本中当Display
Hint为Display的情况下,即使将列加入ViewControl的绑定,只要列不出现在RichTable初始列表中,则Panel
Collection的列选择功能不能选择到该列。

jBPM4 on Weblogic 10.3

1. Weblogic 10.3 的配置
将 dom4j.jar, slf4j-api.jar, slf4j-jdk14.jar 放在Weblogic当前使用的Domain下面的lib目录下。

PS:
jBPM4的lib中带有slf4j-log4j12.jar及slf4j-jdk14.jar。slf4j-api.jar默认使用log4j,当
slf4j-log4j12.jar不存在时则使用jdk14.jar。此次我们使用jdk的log机制,故不将slf4j-log4j12.jar放入
web工程或weblogic的lib目录

需要将antlr.jar配置入 Weblogic 当前 Domian 下的
setDomainEnv.sh (.bat for windows),在其中 "PRE_CLASSPATH="
后添加antlr.jia的路径。我这里使用的是antlr-2.7.6.jar

需要在setDomainEnv.sh (.bat for windows) 文件末设置JAVA_OPTIONS
JAVA_OPTIONS="${JAVA_OPTIONS} -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"
export JAVA_OPTIONS
如此设置是由于错误
org.xml.sax.SAXNotRecognizedException: SAX feature ‘http://apache.org/xml/features/validation/dynamic‘ not recognized.
该错误产生的原因是Weblogic扩展的SAX中有一个方法重载的Bug,粗心的开发人员漏掉了"c",这里推荐同事11.xu的博文://TODO

需要在应用的META-INF/weblogic-application.xml中配置如下
<weblogic-application>

<prefer-application-packages>
<package-name>antlr.*</package-name>
</prefer-application-packages>

</weblogic-application>

进行这些配置的原因是服务器报出classDefNotFoundException,主要是因为 Weblogic 中有相同的包并且包的版本不统一,现有工程无法使用 Weblogic 中的 jar 包

2. 应用的配置
由于在jBPM4中使用了异步调用(async)、定时器(timer)等功能,这些功能在jBPM4中均作为一个Job进行处理。故需要为应用配置JobExecutor,以便当应用启动时,JobExecutor自动在数据库中检索并执行可执行的Job。

在应用的web.xml中添加如下内容

<web-app>

<servlet>
<servlet-name>JobExecutorServlet</servlet-name>
<servlet-class>
org.jbpm.pvm.internal.jobexecutor.JobExecutorServlet
</servlet-class>

<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JobExecutorServlet</servlet-name>
<url-pattern>/jobexecutor</url-pattern>
</servlet-mapping>

</web-app>

同时jBPM4工程作出如下更改
修改jbpm.cfg.xml,添加
<import resource="jbpm.jobexecutor.cfg.xml" />

在jBPM4工程下添加配置文件jbpm.jobexecutor.cfg.xml,并在其中写入如下内容
<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration>
<process-engine-context>
<job-executor threads="4" idle="15000" idle-max="60000" lock-millis="3600000" />
</process-engine-context>
</jbpm-configuration>

关于参数的内容含义,参见jbpm Developers Guide

这样当应用启动时,JobExecutor即将开始执行。

Install TOra 2.0.0 In Ubuntu 9.04 X86_64



Pre: 为什么要从源码编译
TOra使用OCI连接Oracle数据库,由于版权问题并不附带OCI的支持,而需要用户自行安装Oracle Instant Client,并在编译时指定Client的安装路径,方能提供针对Oracle数据库的支持。



1. 安装Oracle Instant Client 11.1 x86_64

1. 从OTN下载Oracle Instant Client的rpm,我下载的是11.1.0.7.0 for x86_64的版本。
必须下载Basic,可以选择下载其他的几项,建议下载sqlplus进行配置测试。
2. 将rpm包转为deb包,使用alien,没有的同学请使用apt-get安装
alien oracle-instantclient11.1-basic_11.1.0.7.0-2_amd64.rpm
alien oracle-instantclient11.1-sqlplus_11.1.0.7.0-2_amd64.rpm

3. 安装
sudo dpkg -i oracle-instantclient11.1-basic_11.1.0.7.0-2_amd64.deb
sudo dpkg -i oracle-instantclient11.1-sqlplus_11.1.0.7.0-2_amd64.deb

4. 创建或修改/etc/ld.so.conf.d/ora.conf,在其中加入如下两条路径
/usr/lib/oracle/11.1/client64
/usr/lib/oracle/11.1/client64/lib
5. 执行 sudo ldconfig 刷新lib配置
6. 配置ORACLE_HOME和TNS

7. 执行 sqlplus 进行测试
可能会遇到libaio.so.1载入错误,使用apt-get安装libaio即可。

2. 获得TOra 源码
从SourceForge下载源码,链接:http://sourceforge.net/projects/tora/files/

3. 编译安装

1. 使用cmake进行编译,没有的同学可以通过 apt-get 进行安装。

里要注意的是由于使用Oracle Instant Client
11.1,默认的oci.h的位置在/usr/include/oracle/11.1/client64,而lib的位置在/usr/lib
/oracle/11.1/client64/lib,故需要在安装时指定如下参数。
cmake
-DORACLE_PATH_INCLUDES=/usr/include/oracle/11.1/client64
-DORACLE_PATH_LIB=/usr/lib/oracle/11.1/client64/lib
-DORACLE_OCI_VERSION=11G

2. cmake成功后make

3. 添加 README.LAYOUT

认cmake出来没有这个文件(也许是作者忘了放进src里面?),安装时会报错。需要在放置TOra源码的目录下创建名为README.LAYOUT的
空文件。(其实不进行这一步也没关系,这个文件只是一个doc,不安装TOra也完全可以使用。但是如果不进行这一步,需要直接进入/usr/local
/tora/bin执行tora,或手工将tora的路径添加入PATH变量。)

4. make install

4. 修改启动
如果不修改则可能Oracle 的 TNS Provider无法使用
sudo rm /usr/local/bin/tora
sudo ln /usr/loca/tora/bin/tora /usr/local/bin

在Ubuntu X86_64下安装myeclipse 7.5

遇到的问题集中在JRE上。首先,Ubuntu默认的JDK/JRE为OpenJDK,故直接使用系统源中安装好的JAVA运行环境进行安装会报ClassDefNotFound的异常,主要是SSL的实现类不存在的错误。需要换装SUN官方的JDK方可。

其次,注意JDK的版本。由于使用X86_64的Linux版本,故需使用对应版本的myeclipse。需要注意的是,JDK是否为X86_64的版本
也很重要。起初我使用了JDeveloper11g中附带的jdk160_05进行安装,myeclipse提示系统架构不对应。在这个问题上困扰了将近
一个小时,Google无果(可恶myeclipse的网站还被和谐了)。后来到SUN的网站下载了jdk160_14 for
x86_64的版本安装,替换~/.bashrc中的JAVA_HOME及在PATH中加入$JAVA_HOME/jre/bin,重新打开一个
shell再执行安装,问题解决。

Oracle startup ora-00205 ora-01102



Database: Oracle 10g
OS: RedHat

两个错误均发生在数据库启动时。

1. ORA-00205: error in identifying controlfile, check alert log for more inf
原因:控制文件读取错误
解决:进入目录 /db/product/10.2.0/admin/<target database>/pfile/,得到pfile名称;
执行create spfile from pfile=’/db/product/10.2.0/admin/<target database>/pfile/<pfile>’;
实例:
create spfile from pfile=’/db/product/10.2.0/admin/adfprod/pfile/init.ora.6242009193030’;

2. ORA-01102: cannot mount database in EXCLUSIVE mode
原因:dbs/kl<SID>文件被锁定
解决:进入目录 /db/product/10.2.0/dbs/
fuser -k kl<SID> 解除锁定
fuser -u

org.xml.sax.SAXNotRecognizedException 的解决



在ADF中调用JBPM方法进行工作流的操作时,有时服务器端报出org.xml.sax.SAXNotRecognizedException的异常。

Google时发现问题的焦点集中在jar的加载顺序上,主要是因为ADF和JBPM的框架中用到了不同版本的xerces。故需要调整应用服务器(weblogic)加载jar的ClassPath。


本机中查找到的多个xercesImpl.jar中选择最新版本的,将其复制入Weblogic在本机的目的Domain文件夹下的lib目录中,修改
Domian/bin/setDomainEnv.sh(Linux系统,Windows系统修改.bat),在PRE_CLASSPATH中加入该
jar包的路径。重启应用服务器,问题解决。

Linux JDK 中文乱码



可以将字体文件从windows下面复制到/usr/share/fonts/truetype/<anydir>

确定JDK的目录

ln /usr/share/fonts/truetype/<anydir>/* $JAVA_HOME/jre/lib/fonts/fallback/

注意目录必须为fallback,如果不存在该目录则应该创建。