大千世界。。。骗子一堆

一直幻想有天打个电话过去,第一句话就是:这里是派出所,我们已经侦查你们很久了,别望窗外。限你们24小时内到最近的派出所投案自首,坦白从宽。如不然,侦查小组24小时后发起突击,到时候就洗干净屁股等着。(呵呵!!)

1 2

3 4

5 6

7 8

9

造假造的没有办法说。。。首先是好多错别字。。。。估计语文不过关。。。

再有就是傻得可以。。。。微软的网页。。。。向来也算严谨。。。

那个资料填写网页。。。。什么检查都没有。。。。看来他们雇佣的程序员还是比较初级点的,还asp的呢。。。微软早就升级asp.net喇,看来还是雇不起高级点的程序员。。。

再有就是许多链接直接链到微软网站。。。但是都是风马牛不相及。。。

最明显的是网站的url。。。真以为白痴多?!

All road lead to Rome

气死我了,发现使用blogger之后
然后许多问题就出现了

一开始可以访问
过了一段时间就出现问题
然后就只能上网求解,最后是使用 inblogs
可是好景不长
又出问题了

有点不甘心
不为什么
就是内心的反叛气息

于是最后还是找到相关的解决方案
================================
Windows用户请在C:\WINDOWS\system32\drivers\etc\hosts文件中添加“72.14.219.190        ipis2justin.blogspot.com”
================================
看来是域名解析问题
估计就是域名解析的时候被禁用了
所以没有办法解析
同上上边的方法仅仅是添加了域名和ip的对应
然后就可以访问了

没有办法,人就争这口气
——–参考文章:
http://feng.w.qin.googlepages.com/

@@@@@@@@@@@@@@@@@@@@@@@@@$$$$$$$$$$$
可惜最终还是被封了。现在无法访问了,连blogger都无法登陆了。

紧急事件:小心你的手机

晚上,正在看别人的blog,猪猪打来电话,让我帮他查他的手机的进网许可证
说最近都已经很头条了,手机发生爆炸事件
尤其是nokia和摩托罗拉
暂时说是电池缘故

google了一下,才发现最近许多相关的新闻
http://www.cnetnews.com.cn/list-0-0-54099-0-1.htm

导火线是端午节的时候的爆炸事件:
http://www.donews.com/Content/200707/94c0997565ea450bb4b4e798a118f753.shtm

浏览了下事件回顾
http://www.cnetnews.com.cn/2007/0708/416948.shtml
发现频率有增长的趋势(还是以前没有记录在案,抑或者是以前手机的普及率不高)

不过矛头都是指向电池,都说是电池原因。
http://tech.sina.com.cn/t/2007-07-05/01191598921.shtml

专家们也提倡以下四种情况下禁用手机:
一、是发现电池充电后使用时间严重不足;
二、是充不上电;
三、是使用中电池过热;
四、是外型鼓胀破裂等现象。

而且,根据报道:
http://www.cnetnews.com.cn/2007/0708/416982.shtml
称,市场上50%的电池都是假的。
看来我们真的是生活在恐惧线上的蚱蜢
随时有生命危险,而危险就来自我们的手机

以前看过一个报道
关于手机的,说的主要是辐射,但是本身几率很小
而现在,又加上了电池,看来,我们生活在n多活火山之间

不过俺的手机买的是行货,上以下网址可以验证
http://www.tenaa.com.cn/WSFW/FlagValidate.aspx
首先,选择省份,输入城市。(这两个没有用途的,有就行)
然后输入许可证编码。

点击提交,然后到达下一部的时候
如果许可证正确,那么设备型号中显示的就是你的手机型号,如有有差别,那就证明有问题
然后再扰码输入你的手机入网许可的第三行
至于手机串号,直接输入“*#06#”就可以获取,然后把手机串号输入
点击验证就可以验证你的手机是否是正版的手机

nokia的电池也可以查,网址是:
http://europe.nokia.com/A4144894
或者把相关的20位电池序列号发送至“+61 427151515”。
——-
可惜我以前就玩过了,现在手机用了许久,那些编码都被我刮花了几个,所以也就不再去验证

大家赶快验证下吧
别等出事,呸呸呸,别乌鸦嘴
不过这种事情如果可以避免,还是尽量避免
最起码别拿自己的生命开玩笑

————-
p.s. 猪猪的告诫:千万别把手机放裤兜里(尤其男的),或者睡觉的时候放在枕头边。万一发生事故可不好受。

转帖-《正则表达式学习笔记》

 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
  列目录时, dir *.txt或ls *.txt中的*.txt就是一个正则表达式,因为这里*与正则式的*的含义是不同的。

  为便于理解和记忆,先从一些概念入手,所有特殊字符或字符组合有一个总表在后面,最后一些例子供理解相应的概念。

正则表达式

  是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式,即/expression/

普通字符

  由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

非打印字符

字符

含义

\cx

匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。

\f

匹配一个换页符。等价于 \x0c 和 \cL。

\n

匹配一个换行符。等价于 \x0a 和 \cJ。

\r

匹配一个回车符。等价于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t

匹配一个制表符。等价于 \x09 和 \cI。

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK。

特殊字符

  所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。

特别字符

说明

$

匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。

( )

标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。

*

匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

+

匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。

.

匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。

[

标记一个中括号表达式的开始。要匹配 [,请使用 \[。

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。

\

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 "\",而 ‘\(‘ 则匹配 "("。

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。

{

标记限定符表达式的开始。要匹配 {,请使用 \{。

|

指明两项之间的一个选择。要匹配 |,请使用 \|。

  构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

限定符

  限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
  正则表达式的限定符有:

字符

描述

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?

匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

{n}

n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 "Bob" 中的 ‘o’,但是能匹配 "food" 中的两个 o。

{n,}

n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 "Bob" 中的 ‘o’,但能匹配 "foooood" 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。

{n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

定位符

  用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。

选择

  用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
  其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

后向引用

  对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
  可以使用非捕获元字符 ‘?:’, ‘?=’, or ‘?!’ 来忽略对相关匹配的保存。

各种操作符的运算优先级

  相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:

操作符

描述

\

转义符

(), (?:), (?=), []

圆括号和方括号

*, +, ?, {n}, {n,}, {n,m}

限定符

^, $, \anymetacharacter

位置和顺序

|

“或”操作

全部符号解释

字符

描述

\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,’n’ 匹配字符 "n"。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 "\" 而 "\(" 则匹配 "("。

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?

匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

{n}

n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 "Bob" 中的 ‘o’,但是能匹配 "food" 中的两个 o。

{n,}

n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 "Bob" 中的 ‘o’,但能匹配 "foooood" 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。

{n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",’o+?’ 将匹配单个 "o",而 ‘o+’ 将匹配所有 ‘o’。

.

匹配除 "\n" 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。

(pattern)

匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘\(‘ 或 ‘\)’。

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。

(?=pattern)

正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,’Windows (?=95|98|NT|2000)’ 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y

匹配 x 或 y。例如,’z|food’ 能匹配 "z" 或 "food"。'(z|f)ood’ 则匹配 "zood" 或 "food"。

[xyz]

字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 "plain" 中的 ‘a’。

[^xyz]

负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 "plain" 中的’p’。

[a-z]

字符范围。匹配指定范围内的任意字符。例如,'[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。

[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 "verb" 中的 ‘er’。

\B

匹配非单词边界。’er\B’ 能匹配 "verb" 中的 ‘er’,但不能匹配 "never" 中的 ‘er’。

\cx

匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。

\d

匹配一个数字字符。等价于 [0-9]。

\D

匹配一个非数字字符。等价于 [^0-9]。

\f

匹配一个换页符。等价于 \x0c 和 \cL。

\n

匹配一个换行符。等价于 \x0a 和 \cJ。

\r

匹配一个回车符。等价于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t

匹配一个制表符。等价于 \x09 和 \cI。

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w

匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]’。

\W

匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。

\xn

匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41′ 匹配 "A"。’\x041′ 则等价于 ‘\x04’ & "1"。正则表达式中可以使用 ASCII 编码。.

\num

匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1′ 匹配两个连续的相同字符。

\n

标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm

标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml

如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un

匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

部分例子

正则表达式

说明

/\b([a-z]+) \1\b/gi

一个单词连续出现的位置

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

将一个URL解析为协议、域、端口及相对路径

/^(?:Chapter|Section) [1-9][0-9]{0,1}$/

定位章节的位置

/[-a-z]/

A至z共26个字母再加一个-号。

/ter\b/

可匹配chapter,而不能terminal

/\Bapt/

可匹配chapter,而不能aptitude

/Windows(?=95 |98 |NT )/

可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。

参考文献:
正则表达式
http://www.soulogic.com/code/doc/RegularExpressions/
==================
文章出处:http://hedong.3322.org/archives/000244.html

动态装载类和相应的方法

因为工作需要,所以看了动态装载类和方法的内容
实际上看懂的话都很容易的。
以下是个例子,用来说明一下。
====================
import java.lang.reflect.*;
public class TestMethod {
 public static void main(String[] args) {
  try {
   //动态装载类,forName中为类名。
   Class classTest = Class.forName("TestMethod");
   //初始化一个一个对象,并把他赋给object
   Object object = classTest.newInstance();
   
   //传递的参数,需要和调用的函数的参数顺序一致,而且类型要统一
   Class[] cArgs = new Class[3];
   
   //测试数据
   String string = "test";
   Integer integerNum = 123;
   Float floatNum = 123.1f;
   
   //以下是数据的数据类型
   cArgs[0] = string.getClass();
   cArgs[1] = integerNum.getClass();
   cArgs[2] = floatNum.getClass();
   
   //以下是数据装载。
   Object[] inArgs = new Object[3];
   inArgs[0] = string;
   inArgs[1] = integerNum;
   inArgs[2] = floatNum;
   
   //调用了method方法,返回值为Method变量,这里仅仅是传递方法名,还有方法调用时的参数类型。
   Method method = classTest.getMethod("method", cArgs);
   
   //直接调用该方法。因为invoke中两个对象都是Object,所以需要设置下。第一个参数需要是一个实例的引用,第二个参数才是真正的数据。
   method.invoke(object, inArgs);
  } catch (Exception e) {
   System.out.println(e);
  }
 }
 public void method(String string, Integer integerNum, Float floatNum) {
  System.out.println("String:"+string);
  System.out.println("Integer:"+integerNum);
  System.out.println("Float:"+floatNum);
 }
}
====================
看到没有?java的反射机制真的很不错,这样子就可以动态的装载类还有类的方法。
切记,数据类型中不要使用int和float这样子的基础类型,因为没有getClass这个函数。
当然调用的时候可以用,但是至于函数声明时必须是类,不可以是基础类型。
例如你调用的时候把int数值赋给intergerNum对应的参数。但是函数声明中不可以是:
method(String string, int integerNum, Float floatNum)
注意到没有,因为即使你传递int数值给函数调用,但是还是被自动转换为Integer的实例了
但是函数调用的时候,int因为没有getClass的函数,如果你传递Integer,
则发生编译无法匹配的错误。

试用dom4j

以前用过jdom
感觉也算是很方便的
 
只是后来据说jdom的效率没有dom4j好
于是就一直都想看看
今天就初试了下,感觉还是很不错的
 
===================测试xml
<bill name="reckoning" cn_name="帐单" table="zd">
 <handler type="TypeNotMatch" handler="gzbill.handler.TypeNotMatchHandler"/>
 <handler type="EmptyString" handler="gzbill.handler.EmptyStringHandler"/>
 <header>
  <item name="total_line" length="9" type="int" required="1" cn_name="总行数"/>
  <item name="total_amount" length="20" type="float" required="1" cn_name="总金额"/>
 </header>
 <body>
     <item name="user_equipment_num" length="10" type="int" required="1" cnName="用户设备序号" filed="yhsbxh"/>
   <item name="district" length="4" type="char" required="1" cnName="地区" filed="dq"/>
   <item name="business_type" length="2" type="char" required="1" cnName="业务类别" filed="ywlb"/>
   </body>
</bill>
===================测试代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * @author justin (
mailto:xuzc@carnation.com.cn )
 *
 */
public class TestParse {
 /**
  *
  */
 public TestParse() {
  super();
  // TODO Auto-generated constructor stub
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try {
//   //Bof: justin 20070531. read the file to the string, then use the string to parse.
//   BufferedReader br = new BufferedReader(new FileReader(
//     "E://24th_task/xmlTest/type1.xml"));
//   StringBuffer sb = new StringBuffer();
//   String line = null;
//   while ((line = br.readLine()) != null) {
//    sb.append(line);
//   }
//   line = sb.toString();
//   //Eof: justin done here. 20070531.
//   //Bof: justin 20070531. parse the string to the xml document.
//   Document document = DocumentHelper.parseText(line);
//   //Eof: justin done here. 20070531.
   //Bof: justin 20070531. use this method just to parse the document directly, without any process.
   SAXReader reader = new SAXReader();
         Document document = reader.read(new File("E://24th_task/xmlTest/type2.xml"));
         //Eof: justin done here. 20070531.
         //Bof: justin 20070531. init a root element.
         Element root = document.getRootElement();
         //Eof: justin done here. 20070531.
   System.out.println("parse the root information…");
   Iterator ab = root.attributeIterator();
   while(ab.hasNext()){
    Attribute a = (Attribute) ab.next();
    System.out.println("attribute:"+a.getName()+",value:"+a.getValue());
   }
   System.out.println("");
   System.out.println("parse the handler information…");
   Iterator handlers = root.elementIterator("handler");
   while(handlers.hasNext()){
    Element el = (Element) handlers.next();
    Iterator handlerAttributes = el.attributeIterator();
    while(handlerAttributes.hasNext()){
     Attribute handlerAttribute = (Attribute) handlerAttributes.next();
     System.out.println("attribute:"+handlerAttribute.getName()+",value:"+handlerAttribute.getValue());
    }
    System.out.println("");
   }
   System.out.println("");
   System.out.println("parse the header….");
   Element header = root.element("header");
   Iterator headerDetail = header.elementIterator();
   while(headerDetail.hasNext()){
    Element headerXml = (Element) headerDetail.next();
    Iterator headerAttributes = headerXml.attributeIterator();
    while(headerAttributes.hasNext()){
     Attribute handlerAttribute = (Attribute) headerAttributes.next();
     System.out.println("attribute:"+handlerAttribute.getName()+",value:"+handlerAttribute.getValue());
    }
    System.out.println("");
   }
   System.out.println("");
   System.out.println("parse the body…..");
   Element body = root.element("body");
   Iterator bodyDetail = body.elementIterator();
   while(bodyDetail.hasNext()){
    Element bodyXml = (Element) bodyDetail.next();
    Iterator bodyAttributes = bodyXml.attributeIterator();
    while(bodyAttributes.hasNext()){
     Attribute handlerAttribute = (Attribute) bodyAttributes.next();
     System.out.println("attribute:"+handlerAttribute.getName()+",value:"+handlerAttribute.getValue());
    }
    System.out.println("");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
===================输出
parse the root information…
attribute:name,value:reckoning
attribute:cn_name,value:帐单
attribute:table,value:zd
parse the handler information…
attribute:type,value:TypeNotMatch
attribute:handler,value:gzbill.handler.TypeNotMatchHandler
attribute:type,value:EmptyString
attribute:handler,value:gzbill.handler.EmptyStringHandler
parse the header….
attribute:name,value:total_line
attribute:length,value:9
attribute:type,value:int
attribute:required,value:1
attribute:cn_name,value:总行数
attribute:name,value:total_amount
attribute:length,value:20
attribute:type,value:float
attribute:required,value:1
attribute:cn_name,value:总金额
parse the body…..
attribute:name,value:user_equipment_num
attribute:length,value:10
attribute:type,value:int
attribute:required,value:1
attribute:cnName,value:用户设备序号
attribute:filed,value:yhsbxh
attribute:name,value:district
attribute:length,value:4
attribute:type,value:char
attribute:required,value:1
attribute:cnName,value:地区
attribute:filed,value:dq
attribute:name,value:business_type
attribute:length,value:2
attribute:type,value:char
attribute:required,value:1
attribute:cnName,value:业务类别
attribute:filed,value:ywlb
===================
一开始试用读取字符串,然后再对字符串进行parse,这个过程,我的文本文件是ansii的,但是读取的时候不存在任何问题
但是,如果我是用:
SAXReader reader = new SAXReader();
Document document = reader.read(new File());
系统提示一个错误:Invalid byte 2 of 2-byte UTF-8 sequence
然后,我用记事本打开那个xml文件,把它另存,更改为UTF-8编码,重新运行程序,bingle,程序正确输出。
————–总结
还是很方便的,dom4j,看起来真的很方便。和jdom差不多。不用不要引用错类哦。
————–项目地址:

tomcat下自行配制oracle的数据库缓冲池

1. 准备工作。需要oracle的jdbc包。直接copy到 tomcat目录下的 {CATALINA_HOME}/common/lib.
2. 在tomcat下边定义数据库连接。主要有两种方式:
一、一种在{CATALINA_HOME}/conf/server.xml中定义。内容如下
==============server.xml添加内容
<Context path="/test" docBase="test" debug="0" reloadable="true">
     <Resource name="jdbc/oracleDB" auth="Container" type="javax.sql.DataSource"/>
      <ResourceParams name="jdbc/oracleDB">
       <parameter>
        <name>factory</name>     
        <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
       </parameter>
      <parameter>
       <name>driverClassName</name>    
       <value>oracle.jdbc.driver.OracleDriver</value>
      </parameter>
      <parameter>
       <name>url</name>
       <value>jdbc:oracle:thin:@192.168.0.88:1521:test</value>
      </parameter>
      <parameter>
       <name>username</name>
       <value>system</value>
      </parameter>
      <parameter>
       <name>password</name>
       <value>system</value>
      </parameter>
      <parameter>
       <name>maxActive</name>
       <value>100</value>
      </parameter>
      <parameter>
       <name>maxIdle</name>
       <value>98</value>
      </parameter>
      <parameter>
       <name>maxWait</name>
       <value>-1</value>
      </parameter>
    </ResourceParams>
   </Context>

==============(对应了项目test)
该文件为{CATALINA_HOME}/webapp下的test文件夹创建了一个jdbc的“jdbc/oracleDB”。
二、第二种方式是在{CATALINA_HOME}/webapp 下创建一个和项目名称一致的xml文件。tomcat启动的时候就会装载该xml文件。
具体内容参阅附件的test2.xml文件(针对test2项目)。
3. 在项目下建立WEB_INF目录。并且加入web.xml文件。内容为:
    <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/oracleDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

具体如下:
============web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app >
   <display-name>test</display-name>
     <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/oracleDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

============
4. jsp的引用例子:
===================testdb.jsp
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import= "java.sql.* "%>
<%@ page import= "javax.naming.* "%>
<%@ page import= "javax.sql.DataSource"%>
 
<%
   try{
   Context initCtx = new InitialContext();
   //获取连接池对象
   DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/oracleDB");   
   Connection conn = ds.getConnection();
   Statement stmt = conn.createStatement();
   String strSql = " select id,worktype from ADDR ";
   ResultSet rs = stmt.executeQuery(strSql);
   if(rs.next()){
      out.println(rs.getString(1));                
      out.println(rs.getString(2));
     }
    conn.close();
   }catch(Exception ex){
   ex.printStackTrace();
   throw new SQLException("cannot get Connection pool.");
   }
%>
===================
代码中出现的conn.close()并不是关闭数据缓冲池,而是把释放资源,那数据库连接还给数据库缓冲池。
以上两个,server.xml对应于项目test,test2.xml对应于项目test2。目录结构如下:
webapp
        test
              WEB_INF
                           web.xml
               testdb.jsp
        test2.xml
        test2
              WEB_INF
                           web.xml
              testdb.jsp

OpenCRX初探

1. 安装JDK1.5还有安装JDK1.4。环境变量中设置JAVA_HOME和JRE_14还有一些相关的CLASSPATH和PATH属性。
2. 下载jboss。
3. 下载MYSQL。
4. 下载ant,设置ANT_HOME和ANT_OPTS。
5. 下载以下的opencrx需要的文件:
  * openMDX/Core (e.g. openmdx-1.16.4-core.jre-1.4.zip)
  * openMDX/Portal (e.g. openmdx-1.16.4-core.jre-1.4.zip)
  * openMDX/Security (e.g. openmdx-1.16.4-security.jre-1.4.zip)
  * openMDX/WebSphere (e.g. openmdx-1.16.4-websphere.websphere-6.zip)
  ————-http://www.openmdx.org/downloads.htm
  * opencrx-1.10.0-core.CRX.jre-1.4.zip
  ————-http://www.opencrx.org/downloads.htm
6. 解压缩opencrx-1.10.0-core.CRX.jre-1.4.zip,目录情况:
  opencrx-1.10.0
       apache
       codehaus
       core
          etc
          build.properties
          build.xml
          LICENSE
          README
          RELEASE-NOTES
          version.properties
       itseasy
       jre-1.4
       novell
       pdfbox
       source-archive
   ———
   其中,除了core目录是主目录之外,其他的目录为需要的库文件。
7. 在opencrx-1.10.0目录下新建opt目录,解压缩其他openMDX的目录到opt目录下。
8. 定位到opencrx-1.10.0/core目录下,运行ant。
  ant config
  可以看到系统的配置信息。
9. 在core目录下,输入:
  ant install-src
  可以看到所有的java文件和配置信息。
10. 在core目录下,输入:
  ant assemble
  可以生成发布包,包位于opencrx-1.10.0\jre-1.4\core\deployment-unit目录下。直接copy该包到jboss下即可。
11. 导入到eclipse时,直接定位到opencrx-1.10.0\core目录即可。需要加入以下的库,否则提示出错信息:
      opencrx-1.10.0\jre-1.4\core\lib
      opencrx-1.10.0\opt\openmdx-1.16.4\java2\jre-1.4\endorsed\lib
      opencrx-1.10.0\opt\openmdx-1.16.4\java2\jre-1.4\enterprise\lib
      opencrx-1.10.0\opt\openmdx-1.16.4\java2\jre-1.4\extension\lib
      opencrx-1.10.0\opt\openmdx-1.16.4\jre-1.4\portal\lib
      opencrx-1.10.0\opt\openmdx-1.16.4\jre-1.4\security\lib
      opencrx-1.10.0\opt\openmdx-1.16.4\jre-1.4\core\lib
      opencrx-1.10.0\novell\jre-1.4\jldap\lib
      opencrx-1.10.0\pdfbox\jre-1.4\pdfbox\lib
      opencrx-1.10.0\codehaus\jre-1.4\janino\lib
  或者可以尝试在opencrx-1.10.0\core下新建子目录lib,并且把所有的包都copy到该目录下,直接import所有包即可。
12. 数据库位于:opencrx-1.10.0\core\src\sql目录下。根据使用的数据库选择相关的文件夹,把数据库文件导入数据库。
 ———导入的时候记得,系统需要创建用户system用户,密码是manager。并且该用户对于系统拥有对于数据库crx-crx的操作权。
13. jboss的配置:
  加入以下内容到jboss-4.0.5.GA\server\default\conf\login-config.xml:
  ————————
  <application-policy name="opencrx-core-CRX">
    <authentication>
     <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="sufficient">
      <module-option name="dsJndiName">java:/jdbc_opencrx_CRX</module-option>
      <module-option name="principalsQuery">SELECT c.passwd FROM security_Principal p, security_Credential c WHERE (p.object_id LIKE ‘principal/CRX/Root/Default/%’) AND (p.credential = c.object_id) AND (p.name = ?)</module-option>
      <module-option name="rolesQuery">SELECT r.name, ‘Roles’ FROM security_Principal_N pg, security_Principal p, security_Principal_N pn, security_Role r WHERE (p.object_id = pn.object_id) AND (pn.is_member_of = pg.object_id) AND (pg.granted_role = r.object_id) AND (p.object_id LIKE ‘principal/CRX/Root/Default/%’) AND (p.name = ?)</module-option>
      <module-option name="ignorePasswordCase">true</module-option>
      <module-option name="hashCharset">UTF-8</module-option>
      <module-option name="hashEncoding">base64</module-option>
      <module-option name="hashAlgorithm">MD5</module-option>
     </login-module>
     <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="sufficient" >
      <module-option name="usersProperties">users.properties</module-option>
      <module-option name="rolesProperties">roles.properties</module-option>
     </login-module>
    </authentication>
   </application-policy>

  ————————
  新建jboss-4.0.5.GA\server\default\conf\users.properties,内容为:
  ————————
  admin-Root=rootSecret
  admin-Standard=adminSecret
  guest=guest
  ————————
  新建jboss-4.0.5.GA\server\default\conf\roles.properties,内容为:
  ————————
  admin-Root.Roles=OpenCrxRoot
  admin-Standard.Roles=OpenCrxAdministrator
  guest.Roles=OpenCrxUser
  ————————
  根据需要copy相关的connector(opencrx-1.10.0\core\src\connector)到发布目录下。例如jboss和MYSQL。
  那就copy
  opencrx-1.10.0\core\src\connector\jboss-3\jdbc-opencrx-CRX-mysql-ds.xml到
  jboss-4.0.5.GA\server\default\deploy目录下。
  然后启动jboss,就可以了。
 
===============================
AllPackage 减少功能:
1. 根据http://www.opencrx.com.cn/bbs/dispbbs.asp?boardID=6&ID=545&page=1
  以上的URL叙述中知道,许多语言文件都被删除了,主要:
  opencrx-core-CRX-Web.ear\opencrx-core-CRX.war\WEB-INF\config\code\Root
  opencrx-core-CRX-Web.ear\opencrx-core-CRX.war\WEB-INF\config\texts
  opencrx-core-CRX-Web.ear\opencrx-core-CRX.war\WEB-INF\config\ui\Root
  对应于OpenCRX的目录:
  opencrx-1.10.0\core\src\data\org.opencrx\code\Root
  opencrx-1.10.0\core\src\data\org.opencrx\texts
  opencrx-1.10.0\core\src\data\org.opencrx\ui\Root
  然后修改opencrx-core-CRX-Web.ear\opencrx-core-CRX.war\WEB-INF\web.xml,把其他语言的配置删除。
  对应于:opencrx-1.10.0\core\src\data\org.opencrx\WEB-INF\web.xml。
2. 根据以上的url提到,某些功能运行在MYSQL上可能出现功能上的错误,中文翻译者希望使用DB2作为数据库。
  ———-作者原文:
  经过测试发现,在新版本中,使用未经优化的MySQL数据库速度、性能都无法满足正式环境中的CRM应用,因此,建议大家如果要在生产环境中使用,那么在试用傻瓜包之后,改为使用DB2 express-c数据库(在免费数据库中无需优化条件下,性能最好的数据库)。
  现在Demo服务器的数据库已经改为DB2,大家可以从响应时间上比较一下,性能上有多少提高?
  另外,在使用MySQL时,我们也发现有些功能上的Bug,在使用DB2之后就消失了,我们估计这是MySQL版本和设置的问题,因此不支持某些数据库操作。所以,即使从使用全部的opencrx功能的角度上讲,也推荐大家使用其他数据库。
  ———-
3. 标题和底部的信息修改。中文版本在header和footer两部门都加上一些广告信息,这部份源码主要位于:
  opencrx-1.10.0\core\src\data\org.opencrx\html\
4. 第一次登陆的时候需要用超级管理员的身份,必须由管理员给其他用户分配权限,否则即使已经是合法用户还是无法登陆。
    但是allpackage傻瓜包中仅保留了超级管理员的帐号。
    用户密码保存于:jboss-4.0.5.GA\server\default\conf\users.properties
    用户角色保存于:jboss-4.0.5.GA\server\default\conf\roles.properties
    但是仔细看过openCRX_Quick_Start1.10.pdf这个文档,用户guest是在管理员登陆之后创建之后方可使用的。
    一个比较奇怪的事情,没有找到相关的密码更改。而且对于密码的机制不了解。
    自己制作的版本和服务器上的版本还有allpackage里边的一样,没有找到相关的密码更改机制。
    最后在文档 openCRX_Installation_JBoss-4.pdf 的4.1中提及。如果在系统修改了login-config.xml
    就是采用文件和数据库的密码保存。采用文件格式的密码不允许修改
    采用数据库的密码允许修改。在“User Homepages=>Sercurity=>change password”。
    如果在properties文件中定义了的用户,则不给与修改密码的选项。
   
=================
安装DB2。
1. 下载db2:http://www-306.ibm.com/software/data/db2/express/download.html
2. 安装db2。记住。使用的时候,用户为系统用户。所以db2的话需要用系统的用户。并在系统中设置密码。而不是在数据库中。
3. 根据http://www.opencrx.org/opencrx/1.10/DB2/openCRX_Installation_IBMDB2-9.html 新建数据库并把数据导入。
  这一步需要注意,必须使用正确的用户来建立数据,否则查询的时候提示没有相关的权限。
  (我在原先的系统中使用控制中心创建数据,结果模式那边显示我的主机名,但是查询的时候jboss报错,根据错误代码,原因就是权限问题。
  之后我使用db2admin用户登录,然后创建数据,之后切换回去正常用户那边,连接正常。
  )
  单单根据登录和实际页面的装载情况,DB2的效率还是比MYSQL好的。就测试的结果。
4. 需要把DB2中的包(我采用db2 express 9),位于{DB2}/java下的
    db2java.zip(需要改名为db2java.jar)
    db2jcc.jar
    db2jcc_license_cu.jar
  copy到jboss-4.0.5.GA\server\default\lib目录下。
 
——————————-
参考文档:
1. opencrx\core\README
2. openCRX_Quick_Start1.10.pdf
3. openCRX_Installation_JBoss-4.pdf
4. openCRX_MySQL.pdf
 
项目位置:
英文网站:http://www.opencrx.org

拾穗者

拾穗者
呵呵,到处都是“麦穗”,没有办法,自己只能慢慢挑选自己碰到的就捡,懒得理会那么多了。

linux低下可能用户组和权限不统一,可能带来权限问题。可以使用以下把所有用户统一并给于写入的权限
否则上传文件可能没有权限的问题:
———
chgrp -R root 文件路径

chown -R root 文件路径

chmod -R 777 文件路径
———
呵呵,怕了吧,这样子全部的权限都是root了,可能有安全隐患,再看看上传之后的文件属性,都是nobody
那就修改一下成为nobody
———
chgrp -R nobody 文件路径

chown -R nobody 文件路径

chmod -R 777 文件路径
———
这下子,ok了。那给的权限过多,那就把777更改为755。

再有就是PHPUnit。哎,这个还相对简单,把实现需要的东西放在setup(),然后在tearDown()销毁对象。
这样子中间的测试代码就可以简化许多。
然后?整个框架很简单:
require_once ‘PHPUnit2/Framework/TestCase.php’;
require_once ‘XXX.php’;
class XXXTest extends PHPUnit2_Framework_TestCase{
 protected function setup(){
  // do some inition.
 }
 protected function tearDown(){
  // do some clear job, like database close.
 }
 //then here is your job.
 public function testMissingSomething(){
  // do the test here.
  // and use the below to check whether $param1 equals $param2.
  $this->assertEquals($param1,$param2);
  // use the below to check $param1 is true.
  $this->assertTrue($param1);
  // use the below to check $param2 is false.
  $this->assertFalse($param);
 }
}
不过有个需要注意的地方,虽然我们在PHP中,数字和字符串没有太大的区分(除非使用===)
但是在PHPUnit可是不一样的,例如,(int)1和(string)“1”可是不等的。这个细节要小心哦。
更多详细信息:http://ipis.xu.googlepages.com/phpunit 或者参阅:http://bbs.phpla.com/viewtopic.php?t=13&view=next

再有就是log4php,很久以前自己发了一篇,结果还真的帮到别人,现在想使用两个配置文件
于是上网找答案,结果那个被我帮到的回过头来帮助我了。呵呵。
需要配置一个按日产生日志的,需要采用以下配置:
———–主要就是前边这些,后边的是关于日志级别
log4php.appender.A1=LoggerAppenderDailyFile
log4php.appender.A1.layout=LoggerPatternLayout
log4php.appender.A1.File=./log/agent_%s.log
log4php.appender.A1.layout.ConversionPattern="%d %-5p: %m (%F:%L)%n"

//log4php.rootLogger=fatal, A1
//log4php.rootLogger=error, A1
//log4php.rootLogger=warn, A1
log4php.rootLogger=info, A1
//log4php.rootLogger=debug, A1
———–
使用的时候,采用以下php代码:
———–
 if(!isset ($GLOBALS[‘log’])){
  define(‘LOG4PHP_DIR’, ‘log4php’);
  define(‘LOG4PHP_DEFAULT_INIT_OVERRIDE’, true);
  require_once (LOG4PHP_DIR . ‘/LoggerManager.php’);
  require_once (LOG4PHP_DIR . ‘/LoggerPropertyConfigurator.php’);
  $config = new LoggerPropertyConfigurator();
  $config->configure(‘log4agent.properties’);
  $GLOBALS[‘log’] = LoggerManager :: getLogger(‘log4php.appender.A1’);
 }
———–假定是根目录哦。然后就可以使用了。
注意:如果需要独立两个不同的日志,需要分开两个配置文件。测试发现如果我写了两个配置文件在同一文件
结果并不是我想要的结果。就是两份不同的日志文件中记载相同的重复的东西。如果你有必要的话,就可以这样子写
———–
log4php.appender.A2=LoggerAppenderDailyFile
log4php.appender.A2.layout=LoggerPatternLayout
log4php.appender.A2.File=./test_%s.log
log4php.appender.A2.layout.ConversionPattern="%d %-5p: %m (%F:%L)%n"

log4php.logger.class.of.the.day=INHERIT

log4php.appender.A1=LoggerAppenderRollingFile
log4php.appender.A1.MaxFileSize=10MB
log4php.appender.A1.MaxBackupIndex=5
log4php.appender.A1.layout=LoggerPatternLayout
log4php.appender.A1.File=./test.log
log4php.appender.A1.layout.ConversionPattern="%d %-5p: %m (%F:%L)%n"

//log4php.rootLogger=fatal, A1
//log4php.rootLogger=error, A1
//log4php.rootLogger=warn, A1
log4php.rootLogger=info, A2, A1
//log4php.rootLogger=debug, A1
———–结果是同时记录两份同一的日志。不论你load A1还是A2。

最后,就是关于php的,有个很烦的东西,就是php本身可以include和require多个文件,
而多个文件又可以再继续include和require下去,如果这样子积累到一定程度的话,问题也就来了
本身看起来不方便,再有就是如果你写多一个文件,这个文件不在根目录,那么他需要include和
require的文件,应该怎么样了?
因为本身include和require都是使用相对路径,因此,直接把相对路径填写就可以了。
但是如果include和require的对象包含其他的文件,那么路径也应该跟着改变。这样子带来All a mess的结果。
当然,您可以设置某些东西,然后根据这些判断装载的路径,但是代码就不断地复杂化了。
所以,遇到这样子的问题,应该好好考虑考虑。免得把自己搞得焦头烂额哦。

解决方案:使用set_include_path()这个系统函数。
把需要定义include和require的文件路径选择到根目录下,这样子其他文件都制定到根目录上
问题就解决了

转贴:在电脑上实现Googe WAP全套功能

http://yidong.google.com/xhtml?hl=zh-CN

这是Google WAP的网址,使用电脑打开就可以了。
你还可以把浏览器的宽度调整到和手机相仿,这样就可以模拟Googe WAP的全套功能了。
其中:
1,搜索功能显示效果进行了全新的符合移动终端的优化
2,本地搜索也对移动终端进行了优化,搜索结果中的电话号码可以直接拨打
3,Gmail和个人主页也可以打开了,不必担心是不是使用cnwap还是cmwap,更不必担心按照GPRS流量计算费用了
4,也可以切换到英文版下,享受更多的功能

————文章出处:http://gfanscn.blogspot.com/2006/11/googe-wap.html

以后可以直接在手机上便搜索新闻和图片了。