星期三, 十二月 21, 2005

可免费使用的BPEL

Oracle BPEL Engine
http://www.oracle.com/technology/products/ias/bpel/index.html

Jbmp.org
Jboss?Open source Engine.

星期六, 十二月 17, 2005

Workflow 和BPM 一些词汇翻译

http://www.ftponline.com/china/print.aspx?TotalPage=7&ID=34#

workflow 和 BPM,Orchestration 翻译为协调或流程编排

非常棒的翻译方法.

星期三, 十二月 14, 2005

Eclipse 的学习日记

如何关掉Eclipse的自动编译功能?当我想编译的时候手动编译?

从菜单 Window > Preferences > General > Workspace > 去掉Build automatically复选框
当你想编译的时候,按下Ctrl+B功能键盘.或者选择 Project >Build All 菜单命令

小秘密: 当你关闭 "auto compile" 功能的时候最好打开自动保存功能Window > Preferences > General > Workspace > 选择 Save automatically before build

help Search 关键词:compile my Java program

星期四, 十二月 08, 2005

JBoss JBPM 学习手册(一).

: 准备:

  1. 下载 以下5个包:



JBoss jBPM 3.0.2 17.6 MB 2005-11-17 LGPL Notes Download
JBoss jBPM Starters Kit 3.0.2 88.3 MB 2005-11-17 LGPL Notes Download
JBoss jBPM Process Designer Plugin 3.0.5 26.2 MB 2005-11-17 LGPL Notes Download
JBoss jBPM BPEL Extension 1.0 alpha 3 11 MB 2005-09-05 Custom Notes Download
JBPM DB 3.0.2 8.3 MB 2005-11-17 Custom ... Download


2.下载JBOSS 4.0.3SP1(最新)
http://www.jboss.org

3.下载 j2sdk 5.0(最新)
http://java.sun.com


4.下载Eclipse(JBOSS提供的Process DesignerEclipsePlug-in)
http://www.eclipse.org

5.下载mySQL5.0或其他数据库

http://www.mysql.com
mySQL 5.0 终于具有完全的功能了,包括sub select,Trigger,Procedure,UTF8支持


2005年末是个让人兴奋的年尾,OpenSource Database终于遇到了最强的阻击,
OracleMicrosoft都推出了有限制的企业Express版本。Oracle 10g Express
Microsoft SQL 2005 Express都是免费使用,发布安装的,不过数据容量限制在4GB,对大多数论坛或small application 是足够了.

6.下载mySQL或其他数据库JDBC Driver的支持.

7.下载 ant 1.6.2(最新)
http://ant.apache.org/


:安装
1.安装J2SDK
2.安装 mySQL 建立一个新的databasejbpm
安装Jbossjboss docs\examples\jca 目录下 复制mysql-ds.xml jbpm目录下的
deploy目录下,然后打开mysql-ds.xml,修改里面的:
<connection-url>jdbc:mysql://mysql-hostname:3306/jbossdb</connection-url>
主机为localhostDatabase Scheme为实际的Scheme,这里为jbpm

3.安装Eclipse 3.1
4.安装ant 1.6.2 ,并将路径加入到系统PATH变量中

5.安装 JBPM 3.06. JBPM安装

展开jbpm-3.0.2.zip 到一个目录下,修改build.properties
修改:ant.home jboss.home 为实际的路径
在当前目录下运行ant,编译.
再运行.ant ?buildfile build.deploy.xml jpm 发布到JBOSS目录下.
安装结束后,在jboss server目录下多了一个jbpm的目录,这就是
build.deploy.xml所做的工作。

6. 安装其他数据库
展开jbpm-db-3.0.2.zip,然后修改, jbpm-db-3.0.2.zip.dir\mysql\ hibernate.properties文件中的:
hibernate.connection.url=jdbc:mysql://localhost:3306/jbpm
hibernate.connection.username=root
hibernate.connection.password=
运行 ant mysql.script开始mysql脚本的安装和测试

如果顺利,则全部准备工夫完成了

.运行

3.1 启动 jboss

命令行 {jboss_home}\bin\run.bat ?c jbpm (注意:启动jbpm)
注意后台输出屏幕应该没有任何错误信息.
通过:http://localhost:8080/jbpm 出来jbpmWeb 页面了

.开发 Hello World工作流.
(pengding……..)

星期五, 十一月 18, 2005

Javascript:getElementByID getElementByName

得到当前form元素的表现层对象。

可以通过.getElementByID
或.document.forms['name'].elements['tagname']

来得到

星期六, 十一月 05, 2005

Tips:不能预先确定的动态数组.

Q:需要一个长度不固定,完全需要动态变化的array对象。

A:使用:java.io.ByteArrayOutputStream
最后使用ByteArrayOutputStream.toByteArray,得到最终的数组

典型代码:

protected Class getClassFromJar(InputStream is, String className) throws Exception
{
System.out.println("getClassFromJar try find "+className);
JarInputStream jis = new JarInputStream(is);
String rname = className;
rname = rname.replace ('.', '/') + ".class";//重要,必须还原为目录格式
JarEntry entry=null;
Class tmp=null;
while ((entry = jis.getNextJarEntry()) != null)
{
System.out.println(entry.getName());
if(entry.isDirectory()) continue;
if(entry.getName().equals(rname))
{
System.out.println("find it!!!!");
// int size=(int)entry.getSize();
// if(size==-1)throw new Exception("size is -1");
// System.out.println("size:"+size);
int status;
byte[] b= new byte[4096];
ByteArrayOutputStream buf = new ByteArrayOutputStream();
while((status = jis.read(b))!=-1)
{
System.out.println("read ..."+status);
buf.write(b,0,status);
}
System.out.println("All Read is "+buf.size());
byte[] classByte= buf.toByteArray();
buf.close();
tmp = defineClass(className,classByte,0,classByte.length);
jis.close();
return tmp;
}
}
return tmp;
}

星期日, 十月 30, 2005

One-Jar Open source

最近因为弄JNI,必须解决一个技术问题,就是自动加载

包含在可执行Jar中的动态库(.dll或.so).

这个问题2年前就碰到过类似的问题,不过当时是用编写脚本用 -

Xbootclasspath/a:作为加载第三方不包含在Jar文件中的class的方法。


虽然可以解决问题,很不完美。

后来用System.load来动态加载JNI的动态库,解决了这个问题后。

突然想到这个老问题,继续尝试以前想到的用ClassLoader来解决这个问题。

具体方法是:把包含在jar文件中的第三方jar包,展开到当前目录或系统临时目录

下,通过loadClass来加载这些包。

任务将近完成的时候,觉的这种方法依然要依赖用户的运行环境,如果是个限制

严格的环境,在临时展开这些class的时候,会出现运行时RuntimeException

终于在google发现了一个 one-jar的方法,是直接通过InputStream来加载

class,这是很大的进步了。仔细看看作者的实现。

http://one-jar.sourceforge.net/

星期六, 十月 29, 2005

JNI 常见问题 FAQ.

JNI 常见问题 FAQ.

  1. 如何从JNI返回一个字符串?
注意:所有JNI Method都有同样的参数, JNIEnv * env, jobject obj
JNIEnv是个系统的工具对象(ToolKit).
可以使用下列语法得到返回一个Java String
C 语法:
jstring str = (*env)->NewStringUTF(env,(char *)变量);

Java JNI 基本使用说明

Java JNI 解说.
步骤:

  1. 先建立一个标准java Class
通过native表明方法是平台相关的.
class TestNative {
     private native void print(); //注意方法声明
     public static void main ( String [ ] args ) {
           new TestNative().print();  //注意调用方法
     }
     static {
           System.loadLibrary ("helloWorld"); // 注意Load 动态库的语法.
     }
}
  • 注意:根据Java JNI 规范,
loadLibrary 根据平台不同会把 库名字修改为本地的lib名字.WindowsLib的名字同参数名字相同后缀上.dll.Unix类的平台下,往往修改为:lib参数名.so的最终名字。比如helloWorldUnix必须把文件名修改为libhelloWorld.so并设置LD_LIBRARY_PATH=包含这个.so的路径,才不会出现java.lang.UnsatisfiedLinkError的异常
  • 生成C用头文件

  • javac TestNative.java

  • javah ?jni TestNative
2.2后会产生一个头文件:TestNative.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestNative */

#ifndef _Included_TestNative
#define _Included_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     TestNative
* Method:    print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_TestNative_print
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
注意红色的: Java_TestNative_print 函数名的生成是按照JNI规范产生的
模式为Java_类名_方法名.

  1. 编辑对应的C代码:
#include <stdio.h>
#include "TestNative.h" //这行必须加入

JNIEXPORT void JNICALL
Java_TestNative_print ( JNIEnv* env, jobject obj )
{
      printf ( "Hello, Native!\n" ) ;
     return ;
}

  1. 编译源程序(注意生成的动态库的命名规则
Linux :
[root]# gcc TestNative.c -o libhelloWorld.so -shared -I /usr/java/j2s
dk1.4.2/include/linux/ -I /usr/java/j2sdk1.4.2/include/
Window:..
  1. 设置路径
Linux:
export LD_LIBRARY_PATH= .so文件所在目录名
  1. java TestNative 得到结果
  Hello, Native!
    

星期四, 十月 27, 2005

JVM Memory Model

JVM Memory Model

Thread可执行的操作:
use(使用)
assign(赋值)
load
store,
lock,
unlock
useassign
Main Memory SubSystem 可执行的操作:
read,
write,
lock,
unlock

这些操作都是Atomic的操作
Main Memory:主内存
Working Memory:工作区内存
关于这些Operation的定义说明:
  • use 动作:使用一个Threaduse 动作把当前Thread里的变量内容传送到Thread的执行引擎.这个动作发生在ThreadJVM指令中使用该变量的值的时候.

  • assign 动作:赋值 一个Threadassign动作 传送Thread引擎的变量值到Threadcopy变量里.这个动作在Thread执行JVM赋值指令的时候.

  • read 动作:读 主内存用稍侯的load动作传送原版变量的值到thread的工作区内存.

  • load 动作:载入 一个Thread把一个值从主内存通过read动作放到thread的工作区的复制的变量

  • store动作: 存储  一个Thread的存储动作是用下面的Write操作传送Thread工作区的复制变量值到主内存。

  • write 动作:写入  主内存的写入动作是通过store动作放一个值从Thread工作区复制变量到在主内存里的原版变量里

  • lock 动作:缩定 Thread和主内存紧密偶合的同步 lock动作造成Thread得到了一个特定锁的声明

  • unlock 动作:解锁 Thread和猪内存的紧密同步,让Thread释放关于特定锁的声明


(image placeholder)


http://java.sun.com/docs/books/vmspec/2nd-edition/html/Threads.doc.html

8.7 Rules for volatile Variables
如果一个变量被申明为volatile,哪个对操作这个变量的Thread有多了额外的约束
T 是个线程.
VWVolatile变量

  • A use operation by T on V is permitted only if the previous operation by T on V was load, and a load operation by T on V is permitted only if the next operation by T on V is use. The use operation is said to be "associated" with the read operation that corresponds to the load.

  • A store operation by T on V is permitted only if the previous operation by T on V was assign, and an assign operation by T on V is permitted only if the next operation by T on V is store. The assign operation is said to be "associated" with the write operation that corresponds to the store.

  • Let action A be a use or assign by thread T on variable V, let action F be the load or store associated with A, and let action P be the read or write of V that corresponds to F. Similarly, let action B be a use or assign by thread T on variable W, let action G be the load or store associated with B, and let action Q be the read or write of W that corresponds to G. If A precedes B, then P must precede Q. (Less formally: operations on the master copies of volatile variables on behalf of a thread are performed by the main memory in exactly the order that the thread requested.)

星期三, 十月 26, 2005

关于Class literal 的一些说明

关于Class literal 的一些说明

JLS 2.0 15.8.1 Lexical Literals 章节说明了”literal”的特定含义
A literal (§3.10) denotes a fixed, unchanging value.
A literal 表示一个固定的,不能改变的值.
因为如此我们把 literal翻译为常数
故此:我们把 Class Literal 翻译为 类常数

JLS 2.0 15.8.2 章节有如下话:
15.8.2 Class Literals(类常数)
A class literal is an expression consisting of the name of a class, interface,
or primitive type followed by a ‘.’ and the token class. The type of a class
is Class. It evaluates to the Class object for the named type (or for void)
defined by the defining class loader of the class of the current instance.
翻译如下:
类常数是有类(class),接口(class)或基本类型(primitive type)的名字接着句号”.”class
记号.

Class的类型是Class. 它相等于对应着名字标记的类型的Class对象(或者void).
这是有当前实例所定义的class Loader来定义的。

Jdk 5.0 的泛性中.class的 类常数表示方法频频使用。设计的目的,还是为了解决,在
reflection 技术中,关于使用基本类型(int,boolean….)作为参数的问题.
比如一个用int作为参数的Method通过.Class.getMethod(String methodName,Class[] param)
因为int本身不是一个Object也没有显式的定义申明,所以重载.class可以把int转换为
Class对象。
基本类型和Class之间的对应关系如下:
        boolean.class   ==   Boolean.TYPE
        char.class      ==   Character.TYPE
        byte.class      ==   Byte.TYPE
        short.class     ==   Short.TYPE
        int.class       ==   Integer.TYPE
        long.class      ==   Long.TYPE
        float.class     ==   Float.TYPE
        double.class    ==   Double.TYPE
        void.class      ==   Void.TYPE

Java Open Source的 Portlet The Portals Pluto Site

http://portals.apache.org/pluto/powered_by_pluto.html

以及企业Portal:
http://portals.apache.org/jetspeed-2

Java Reflection (Java反射)性能说明

Java Reflection in ActionReflection Cost比较昂贵的说法一直很流行。
其实,如果没有太多的getMethod方法的调用。
直接运行方法的cost和通过invoke()Cost基本是一样的。
但在某些情况下,反射书写的代码更加紧凑和幽雅。
比如在实现SQL Type -->Java Type之间的Mapping的时候.
需要更新ResultSetupdateXXX 方法组的时候。
BTW:性能测试代码:
public class TestReflection
{

public static void main(String[] args) throws Exception
{
Object object = new Object();
Class c = Object.class;

int loops = 100000;

long start = System.currentTimeMillis();
for( int i = 0; i < loops; i++ )
{
object.toString();
}
System.out.println( loops + " 正常方法调用:" + (System.currentTimeMillis() - start) + " milliseconds." );
java.lang.reflect.Method method = c.getMethod( "toString", null );

start = System.currentTimeMillis();
for( int i = 0; i < loops; i++ )
{
method.invoke( object, null );
}

System.out.println( loops + " 通过反射调用方法但没有查找方法过程:" + (System.currentTimeMillis() - start) + " milliseconds." );
start = System.currentTimeMillis();
for( int i = 0; i < loops; i++ )
{
method = c.getMethod( "toString", null );
method.invoke( object, null );
}
System.out.println( loops + " 通过反射调用方法包含查找方法过程:" + (System.currentTimeMillis() - start) + " milliseconds." );
}
}
测试结果:
C:\temp>java TestReflection
100000 正常方法调用:109 milliseconds.
100000 通过反射调用方法但没有查找方法过程:125 milliseconds.
100000 通过反射调用方法包含查找方法过程:312 milliseconds.

C:\temp>java -version
java version "1.4.2_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_09-b05)
Java HotSpot(TM) Client VM (build 1.4.2_09-b05, mixed mode)

C:\temp>d:\java\jdk1.5.0_05\bin\java TestReflection
100000 正常方法调用:94 milliseconds.
100000 通过反射调用方法但没有查找方法过程:110 milliseconds.
100000 通过反射调用方法包含查找方法过程:328 milliseconds.    

机器配置: 2.6G CPU.512M Memeory. WindowXp sp2

可见在调用次数非常少的情况下,花费的多余时间是可以忽略不计的。
在调用次数非常多的时候,必须注意要减少getMethod 寻找方法的
调用.

有关Java 系统级别和架构上的一些问题。

这里回答了很多经典的Java系统级别的问题:

http://www.javaolympus.com/J2SE/JavaPerformance/JavaReflectionPerformance.jsp

星期日, 十月 23, 2005

FreeMind - free mind mapping software

http://freemind.sourceforge.net/wiki/index.php/Main_Page

Freemind是一实用的开源思维导图/心智(MindMap)软件.它可用来作为:
1.管理项目(包括子任务的管理,子任务的状态,时间记录,资源链接管理).
2.笔记或知识库.
3.头脑风暴(Brain storm)
4.结构化的存储小型数据库.

星期四, 十月 20, 2005

HSQLDB vs Oracle

sqltool.rc 语法,用于SQLTools命令行输入数据.

urlid crm
url jdbc:hsqldb:/temp/testdb
username sa
password

注意:SQLTool命令行,默认commit是不自动提交的,需要设置为--autoCommit

如:
C:\Documents and Settings\William Wang>java -Dsqlfile.charset=UTF-8 -Xms512m -Xm
x512m -jar E:\hsqldb\lib\hsqldb.jar crm test.sql
,倒入了58770条记录。
查看可以使用:
C:\Documents and Settings\William Wang>java -jar e:\hsqldb\lib\hsqldb.jar --sql

速度非常快。

"select count(*) from att_M_dailyattendance" crm


HSQLDB Cached Table的索引都在.data文件里,如果建立索引(index),文件几乎要增加一倍啊。

太可怕了。不过在记录58000条左右的时候,建立索引前和索引后,查询速度几乎没什么变化 啊。
使用分页速度到是没什么变化。
SELECT LIMIT 1 10 * FROM ATT_M_DAILYATTENDANCE

HSQLDB vs MYSQL

语法非常接近。

从Mysql 倒出的Schema Create Script只要简单的调整后就可以了。


从command Line 运行HSQLDB脚本的语法:

java -jar $HSQLDB_HOME/lib/hsqldb.jar urlid file.sql

urlid通过hSQLDB Admin UI 建立的。

HSQLDB对Mysql的default ''的语法理解有点问题,似乎要把mysql脚本中非整数(int)的default语句要全部删除,才可以。
用 UltraEdit regular Expression表达:
find:NOT NULL^(*^),
replace: ^1 NOT NULL,

星期二, 十月 18, 2005

Swing Jpanel任意绝对定位

1.调用setLayout(null);把Layout设置为null
2.添加到JPanel里的组件,使用setBounds(x,y,width,height)来定位。
x,y是相对与左上角(0,0)来定位的。

Very Easy!!!!!!!!!!:)

星期五, 十月 14, 2005

Oracle 10g 企业管理工具

今天装上Oracle 10g,晕了,找不到,企业管理器(Enterprise Manager).

Google了1个多小时,才知道,原来Oracle改变了管理器的UI

全用Web Page来做了,emctl (em=Enterprise Manager)

晕啊,怎么一点兼容性都不考虑啊。

1.emctl start dbconsole
出来如图的说明

Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://IMAGE:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager 10g Database Control ...OracleDBConsolecrm 服
务正在启动 ...............
OracleDBConsolecrm 服务已经启动成功。

2.在Browser用地址:http://IMAGE:1158/em/console/aboutApplication
开始了管理的学习任务,

3.再大叹一声,晕啊。
Oracle 8i,9i,10G,越来越不认识了。
Online DBA Help:http://download-west.oracle.com/docs/cd/B12037_01/server.101/b10742/toc.htm

Unix下如何使用Java 颜色控制码?

Unix Console的AscII颜色控制码的格式是.^[[fg;bgm

fg=前景
bg=后景

fg和bg的手册有相关手册可以查找.标准的字符颜色控制码为^[[0;0m

^[对应的是ASCII 27,(char)0x1b

所以可以用以下代码在Unix环境下打印出来有颜色的提示:

if(System.getProperty("os.name").toLowerCase().indexOf("windows") == -1)System.out.println((char)0x1b+"[1;31m hello World! "+(char)0x1b+"[0;0m");



HSQLDB的排名很高啊。可以用来做企业数据库

http://jdj.sys-con.com/general/readerschoice.htm

Product Company Points
Birdstep RDM Embedded 7.1 Birdstep Technology
24
IBM Informix IDS v10 IBM
79
Daffodil DB Daffodil Software Ltd.
82
ObjectDB for Java/JDO ObjectDB
90
db4o db4objects
97
EAC MySQL Cluster Emic Networks
108
PointBase Embedded PointBase / DataMirror Corp.
139
Oracle Database Lite 10g Oracle Corporation
146
JDataStore 7 High Availability Edition Borland Software
165
Berkeley DB Java Edition Sleepycat Software
175
Sybase Adaptive Server Enterprise (ASE) Sybase, Inc.
258
HSQLDB HSQLDB Development Team
441
IBM DB2 Universal Database IBM
1110
Oracle Database 10g Oracle Corporation
2780

排名第三啊

星期三, 十月 12, 2005

如何在FireFox中播放MP3?

<object id="PlayerEx3" classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" width="296" height="65"> <param name="autoStart" value="false" /> <param name="LOOP" value="false" /> <param name="URL" value="http://sunose.sitesled.com/music/vitas/TheChorus.m3u" /> <embed LOOP="false" autostart="false" showstatusbar="1" src="http://sunose.sitesled.com/music/vitas/TheChorus.m3u" type="application/x-mplayer2" width="296" height="65" controls="ImageWindow,ControlPanel,StatusBar,TACCtrl" > </embed></object>

星期五, 十月 07, 2005

Netbean 5.0 beta Release.

但是安装后,启动Netbean 5.0 beta,则IDE 处于Freeze 状态。

反复安装几次,依然如故.

最后下载了Jdk 5.0 update 5 才解决了问题。

愚昧。这种东西也能说成是beta?

Sun的产品质量越来越糟糕了。

星期日, 九月 25, 2005

The Return of the King-王者归来--NetBean IDE 5.0 Preview.

这是一款真正重量级的IDE,几乎横扫目前主流IDE的优良Features.

主要增加的最新Feature.
1.Import Jbuildx and IDEA Project
2.Deploy JBoss.weblogic多个Application Server.
3.J2EE Support.
4.UI Native support.
5.Netbase Plugin development wizard(like as Eclipse plug-in wizard)
Cool!

..

不足:
1.source editor 不支持 multi-shortkey-template switch 必须:Turbo C/Visual Studio/CUA 如果Jbuilder

2.Source Code Verify有某些Bug,比如can't Reached java statement check 算法有些问题。

3.Open java source file not open as UNICODE,default is ISO8859-1
this is cause many issue.
4.其他Application Server deployment 的支持需要大大增加.

如果NetBeans 5.0能解决掉上续的不足,这是一款能统一JAVA IDE的工具。

星期一, 九月 19, 2005

Groovy shell 运行Script泄露内存问题.

When you create a Script, and then call run() on that Script, it is important to remove any entries created in the MetaClassRegistry after you are done. This is done by calling InvokerHelper.removeClass(script.getClass()). If you do not, the MetaClassRegistry will keep growing until you run out of memory.

Secondly, make sure that the GroovyShell is non-static, i.e. garbage collectable. Otherwise the GroovyClassLoader associated with the GroovyShell will hold on the all the classes (scripts) ever created.


来自:

Groovy shell 运行Script泄露内存问题.

When you create a Script, and then call run() on that Script, it is important to remove any entries created in the MetaClassRegistry after you are done. This is done by calling InvokerHelper.removeClass(script.getClass()). If you do not, the MetaClassRegistry will keep growing until you run out of memory.

Secondly, make sure that the GroovyShell is non-static, i.e. garbage collectable. Otherwise the GroovyClassLoader associated with the GroovyShell will hold on the all the classes (scripts) ever created.


来自:

星期五, 九月 16, 2005

程序的安全性

应用程序会随时间而演进,新的功能会逐次被加入、错误也逐一被修正,而安全性威胁也会逐步演进。因此,您必须定期对安全性威胁和应用程序安全性服务进行检视,以确保应用程序不致于暴露在不必要的风险下。
维持警觉
下面列出您可采取的步骤,以维持应用程序之安全性:
加入安全性批注至您的原始程序代码
在设计和撰写程序代码的阶段中,您会做出许多关于应用程序安全性实作 (Implementation) 的决定。未来继续维护您原始程序代码的开发人员,不一定完全了解这些决定或原始程序代码修改部分的枝节。您可以在原始程序代码内加入批注,说明您的假设、程序代码意图和任何外部安全性措施 (例如档案的存取控制清单,即 ACL 和验证方法等) 的相依性,减轻此风险。
回归测试错误修复
无可避免地,在应用程序发行之后,仍然会发现一些错误。而当您修复某个错误后,也可能会导致更多之前被修复错误遮蔽的错误浮现。在发行错误修复之前,请进行应用程序回归测试,以确保该修复不会损害到应用程序的安全性。
回归测试平台变更
软件错误难以避免,同样地,执行应用程序的平台以及软件互动的应用程序也免不了会有错误。在修补平台或是自用应用程序以外的应用程序时,请务必了解这些变更对应用程序的影响。例如,您的应用程序可能不经意地倚赖平台先前的不良行为 (Broken Behavior),做为安全性设计的一部份。
监视支持要求
您会在设计应用程序时假设其使用方法。若要验证这些假设,您应监视支持要求和讨论区,以评估真实世界的使用情况。例如,您的应用程序可能会要求使用者所不愿意或无法实作的安全性设定,这将会导致支持问题的增加。
开发良好的稽核原则
好的稽核原则会要求您记录系统上发生的重要事件并且适时对它们进行评估。适时的审核追踪记录有助于找出加害者。延迟的审核追踪记录通常则会延误修复安全性问题时机,加害者早已完成所有的破坏性动作。
监视找不到的错误
系统监视程序中的 Web 服务效能对象包含显示找不到的错误的计数器。找不到的错误是指无法满足客户端要求,因为它们包括了一个对不存在之网页或档案的参考(这些错误有时是以其 HTTP 状态码 404 来描述)
许多找不到错误的发生是由于网页和档案已被删除或移往别处,但是有些则是由于使用者尝试存取未经授权的文件所造成 (这些「禁止存取」错误的程序代码编号为 403。在大多数的浏览器上,403 错误与 404 错误的报告方式大多不同 ,且不会出现在 Not Found Errors/sec 计数器结果中)
您可以使用 Web 服务对象的 Not Found Errors/sec 计数器,追踪服务器上找不到错误的发生率。另外一种作法是,设定系统监视程序警示,在找不到错误发生率超过临界值时,通知系统管理员处理。
找不到错误的增加,有可能表示移动档案却没有更新档案连结。不过也有可能是表示尝试存取受保护的文件 (例如使用者清单和档案目录) 失败。
请勿储存机密
如果可能,请尽量避免储存敏感性信息。机密数据的管理通常是设计安全系统时,最困难的部份之一。
鼓励使用最小权限
请将您的应用程序设计成需要最少量的存取权限。以此作法,可减少攻击者利用您的应用程序做为平台,对任一计算机进行攻击之可能性。同时,若您的应用程序要求使用者以高优先权限账户登入,例如具有管理员权限的账户,这可能让使用者暴露于其它的攻击途径。
评估潜在损坏
Microsoft 在评估潜在的安全性弱点时,使用 DREAD 这个前缀缩写字。此前缀缩写字描述下列因素:
潜在损坏 (Damage Potential)
重现性 (Reproducibility)
可擅用性 (Exploitability)
受影响的使用者 (Affected Users)
发现性 (Discoverability)
每个因素的等级可从 1 (最低) 10 (最高)。根据每个因素的分数,可计算出该弱点的总分,并做出主观性判断。最后,是否修复它的决定也取决于其它难以具体化之因素,例如对于声誉的影响。
潜在损坏
若此弱点遭擅用,最坏的结果会是什么?
注意???下列的等级为范例定义。
  1. 10 - 攻击者完全控制计算机。

  2. 2 9 - 每个数字代表递增的破坏程度。

  3. 1 - 攻击者仅能读取或写入少数不造成损害的信息 (如果有的话)
重现性
利用此弱点重现攻击的难易度?
  1. 10 - 每次攻击都会成功。

  2. 2 9 - 每个数字代表递增的重现性难易度。

  3. 1 - 重复测试但发生次数极少。
可擅用性
根据此弱点进行攻击的难易度?
  1. 10 - 只需要极少甚至不需要知识或时间。

  2. 2 9 - 每个数字代表递增的可擅用性难易度。

  3. 1 - 需要大量的人物力和财力。
受影响的使用者
可能受此弱点影响的使用者百分比?
  1. 10 - 91-100%

  2. 2 9 - 每个数字代表递增的受影响使用者百分比 (例如 210-19%320-29%,其余依此类推)

  3. 1 - 0-9%
发现性
找出此弱点的难易度?
  1. 10 - 有大量公开发行的信息。

  2. 2 9 - 每个数字代表递增的公开程度。

  3. 1 - 相当隐密,几乎没有人知道它的存在。
请参阅
安全性

保持安全性术语.

保持安全
应用程序会随时间而演进,新的功能会逐次被加入、错误也逐一被修正,而安全性威胁也会逐步演进。因此,您必须定期对安全性威胁和应用程序安全性服务进行检视,以确保应用程序不致于暴露在不必要的风险下。
维持警觉
下面列出您可采取的步骤,以维持应用程序之安全性:
加入安全性批注至您的原始程序代码
在设计和撰写程序代码的阶段中,您会做出许多关于应用程序安全性实作 (Implementation) 的决定。未来继续维护您原始程序代码的开发人员,不一定完全了解这些决定或原始程序代码修改部分的枝节。您可以在原始程序代码内加入批注,说明您的假设、程序代码 意图和任何外部安全性措施 (例如档案的存取控制清单,即 ACL 和验证方法等) 的相依性,减轻此风险。
回归测试错误修复
无可避免地,在应用程序发行之后,仍然会发现一些错误。而当您修复某个错误后,也可能会导致更多之前被修复错误遮蔽的错误浮现。在发行错误修复之前,请进行应用程序回归测试,以确保该修复不会损害到应用程序的安全性。
回归测试平台变更
软件错误难以避免,同样地,执行应用程序的平台以及软件互动的应用程序也免不了会有错误。在修补平台或是自用应用程序以外的应用程序时,请务必了解 这些变更对应用程序的影响。例如,您的应用程序可能不经意地倚赖平台先前的不良行为 (Broken Behavior),做为安全性设计的一部份。
监视支持要求
您会在设计应用程序时假设其使用方法。若要验证这些假设,您应监视支持要求和讨论区,以评估真实世界的使用情况。例如,您的应用程序可能会要求使用者所不愿意或无法实作的安全性设定,这将会导致支持问题的增加。
开发良好的稽核原则
好的稽核原则会要求您记录系统上发生的重要事件并且适时对它们进行评估。适时的审核追踪记录有助于找出加害者。延迟的审核追踪记录通常则会延误修复安全性问题时机,加害者早已完成所有的破坏性动作。
监视找不到的错误
系统监视程序中的 Web 服务效能对象包含显示找不到的错误的计数器。找不到的错误是指无法满足客户端要求,因为它们包括了一个对不存在之网页或档案的参考(这些错误有时是以其 HTTP 状态码 404 来描述)。
许多找不到错误的发生是由于网页和档案已被删除或移往别处,但是有些则是由于使用者尝试存取未经授权的文件所造成 (这些「禁止存取」错误的程序代码编号为 403。在大多数的浏览器上,403 错误与 404 错误的报告方式大多不同 ,且不会出现在 Not Found Errors/sec 计数器结果中)。
您可以使用 Web 服务对象的 Not Found Errors/sec 计数器,追踪服务器上找不到错误的发生率。另外一种作法是,设定系统监视程序警示,在找不到错误发生率超过临界值时,通知系统管理员处理。
找不到错误的增加,有可能表示移动档案却没有更新档案连结。不过也有可能是表示尝试存取受保护的文件 (例如使用者清单和档案目录) 失败。
请勿储存机密
如果可能,请尽量避免储存敏感性信息。机密资料的管理通常是设计安全系统时,最困难的部份之一。
鼓励使用最小权限
请将您的应用程序设计成需要最少量的存取权限。以此作法,可减少攻击者利用您的应用程序做为平台,对任一计算机进行攻击之可能性。同时,若您的应用程序要求使用者以高优先权限帐户登入,例如具有管理员权限的帐户,这可能让使用者暴露于其它的攻击途径。
评估潜在损坏
Microsoft 在评估潜在的安全性弱点时,使用 DREAD 这个前缀缩写字。此前缀缩写字描述下列因素:
潜在损坏 (Damage Potential)
重现性 (Reproducibility)
可擅用性 (Exploitability)
受影响的使用者 (Affected Users)
发现性 (Discoverability)

每个因素的等级可从 1 (最低) 到 10 (最高)。根据每个因素的分数,可计算出该弱点的总分,并做出主观性判断。最后,是否修复它的决定也取决于其它难以具体化之因素,例如对于声誉的影响。
潜在损坏
若此弱点遭擅用,最坏的结果会是什么?
注意 下列的等级为范例定义。
? 10 - 攻击者完全控制计算机。
? 2 到 9 - 每个数字代表递增的破坏程度。
? 1 - 攻击者仅能读取或写入少数不造成损害的信息 (如果有的话)。
重现性
利用此弱点重现攻击的难易度?
? 10 - 每次攻击都会成功。
? 2 到 9 - 每个数字代表递增的重现性难易度。
? 1 - 重复测试但发生次数极少。
可擅用性
根据此弱点进行攻击的难易度?
? 10 - 只需要极少甚至不需要知识或时间。
? 2 到 9 - 每个数字代表递增的可擅用性难易度。
? 1 - 需要大量的人物力和财力。
受影响的使用者
可能受此弱点影响的使用者百分比?
? 10 - 91-100%
? 2 到 9 - 每个数字代表递增的受影响使用者百分比 (例如 2:10-19%、3:20-29%,其余依此类推)。
? 1 - 0-9%
发现性
找出此弱点的难易度?
? 10 - 有大量公开发行的信息。
? 2 到 9 - 每个数字代表递增的公开程度。
? 1 - 相当隐密,几乎没有人知道它的存在。

如何在HSQL中判定一个Table是否已经建立.

--使用如下SQL,可以得到一个Schema里是否已经建立了一个table

select * from information_SCHEMA.SYSTEM_TABLES
where TABLE_SCHEM='PUBLIC' and table_name='USER'

PUBLIC是HSQL Schema的名称
USER是已经建立的table的名称.

非常cool.


星期四, 九月 08, 2005

如何想HSQLDB插入binary数据?

1.使用SQLTOOL。
在系统用户目录下建立:sqltool.rc文件,包含如下格式文字:
urlid SELF
url jdbc:hsqldb:file:D:/temp/testdb
username sa
password

java -classpath D:\hsqldb\lib\hsqldb.jar org.hsqldb.util.SqlTool SELF
使用\bl,\bp命令
2.\bl d:/a3.jpg
3.\bp
4.insert into table('wxk',?);注意?号。

星期日, 八月 28, 2005

如何通过Gtalk同朋友共享美妙音乐?

如何通过Gtalk同朋友共享美妙音乐?

Windows XP下的设置步骤
1.首先打开音量控制器,双击状态行上的音量图标,如图一,会弹出图二窗口

图一

图二
2.选择图二中的选项 菜单里的 属性(如图二),弹出图三.

图三
3.选择录音 ,然后选择 波形输出混音,如图三,在选择确定按钮弹出图四

图四

4.如图四 选择波形输出混音,并关闭该窗口
5.打开Gtalk,选择在线的朋友,在窗口里点Call按钮,如图五

图五

6.连通后,用Window MediaPlay或RealPlay打开音乐,则对方的朋友同时也可以听到了

缺点:
此时麦克风录音在window录音机里失去录音效果了。如果需要麦克风录音,
必须重复1,2,3 选择 麦克风

附录:经过测试,这个原理是通用的在MSN 7.5 测试也是可以的。哈哈

星期四, 八月 25, 2005

如何使用maven编译Project

1.学习如何使用Maven
Maven pdf手册,Getting Start 2.2 Building a Project
给出了步骤。
自然首先是安装,建立Maven使用的依赖的package.
1.1
建立一个目录 mkdir d:\project\maven cd\d:\proeject\maven
使用命令:maven genapp 一路回车按到底。maven开始从网络上下载需要的jar包(如果是第一次运行maven)
1.2
maven genapp后,在当前目录下生成了

1.3 应用其他编译需要的包或class.
看了许久,发现大多数都用,重新定义maven.dependency.classpath的方法。
需要在当前目录下建立maven.xml文件,如下:
























<pathelement path="D:/Project/employee_ejb/classes/"/>
<pathelement path="C:/ThirdPart/ehrm_EJB.jar"/>
<pathelement path="C:/ThirdPart/EJBMD_ehrm_menu.jar"/>
<pathelement path="C:/ThirdPart/gpejb.jar"/>
<pathelement path="C:/ThirdPart/gp_MailClass.jar"/>
<pathelement path="C:/ThirdPart/groovy-all-1.0-beta-7.jar"/>
<pathelement path="C:/ThirdPart/javadbf-0.4.0.jar"/>
<pathelement path="C:/ThirdPart/jdbf.jar"/>
<pathelement path="C:/ThirdPart/mailerEjb.jar"/>
<pathelement path="C:/ThirdPart/mr.jar"/>
<pathelement path="C:/ThirdPart/mysql-connector-java-3.0.8-stable-bin.jar"/>
<pathelement path="C:/ThirdPart/poi-2.5.1-final-20040804.jar"/>
<pathelement path="C:/ThirdPart/rowset1.0.1.ehrm.jar"/>
<pathelement path="C:/jboss-3.2.3/lib/jboss-jmx.jar"/>
<pathelement path="C:/jboss-3.2.3/lib/jboss-system.jar"/>
<pathelement path="C:/ThirdPart/commons-fileupload-1.0.jar"/>
</path>
</preGoal>
</project>



星期日, 八月 21, 2005

哈哈,新西兰小国家的卫星技术好厉害啊.

最近在玩NASA的WorldWind,想看清楚New ZeaLand的地图,才发现.

http://forum.worldwind.arc.nasa.gov/index.php?act=Attach&type=post&id=1203

worldwind://goto/world=Earth&lat=-41.27978&lon=174.77643&alt=344&dir=101.0&tilt=40.0

http://www.nztopoonline.linz.govt.nz/wmsconnector/com.esri.wms.Esrimap?ServiceName=nztopo_wms&

安装了Worldwind后,再下载这个可以看到New ZeaLand:

http://www.worldwindcentral.com/wiki/World_Wind_Central_Add-on_Pack

在worldwind里,选择哪个图标上面标志有:Aerial Visible字样的Icon.就可以看到了,需要从worldCentral里下载图象数据.

星期三, 七月 27, 2005

Re: XML Schema 的最佳实践原则

ARTS (零售技术标准协会)的 IXRetail 最近提出了规范 XML Schema 设计的最佳实践原则,共有17条:

1. 所有的 XML 命名采用UCC (首字大写的大小写混合)方案,单词间无空格或连字符。
解释:大小写混合方案(camel case)分为UCC与LCC两种。UCC要求以大写字母开头,例如:NewBookName;LCC则以小写字母开头,例如:newBookName。 为了统一命名,IXRetail 推荐使用UCC,且不允许使用空格或下划线,即不能用New_Book_name或New Book Name。
2. 可读性比标记长度更重要。
解释:IXRetail认为,为了便于用户理解 XML 文档,增加标记的长度也是值得的。例如:CompanyID就比ID_Comp要好。
3. 尽量避免在元素、属性和类型的命名中使用缩写。但是 GTIN(全球贸易项目编号)、ID(标识号)、POS(电子收款机系统)除外。
解释:本原则是依据 ARTS 数据模型而提出的。例外情况是针对零售业而言,其它行业可以规定本行业的可缩写术语。
4. 尽量不要在属性命名中包括实体名。
在 ARTS 数据模型中,实体名通常被用作属性名字前缀。然而 XML 已具清晰的层次结构,包含前缀的属性名只会徒然增加标记长度。本原则也适用于本地元素命名。
5. 使用 W3C XML Schema,不要用 DTD 或其他 Schema 方案。
解释:与 DTD 相比,W3C 的 XML Schema具有很多优点,如:XML Schema 是 XML文档;一个XML文件可以对应多个Schema;XML Schema 的内容模型可以随意扩充;XML Schema支持多种数据类型,且能自定义;XML Schema允许使用本地名称;XML Schema 可以使用空值,等等(参见http://www.w3.org/TR/xmlschema-0)。其他方案包括微软早期向 W3C 提交的 XML Schema 方案等。
6. 枚举值的命名,应该遵循元素命名原则,且不包含数字;尽量不要使用 IXRetail 创造的新名字;尽量使用 ISO 标准命名而不是国家标准或协会标准命名。
解释:包含数字的命名是不规范的,且给处理带来困难。自然语言词汇已经暗示了其数值,何乐而不为?
7. 枚举值应该使用由英语单词组成的名字。
解释:能够暗示数值的自然语言命名没有多少选择余地,而在 ARTS 数据模型中已经提供了英语命名,可以使用它们的衍生词作为名称。
8. 命名不应与所在结构重复。
解释:本原则是4.的推广。例如:在 元素中的 元素就不要使用 NewBookName。
9. 所有的 XML Schema 的全局名字空间统一命名为 IXRetail,它的 URI 是 http://www.nrf-arts.org/IXRetail/namespace/
解释:本原则可以避免与其他名字空间冲突。URI 末尾的"/"代表它是目录而不是文件名。这并不重要,因为 URI 是用于给名字空间命名而不是对其定位的。其他行业可以自行规定名字空间。
10. 所有来自 IXRetail 的 XML 实例都要指定 IXRetail 为默认名字空间。   

解释:本原则可以避免在使用本行业术语时都要加上名字空间前缀 IXRetail。各行业可以指定自己的默认名字空间。注意:本原则仅适用于 XML 实例,而不是 XML Schema。
11. 所有来自 IXRetail 的 XML Schema 都要指定 IXRetail 为默认名字空间以及目标名字空间。
解释:在本原则下,W3C 不再是默认名字空间,相应的标准命名都要加上名字空间前缀。注意:本原则仅适用于 XML Schema 而不是 XML 实例。
12. 凡是领域专家认为可重用的数据类型,无论是 simpleType 还是 complexType,应该在全局名字空间而不是在 Element 属性中定义。
解释:数据类型名称很少用在标记里,即使全局名字空间里定义,并且加上领域名称和作者等前缀,也不会影响标记的总长度。
13. Schema 中的元素名称,应该使用嵌套 Element 定义,其数据类型可以被显式或隐式定义;不要用 ref 引用全局定义。
解释:本原则与12.相反。元素名称在标记中频频出现,因此,精简了附加信息的本地元素名称可以大大缩短标记总长度。
14. 来自 IXRetail 的 Schema 的各个版本,都应该在 schemaLocation 属性中指定其 URI;URI 要遵循 ARTS-NRF 制定的规范 (每个 schemaLocation 都是 http://www.nrf-arts.org/IXRetail/schemaLocation/ 的子目录,且是 UTF-8 文件)。开放标记 的 version 属性不能为空,且必须与 schemaLocation 属性一致。schemaLocation 属性和 version 属性的值都要与 Schema 的许可、实施、发行信息中所述一致;还要包含符合 W3C 日期格式的发行日期
解释:为了规范 XML Schema 的版本控制机制,任何发行版本,包括第一版的 XML Schema ,都应该遵循本原则。任何 XML 处理器均支持 UTF-8 格式,但只有少数处理器支持简/繁体中文、日语等 UTF-16 格式的语言,因此要用 UTF-8 格式。所谓 W3C 日期格式,是指 yyyymmdd 格式,如:20020211(2002年2月11日)。版本控制机制尚未统一,故其他机构制定的规范可能与本原则有出入。
15. 尽量使用 ARTS XML 字典中的词汇。
解释:ARTS XML 字典中包含了 ARTS 数据模型的实体名和属性名、来自 IXRetail schemas 的名称,以及它们的衍生词。目前它的词汇以零售业为主,可以扩充到任何行业。
16. 从全局名字空间选取名称时,尽量选取能揭示被命名对象的特定意义的复合词。
解释:词汇具有多义性,通用词更是如此。如果不加选择,就会引起岐义,从而影响文档的可读性。本原则对于用 Element 定义的本地词汇不适用,它们所在的层次限定了其含义。
17. 名字空间前缀要保持统一;使用 IXRetail 名字空间不需要加前缀。

只能使用下列前缀和定义:
(1) xml(在可扩展标示语言标准方面定义)
(2) xmlns(在可扩展标示语言标准的 Namespaces 中定义)
(3) xs http://www.w3.org/2001/XMLSchema
(4) xsi http://www.w3.org/2001/XMLSchema-instance
解释:前述10.与11.两条原则已经规定了 IXRetail是默认名字空间,故不需加前缀。本原则提到的可用前缀还可进一步完善。
小结:以上17条原则是由 IXRetail 提出来,以规范零售业的 XML Schema 的设计。基本的原则包括:规范命名的形式、合理选词、规范名字空间、与现行工业标准接轨。具体应用时,可视情况加以调整。

星期四, 七月 21, 2005

如何用diskboot.img制造Redhat AS 4.0 USB启动安装盘?

http://www.raimokoski.com/lineox/4.0/i386/os/README-x86-en.html

Another image file contained in the images/ directory is diskboot.img. This file is designed for use with USB pen drives (or other bootable media with a capacity larger than a diskette drive).
Use the dd command to write the image. dd if=bootdisk.img of=/dev/sd0
(Windows 用RawWrite.exe)

Note

The ability to use this image file with a USB pen drive depends on the ability of your system's BIOS to boot from a USB device.



如何把RedHat 的Boot.iso放到USB 盘上,直接启动,不要再刻CD了。Cool

4.4. 为采用 USB 闪盘引导方法准备文件

第4章 获取系统安装介质

4.4. 为采用 USB 闪盘引导方法准备文件

如果采用 USB 闪盘引导你需要一台运行支持 USB 的 GNU/Linux 系统。 你应该确定 usb-storage 内核模块已经装入 ( modprobe usb-storage ) 然后尝试找出 USB 闪盘映射到的那个 SCSI 设备。 在这个例子中是 /dev/sda )。 为了 写入你的闪盘,你可能需要关闭它的写保护开关。

注意,准备的 USB 闪盘应该至少有 128MB 的容量 ( 在更小的尺寸安装也是可能的,请参照 第4.4.2节 , "拷贝文件 ── 灵活的方法 " )。

4.4.1. 拷贝文件 ── 轻松的途径

这里有一个单一的文件 hd-media/boot.img.gz 。其中包括了所有的 安装文件 (包括内核),以及 SYSLINUX 和它的配置文件。你只需要把它直接 解到你的 USB 闪盘内:

gzip -dc boot.img.gz >/dev/sda

当然这会删除这个设备上的所有内容,因此小心你使用的是正确的 USB 闪盘设备名称。

之后,挂接 USB 闪盘 ( mount /dev/sda /mnt )。里面应该 存在一个 FAT 文件系统,并且存有一个 Debian 网络安装盘或者名片型 ISO 映象。请注意文件 名必须以 .iso 结尾。 解挂闪盘 (umount /mnt) 后结束。

4.4.2. 拷贝文件 ── 灵活的方法

如果你需要更多的灵活性或者只是想了解其间发生了什么,你应该使用如下的方法来把文件放到你的闪盘。 我们将显示如何安装闪盘来使用其第一个分区,而不是整个设备。

由于大多数 USB 内存条预先装载了一个单一的 FAT16 分区,你可能不需要重新分区或者重新格式化 USB 内存条。如果你必须这么做,请使用 cfdisk 或者其他的分区工具来 创建一个 FAT16 分区并且输入

mkdosfs /dev/sda1

小心你使用的是 USB 盘正确的设备名称。mkdosfs 命令包含在 dosfstools Debian 包中。

如果想要在 USB 闪盘引导后启动内核,我们将在 USB 闪盘上放入一个引导装载程序。尽管任何引导装载程序 (比如 LILO) 应该可以胜任这个工作。不过还是使用 SYSLINUX 更方便。主要是它使用一个 FAT16 分区并且用编辑一个文本文件 就能进行配置。任何支持 FAT 文件系统的操作系统可以用来改变引导装载程序的配置文件。

为了把 SYSLINUX 放到你的 USB 闪盘的分区上,请安装 syslinuxmtools 包在你的系统里, 然后输入

syslinux /dev/sda1

请再次确保你使用的是正确的设备名称。在开始 SYSLINUX 的时候 不能挂接分区。这个程序会写入分区的引导扇区并且创建 ldlinux.sys 文件。它主要包含引导装载器的代码。

接下来挂接分区 (mount /dev/sda1 /mnt) 并且 从 Debain 文件库拷贝下列文件到内存条上:

  • vmlinuz (内核执行文件)

  • initrd.gz (初始化内存映像)

  • syslinux.cfg (SYSLINUX 配置文件)

  • Optional kernel modules

如果你想重命名这些文件,请注意 SYSLINUX 只能处理 DOS (8.3) 文件名。

syslinux.cfg 配置文件应该含有下列两行:

default vmlinuz
append initrd=initrd.gz ramdisk_size=10000 root=/dev/rd/0 init=/linuxrc devfs=mount,dall rw

请注意, ramdisk_size 参数在需要的时候可能要增大,这取决于 你正在引导的内存映像大小。

现在你需要把任意 Debian ISO 映像 (名片式,网络安装式或者甚至是完全安装版) 放入你的 USB 闪 盘 (如果它装的下的话)。这样的一个映象文件后缀必须是 .iso

如果你想通过网络安装而不需要一个 ISO 映像,你当然需要跳过以前的步骤。并且你必须要使用来自 netboot 目录的内存映像来取代来自 hd-media 的内存映像。这是因为 hd-media/initrd.gz 并不包含网络支持。

当你完成的时候,解挂 USB 闪盘memory stick (umount /mnt) and activate its write protection switch.

警告

如果你的系统拒绝从 USB 闪盘引导,那么闪盘可能装有一个无效引导扇区记录 (MBR)。 使用来自 mbrinstall-mbr 命令也许可以解决这个问题:

install-mbr /dev/sda

星期四, 七月 07, 2005

SCM Principle Microsoft SourceSafe VS CVS/Subvision

SourceSafe:The Lock-Modify-Unlock Solution
CVS/Subvison:The Copy-Modify-Merge Solution

which is better?

LMU(SourceSafe ) is better for common.

星期日, 七月 03, 2005

测试Email Post

Email Post:

--------
测试风格.
  TSS

星期五, 七月 01, 2005

window command line shutdown

DOS ECHO G=FFFF:0000 ? DEBUG Reboot Warm boot, sometimes cold boot.
May not work with "exotic" memory managers, like Quarterdeck's QEMM or DesqView; in that case, use RESET.COM instead.
Win31* ECHO G=FFFF:0000 ? DEBUG Task Manager popup And sometimes reboot
Win9* RUNDLL USER.EXE,ExitWindows Shutdown (2)  
Win9* RUNDLL USER.EXE,ExitWindowsExec See Remarks Win95: various results, usualy fast shutdown (and lock PC), sometimes restart Windows, sometimes reboot.
Win98: Restart Windows, sometimes reboot.
Win9* RUNDLL SHELL.DLL,RestartDialog Restart dialog "System Settings Changed, Do you want to restart your computer now?" dialog
Win98 RUNDLL32 KRNL386.EXE,exitkernel Poweroff Poweroff for ATX boards only, otherwise normal shutdown (3)
Win98/ME RUNDLL32 SHELL32.DLL,SHExitWindowsEx n See Remarks
n can be any combination (sum) of the following numbers: (4)
0    Logoff
1    Shutdown
2    Reboot
4    Force
8    Poweroff (if supported by the hardware)
Win98/ME RUNONCE.EXE -q Reboot (4)  
NT4 See Reboot NT on my Solutions found in alt.msdos.batch page Reboot Reboot immediately
NT4 RUNDLL32 USER32.DLL,ExitWindowsEx
RUNDLL32 USER32.DLL,ExitWindowsEx
Logoff Most systems require the command to be called twice before logging off
NT4+RK
W2K+RK
SHUTDOWN /L /R /T:0 /Y Reboot Immediate shutdown & reboot
NT4+RK
W2K+RK
SHUTDOWN /L /T:10 /Y /C

星期四, 六月 30, 2005

JSP中如何利用outputStream下载一个dbase III文件?

JSP中如何利用outputStream下载一个dbase III文件?

<%@ page language="java" import="java.io.*"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="com.sun.rowset.CachedRowSetImpl"%>
<%@ page import="com.linuxense.javadbf.*"%>
<%@ page import="att_I_ZhongShanAttendance"%>

<jsp:useBean id="query" class="com.goldpeak.ehrm.web.zhongshan.eHRM2ZSDBFHandler">
<jsp:setProperty name="query" property="request" value="<%=request%>"/>
<jsp:setProperty name="query" property="session" value="<%=session%>"/>
</jsp:useBean>

<c:set var="resultlist" value="${query.query}" scope="request">
</c:set>

<%
try
{
//System.out.println(request.getRealPath("/"));
//String path=request.getRealPath("/");
String tmppath =System.getProperty("java.io.tmpdir");

CachedRowSetImpl crset = (CachedRowSetImpl)request.getAttribute("resultlist");
att_I_ZhongShanAttendance ZS = new att_I_ZhongShanAttendance();
DBFWriter writer = new DBFWriter();
writer.setFields(ZS.fields);
while (crset.next())
{
Object rowData[] = new Object[ZS.fields.length];
java.sql.ResultSetMetaData meta = crset.getMetaData();
for (int i = 0; i <ZS.fields.length ; i++)
{
System.out.println(i+":"+ZS.fields[i].getName()+":");
if(meta.getColumnTypeName(i+1).equals("DECIMAL"))
{
rowData[i] = new Double(crset.getDouble(ZS.fields[i].getName().trim()));
}else
{
rowData[i] = crset.getString(ZS.fields[i].getName().trim());
}
}
writer.addRecord(rowData);
}

//response.setContentType("application/x-msexcel");
response.setHeader("Content-Type","application/octet-stream");
PersonHelper person =(PersonHelper)session.getAttribute("personHelper");
java.util.Calendar ca=java.util.Calendar.getInstance();
String termstartdate=(String)request.getParameter("startdate");
String termenddate=(String)request.getParameter("enddate");
String filename=person.getFactoryCode()+"_"+person.getUserID()+"_"+
"_"+termstartdate+"_"+termenddate+".dbf";
//System.out.println(filename);
response.setHeader("Content-Disposition","attachment; filename="+filename);
response.setHeader("Connection","close");
tmppath = tmppath+System.currentTimeMillis()+".dbf";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
writer.write(baos);
javax.servlet.ServletOutputStream outs = response.getOutputStream();
baos.writeTo(outs);

outs.flush();
baos.close();
outs.close();
}catch(Exception e)
{
e.printStackTrace();
}
%>
注意:利用了JDBF 0.40来实现DBF.

星期二, 六月 21, 2005

MySQL Transaction JDBC tips

首先:table type必须是:InnoDB,mysql 在这种类型的table才支持Transaction.

两种方法:
必须禁止JDBC的自动事务提交

1.java.sql.Connection Transaction
conn.setAutoCommit(false);//必须的
...
conn.commit();//提交
conn.rollback();//回滚
2.XA架构造的事物.

<%
...
conn.setAutoCommit(false);//必须的
Context initCtx = new InitialContext();
UserTransaction tx =null;
tx = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");

try
{
if(tx.getStatus() == javax.transaction.Status.STATUS_NO_TRANSACTION)tx.begin();
stmt.executeUpdate("insert into att_L_OTPolicy(factorycode,otdaytype) values('WWW','ttt')");
System.out.println(1/0);制造异常回滚.
tx.commit();
}catch(Exception e)
{
tx.rollback();
out.println("Error:"+e.getClass()+e.getMessage());
}
conn.close();
%>

星期五, 六月 10, 2005

Java constant expression required issue:

constant expression:发生在用Switch ...case的时候使用了静态variable.

如下:
class Tester {
public static int a = 1;
public static int b = 2;

public static void main(String[] args) {
int x = a;
switch(x) {
case a: System.out.println("matched a==0");
break;
case b: System.out.println("matched b==1");
break;
}
}}
得到:
C:\temp>javac Tester.java
Tester.java:8: constant expression required
case a: System.out.println("matched a==0");
^
Tester.java:10: constant expression required
case b: System.out.println("matched b==1");


方法修改static 变量为final static: 如下
class Tester {

public final static int a = 1;
public final static int b = 2;


public static void main(String[] args) {
int x = a;
switch(x) {
case a: System.out.println("matched a==0");
break;
case b: System.out.println("matched b==1");
break;
}
} // main()
} // Tester_2

星期四, 六月 09, 2005

Design pattern VS MM

关于23种设计模式的有趣见解(转)
在网上看见了这篇文章,作者以轻松的语言比喻了java的32种模式,有很好的启发作用。

创建型模式

1、FACTORY?追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

2、 BUILDER?MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)

建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

3、FACTORY METHOD?请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

4、PROTOTYPE?跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

5、SINGLETON?俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

结构型模式

6、ADAPTER?在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

7、BRIDGE?早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

8、 COMPOSITE?Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”, MM都会用Composite模式了,你会了没有?

合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

9、 DECORATOR?Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上 “最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

10、 FACADE?我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有 Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

11、 FLYWEIGHT?每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。

享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

12、PROXY?跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

行为模式

13、 CHAIN OF RESPONSIBLEITY?晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

14、 COMMAND?俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,:-(

命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

15、INTERPRETER?俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。



16、ITERATOR?我爱上了Mary,不顾一切的向她求婚。

Mary:“想要我跟你结婚,得答应我的条件”

我:“什么条件我都答应,你说吧”

Mary:“我看上了那个一克拉的钻石”

我:“我买,我买,还有吗?”

Mary:“我看上了湖边的那栋别墅”

我:“我买,我买,还有吗?”

Mary:“你的小弟弟必须要有50cm长”

我脑袋嗡的一声,坐在椅子上,一咬牙:“我剪,我剪,还有吗?”

……

迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

17、MEDIATOR?四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

18、MEMENTO?同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19、OBSERVER?想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

20、 STATE?跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21、STRATEGY?跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

22、TEMPLATE METHOD??看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23、 VISITOR?情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

星期三, 六月 08, 2005

Thread.isAlive() == false?

Thread的run() method override的时候,执行完毕,则Thread的状态就不是
Alive的了.
所以如果在run()方法里加入
while(true)
{
try
{
...;//你的代码
}catch(Exception e)
{
}
}

则thread的状态讲永远是true

Java Thread Wait()或notifyAll()引起IllegalMonitorStateException问题解决方法.

java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:426)
at LockTip.run(LockTip.java:18)

解决这个问题很简单,有两个办法:
1.加上synchronized 到Method定义的时候
比如synchronized void afterInputData()P{....;notifyAll();}
2.用this关键词或其他对象上加上synchronized 关键词
synchronized(this)
{
...;
notifyAll();//或其他变量名.notifyAll();
}