星期五, 十二月 30, 2005

JSF 1.1和JSF 1.2 在支持EL能力上的差别

根据规范:

jsf 1.1

Value Binding Expression Syntax
The syntax of a value binding expression is identical to the syntax of an expression
language expression defined in the JavaServer Pages Specification (version 2.0),
sections 2.3 through 2.9, with the following exceptions:
  1.  The expression delimiters for a value binding expression are “#{“ and “}” instead
  2.  Value binding expressions do not support EL functions.


jsf 1.2

provided by version 2.1 of the JavaServer Pages specification. The EL is described in a
separate specification document delivered as part of the JSP 2.1 spec. Please consult that
document for complete details about the EL.

JSF 1.2中, JSP 1.2和JSP 2.1在EL 引擎上完全统一了,不像以前JSP和JSF是各自的EL引擎。

JSF 1.1中不支持 自定义EL function 的能力。所以必须通过其他技术手段来完成。


星期三, 十二月 28, 2005

CachedRowSet (New Version) NullPointerException

Simplest Solution is:

Java Forums - CachedRowSet (New Version) NullPointerException: Locale.setDefault(Locale.ENGLISH

MyEclipse Deploy Web Module include External Package in war lib.

Deployment by deploy policy.

http://myeclipseide.com/enterpriseworkbench/help/index.jsp?topic=/com.genuitec.myeclipse.doc/html/quickstarts/webprojects/index.html

星期二, 十二月 27, 2005

Eclipse 热键

3.1 有点不同

Eclipse优点:免费、程序代码排版功能、有中文化包、可增 
设许多功能强大的外挂、支持多种操作系统(Windows、 
Linux、Solaris、Mac OSX)..等等。 

发这张帖子的目的是希望能将Eclipse的一些使用技巧集 
合起来...欢迎大家继续补充下去(由于Eclipse的版本众多 
,希望补充的先进们能顺便说明一下您所使用的版本) 

Eclipse网站  http://www.eclipse.org/
(使用版本:Eclipse 2.1.2 Release + 中文化) 

热键篇: 
Template:Alt + / 
修改处:窗口->喜好设定->工作台->按键->编辑->内容辅助。 
个人习惯:Shift+SPACE(空白)。 
简易说明:编辑程序代码时,打sysout +Template启动键,就 
会自动出现:System.out.println(); 。 
设定Template的格式:窗口->喜好设定->Java->编辑器->模板。 

程序代码自动排版:Ctrl+Shift+F 
修改处:窗口->喜好设定->工作台->按键->程序代码->格式。 
个人习惯:Alt+Z。 
自动排版设定:窗口->喜好设定->Java->程序代码格式制作程序。 
样式页面->将插入tab(而非空格键)以内缩,该选项取消勾选 
,下面空格数目填4,这样在自动编排时会以空格4作缩排。 

快速执行程序:Ctrl + F11 
个人习惯:ALT+X 
修改处:窗口->喜好设定->工作台->按键->执行->启动前一次的启动作业。 
简易说明:第一次执行时,它会询问您执行模式, 
设置好后,以后只要按这个热键,它就会快速执行。 
..我觉得很顺手^___^ 

自动汇入所需要的类别:Ctrl+Shift+O 
简易说明: 
假设我们没有Import任何类别时,当我们在程序里打入: 

BufferedReader buf = 
new BufferedReader(new InputStreamReader(System.in)); 

此时Eclipse会警示说没有汇入类别,这时我们只要按下Ctrl+Shift+O 
,它就会自动帮我们Import类别。 

查看使用类别的原始码:Ctrl+鼠标左键点击 
简易说明:可以看到您所使用类别的原始码。 

将选取的文字批注起来:Ctrl+/ 
简易说明:Debug时很方便。 
修改处:窗口->喜好设定->工作台->按键->程序代码->批注 

视景切换:Ctrl+F8 
个人习惯:Alt+S。 
修改处:窗口->喜好设定->工作台->按键->窗口->下一个视景。 
简易说明:可以方便我们快速切换编辑、除错等视景。

myEclipse如何增加JSF能力

首先添加一个Web Project后,
web.xml和face-config.xml 并没有包含jsf必须的配置功能。

必须通过手工要myEclipse加入该配置文件:

在项目文件夹上老鼠右键 myEclipse Add JSF Capabilities...
然后选择合适的servlet-mapping url-pattern就可以了。

如图:

如何改变JSF默认的错误提示信息.

在JSF 规范里给出的错误提示字典如下:
javax.faces.Message.properties 里.这是Sun JSF IMPL实现里的资源.

myfaces相应的资源名可能有不同.


# ==============================================================================
# SPECIFICATION DEFINED MESSAGES
# ==============================================================================


# ==============================================================================
# Component Errors
# ==============================================================================

javax.faces.component.UIInput.CONVERSION={0}Conversion error occurred.
javax.faces.component.UIInput.REQUIRED=Validation Error\: {0}Value is required.
javax.faces.component.UISelectOne.INVALID=Validation Error\: {0}Value is not valid
javax.faces.component.UISelectMany.INVALID=Validation Error\: {0}Value is not valid

# ==============================================================================
# Validator Errors
# ==============================================================================

javax.faces.validator.NOT_IN_RANGE=Validation Error\: {2}Specified attribute is not between the expected values of {0} and {1}.
javax.faces.validator.DoubleRangeValidator.MAXIMUM=Validation Error\: {1}Value is greater than allowable maximum of "{0}"
javax.faces.validator.DoubleRangeValidator.MINIMUM=Validation Error\: {1}Value is less than allowable minimum of ''{0}''
javax.faces.validator.DoubleRangeValidator.TYPE=Validation Error\: {0}Value is not of the correct type
javax.faces.validator.LengthValidator.MAXIMUM=Validation Error\: {1}Value is greater than allowable maximum of ''{0}''
javax.faces.validator.LengthValidator.MINIMUM=Validation Error\: {1}Value is less than allowable minimum of ''{0}''
javax.faces.validator.LongRangeValidator.MAXIMUM=Validation Error\: {1}Value is greater than allowable maximum of ''{0}''
javax.faces.validator.LongRangeValidator.MINIMUM=Validation Error\: {1}Value is less than allowable minimum of ''{0}''
javax.faces.validator.LongRangeValidator.TYPE=Validation Error\: "{0}" Value is not of the correct type.


# ==============================================================================
# IMPLEMENTATION DEFINED MESSAGES
# ==============================================================================

com.sun.faces.ASSERTION_FAILED=Assertion Failed
com.sun.faces.ATTRIBUTE_NOT_SUPORTED=Attribute ''{0}'' not supported for component type ''{1}''.
com.sun.faces.CANT_CONVERT_VALUE=Can''t convert property: ''{0}'' to value type: ''{1}''.
com.sun.faces.CANT_CLOSE_INPUT_STREAM=Unable to close input stream.
com.sun.faces.CANT_CREATE_LIFECYCLE_ERROR=Can''t create Lifecycle for id: ''{0}''.
com.sun.faces.CANT_INSTANTIATE_CLASS=Can''t instantiate class: ''{0}''.
com.sun.faces.CANT_INTROSPECT_CLASS=Can''t introspect class: ''{0}''
com.sun.faces.CANT_PARSE_FILE=Can''t parse file: ''{0}''.
com.sun.faces.COMPONENT_NOT_FOUND_ERROR=Component Not Found for identifier: ''{0}''.
com.sun.faces.COMPONENT_NOT_FOUND_IN_VIEW_WARNING=Unable to find component with ID ''{0}'' in view.
com.sun.faces.CONTENT_TYPE_ERROR=Unrecognized Content Type.
com.sun.faces.CONVERTER_NOT_FOUND_ERROR=Converter Not Found for identifier: ''{0}''.
com.sun.faces.DUPLICATE_COMPONENT_ID_ERROR=Duplicate component ID ''{0}'' found in view.
com.sun.faces.EMPTY_PARAMETER=Parameter is empty
com.sun.faces.ENCODING_ERROR=Unrecognized Character Encoding.
com.sun.faces.ERROR_GETTING_VALUE_BINDING=Can''t get ValueBinding for value: ''{0}''.
com.sun.faces.ERROR_GETTING_VALUEREF_VALUE=Can''t get value from value binding expression: ''{0}''.
com.sun.faces.ERROR_OPENING_FILE=Can''t open configuration file: ''{0}''.
com.sun.faces.ERROR_REGISTERING_DTD=Can''t register DTD: ''{0}''.
com.sun.faces.ERROR_SETTING_BEAN_PROPERTY=Can''t set managed bean property: ''{0}''.
com.sun.faces.FACES_CONTEXT_CONSTRUCTION_ERROR=Construction Error: One or more input parameters may be null.
com.sun.faces.FACES_SERVLET_MAPPING_CANNOT_BE_DETERMINED=Unable to determine FaceServlet mapping for servlet path ''{0}''.
com.sun.faces.FILE_NOT_FOUND=File Not Found for file: ''{0}''.
com.sun.faces.ILLEGAL_ATTEMPT_SETTING_STATEMANAGER=Illegal attempt to set StateManager after a response has been generated.
com.sun.faces.ILLEGAL_ATTEMPT_SETTING_VIEWHANDLER=Illegal attempt to set ViewHandler after a response has been generated.
com.sun.faces.ILLEGAL_CHARACTERS_ERROR=Characters not allowed.
com.sun.faces.ILLEGAL_IDENTIFIER_LVALUE_MODE=Illegal use of implicit object identifier in lValue mode: ''{0}''
com.sun.faces.ILLEGAL_MODEL_REFERENCE=Illegal Model Reference in this context for expression ''{0}''.
com.sun.faces.ILLEGAL_VIEW_ID=Illegal view ID ''{0}''. The ID must begin with ''/''
com.sun.faces.INVALID_EXPRESSION=Invalid expression: ''{0}''.
com.sun.faces.INVALID_INIT_PARAM=Invalid initialization parameter: ''{0}''.
com.sun.faces.INVALID_MESSAGE_SEVERITY_IN_CONFIG=Invalid Message severity ''{0}'' defined in configuration.
com.sun.faces.INVALID_SCOPE_LIFESPAN=The scope of the referenced object: ''{0}'' is shorter than the referring object
com.sun.faces.LIFECYCLE_ID_ALREADY_ADDED=LifecycleId already added for id: ''{0}''.
com.sun.faces.LIFECYCLE_ID_NOT_FOUND=LifecycleId not found for id ''{0}''.
com.sun.faces.MAXIMUM_EVENTS_REACHED=Maximum number of events ''{0}'' reached.
com.sun.faces.MISSING_CLASS_ERROR=Missing Class: Can''t load class ''{0}''.
com.sun.faces.MISSING_RESOURCE_ERROR=Missing Resource: Can''t get ResourceBundle.
com.sun.faces.MODELUPDATE_ERROR=Model Update failure for value ''{0}'' in model''{1}''.
com.sun.faces.NAMED_OBJECT_NOT_FOUND_ERROR=Expression Error: Named Object: ''{0}'' not found.
com.sun.faces.NOT_NESTED_IN_FACES_TAG_ERROR=Not nested in a UIComponentTag Error for tag with handler class: ''{0}''.
com.sun.faces.NULL_BODY_CONTENT_ERROR=BodyContent is null for tag with handler class: ''{0}''.
com.sun.faces.NULL_COMPONENT_ERROR=Construction Error: Component argument is null.
com.sun.faces.NULL_CONFIGURATION=No Configuration loaded for the application.
com.sun.faces.NULL_CONTEXT_ERROR=Argument Error: Context argument is null.
com.sun.faces.NULL_EVENT_ERROR=Argument Error: Event argument is null.
com.sun.faces.NULL_FORVALUE=Component "{0}" not found
com.sun.faces.NULL_HANDLER_ERROR=Argument Error: Handler argument is null.
com.sun.faces.NULL_LOCALE_ERROR=Argument Error: Locale argument is null.
com.sun.faces.NULL_MESSAGE_ERROR=Argument Error: Message parameter cannot be null
com.sun.faces.NULL_PARAMETERS_ERROR=Argument Error: One or more parameters are null.
com.sun.faces.NULL_REQUEST_VIEW_ERROR=Argument Error: Request View argument is null.
com.sun.faces.NULL_RESPONSE_STREAM_ERROR=Argument Error: ResponseStream argument is null.
com.sun.faces.NULL_RESPONSE_VIEW_ERROR=Argument Error: ResponseView argument is null.
com.sun.faces.NULL_RESPONSE_WRITER_ERROR=Argument Error: ResponseWriter argument is null.
com.sun.faces.OBJECT_CREATION_ERROR=One or more confgured application objects could not be created. Check your web application logs for details.
com.sun.faces.PHASE_ID_OUT_OF_BOUNDS=PhaseId out of bounds for id: ''{0}''.
com.sun.faces.RENDERER_NOT_FOUND=Renderer not found for Renderer type: ''{0}''.
com.sun.faces.REQUEST_VIEW_ALREADY_SET_ERROR=State Error: RequestView has already been set for this request.
com.sun.faces.SAVING_STATE_ERROR=Error while saving state in ''{0}'': ''{1}''.
com.sun.faces.SUPPORTS_COMPONENT_ERROR=Argument Error: ''{0}'' is not supported for this renderer.
com.sun.faces.TYPECONVERSION_ERROR="{2}" Conversion Error setting value ''{0}'' for ''{1}''.
com.sun.faces.VALIDATION_COMMAND_ERROR=Validation error. ''{0}'' must have value or image attribute.
com.sun.faces.VALIDATION_EL_ERROR=Validation error. Expression invalid for:''{0}''
com.sun.faces.VALIDATION_ID_ERROR=Validation error. The following JSF tags are required to contain IDs:''{0}''
com.sun.faces.VALIDATOR_NOT_FOUND_ERROR=Validator Not Found for identifier: ''{0}''.


com.sun.faces.CYCLIC_REFERENCE_ERROR=Possible cycle reference to managed bean "{0}"


修改为自己的本地语言的 必须要设置.
web.xml里设置的:
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>

faces-config.xml
文件里的配置部分,如下:

<faces-config>
<application>
<locale-config>
<default-locale>zh</default-locale>
</locale-config>
<message-bundle>org.wxk.HelloWorld</message-bundle>
</application>
</faces-config>

JSF 常见问题站点

http://jsf-faq.com/

一些奇怪的问题,我碰到的问题没有,没碰到的一大堆。

JBoss JavaServerFace 里的配置诡异.

在JBoss 4.0.3 sp1里配置JSF,不用Myfaces用Sun实现的版本。
经常出现以下两个错误:

1.:JavaServerFace:Cannot find FacesContext
NullPointer 错误
2.
java.lang.NoClassDefFoundError: org.apache.myfaces.taglib.core.ViewTag


通过web.xml里如下配置,依然不能解决问题。

<listener>
<listener-class>
com.sun.faces.config.ConfigureListener
</listener-class>
</listener>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

原因在于我们对这段话的理解,同JSF规范里定义的语义的不一致。
这个mapping只是询问我们,给包含JSF标签的jsp起一个别名
实际的文件后缀都是jsp,如果一个jsp里包含了JSF的标签。就不能按照
普通jsp来解释,必须通过把用同名文件但是后缀是mapping的文件来告诉web container
用JSF来解释这个JSP。
比如:index.jsp包含了JSF标签,如果我们直接引用http://localhost:8080/HelloWorld/index.jsp
则出现Cannot find FacesContext错误。
但如果我们使用:
1.
http://localhost:8080/HelloWorld/faces/index.jsp
2.http://localhost:8080/HelloWorld/index.jsf

都能得到正确的结果!!!

错误2:
java.lang.NoClassDefFoundError: org.apache.myfaces.taglib.core.ViewTag
在删除Jboss自带的Myface的执行包后,依然不能解决问题,需要删除tmp和work目录。
重新启动Jboss来解决.

BTW:如果以上配置依然不能解决问题,在tomcat里,需要删除tmp和work目录后,重新
启动,就可以解决这个问题。Opensource的hot deploy的不稳定可见一斑了。:(

诡异!!


星期四, 十二月 22, 2005

好的翻译

Java Enterprise Design Patterns

Versioned Object:版本化的对象


星期三, 十二月 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