星期四, 八月 07, 2008

JSF无限递归错误Infinite recursion

运行.jsf文件,后台出现解析无线递归错误。最后出现
java.lang.StackOverflowError

错误原因在于同时声明了
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsf</param-value>
</context-param>


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


只要去掉 javax.faces.DEFAULT_SUFFIX的申明就解决问题了

JSF 访问控制Access Control方法

1.思路,扩展JSF提供的JAAS验证和Navigator 来定制满足自己要求的方法

JSF对安全的支持,是通过web.xml里JAAS相关申明和faces-config.xml里的导航规则说明,
以及在jsp或JSF页面里的相关 rendered标志的控制来做到。
也是 一个MVC的结构.
A.扩展自己的class (Control)
B.配置文件声明(web.xml,faces-config.xml) (Model)
C.jsp或JSF页面里的引用. (View)

web.xml里申明使用的导航配置文件,可以指定多个,用逗号,分开不同的配置文件。除了默认的faces-config.xml意外。
web.xml:
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-beans.xml</param-value>
</context-param>
一个技巧,定义一个网站或一个目录使用的导航规则,使用符号"*",如下
<navigation-rule> </navigation-rule>                        
<from-view-id>*</from-view-id>
<navigation-case> </navigation-case>
<from-outcome>globalhelp</from-outcome>
<to-view-id>/menu/generalHelp.jsp</to-view-id>



在JSP页面使用在faces-config.xml里定义的导航规则:
首先定义一个导航规则:
<navigation-rule>
<from-view-id>/pages/inputname.jsp</from-view-id>
<navigation-case>
<from-outcome><span style="font-weight: bold; color: rgb(255, 0, 0);">sayHello</span></from-outcome>
<to-view-id>/pages/anotherhello.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{GetNameBean.helloAction}</from-action>
<from-outcome>sayHello</from-outcome>
<to-view-id>/pages/hello.jsp</to-view-id>
</navigation-case>

</navigation-rule>

<h:commandbutton id="submit" action="sayHello" value="Submit">
sayHello就是在faces-config.xml里定义的。

http://sunxacml.sourceforge.net/faq.html
http://www.oasis-open.org/committees/xacml/

星期三, 八月 06, 2008

.JSF 使用及其他。

指定JSF pageEncoding必须使用:

在JSF文件第一行申明,用jsp的<%@page pageEncoding="UTF-8">来申明将会出现运行时间的

jsf The markup in the document preceding the root element must be well-formed

错误。

如果想区别jsp和jsf文件,让后缀为.jsf的文件直接用faceservlet来解析。需要在web.xml加入以下两组配置

1.修改默认的jsf文件默认后缀.
<context-param></context-param></span>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsf</param-value></span>


2.修改触发pattern
<servlet></servlet>
<servlet-name>Faces Servlet
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>


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


这样在浏览器里敲入http://localhost:8080/gate/index.jsf 就可以直接看到结果了。

Java数据库设计中的14个技巧

Java数据库设计中的14个技巧

http://news.newhua.com/news1/programming/2008/48/0848108471BJ3B21FAIB3C4G26JDJ3CB4436K58EG52EC9234IIKH3_3.html


下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。

1. 原始单据与实体之间的关系
  
可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一 的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。


2. 主键与外键
  
一般而言,一个实体不能既无主键又无外键。在E?R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。
  
主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也 没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体 之间的连接。


3. 基本表的性质
  
基本表与中间表、临时表不同,因为它具有如下四个特性:
  
(1) 原子性。基本表中的字段是不可再分解的。
   (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
   (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
   (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。


4. 范式标准
 
基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
  
在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。
  
表1 商品表的表结构
   商品名称 商品型号 单价 数量 金额
   电视机 29? 2,500 40 100,000

  
5. 通俗地理解三个范式
  
通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
  
  1. 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
  2.    第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
  3.    第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余.
  
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字
,允许冗余。

6. 要善于识别与正确处理多对多的关系

若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。 要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多 对多的关系,但能处理多对多的关系。

〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以 被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借 书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

7. 主键PK的取值方法
  
PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

8. 正确认识数据冗余
  
主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提 高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低 级冗余(重复性冗余)。

9. E--R图没有标准答案
  
信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。尽管 它没有惟一的标准答案,并不意味着可以随意设计。好的E?R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

10. 视图技术在数据库设计中很有用
  
与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视 图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。只有数据库管理员,带着多个人员共同掌握的 “安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

11. 中间表、报表和临时表
  
中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

12. 完整性约束表现在三个方面

  
域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。参照完整性:用PK、FK、表级触发器来实现。用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

13. 防止数据库设计打补丁的方法是“三少原则”
  
(1) 一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;
  
(2) 一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;
  
(3) 一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了 将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有 的人就是不习惯、不采纳、不执行。
  
数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。该原则是相对的,不是绝对 的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性) 的E--R图,要好得多。
  
提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将 主题数据库集成为全局综合数据库。集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E?R图中实体的个数、主键的个数、属 性的个数就会越少。
  
提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院 ”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。
  
“三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

14. 提高数据库运行效率的办法
  
在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
(1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
  
(3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
  
(4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
  
(5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。
 
总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

星期六, 八月 02, 2008

在Java使用JSON对象

JSON :www.json.org 不但是用来传递结构化的数据可以大显身手,也可以在静态的properties或XML数据中显示强大的威力。

由于现在java 5已经内置的支持javascript 引擎(http://www.mozilla.org/rhino/scriptjava.html)
所以可以在Java代码中通过手工编写调用javascrit来解析JSON的数据,
比如类似下面代码:

import javax.script.*;
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
engine.eval("a="+str);
String values= (String)engine.eval("a.string");
values里面的值为"JSON";

或者使用JSON的java类库来自(http://json-lib.sourceforge.net/)
代码如下:
这里把JSON对象放在Java的Properties里,注意,Java Properties最后一行必须是包含一个空行的独立行,否则最后一个字符将读不到,这可能是个bug或者怪癖吧。 注意下列的多行的写法,
每一行后面加入一个 \ 表示是同一行的内容.

com.test.t.properties文件里包含如下内容
DatabaseURL={\
"First":{"defaultDS":"java:/mysql","securityDS":"java:/secMysql"}, \
"Two":{"defaultDS":"java:/mysqlTwo","securityDS":"java:/secMysql"}, \
"Three":{"defaultDS":"java:/mysqlTHree","securityDS":"java:/secMysql"} \
}

import net.sf.json.*;
import java.util.ResourceBundle;
ResourceBundle t=ResourceBundle.getBundle("com.test.t");
JSONObject a=(JSONObject) JSONSerializer.toJSON( t.getString("DatabaseURL"));
JSONObject b=a.getJSONObject("First");//这是两级对象表示的方法
System.out.println(b.getString("defaultDS"));
打印结果为:java:/mysql

星期五, 八月 01, 2008

干净的安装Eclipse的Plugin

方法
步骤一 。在Eclipse的安装目录下找到links目录,如果没有links目录就建立一个目录
步骤二.用unzip或winrar展开plugin到一个建立的目录下,比如d:\Reponstity目录。
步骤三。在Eclipse的links目录下建立一个后缀为.link的文件。该文件里包含一行记录
path=d:/reponsity

这样,启动Eclipse的时候,就载入该插件了。同样卸载的时候,只需要注释掉path这样一行就可以了。

Seam 开发手册之一,添加新的Seam Runtime

1.新建一个Seam Project时候选择Seam runtime 并且选择Seam 版本(Jboss Web Tools自带) 1.2并且浏览到安装在硬盘上的最新的Seam安装目录the Seam 2.1,但是对话框无法改变Seam 版本字段. 显示一个错误的提示 "The selected seam appears to be of an incompatible version "2.1.0.A1"".
纠正错误的步骤。
1.首先建立新版本的seam

2.修改Project中使用的seam版本。

星期五, 七月 25, 2008

解决Java和Mysql 5.1 jdbc 之间包含汉字的SQL命令无法正常解析问题

Jsp Encode=UTF-->Servlet by jdbc--->mysql 5.1

如果包含汉字需要在jboss mysql-ds.xml里链接字符串加入如下

<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/gpsrm?useUnicode=TRUE</connection-url>
<connection-property name="characterEncoding">utf8</connection-property>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password></password>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>

星期四, 五月 22, 2008

vi的替换命令

关于vi替换命令的使用说明

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

n 为数字,若 n 为 .,表示从当前行开始到最后一行

:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky

可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

(n 为数字,若 n 为 .,表示从当前行开始到最后一行)

3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky


4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

5. 删除文本中的^M

问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。

· 使用命令:cat filename1 | tr -d “^V^M” > newfile;

· 使用命令:sed -e “s/^V^M//” filename > outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。

· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。

· :%s/^M$//g

如果上述方法无用,则正确的解决办法是:

· tr -d "\r" <>dest

· tr -d "\015" dest

· strings A>B

6. 其它

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g 功能同上

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索

字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作

JBOSS 4.2.X启动绑定IP,及外部访问问题

一般来说是两个方法。
一个是在JAVA_OPTS后面加入:-Djboss.bind.address=0.0.0.0,
同时并且要在/etc/hosts里加入 其他行除了 127.0.0.0 hostname localhost之外。

IPAddress hostname

另外一种是启动的时候加入-b 0.0.0.0的选择。
run.sh -b 0.0.0.0

这样也可以

星期二, 五月 20, 2008

EJB 的java.lang.ClassCastException错误

Jboss发布EJB成功后,再java 类中后调用出现错误:
一下代码行引起了错误:
PortableRemoteObject.narrow(objref, JControllerHome.class);
objRef是通过lookup找到的JNDI引用。
JControllerHome.class是stateless session bean

错误:

java.lang.ClassCastException: $Proxy59 cannot be cast to org.omg.CORBA.Object
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)

原因,当前Java Class有两个.class文件分别放在不用的目录下,JBOSS 4.2x系列的classloader对class安全载入验证严格,引起了这种问题。

解决方法:删除掉一个不需要的.class的文件,就可以了

星期三, 四月 30, 2008

如何得到JSON对象的数目?

JSON对象不支持length属性。如果想得到一个JSON包含的最顶层的对象的数目,必须用
for 函数来遍历
一种是单纯的数组:

strJSON = "['one','two',{obj1:'obj1_one',obj2:'obj2_two'}]";
var arrObj = eval('(' +strJSON+ ')');
alert(arrObj.length);

另外一种是复杂对象:

var jsonString = "{field1:'data1',field2:'data2',arrField1:['arrField1Content1','arrField1Content2']}";
var obj = eval('(' + jsonString + ')');

var objCount=0;
for(_obj in obj) objCount++;

alert(objCount);

星期一, 二月 11, 2008

RealPlay 11 的不兼容

如果机器安装了Realplay 11版本后,会出现很多视频或音频转换出现无声音的情况。
比如使用kmplayer放电影或 .rmvb无声音的情况.
或者WinAVI Video Converter 7.x,8.0版本转换视频到手机等其他格式的时候,只有图像,
没有声音。

解决的办法是用realplay 10.x的cook.dll来替换realplay 11版本的cook.dll,这样启动机器后,就正常了。这个dll在目录C:\Program Files\Common Files\Real\Codecs下。

这个情况很糟糕,希望以后能改进。

星期六, 一月 19, 2008

如何配置apache,jboss mod_jk一起工作

Apache和Mod_nk配置部分:
http://labs.jboss.com/jbossas/docs/Clustering_Guide/beta422/html/clustering-http-modjk.html

Apache下载:

http://httpd.apache.org/

Mod_Jk下载:
http://tomcat.apache.org/download-connectors.cgi
编译好的版本:
http://apache.mirror.phpchina.com/tomcat/tomcat-connectors/jk/binaries/
注意下载对应的apache http server的正确版本。
mod_jk-1.2.26-httpd-2.2.6.so   这个名字表示对应http server 2.2.6的版本,

其他配置,参看jboss文档

星期五, 一月 18, 2008

Kaspersky 注册表的删除

Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/SystemCertificates/SPC/Certificates]
[-HKEY_LOCAL_MACHINE/SOFTWARE/KasperskyLab/LicStorage]
[-HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Cryptography/RNG]

保存,为k.reg,然后运行就可以删除啦。

星期三, 一月 16, 2008

Redhat 如何打开 telnet

主要是iptable的负作用。
需要如此
/etc/init.d/./ipchains stop
/etc/init.d/./xinetd restart //重起xinetd

如果需要允许root远程登录,修改
/etc/securetty
加入:
pts/0,pts/1



星期六, 十二月 22, 2007

罗马数字的表示方法

I - 1 unus
II - 2 duo
III - 3 tres
IV - 4 quattuor
V - 5 quinque
VI - 6 sex
VII - 7 septem
VIII - 8 octo
IX - 9 novem
X - 10 decem
XI - 11 undecim
XII - 12 duodecim
XIII - 13 tresdecim
XIV - 14 quattuordecim
XV - 15 quindecim
XVI - 16 sedecim
XVII - 17 septendecim
XVIII - 18 duodeviginti
XIX - 19 undeviginti
XX - 20 viginti
XXI - 21 viginti unus
XXII - 22 viginti duo
XXVIII - 28 duodetriginta
XXIX - 29 undetriginta
XXX - 30 triginta
XL - 40 quadraginta
L - 50 quinquaginta

1~10: I II III IV V VI VII VIII IX X
11~20: XI XII XIII XIV XV XVI XVII XVIII XIX XX
21~30: XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX
31~40: XXXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL
41~50: XLI XLII XLIII XLIV XLV XLVI XLVII XLVII XLIX L
其中,I 为1
V为5
X为10
L为50

星期五, 十二月 21, 2007

Hibernate的数据库事务处理

1. 介绍数据库事务、事务隔离级别、悲观锁、乐观锁等概念。

2.数据库ACID特征:

Atomic(原子性):指整个数据库事务是不可分割的工作单元。

Consistency(一致性):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

Isolation(隔离性):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

Durability(持久性):指的是只要事务成功结束,它对数据库所作的更新就必须永久保存下来。

3.数据库系统支持两种事务模式:

自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。

手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。

4.MySQL中数据库表分为3种类型:INNODB、BDB和MyISAM,其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。

5.对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:

A.第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

B.脏读:一个事务读到另一个事务为提交的更新数据。

C.虚读:一个事务读到另一个事务已提交的新插入的数据。

D.不可重复读:一个事务读到另一个事务已提交的更新数据。

E.第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。

6.数据库系统提供了四种事务隔离级别供用户选择:

A.Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。

B.Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。

C.Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。

D.Read Uncommitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场 合,可以由应用程序采用悲观锁或乐观锁来控制。

7.当数据库系统采用read Commited隔离级别时,会导致不可重复读喝第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:

A.悲观锁:指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。

B.乐观锁:乐观锁假定当前事务操作数据资源时,不回有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。

8.悲观锁有两种实现方式:

A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句:select ... for update,在Hibernate中使用get,load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)

B.在数据库表中增加一个表明记录状态的LOCK字段,当它取值为“Y”时,表示该记录已经被某个事务锁定,如果为“N”,表明该记录处于空闲状态,事务可以访问它。增加锁标记字段就可以实现。

9.利用Hibernate的版本控制来实现乐观锁

乐观锁是由程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。

在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁,OR映射文件中的元素和都具有版本控制的功能,一般推荐采用

星期三, 十二月 19, 2007

VBA.Vbscript的定时器timer.任务安排功能的实现

方法:
Application.
OnTime(EarliestTime, Procedure, LatestTime, Schedule)
因为可以有许多的任务,所以默认的索引任务的唯一key,就是该任务开始的时间。就是:
EarliestTime,如果想可以控制一个任务,必须保留下来开始任务的时间。
vba中需要申明一个全局的public变量来保存,
例子:
Public RunWhen As Double

找一个地方调用下面的方法就可以了。

sub msgMovie
RunWhen = Now + DateTime.TimeValue("00:00:05")
Application.OnTime RunWhen, "msgMovie"
end sub

如果要停止这个任务,需要调用以下方法:
sub stopTime()
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, Procedure:="msgMovie", Schedule:=False
end Sub

VBA/Vbscript 如何彻底关闭一个UserForm实例

Excel里的VBA定义了一个UserForm
当点击close按钮的时候,往往是调用me.hide方法来隐藏。单这样不能完全清楚当前
实例,当再次调用me.show的时候,只是将该窗口重新显示。
所以,如果需要在隐藏窗口的时候动态修改了内容,当再次显示的时候,
想显示出来的时候,必须加入unload me代码
如下:
Private Sub okbutton_Click()
aboutForm.Hide
Unload Me
End Sub

星期一, 十一月 19, 2007

Mathematica 6 帮助搜索没有反应

原因:

Mathematica 6 用Java打开连接服务器来动态更新帮助文档,如果在有了firewall或proxy的情况下,Mathematica 6 可能会应为等待返回而造成,帮助的搜索,点击link无法打开新文档新窗口。

这种情况下要关闭Mathematica 6的这个选择。

在edit.Preferencs..Internet Connectivity去掉这个功能。

如图

星期五, 十一月 09, 2007

配置Jboss web 虚拟目录

在jboss 4.2.1 GA里需要修改
deploy/jboss-web.deployer/server.xml
加入下面类似的红色代码行。

<Host name="localhost"
autoDeploy="false" deployOnStartup="false" deployXML="false"
configClass="org.jboss.web.tomcat.security.config.JBossContextConfig"
>
......

<context path="/help" docbase="/home/jb/jboss/server/mrp_guide" debug="0" reloadable="true">
</host >

星期五, 十月 26, 2007

网络Vbscript函数库大全

http://www.thescriptlibrary.com/default.asp?Action=SubIndex&ScriptLanguage=VBScript

不过现在还不太清楚如何在一个vbscript调用另外一个vbscript文件里的函数呢?

需要研究一下

星期二, 十月 23, 2007

Sqlite3 3.5.1 如何读取汉字?

首先.sqlite3 建立的数据库默认编码是UTF-8.
当进入管理界面通过.read sql.txt运行的命令或insert into插入的汉字,sqlite3认为是"合格"的
UTF-8字符串。

所以需要,使用UltraEdit之类的软件,首先把sql.text转换为标准的utf-8的编码,然后再用.read读取

在powershell读取sqlite.net的数据库代码:
1.首先需要建立一个数据库,名字叫szsk.db3,只要在sqlite3.exe 后面跟随数据库名就可以了。
sqlite3.exe szsk.db3 ,然后敲入.quit推出,就发现szsk.db3已经被建立了。
sqlite3.exe可以从www.sqlite.org下载最新的window 版本。

把System.Data.SQLite.dll文件放在当前目录下.
SQLITE.NET 2.0 下载地址: http://sourceforge.net/projects/sqlite-dotnet2
cls
$global:sdb="$pwd\szsk.db3"
$global:url="$pwd\System.Data.SQLite.dll"
$createTable=@"
CREATE TABLE IF NOT EXISTS DoubleBall (
id integer primary key AUTOINCREMENT,
_Year varchar(4),
_Month varchar(2),
_Day varchar(2),
_Term varchar(3),
_N1 varchar(2),
_N2 varchar(2),
_N3 varchar(2),
_N4 varchar(2),
_N5 varchar(2),
_N6 varchar(2),
_Blue varhcar(2)
)
"@
$dropit= "drop table doubleball"

$command="";
trap [exception]
{
write-host "Exception"
}
function initdb
{
[void][system.reflection.Assembly]::LoadFile($url)
if ((test-path $sdb) -eq $FALSE)
{
$global:conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=TRUE;")
}else
{
$global:conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=false;")
}
}
function getDBConnection
{
$conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=false;")
}
initdb

$command=new-object System.Data.SQLite.SQLiteCommand

if($args.count -eq 0)
{
return $conn
}else
{
$sql="select * from stocklist where stockCode='" + $args[0]+".sz'"
$command.CommandText =$sql

$command.Connection=$conn

$conn.open()
$dataReader =$command.ExecuteReader()
$script:cnName=$args[0]
while($dataReader.Read() )
{
$script:cnName $dataReader.GetString(1)
}
$dataReader.close()
$conn.close()
return $cnName
}

星期五, 十月 19, 2007

Vbscript 实现 cls命令

目的:在Vbscript中实现清空当前cmd窗口的内容。经过实验 发现一下代码可以实现。

Set WshShell = CreateObject("wscript.shell")
WshShell.SendKeys "%( )+E+P{ENTER}CLS{ENTER}{TAB}",True
Wscript.Sleep 5000

但是这个代码有一个问题就是键盘缓冲区是在当前VBS执行完成后,才被发送到当前cmd
窗口,因此是一种后script方式,不是希望在执行其他vbscript之前清空的方式。

经过努力,发现没有其他办法实现。


星期三, 十月 17, 2007

如何在vbscript/cscript 中调用.dll

1.普通DLL
必须是通过regsvr32 可以注册的dll才能在vbscript中被调用,应为createobject必须是 ActiveObject dll,如果是标准的函数库,则无法使用。必须包装成Activexobject

2..NET Dll
必须通过 regasm注册后,就可以在vbscript中使用了?

regasm System.Data.SQLite.DLL /tlb:System.Data.SQLite.tlb /codebas

星期三, 十月 10, 2007

Powershell .ps1 如何得到返回的对象?

把需要返回的对象在ps1文件的最后一行写明就可以了。
其他命令的输出需要同管道|out-null,来回避。

比如下面:
[system.reflection.Assembly]::LoadFrom($url) |out-null

$conn=new-object System.Data.SQLite.SQLiteConnection("data source="+$sdb+";Version=3;New=TRUE;")

如果想返回一个connection object
就在ps1文件的最后一行写明
$conn就可以了。

星期一, 十月 08, 2007

PowerShell如何处理HTMLDocument Object

上次写的文章中因为无法使用Com对象“HTMLFILE”,而不得不采用IE.Application对象来处理
HTMLDocument对象。
但是速度上同同样的VBS代码比感觉差太多。所以始终想使用"HTMLFILE"来处理HTML Document.

最终通过get-member发现了 在PowerShell里使用的IHTMLDocument2_write方法可以用来初始化HTMLDocument对象内容。

如下代码,可以在POWERSHELL里使用了。

$htmlDoc= New-Object -com "HTMLFILE"
$page = "<html><body>this is a test</body></html>"
$htmlDoc.IHTMLDocument2_write($page)
$htmlDoc.close

如何在PowerShell调用Dll文件。

PowerShell中可以直接使用.NET的Dll库,通过如下语句:
[system.reflection.Assembly]::LoadFrom("dll所在绝对路径");

但是传统的非.NET生成的Dll库如何使用呢?
比较复杂,基本可以按照下列语句来使用:
$dir="C:\\curl-7.16.4\\FTCTRLPRO3.dll"
$ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dir

这只能简单载入Dll,如果想使用Dll的具体的函数,可以参看如下文章:
http://www.leeholmes.com/blog/ManagingINIFilesWithPowerShell.aspx
##############################################################################
##
## Invoke-WindowsApi.ps1
##
## From PowerShell Cookbook (O'Reilly)
## by Lee Holmes (http://www.leeholmes.com/guide)
##
## Invoke a native Windows API call that takes and returns simple data types.
##
## ie:
##
## ## Prepare the parameter types and parameters for the
## CreateHardLink function
## $parameterTypes = [string], [string], [IntPtr]
## $parameters = [string] $filename, [string] $existingFilename, [IntPtr]::Zero
##
## ## Call the CreateHardLink method in the Kernel32 DLL
## $result = Invoke-WindowsApi "kernel32" ([bool]) "CreateHardLink" `
## $parameterTypes $parameters
##
##############################################################################

param(
[string] $dllName,
[Type] $returnType,
[string] $methodName,
[ Type[]] $parameterTypes,
[Object[]] $parameters
)

## Begin to build the dynamic assembly
$domain = [AppDomain]::CurrentDomain
$name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
$assembly = $domain.DefineDynamicAssembly( $name, 'Run')
- Show quoted text -
$module = $assembly.DefineDynamicModule( 'PInvokeModule')
$type = $module.DefineType('PInvokeType', "Public,BeforeFieldInit")

## Go through all of the parameters passed to us. As we do this,
## we clone the user's inputs into another array that we will use for
## the P/Invoke call.
$inputParameters = @()
$refParameters = @()

for($counter = 1; $counter -le $parameterTypes.Length; $counter++)
{
## If an item is a PSReference, then the user
## wants an [out] parameter.
if($parameterTypes[$counter - 1] -eq [Ref])
{
## Remember which parameters are used for [Out] parameters
$refParameters += $counter

## On the cloned array, we replace the PSReference type with the
## .Net reference type that represents the value of the PSReference,
## and the value with the value held by the PSReference.
$parameterTypes[ $counter - 1] =
$parameters[$counter - 1 ].Value.GetType().MakeByRefType()
$inputParameters += $parameters[$counter - 1].Value
}
else
{
## Otherwise, just add their actual parameter to the
## input array.
$inputParameters += $parameters[$counter - 1]
}
}

## Define the actual P/Invoke method, adding the [Out]
## attribute for any parameters that were originally [Ref]
## parameters.
$method = $type.DefineMethod( $methodName, 'Public,HideBySig,Static,PinvokeImpl',
$returnType, $parameterTypes )
foreach($refParameter in $refParameters)
{
[void] $method.DefineParameter($refParameter, "Out", $null)
}

## Apply the P/Invoke constructor
$ctor = [Runtime.InteropServices.DllImportAttribute ].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName
$method.SetCustomAttribute($attr)

## Create the temporary type, and invoke the method.
$realType = $type.CreateType()

$realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null,
$inputParameters)

## Finally, go through all of the reference parameters, and update the
## values of the PSReference objects that the user passed in.
foreach($refParameter in $refParameters)
{
$parameters[$refParameter - 1].Value = $inputParameters[$refParameter - 1]
}

星期五, 十月 05, 2007

Akashic records

空之境界中对于阿克夏记录,或者说阿卡沙年代记的注解十分简单和模糊。阿克夏记录(Akashic Records)并不具备电脑分析和处理信息的功能,它所能做的只有忠实详细的记录而已。

阿 克夏的概念起源于印度。在婆罗门教的文献中,“阿克夏”被描述为“宇宙的精神—物质”,它包括了所有的存在与发展。与之类似的“梵”(婆罗门教与印度教的 主神之一,为创造之神,亦指终生之本)在实质上通常被视作非个人的、无法识别的最高宇宙原理,万物来源于它,万物又回归于它。它非实体、非物质、非先天而 又永恒存续,无始无终。按照古老的印度学说,梵“能够穿透一切,赋予至高无上的天神或是小到极点的矿物原子以生机。”古印度秘密学说最后明确指出,“阿克 夏就是一切创造物的起源于回归之地”,阿克夏“比一切万物都更古老”,简直就是“最后的终点”。阿克夏就是世间万物的根源(荒耶宗莲竭尽全力所追求的,想 必就是这个东西了);而阿克夏记录则使得任何时刻——包括过去、现在和未来——所发生的任何事情都不致归于遗忘之中,它记录了一切的信息。

当 然在客观上,没有确切的证据能证明这样一种所谓的“宇宙记忆”确实存在,或者证明这个世界上从一开始曾经发生的一切都被记录了下来。但若仅仅因此就认为阿 克夏记录是不存在的,同样不能令人信服。即使是现代,这种现象也能得到共鸣和认同,只是换了一个完全不同的名字:形态发生场。

剑桥大学的 生化学家鲁伯特·谢尔德雷克在其著作《创造性的宇宙》中写道,形态发生场能够摆脱时间和空间发挥作用。具体地说,如果一个生物种类的成员获得了一种新的行 为,那么它自己的形态发生场会由此改变。只要这种新的行为在足够长的时间里得到了坚持,物种成员之间就会形成一种相互影响,进而影响整个物种。实际的例子 是:一只老鼠一旦学会了在一明一暗的信号下告到黄油,其他老鼠就会越来越快地掌握这个方法。直到最后,所有的老鼠——即便不是由最初的那只生出来的,也不 曾与它有过接触——都学会了这种行为。

按照谢尔德雷克的观点,自然是具有“记忆”的,我们通常视作自然法则的东西只不过是“习惯”。自然存在与“习惯”也就是“行为模式”之中。根据这一构想,自然界中的每一类事物都必须按照它那一类的“集体记忆”内容来行事,从有生命的事物到无生命的物质都是如此。

调试.NET错误工具

再运行Powershell经常出现一些系统错误,可以通过
C:\Program Files\Microsoft.NET\SDK\v2.0\Bin\FUSLOGVW.exe 来观察错误。
首先运行FUSLOGVW.exe ,然后再运行Powershell,就可以在FUSLOGVW.exe窗口中看到错误内容。如图


双击条目或按下 查看日志按钮,则在IE中查看日志内容

Dll 函数查看工具

因为在Powershell里调用一些dll,总是出现错误。
才寻找到了一些Dll函数查看器。
都挺不错的。
DLL Export Viewer
http://www.nirsoft.net/utils/dll_export_viewer.html

国产的。
http://www.onlinedown.net/soft/17471.htm

星期四, 十月 04, 2007

在Powershell里访问Mysql 5.0 数据库

首先必须安装了Mysql 5.0 Connector .net 5.0的driver,
下载地址:http://www.mysql.org/downloads/connector/net/5.0.html
然后编写如下代码。
[void][system.reflection.Assembly]::LoadFrom("D:\mysql\MySQL Connector Net 5.0.8.1\Binaries\.NET 2.0\MySQL.Data.dll")
$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection
$myconnection.ConnectionString = "server=localhost;user id=root;password=root;database=mrpII;pooling=false"
$myconnection.Open()
$mycommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$mycommand.Connection = $myconnection
$mycommand.CommandText = "SELECT * from MRP_BOM"

$adapter = new-object MySql.Data.MySqlClient.MySqlDataAdapter
$adapter.SelectCommand = $mycommand
$ds = new-object System.Data.DataSet
$adapter.Fill($ds)
$myconnection.close()
$ds.Tables[0] |Format-Table #非常Cool的输出效果,如下图

真是cool毙了。

如何传递一个参数到cmdlet?

增强版本的HelloWorld,通过传递一族人民到HellowWorld.
一下只写明增强版本的cmdlet程序,注册的snapin没有变化。
HelloWorld.cs
在PS下通过 get-helloworld,一个接一个输入所有名称,回车表示输入结束。
或者通过get-helloworld ("William wang","Peter Zhang","李华") 来直接得到结果.


using System;
using System.Management.Automation;


[Cmdlet(VerbsCommon.Get, "HelloWorld", SupportsShouldProcess = true)]
public class HelloWorld : PSCmdlet
{

// An array is used to support the following scenario:
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
Mandatory = true,
HelpMessage = "恭贺的名字清单")]
[ValidateNotNullOrEmpty]
public string[] FullName
{
get { return fullName; }
set {fullName = value; }
}
private string[] fullName;
// Called when cmdlet is invoked.
protected override void BeginProcessing()
{
// You could open a database connection here for example.
base.BeginProcessing();
}

// Called when we have pipeline input.
protected override void ProcessRecord()
{
// this.Name could be null in BeginProcessing (no parameters passed)
// but could be filled when ProcessRecord gets called (parameters from pipeline)
try
{
if(this.fullName==null)
{
WriteObject("fullName is null");
}else
{

foreach (string item in this.fullName)
{
WriteObject("Hello World!"+item);
}
}

}catch(Exception)
{
WriteObject("excetpin");
}
}

// Called after every record has been processed.
protected override void EndProcessing()
{
base.EndProcessing();
}

// Called when the user hits CTRL+C
protected override void StopProcessing()
{
base.StopProcessing();
}
}

编写Powershell的HelloWorld的例子,开始编写cmdlet第一步

首先来自Microsoft的例子:http://msdn2.microsoft.com/en-us/library/ms714437.aspx
编译一个以C#语言编写的cmdlet需要的开发环境,可以参看:
http://msdn2.microsoft.com/en-us/library/ms714644.aspx

首先要确认安装了.NET 2.0 Framework的SDK包含csc.exe c#的命令行编译软件。
如果安装成功了.net 2.0 framework SDK,可以在一下目录发现:
C:\WINDOWS\Microsoft.NET\Framework 发现所有安装的.NET Framework的目录。
.Net framework SDK 3.0是在.NET 2.0 SDK的基础上增加了一些新的特性完成的。
所以.NET 3.0自身不带有csc.exe编译软件。
C:\WINDOWS\Microsoft.NET\Framework的典型目录如下。
<dir> v1.0.3705
<dir> v1.1.4322
<dir> v2.0.50727 csc.exe所在目录
<dir> v3.0

其次需要Powershell SDK的安装,如果安装成功可以发现如下目录。
C:\Program Files\Reference Assemblies\Microsoft 发现powershell目录
包含一些.dll 库.

C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0
2006-09-28 15:49 139,264 Microsoft.PowerShell.Commands.Management.dll
2006-09-28 15:49 294,912 Microsoft.PowerShell.Commands.Utility.dll
2006-09-28 15:49 200,704 Microsoft.PowerShell.ConsoleHost.dll
2006-09-28 15:49 65,536 Microsoft.PowerShell.Security.dll
2006-09-28 15:49 1,564,672 System.Management.Automation.dll

软后编写 用来编译C#的Powershell批处理文件,需要包含命令行编译C#代码的一些参考库
cscc.bat包含内容:

set PS_HOME="C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0"
csc.exe /reference:%PS_HOME%\Microsoft.PowerShell.Commands.Management.dll,%PS_HOME%\Microsoft.PowerShell.Commands.Utility.dll,%PS_HOME%\Microsoft.PowerShell.ConsoleHost.dll,%PS_HOME%\Microsoft.PowerShell.Security.dll,%PS_HOME%\System.Management.Automation.dll /t:library %1 %2 %3
%1 %2 %3 代表 C#的代码文件.cs文件。

编写HelloWorld的cmdlet步骤。
1.首先编写cmdlet或pscmdlet的子类:
HelloWorld.cs:
using System;
using System.Management.Automation;


[Cmdlet(VerbsCommon.Get, "HelloWorld", SupportsShouldProcess = true)]
public class HelloWorld : PSCmdlet
{

// Called when cmdlet is invoked.
protected override void BeginProcessing()
{
// You could open a database connection here for example.
base.BeginProcessing();
}

// Called when we have pipeline input.
protected override void ProcessRecord()
{
// this.Name could be null in BeginProcessing (no parameters passed)
// but could be filled when ProcessRecord gets called (parameters from pipeline)
try
{
WriteObject("Hello World!");
}catch(Exception)
{

}
}

// Called after every record has been processed.
protected override void EndProcessing()
{
base.EndProcessing();
}

// Called when the user hits CTRL+C
protected override void StopProcessing()
{
base.StopProcessing();
}
}

2.再编写一个Snapin的注册类。
HelloWorldSnapin.cs

using System;
using System.ComponentModel;
using System.Management.Automation;


[RunInstaller(true)]
public class HelloWorldSnapIn : PSSnapIn
{
public override string Name
{
get { return "HelloWorldSnapIn"; }
}

public override string Vendor
{
get { return "William Wang"; }
}

public override string Description
{
get { return "This Windows PowerShell snap-in contains the Get-HelloWorld cmdlet."; }
}
}

3.编译:
set PS_HOME="C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0"
csc.exe /reference:%PS_HOME%\Microsoft.PowerShell.Commands.Management.dll,%PS_HOME%\Microsoft.PowerShell.Commands.Utility.dll,%PS_HOME%\Microsoft.PowerShell.ConsoleHost.dll,%PS_HOME%\Microsoft.PowerShell.Security.dll,%PS_HOME%\System.Management.Automation.dll /t:library HelloWorld*.cs

得到 HelloWorld.dll文件,然后安装
InstallUtil.exe HelloWorld.dll得到如下成功message:
正在运行事务处理安装。

正在开始安装的“安装”阶段。
查看日志文件的内容以获得 C:\curl-7.16.4\helloworld.dll 程序集的进度。
该文件位于 C:\curl-7.16.4\helloworld.InstallLog。
正在安装程序集“C:\curl-7.16.4\helloworld.dll”。
受影响的参数是:
logtoconsole =
assemblypath = C:\curl-7.16.4\helloworld.dll
logfile = C:\curl-7.16.4\helloworld.InstallLog

“安装”阶段已成功完成,正在开始“提交”阶段。
查看日志文件的内容以获得 C:\curl-7.16.4\helloworld.dll 程序集的进度。
该文件位于 C:\curl-7.16.4\helloworld.InstallLog。
正在提交程序集“C:\curl-7.16.4\helloworld.dll”。
受影响的参数是:
logtoconsole =
assemblypath = C:\curl-7.16.4\helloworld.dll
logfile = C:\curl-7.16.4\helloworld.InstallLog

“提交”阶段已成功完成。

4.然后在powershell里注册这个cmdlet
add-pssnapin helloworldsnapin
如果成功,没有任何提示。


5.运行get-helloworld
得到 hello world!的提示信息。

表明最简单的Hello World cmdlet成功了。

星期四, 九月 27, 2007

如何在Powershell中解析HTMLDocument

HTML document是相对XML Document而言,非格式良好的XMLnon-well formatted.
使用标准的XMLDocument会出现语法检查错误。
必须使用mshtml.dll包含的标准HTMLDocumentClass.
标准的vbscript:代码
set htmlDoc= createobject("HTMLFILE")
page = "<html><body>this is a test</body></html>"
htmlDoc.write(page)
htmlDoc.close


对应的POWSERShell代码为:
$htmlDoc= New-Object -com "HTMLFILE"
$page = "<html><body>this is a test</body></html>"
$htmlDoc.write($page) #出错代码,出现type mismatch错误.
$htmlDoc.close

具体的原因看网络上的解释,似乎是DOM包装的时候,有些接口没有实现造成的问题。
所以目前找到的方法是使用IE控件,代码如下:
$IE= New-Object -com "InternetExplorer.Application"
$IE.navigate('about:blank')##必须的代码行
$IE.Resizable=$True
$IE.StatusBar=$True
$IE.AddressBar=$False
$IE.MenuBar=$False
$IE.Toolbar=$False
while ($IE.busy)
{
sleep -milliseconds 50
}
$page = "<html><body>this is a test</body></html>"
$IE.documetn.body.innerHTML=$page#该代码在IE7以下的IE中不能工作必须换成下面的代码
$IE.document.write( $page) #或者替换为 $oIE.document.IHTMLDocument2_write($html)

出现的错误为:
Property 'innerHTML:' cannot be found on this object; make sure it exists
and is settable.

如何得到Windows所有安装的COM控件?

在PowerShell下,用一下命令都可以做到
1.gci HKLM:\Software\Classes -ea 0| ? {$_.PSChildName -match '^\w+\.\w+$' -and (gp "$($_.PSPath)\CLSID" -ea 0)} | ft PSChildName
2.get-wmiobject Win32_COMClass

星期三, 九月 26, 2007

PowerShell 特殊语法符号。@

@()

空数组

$hash = @{ }

创建空哈希表

@(Get-Alias;Get-Process)

执行其中的两条命令,然后在数组中返回结果


字符串常量:

@”

这是here string”,其中可包含任意字符包括回车和引号。将计算表达式 $(2+2)

”@

@’

带单引号的here string不计算表达式。 ‘@

星期五, 九月 21, 2007

PowerShell 错误处理及查看DLL方法

可以在任何function或代码文件中申明如下语句:
trap [Exception]
{
write-host ("trapped " + $_.Exception.GetType().Name); continue;
}


星期四, 九月 20, 2007

Regular Express 表达删除一个空行(blank line)

程序开发中一个常见的问题是如何删除一大段文本中的空行。
所谓的空行就是一行只包含一些空格,制表符或其他不可见的符号的文本行。
在Vbscript的RegExp 对象,支持RegExpOption.Multiline的属性,可以轻易删除。
但其他各种语言,perl,vbscript等等,没有简单的方法。
regularE="^$"可以匹配一个只包含回车换行的空行
但通过十六进制来看很多文本往往发现很多包含000D 00 0D 00 0A之类的空行。
非常难以处理。

标准的删除一个包含很多回车换行的文本的规则表达为
regularE="[\r\n]+\s*[\r\n]+"
这里是一个详细的解释:

http://www.ultraedit.com/index.php?name=Forums&file=viewtopic&t=2777

但这种方法会删除一个所有的回车换行。
所以必须单独编写方法来出来。

星期三, 九月 19, 2007

Microsoft PowerShell 1,0 定制提示符号的简单技巧





















set-item -path function:prompt -value {' PS '+ $(Get-Date -format t) + " " + $(write-host -f red $(Get-Location) -nonewline) + '> '}

得到如下效果:

星期一, 九月 17, 2007

如何通过VBA来让Excel显示HTML代码?

目前发现的方法只是让 EXCEL通过web query是直接支持的。
如果需要更加灵活的方式,目前只能通过把 HTML代码复制到系统粘贴板,然后再让EXCEL
粘帖来实现。

首先在Excel里 ,按下Alt+F11打开宏编写。
然后在菜单工具-->引用。。里找到 Microsoft Forms 2.0 object library ,启用之,
然后书写一下代码,则可以实现了Excel的HTML渲染。

Dim MyDataObj As New DataObject

MyDataObj.SetText "

OneTwo
"

MyDataObj.PutInClipboard '复制到clipboard

然后再调用

ActiveSheet.Paste

则可以显示HTML效果了。

另外一种通过 HTMLProject 来完成,把HTML页面直接传送过去

ActiveWorkbook.HTMLProject.HTMLProjectItems(stockCode).Text = resl
ActiveWorkbook.HTMLProject.RefreshProject


星期五, 九月 14, 2007

几种语言如何设置跳过盗链的检查

一般Java 访问网站。
URL url=new URL("url地址");
然后
Connection conn = url.OpenConnection();
加入下面这行:
conn.addRequestProperty("REFERER", "http://www.mydomain.com");
然后后面再用conn.readLine等就可以避免盗链检查了。

命令行curl访问一个网站避免盗链检查的方式:

curl -x 191.168.1.1:1688 -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -D cookie0001.txt --proxytunnel -o test.html -e "http://quote.地址" %1

Vbscript设置跳过盗链检查。
一个注意事项:在HTML中,设置不起作用,这可能是防止钓鱼网站的原因。
代码如下:
Set httpObj = CreateObject("Microsoft.XmlHttp")
httpObj.open "GET", url, FALSE
'跳过盗链检查
httpObj.setRequestHeader "REFERER", "http://quote.eastmoney.com"
httpObj.send ""

星期五, 八月 24, 2007

关于Javascript的this关键词的解释.

往往在函数中使用this关键词
function checkme()
{
alert(this.value);
}

此时this代表 是当前聚焦的可视HTML元素(focus element).比如一个下拉框,输入框等等。

最严密的说法如下:

http://www.quirksmode.org/js/this.html

In JavaScript this always refers to the “owner” of the function we're executing, or rather, to the object that a function is a method of. When we define our faithful function doSomething() in a page, its owner is the page, or rather, the window object (or global object) of JavaScript. An onclick property, though, is owned by the HTML element it belongs to.

星期四, 八月 09, 2007

如何编写自己的dojo widget(物件)?

网络上有很多的方法。

包括什么使用以下方法来申明:

dojo.setModulePrefix('wang', '../wang');
dojo.registerModulePath('wang', '../wang');
dojo.widget.manager.registerWidgetPackage('wang.widget');
但会出现很多的问题和错误。

这篇文章的方法是最简单的
http://www.alexatnet.com/node/14

简单来说步骤如下:

1.建立一个目录

假设目前js目录结构如下:
/js/dojo-0.4.3-ajax
/js /wang //你自己定做的dojo widget 库
/js/wang/widget/ Memo.html, Memo.css

那么你需要建立的声明文件Menu.js保存在/js目录下.

2.建立新的widget声明文件Menu.js

Menu.js内容如下:

dojo.widget.defineWidget(
// widget name and class
"wang.widget.Memo",

// superclass
dojo.widget.HtmlWidget,

// properties and methods
{
// parameters
title: "Note",

// settings
isContainer: true,
templatePath: dojo.uri.dojoUri("../wang/widget/Memo.html"),
//注意:这个目录是相对于dojo.js所在目录的相对目录.
templateCssPath: dojo.uri.dojoUri("../wang/widget/Memo.css"),

// callbacks
onClick: function(evt){
this.destroy();
}
}
);

3.在HTML里应用声明

<script src="js/Memo.js"></script>

4.通过dojoType来使用新的widget
<div dojoType="Memo" title="你好世界">
你好吗?
</div>

效果如下:

星期三, 八月 08, 2007

Javascript的匿名函数和JSON。

http://www.json.org/
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
JSON的表达语法:
object //用两个大花括号把对象数组包含起来。
{}
{ members }

members //成员
pair
pair , members
pair //标准的名字:值
string : value
array //数组用两个中括号包含起来的
[]
[ elements ]
elements
value
value , elements
value
string
number
object
array
true
false
null

简单的一个小技巧,如何把一个符合JSON数组表达的字符串转为Javascript数组对象
<script>
var arr
var str="[['line 1','line 2'],['line 1','line 2']]";
eval("arr="+str);
alert(arr[0][0]);
</script>

星期二, 七月 31, 2007

如何避免JSP文件产生空格或空白行(whitespace)

jsp的解析器,忠实的输出jsp文件里包含的没一个字符,如果发现一个<%%> 对,就会在解析完成后,则把<%%>解释后的结果输出。
所以,避免JSP文件产生空白行的办法,就是需要把所有的<%%>连起来书写,在jsp文件中减少手动的回车换行,就可以避免JSP文件产生空白行了。

比如.
<%@ page contentType="text/xml;" %><%@page import="com..dao.Mrp_Workload_Capacity_Calculate_DAO"%><%@ page import="com.sun.rowset.CachedRowSetImpl"%><%@ page import="com.util.DBUtil"%><%...%>

星期五, 七月 27, 2007

DHMTL Grid Paginal 语法.

http://www.nauticalworld.co.uk/jscripts/dhtmlxTreeGrid/samples/pro_paging_wt.html

<div id="gridbox" width="100%" height="250px" style="background-color:white;overflow:hidden"></div>//显示grid数据地方
<div id="recinfoArea" style="width:100%;"></div>//用来显示导航条的地方
<script>
mygrid = new dhtmlXGridObject('gridbox');
...
//should be called before init()
mygrid.enablePagingWT(true,10,3,"recinfoArea");
...
mygrid.init();
mygrid.setXMLAutoLoading("dynscroll.php");//如果想每次点击下一页的时候从服务器读取数据,必须要加入这一行,通过url参数rowsLoaded=N 在服务器段来获取下一页的数据

mygrid.loadXML("dynscroll.xml");//this sample uses static loading
</script>

星期三, 七月 25, 2007

Javascript匿名function(或无名unnamed)的申明

Anonymous function(or Unnamed function)语法:

var greet=function(){....}//可以有参数,或无参数。

调用的方法:greet();如果有参数,需要再调用的时候加入参数.

对象常量 Object Literals:

var car = {myCar:(function(){return "WIlliam";}), getCar: "Honda", special: "Sales"}
调用:
document.write(car.myCar()); // WIlliam
document.write(car.getCar); // Honda
document.write(car.special); // Sales
对象常量同匿名function 组合,可以写出非常复杂的表达

var car = {myCar:(function(){return "WIlliam";}), getCar: "Honda", special: "Sales"}
document.write(car.myCar); // WIlliam
document.write(car.getCar); // Honda
document.write(car.special); // Toyota
或另一个常用语法

var Person=function(){}
Person.prototype.name="William"
Person.prototype.age=17
who=new Person();

document.write(who.name);

Javascript的匿名function 的语法主要设计到Javascript如何对面向对象的支持。

var Person=function(){}
Person.prototype = {
initialize: function(name) {
this.name = name;
},
greet: (function() {
return("Hello from " + this.name+"");
})
};

who=new Person();
who.initialize("William");
alert(who.greet());

一个比较好的地址:http://blogs.sun.com/sundararajan/entry/java_javascript_and_jython

星期五, 七月 20, 2007

dojo TabContainer Javascript控制

<div id="mainTabContainer" selectedTab="这里是{CalendarPart,vocationPart,WorkCenterPart}之一" dojoType="TabContainer" style="width: 100%; height: 26em;">
<div id="CalendarPart" dojoType="ContentPane" href="1.jsp" refreshOnShow="true" executeScripts="true" contentCache="false" label="<b>Calendar</b>"></div>
<div id="vocationPart" dojoType="ContentPane" href="2.jsp" refreshOnShow="true" executeScripts="true" contentCache="false" label="<b>Holiday</b>"></div>
<div id="WorkCenterPart" dojoType="ContentPane" href="3.jsp" refreshOnShow="true" executeScripts="true" contentCache="false" label="<b>Work Center</b>"></div>
</div>

每个contentPane内容的改变,典型使用以下Script
<script>
var obj =dojo.widget.byId("WorkCenterPart");
//alert(obj);
obj.setUrl("");//新的动态内容url
</script>

星期二, 七月 17, 2007

WINDOWS XP Dr Watson Log file.

任务管理器,选择进程,鼠标右键选择调试,然后查看log文件

c:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\drwtsn32.log

星期日, 七月 15, 2007

飞狐 运行VBS公式出现错误处理。

在飞狐公式中运行VBS公式出现以下错误的提示:

"脚本引擎请求位置对象信息:"Wscript"",脚本引擎请求位置对象信息:"JSProxy"

解决方法:

进入windows目录下,再进入system32目录下,运行:
regsvr32 jscript.dll
regsvr32 vbscript.dll

再启动飞狐软件或股道软件就可以了。

Java Rest框架。

https://cetia4.dev.java.net/

支持:Servlet API.

支持ROR的Java框架.

http://grails.codehaus.org/

星期五, 七月 13, 2007

XML CDATA,强大的万能标签。

CDATA

Everything inside a CDATA section is ignored by the parser.

If your text contains a lot of "<" or "&" characters - as program code often does - the XML element can be defined as a CDATA section.

A CDATA section starts with "<![CDATA[" and ends with "]]>":


<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
]]>
</script>

In the example above, everything inside the CDATA section is ignored by the parser.

Notes on CDATA sections:

A CDATA section cannot contain the string "]]>", therefore, nested CDATA sections are not allowed.

Also make sure there are no spaces or line breaks inside the "]]>" string.

星期四, 七月 05, 2007

动态创建复杂form之二

方法一:

formname.document.createElement("form");
document.body.appendChild(formname); //关键语句,否则submit()方法没有实际动作

//add other node
txtObj = document.createElement("input");
//1
txtObj.setAttribute("type","hidden");
txtObj.setAttribute("name","username");
txtObj.setAttribute("value","William");
formname.appendChild(txtObj);
//2
txtObj2 = document.createElement("input");
txtObj2.setAttribute("type","hidden");
txtObj2.setAttribute("name","actionTarget");
txtObj2.setAttribute("value","VacationSetting");
formname.appendChild(txtObj2);
formname.action = target;
formname.method="post";
formname.submit();

方法二:

var f = document.createElement(’form’);
document.body.appendChild(f); //关键语句,否则submit()方法没有实际动作

f.style.display = ‘none’; this.parentNode.appendChild(f);
var h = document.createElement(’input’);
h.type = ‘hidden’; h.name = ‘act’; h.value = ‘admin’;
f.appendChild(h);

var h2 = document.createElement(’input’);
h2.type = ‘hidden’; h2.name = ’setadmin’; h2.value = ‘delcat’;
f.appendChild(h2);

f.method = ‘POST’;
f.action = ‘index.php’;
f.submit();
return false

方法三:

function doIt()
{
formname = document.createElement("form");
document.body.appendChild(formname);
//add other node
txtObj = document.createElement("");
formname.appendChild(txtObj);
//2
txtObj2 = document.createElement("");
formname.appendChild(txtObj2);
//3
txtObj3 = document.createElement("");
formname.appendChild(txtObj3);

formname.action = target;
formname.method="POST";

formname.submit();
}

星期三, 七月 04, 2007

用Javascript和DOM完全动态建立一个Form

Form Element Interfa

1.建立一个提交的Form
// Create a form
var f = document.createElement("form");

// Add it to the document body
document.body.appendChild(f);

// Add action and method attributes
f.action = "/cgi-bin/some.cgi";
f.method = "POST"

// Call the form's submit method
f.submit();

星期二, 六月 26, 2007

绝妙招数,JSP页面不能刷新

通过javascript在页面更深,删除后,通过调用window.location.reload()或者window.location.href
的方式来刷新jsp页面,浏览器只是从cache里调用,并没有从服务器段刷新新的页面

如何能通过Javascript来手动刷新jsp页面呢。

秘密在于要加入以下一句

window.returnValue=0;

星期一, 六月 11, 2007

Motorala E6墙纸 Linux下的路径

Motorala E6 wallpater的路径在:

\\169.254.142.2\system\usr\data_resource\picture

星期一, 五月 14, 2007

Motorola E6 修改开机画面。

\\169.254.142.2\system\ezx_user\download\appwrite\setup\ezx_theme.cfg

[THEME_CONFIG_TABLE]
PowerOffScreen = /usr/data_resource/animation/Moto2.gif
PowerOnScreen = /usr/data_resource/animation/Moto1.gif
WallPaper = /usr/data_resource/picture/Home_Wallpaper6.gif

这个图片是240x320 256色的大小GIF89 gif图片。

你可以把图片放到你的SD卡的某个目录上,然后修改这个文件里的目录

Motorola E6 解除手机四个按钮自定义冻结

\\169.254.142.2\system\ezx_user\download\appwrite\setup\ezx_idle.cfg

发现:

[static]
nextEvent = 0
shortcut_1 = fc4eee73-2b5b-4ebd-b6dc-32dd62fbd490
shortcut_1_freeze = 1
shortcut_1_icon_name = Home_CMCC_Service_B.gif
shortcut_2 = 95ffa462-7e2f-49a9-9e6d-f8f63b2f3c40
shortcut_2_freeze = 1

这样就可以在设置里的主屏定义里修改快捷方式了。

Motorola E6的一些说明

Motorola E6使用的是:MontaVista(R) Linux(R) Consumer Electronics Edition 3.1
在网络上找到这个公司网址及文档的说明地址:http://www.mvista.com/product_datasheets.php

不过没有关于里面系统管理的说明,图形是基于
MontaVista Graphics,主要基于两个X window Management:ICEWM和 matchBox,开发UI主要是基于GTK+,
奇怪的是其Motolora的目录里包含:QTDownload的目录,

奇怪。

现在像解决的是,如何定义新的系统分类或修改。

通过USBLAN telnet方式或samba方式 \\169.254.142.2\system 的方式来访问Motorola E6 手机,也不知道修改那个文件。

有人说是修改:\\169.254.142.2\system\ezx_user\download\appwrite\am\UserMenuTree
但因为队X window的配置文件不熟悉,看起来如看天书啊

[2a58c0d6-05c6-45aa-8938-63059d41a4e9]
Items = cb839c8f-72c3-42ac-bf17-b01080cb5705;e8c83dac-db4e-4fb5-98a6-61de1998b277;b18dbbd2-503a-4442-9308-5575ee38c210;51f2cb88-3040-4f00-b66c-c4bb974e4d18;67dc1191-2928-4938-abce-1a73cb5ce490;3bb7f1b5-12bb-4b79-985b-96436e094256;48973844-3955-4323-b5a0-f69435a1dba0
[3bb7f1b5-12bb-4b79-985b-96436e094256]
Items = 5b608840-eb39-4d34-bfdb-8806436d140d;95ffa462-7e2f-49a9-9e6d-f8f63b2f3c40;9faafa35-0688-4529-8310-04f215cb2d0c;ba63e2ca-089c-4a95-8e13-81522eed47a0;fc4eee73-2b5b-4ebd-b6dc-32dd62fbd490;c4e5410b-c0fe-4889-8619-6bdce79f0e47;
[48973844-3955-4323-b5a0-f69435a1dba0]
Items = acd47a08-a135-72ed-9378-5054f598b326;
[51f2cb88-3040-4f00-b66c-c4bb974e4d18]
Items = 5af701f6-33e3-4fe6-b15e-b7ef7c986c74;0f0c629a-9524-4fc9-8429-6df7dedf394d;067a149d-00b4-4ba3-b839-11ab2dbd88c0;bacc9585-ae26-4cf9-8e72-fb520709b4b0;23723ec3-ab86-408a-86c0-f70ac6f5c153;c30158ae-e2a7-4d1c-9f6c-3b079c2f4c4e;6aff7618-c940-48d9-ad3b-3106d9a884c2;0b6c1459-2fbe-4b2e-95c9-a4f93762fa11
[67dc1191-2928-4938-abce-1a73cb5ce490]
Items = 18b62bb5-bd39-4397-9076-fe912a4b6dd0;8a2b9b37-83e7-a8d9-82cf-0bcbe2070002;8a2b9b37-83e7-a8d9-82cf-0bcbe2070001;b0fc7131-b9c1-d70c-82bb-c8893c8a78c2;b726141b-9a5c-1755-b2dd-47da885ae301;25a634e7-6fc5-d058-a2b9-3f6c70a9b430;278e9dbc-0e9b-bc69-8e44-039c62556527;;8a2b9b37-83e7-a8d9-82cf-0bcbe2070003
[b18dbbd2-503a-4442-9308-5575ee38c210]
Items = c1e0df66-11ef-4b33-bddb-0cbd13827312;5e558577-7be1-405a-a888-e65d20a2908a;4d690409-f29f-48f4-8967-48fc151b2272;6cd5ea93-d3e2-4cbd-ac46-9dad6ff62b46;5382eeae-3a6f-40ef-ac3a-6f85c4a7f87f;9667de53-e43e-47bd-96ff-89c06dc3cdbd
[cb839c8f-72c3-42ac-bf17-b01080cb5705]
Items = ce59717d-fb23-4b7c-8800-25ce613f4042;c30158ae-e2a7-4d1c-9f6c-3b079c2f4c4e;1e6b9963-24cc-41f8-bbee-a23ae761ff81;fc4eee73-2b5b-4ebd-b6dc-32dd62fbd490;5b608840-eb39-4d34-bfdb-8806436d140d;95ffa462-7e2f-49a9-9e6d-f8f63b2f3c40;ba63e2ca-089c-4a95-8e13-81522eed47a0;9faafa35-0688-4529-8310-04f215cb2d0c;c4e5410b-c0fe-4889-8619-6bdce79f0e47;9a4cdb74-34ec-415e-ba36-b8c2a35d0071;bb621a8f-c681-477f-9d15-9c4b53b37a3e;0b6c1459-2fbe-4b2e-95c9-a4f93762fa11;6aff7618-c940-48d9-ad3b-3106d9a884c2;c1e0df66-11ef-4b33-bddb-0cbd13827312;4d690409-f29f-48f4-8967-48fc151b2272;5e558577-7be1-405a-a888-e65d20a2908a;5382eeae-3a6f-40ef-ac3a-6f85c4a7f87f;5af701f6-33e3-4fe6-b15e-b7ef7c986c74;0f0c629a-9524-4fc9-8429-6df7dedf394d;9667de53-e43e-47bd-96ff-89c06dc3cdbd;067a149d-00b4-4ba3-b839-11ab2dbd88c0;bacc9585-ae26-4cf9-8e72-fb520709b4b0;23723ec3-ab86-408a-86c0-f70ac6f5c153;1758dab7-a240-4c66-bd01-0a78064c6f87;45e9c626-06be-40d0-a166-fd5b85471aa8;6cd5ea93-d3e2-4cbd-ac46-9dad6ff62b46;18b62bb5-bd39-4397-9076-fe912a4b6dd0;68aa0e99-9a59-302c-96bb-f4f08e7dd90e;474b7d54-abad-93a8-ad5a-11f9f2cc7ba0;f4fae70f-11d4-7006-8cf3-0f1bf2d6eee8;68898845-2628-5f45-9647-d819ece272a3;2c227485-1738-e3b5-94f6-4f88728cdf91;7b1c83d0-7a0c-df33-8766-21712ba02301;8daa06ee-0a83-8934-aed2-73b25af6bfe9;0869ee05-8a86-9bbc-b610-d7ee3abda81a;093e4d22-dad7-8c72-b4ed-d9e88fef9147;1178dc20-66d9-1597-a9f7-f81f8a83b1f4;13a750f6-fe43-d83a-b3b7-8a7fecebfa77;1a112744-bc68-4f43-886a-a5ed58083a6c;256120fb-a864-c6f4-a6a5-dc023e8ba313;25a634e7-6fc5-d058-a2b9-3f6c70a9b430;25af762a-dce9-9232-8a26-0864839f9b85;26022542-9c88-1ce5-8622-de6dc3823df6;2753bbbf-7530-b3c1-b01a-64b49bcdac8c;278e9dbc-0e9b-bc69-8e44-039c62556527;2864e07e-c7d3-15ef-bb78-ecf0576386a6;2cc4d208-40f8-1fba-8e3a-455d140a6be1;38c53039-21c0-d3f4-9934-00c3bfdca9f9;396b61f1-a203-dfa7-92d6-7dfea7067b9e;4c6d6a9b-920d-0ea6-9a58-d79d93afb1a6;5834b42c-7617-bc1b-bc98-c50a33af774c;62cdf98a-c79b-28e7-a958-d3f7d0caf1ab;6657920d-2c3f-c612-9285-0d0a3ccbb2f9;66fc461d-7a46-9591-997b-42d332fdf941;671dbcb5-16b5-9db3-9e78-45e9f42370bf;695c9824-e3ec-7e1b-9904-d4ef4955047a;6d1a0429-586d-ed7b-9fac-6d91b67116c5;758c8293-ad35-8a3e-8471-ceac85e362fd;78661e58-99f4-a0e7-ba8c-c9aededab5de;7b104f18-a878-dd59-b326-0389e37f086b;8ad75187-213f-dd21-8536-4e93aca03cb5;8ba4ab20-1dcb-e2b5-9f1a-e926b650f8d9;8db372ff-1b90-9239-87d6-1b9bbf4886de;96eb974f-4b54-3958-9b1f-1310189dc93b;9b9b7691-fce2-6d5e-b911-692e2236004f;9ec1bc67-7800-f7b1-aee4-30b357001f6e;a97aaa60-bf83-88a1-a7b1-33e59f73edc1;b0fc7131-b9c1-d70c-82bb-c8893c8a78c2;b5961de7-a547-3171-95a5-63a6487f5b97;b726141b-9a5c-1755-b2dd-47da885ae301;b997558a-f41b-8ce8-8e55-3b2faeed6466;bb5025f0-0079-c342-a36e-e2781257d195;c9d5d40c-bd73-482f-9fdc-15f060a20151;cefa0ab0-0dff-e12a-b497-70a399c0a512;d088d0f1-f39d-aeca-8777-acc35a80f0bc;dc9bc4ac-4482-036a-a651-d0f018889db5;de499d5a-7ffd-f091-8493-e408fc57814b;e8ac9283-7e6f-f665-81ef-78ed0d652eda;f36a0a48-5954-7063-9d55-e4aefe32211c;fb2dc9c7-2669-cbd4-a49b-a9aae2080555;acd47a08-a135-72ed-9378-5054f598b326;8a2b9b37-83e7-a8d9-82cf-0bcbe2070001;8a2b9b37-83e7-a8d9-82cf-0bcbe2070002;8a2b9b37-83e7-a8d9-82cf-0bcbe2070003
[e8c83dac-db4e-4fb5-98a6-61de1998b277]
Items = ce59717d-fb23-4b7c-8800-25ce613f4042;1e6b9963-24cc-41f8-bbee-a23ae761ff81;9a4cdb74-34ec-415e-ba36-b8c2a35d0071;1758dab7-a240-4c66-bd01-0a78064c6f87;bb621a8f-c681-477f-9d15-9c4b53b37a3e;45e9c626-06be-40d0-a166-fd5b85471aa8