2010年9月29日
在Window下启动Hadoop-0.21.0版本时,会出现下面这样的错误提示:
1 java.lang.NoClassDefFoundError: org/apache/hadoop/util/PlatformName
2 Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.util.PlatformName
3
4 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
5 at java.security.AccessController.doPrivileged(Native Method)
6 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
7 at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
8 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
9 at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
10 Could not find the main class: org.apache.hadoop.util.PlatformName. Program wil
11 l exit.
经过不断的查找原因和尝试,终于有了解决这个错误的办法,只需要将${HADOOP_HOME}/bin/hadoop-config.sh文件中的第190行的一下的内容
JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
修改成以下的内容即可
JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m -classpath ${HADOOP_COMMON_HOME}/hadoop-common-0.21.0.jar org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
posted @
2010-09-29 17:03 snoics 阅读(12352) |
评论 (7) |
编辑 收藏
2010年7月26日
摘要: 基于自己的兴趣,利用业务时间在Lucene基础上做的一个搜索框架,请大家多多指教。
一、 介绍
基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。
&nbs...
阅读全文
posted @
2010-07-26 08:06 snoics 阅读(2750) |
评论 (0) |
编辑 收藏
2008年12月15日
Myeclipse 7 的插件安装方式与原先的方式完全不一样了,下面以JBossTools-2.1.2.GA插件安装为例进行说明。
假设
Myeclipse 7的安装路径为:C:\Genuitec
JBossTools-2.1.2.GA插件的路径为: C:\eclipse-plugins\plugins\JBossTools-2.1.2.GA-ALL-win32
将下面这段代码编译后执行:
1package test;
2
3import java.io.File;
4import java.util.ArrayList;
5import java.util.List;
6
7
8/** *//**
9 * Descript:
10 *
11 *
12 */
13
14public class CreatePluginsConfig {
15 private String path;
16
17 public CreatePluginsConfig(String path){
18 this.path=path;
19 }
20
21 public void print(){
22 List list=getFileList(path);
23 if(list==null){
24 return;
25 }
26
27 int length=list.size();
28 for(int i=0;i<length;i++){
29 String result="";
30 String thePath=getFormatPath(getString(list.get(i)));
31 File file=new File(thePath);
32 if(file.isDirectory()){
33 String fileName=file.getName();
34 if(fileName.indexOf("_")<0){
35 continue;
36 }
37 String[] filenames=fileName.split("_");
38 String filename1=filenames[0];
39 String filename2=filenames[1];
40 result=filename1+","+filename2+",file:/"+path+"\\"+fileName+"\\,4,false";
41 System.out.println(result);
42 }else if(file.isFile()){
43 String fileName=file.getName();
44 if(fileName.indexOf("_")<0){
45 continue;
46 }
47 String[] filenames=fileName.split("_");
48 String filename1=filenames[0];
49 String filename2=filenames[1].substring(0, filenames[1].lastIndexOf("."));
50 result=filename1+","+filename2+",file:/"+path+"\\"+fileName+",4,false";
51 System.out.println(result);
52 }
53
54 }
55 }
56
57 public List getFileList(String path){
58 path=getFormatPath(path);
59 path=path+"/";
60 File filePath=new File(path);
61 if(!filePath.isDirectory()){
62 return null;
63 }
64 String[] filelist=filePath.list();
65 List filelistFilter=new ArrayList();
66
67 for(int i=0;i<filelist.length;i++){
68 String tempfilename=getFormatPath(path+filelist[i]);
69 filelistFilter.add(tempfilename);
70 }
71 return filelistFilter;
72 }
73
74 public String getString(Object object){
75 if(object==null){
76 return "";
77 }
78 return String.valueOf(object);
79 }
80
81 public String getFormatPath(String path) {
82 path = path.replaceAll("\\\\", "/");
83 path = path.replaceAll("//", "/");
84 return path;
85 }
86
87 public static void main(String[] args){
88 new CreatePluginsConfig("C:\\eclipse-plugins\\plugins\\JBossTools-2.1.2.GA-ALL-win32\\eclipse\\plugins").print();
89 }
90}
执行完之后,将控制台中打印出的执行结果,直接复制到下面这个文件中:
C:\Genuitec\MyEclipse 7.0\configuration\org.eclipse.equinox.simpleconfigurator\bundles.info
然后用 -clean 命令重新启动Myeclipse即了完成插件的安装。
posted @
2008-12-15 13:41 snoics 阅读(8454) |
评论 (13) |
编辑 收藏
2008年4月24日
“不要重新发明轮子!!!”
乍听之下,这一句话似乎是很有道理。确实在很多情况下,这句话是很有道理。可是殊不知在这一句冠冕堂皇的理由下,有多少的创意、多少的激情被抹杀了?
在很多情况下,有些中国的程序员只要自己想做一些有创造性的工作,确总是被上级或其他的某些同行嘲笑“你要做的这个东西已经有现成的了,有必要再花时间去做吗?你能做的比别人做出来的东西更好吗?你这是在重新发明轮子,而且是不好的轮子。”
结果,一个接着一个的萌芽被‘不要重新发明轮子’这个古训扼杀了。
想起来真是觉得很悲哀也很无奈,中国的程序员永远只能使用外国人的技术,甚至其中有不少都是已经快要过时了才开始在中国普及开。一个接着一个的流行框架在国外的人手中产生出来,为什么他们就可以重新发明轮子,而我们就不行呢?死守古训导致的唯一的结果就是无法进步,永远只能使用别人的东西,最多就是罗列了一堆会使用的框架,真正的技术都是掌握在别人的手里。
有一次面试,简历上列出了会使用:JSF,SPRING,HIBERNATE(还有不少其他的,具体的记不太清了),而且已经参与开发过了两个WEB类型的项目,并且已经通过了SCJP认证。结果确连几种List的区别,HashTable和HashMap的区别都分不清,设计模式方面更是惨不忍睹,甚至更不可思议的是连使用HTML语法画出一个稍显复杂的表格都办不到。回答是:因为都是使用框架和框架提供的标签,所以不需要接触这些……
还是那句话:有时候是该反省反省,除了框架,自己还剩下什么?
posted @
2008-04-24 12:52 snoics 阅读(1809) |
评论 (2) |
编辑 收藏
2008年3月25日
摘要:
数据分页显示是一项挺烦人的工作,涉及到数据来源,数据生成,数据显示这几个方面。数据有可能是从任意地方以任意方式获取到的,而且获取到的数据又有可能是经过了任意的方式处理之后,再以任意的方式显示给最终用户。
这...
阅读全文
posted @
2008-03-25 11:39 snoics 阅读(2940) |
评论 (3) |
编辑 收藏
2008年3月24日
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的值
因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
但是它在两个子表达式里的含义是不同的。
在天(月)子表达式中,“L”表示一个月的最后一天
在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT
如果在“L”前有具体的内容,它就具有其他的含义了
例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五
注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
posted @
2008-03-24 21:02 snoics 阅读(1749) |
评论 (0) |
编辑 收藏
IE有时会在打开一些页面时出现
此对话框出现错误。
错误:53
存储空间不足,无法完成此操作
的错误提示框,导致页面最终无法打开
经过很长时间,终于发现在IE7中解决这个问题的解决方法
在IE7中进行如下操作:
Tools-->Internet Options-->Programs-->Advanced-->Reset-->Reset
这样讲IE7中的各项配置,包括插件全部都恢复到IE7刚安装完时的最初始化的状态,之前的那个错误也解决了。
posted @
2008-03-24 20:38 snoics 阅读(6103) |
评论 (5) |
编辑 收藏
2007年11月25日
迷惑了一段时间,现在终于想通了,还是继续以前的执着,继续朝以前的那个目标不断努力吧。差点就放弃了,不过还是终于还是又回来了。
一定要,也一定会变得更强,对自己有信心 ^_^
posted @
2007-11-25 18:51 snoics 阅读(1068) |
评论 (2) |
编辑 收藏
2006年6月3日
源代码发布
snoics-reptile 网页爬虫2.0
|
|
|
FAQ
|
1、snoics-reptile是什么?
|
是用纯Java开发的,用来进行网站镜像抓取的工具,可以使用配制文件中提供的URL入口, 把这个网站所有的能用浏览器通过GET的方式获取到的资源全部抓取到本地,包括网页和各 种类型的文件,如:图片、flash、mp3、zip、rar、exe等文件。可以将整个网站完整地下传至 硬盘内,并能保持原有的网站结构精确不变。只需要把抓取下来的网站放到web服务器 (如:Apache)中,就可以实现完整的网站镜像。
|
2、现在已经有了其他的类似的软件,为什么还要开发snoics-reptile?
|
因为有些在抓取的过程中经常会出现错误的文件,而且对很多使用 javascript控制的URL没有办法正确的解析,而snoics-reptile通过对外提供 接口和配置文件的形式,对特殊的URL,可以通过自由的扩展对外提 供的接口,并通过配置文件注入的方式,基本上能实现对所有的网页都 正确的解析和抓取。
|
3、如何使用?
|
a、配置 bin\snoics-configpath.xml 文件
将配置文件中的path节点的值改为conf文件夹在系统中的绝对路径, 如: c:\snoics-reptile\conf
|
b、配置 conf\snoics-systemconfig.xml 文件
其中parameters节点中的配置为对需要抓取的网站的参数的配置,
以下是各个参数的说明:
1、websitename:
站点的名称(不能为空,由字母和数字组成)
2、charsetName:
该站点使用的字符集类型
3、website:
将被抓取的站点的域名
4、startpage:
抓取的起始页面
5、url:
该站点中将被抓取的部分(如果留空则为整个站点,可以有多个URL, 每个URL之间使用";"隔开)
6、remoteurlflag:
代表远程URL的标志,没有特殊情况请不要修改此处,使用默认值 (多个之间使用";"隔开)
7、forbidurl:
该站点中不被抓取的部分(多个之间使用";"隔开)
8、cachefile:
该站点使用的缓存文件,如果缓存文件不存在则自动创建一个新的, 如果已经存在,则会载入文件中保存的信息
9、filerootpath:
抓取下的文件的保存路径(必须是系统中的绝对路径)
10、indexpage:
将被保存成index.html文件名的URL类型(多个之间使用";"隔开)
11、filenamelength:
页面保存到本地时,随机生成的文件名的长度
12、cacheunitsize:
一个cache单元的大小
13、reptile-downloadfiletype:
将被抓取到本地的文件类型(多个之间使用";"隔开)
14、reptile-undownloadfiletype:
页面被保存到本地时,该种类型的文件的URL将被改成远程的URL地址 ,如果这种类型出现在reptile-downloadfiletype中时,则文件将被抓取到本地, 而URL也将改成本地的URL(多个之间使用";"隔开)
|
c、在参数配置好之后,执行bin/run.bat文件
|
|
4、如何扩展接口?
|
扩展接口使用的配置文件是:conf/snoics-reptile-urlregex.xml
首先加入一段如下的配置 <bean id="ahrefRegexUrl" class="com.snoics.reptile.regex.url.impl.UrlRegex" singleton="false"> <property name="regexUrl"> <!-- 提取可能包含URL的字符串 --> <value><![CDATA[<[^!<>]*\shref\s*=\s*["']?[^<>]*["'\s][^<>]*>]]></value> </property> <property name="replaceRegexUrl"> <!-- 替换可能包含URL的字符串 --> <value><![CDATA[<[^!<>]*\shref\s*=\s*["']?reptile-replace-string["'\s][^<>]*>]]></value> </property> <property name="getRegexUrl"> <!-- 提取最终URL --> <ref bean="ahrefGetRegexUrl"/> </property> </bean>
其中ahrefGetRegexUrl是实现了com.snoics.reptile.regex.url.IGetUrlRegex接口的类,用来从可能包含了URL的字符串里面提取其中包含的URL
其次加入如下的配置:
<bean id="ahrefGetRegexUrl" class="com.snoics.reptile.regex.url.impl.AhrefGetRegexUrl" singleton="false"> <property name="regexString"> <!-- 提取最终URL --> <value><![CDATA[href\s*=\s*["']?[^\s"]+["'\s]\s*]]></value> </property> <property name="unIncludeRegexString"> <!-- 排除不需要的类型 多个正则表达式之间使用';'隔开 --> <value><![CDATA[javascript\s?:\s?;mailto\s?:\s?;^#$;]]></value> </property> </bean>
最后,在如下的配置中,加入刚才配置好的部分
<bean id="urlRegexMap" class="com.snoics.reptile.regex.url.impl.UrlRegexMap"> <property name="ulrRegexMap"> <map> <!-- 名称 --> <entry key="ahref"> <!-- 解析URL使用的类 --> <ref bean="ahrefRegexUrl"/> </entry> <entry key="src"> <ref bean="srcRegexUrl"/> </entry> </map> </property> </bean>
|
5、版本历史
|
2.0:
|
核心代码全部重写,增加了扩展性,通过扩展之后,基本上能实现对整个网站完整的解析
|
1.0:
|
实现了整站抓取的基本的功能,不能解析特殊的URL,对javascript无法辨认
|
源代码下载地址:
snoics-reptile2.0-src.part1.rar |
snoics-reptile2.0-src.part2.rar
snoics-reptile2.0-src.part3.rar
snoics-reptile2.0-src.part4.rar
posted @
2006-06-03 10:53 snoics 阅读(4504) |
评论 (13) |
编辑 收藏
2006年5月29日
|
|
FAQ
|
1、snoics-reptile是什么?
|
是用纯Java开发的,用来进行网站镜像抓取的工具,可以使用 配制文件中提供的URL入口,把这个网站所有的能用浏览器通过 GET的方式获取到的资源全部抓取到本地,包括网页和各种类型 的文件,如:图片、flash、mp3、zip、rar、exe等文件。可以将整 个网站完整地下传至硬盘内,并能保持原有的网站结构精确不变。 只需要把抓取下来的网站放到web服务器(如:Apache)中,就可以 实现完整的网站镜像。
|
2、现在已经有了其他的类似的软件,为什么还要开发snoics-reptile?
|
因为有些在抓取的过程中经常会出现错误的文件,而且对很多使用 javascript控制的URL没有办法正确的解析,而snoics-reptile通过对外提供 接口和配置文件的形式,对特殊的URL,可以通过自由的扩展对外提供 的接口,并通过配置文件注入的方式,基本上能实现对所有的网页都 正确的解析和抓取。
|
3、如何使用?
|
a、配置 bin\snoics-configpath.xml 文件
将配置文件中的path节点的值改为conf文件夹在系统中的绝对路径, 如: c:\snoics-reptile\conf
|
b、配置 conf\snoics-systemconfig.xml 文件
其中parameters节点中的配置为对需要抓取的网站的参数的配置,
以下是各个参数的说明:
1、websitename:
站点的名称(不能为空,由字母和数字组成)
2、charsetName:
该站点使用的字符集类型
3、website:
将被抓取的站点的域名
4、startpage:
抓取的起始页面
5、url:
该站点中将被抓取的部分(如果留空则为整个站点,可以有多个URL, 每个URL之间使用";"隔开)
6、remoteurlflag:
代表远程URL的标志,没有特殊情况请不要修改此处,使用默认值 (多个之间使用";"隔开)
7、forbidurl:
该站点中不被抓取的部分(多个之间使用";"隔开)
8、cachefile:
该站点使用的缓存文件,如果缓存文件不存在则自动创建一个新的, 如果已经存在,则会载入文件中保存的信息
9、filerootpath:
抓取下的文件的保存路径(必须是系统中的绝对路径)
10、indexpage:
将被保存成index.html文件名的URL类型(多个之间使用";"隔开)
11、filenamelength:
页面保存到本地时,随机生成的文件名的长度
12、cacheunitsize:
一个cache单元的大小
13、reptile-downloadfiletype:
将被抓取到本地的文件类型(多个之间使用";"隔开)
14、reptile-undownloadfiletype:
页面被保存到本地时,该种类型的文件的URL将被改成远程的URL 地址,如果这种类型出现在reptile-downloadfiletype中时,则文件将被抓取 到本地,而URL也将改成本地的URL(多个之间使用";"隔开)
|
c、在参数配置好之后,执行bin/run.bat文件
|
|
4、如何扩展接口?
|
扩展接口使用的配置文件是:conf/snoics-reptile-urlregex.xml
首先加入一段如下的配置,其中正则表达式部分应该特定的需要自己给出, reptile-replace-string用来代替URL出现的位置,在程序执行的过程中,该部分 会被自动替换。 <bean id="ahrefRegexUrl" class="com.snoics.reptile.regex.url.impl.UrlRegex" singleton="false"> <property name="regexUrl"> <!-- 提取可能包含URL的字符串 --> <value><![CDATA[<[^!<>]*\shref\s*=\s*["']?[^<>]*["'\s][^<>]*>]]></value> </property> <property name="replaceRegexUrl"> <!-- 替换可能包含URL的字符串 --> <value><![CDATA[<[^!<>]*\shref\s*=\s*["']?reptile-replace-string["'\s][^<>]*>]]></value> </property> <property name="getRegexUrl"> <!-- 提取最终URL --> <ref bean="ahrefGetRegexUrl"/> </property> </bean>
其中ahrefGetRegexUrl是实现了com.snoics.reptile.regex.url.IGetUrlRegex 接口的类,用来从可能包含了URL的字符串里面提取其中包含的URL
其次加入如下的配置:
<bean id="ahrefGetRegexUrl" class="com.snoics.reptile.regex.url.impl.AhrefGetRegexUrl" singleton="false"> <property name="regexString"> <!-- 提取最终URL --> <value><![CDATA[href\s*=\s*["']?[^\s"]+["'\s]\s*]]></value> </property> <property name="unIncludeRegexString"> <!-- 排除不需要的类型 多个正则表达式之间使用';'隔开 --> <value><![CDATA[javascript\s?:\s?;mailto\s?:\s?;^#$;]]></value> </property> </bean>
最后,在如下的配置中,加入刚才配置好的部分
<bean id="urlRegexMap" class="com.snoics.reptile.regex.url.impl.UrlRegexMap"> <property name="ulrRegexMap"> <map> <!-- 名称 --> <entry key="ahref"> <!-- 解析URL使用的类 --> <ref bean="ahrefRegexUrl"/> </entry> <entry key="src"> <ref bean="srcRegexUrl"/> </entry> </map> </property> </bean>
|
5、版本历史
|
2.0:
|
核心代码全部重写,增加了扩展性,通过扩展之后,基本上能实现对整个网站完整的解析
|
1.0:
|
实现了整站抓取的基本的功能,不能解析特殊的URL,对javascript无法辨认
|
下载地址:
snoics-reptile2.0.part1.rar
snoics-reptile2.0.part2.rar
snoics-reptile2.0-doc.rar
|
posted @
2006-05-29 21:41 snoics 阅读(2796) |
评论 (3) |
编辑 收藏
2006年3月9日
现在各种各样的框架满天飞,几乎随便找个人都能把各种框架,模式,说的头头是道.弄的好象如果不懂这些,你就是落伍,就不懂的什么是编程,什么是企业应用系统的开发.
现在很多初学者一上来,就是这个框架,那个框架的,一会学了这个一会又学那个,往往忽略了最重要最基本的JAVA基础.
个人认为,框架不等同于JAVA,它只是JAVA下面的一种工具,就算学会使用再多的框架也不代表就学会了JAVA.一种工具可能一开始不会用,可是如果重复使用过几次,我想只要是正常的人,没有人学不会的,就算是条件反射也该会了(会用了和理解了是两种完全不同的情况).
结果也就出现了这样的情况,问到一个挺简单的问题,可是却都答不上来,原因是原来都是在别人的或者是框架里面封装好的东西,自己只是负责调用而已.
框架是比较容易过时的东西,只有基础才是比较持久的.所以当在学会了使用一大堆的框架以后,请考虑一下,如果除了框架,我还剩下了什么.
只是对这种情况的感想,没有任何贬低框架的意思.
posted @
2006-03-09 09:43 snoics 阅读(2087) |
评论 (4) |
编辑 收藏
2006年3月3日
一般情况下,在记录日志时,只能把通过API进行记录的信息写入自定义的日志文件,其余的信息就无法被写入了.
解决的办法就是重写System.out和System.err,让System.out,System.err的写入转向到你的日志文件,这样只要在控制台的所有的输出信息都会被记录到日志文件中.
例如可以在系统进行初始化时进行这样的操作:
重写System.out:
PrintStream printStreamOut = new PrintStream(outputStreamOut);
System.setOut(printStreamOut);
重写System.err
PrintStream printStreamErr = new PrintStream(outputStreamErr);
System.setErr(printStreamErr);
这里的outputStreamOut,和outputStreamErr都是自定义的重定向的日志文件的OutputStream
现在重定向输出的问题解决了,可以又出现了一个新的问题: 在控制台上看不到任何输出信息,输出的信息全部被定向到日志文件中.
要解决这个问题还需要自己实现一个OutputStream,让OutputStream能同时写入多个输出.
首先继承java.io.OutputStream,然后实现public abstract void write(int b) throws IOException; 并且覆写java.io.OutputStream中的其他的方法,具体的实现方式按照自己的需求来做,这里就不做出具体的实现了.
通过实现自己实现OutputStream之后,
在
PrintStream printStreamOut = new PrintStream(outputStreamOut);
PrintStream printStreamErr = new PrintStream(outputStreamErr);
中分别把outputStreamOut和outputStreamErr对象换成自己实现的OutputStream对象,这样就可以实现在一个OutputStream对象中进行多个输出操作.
按照以上的思路进行的实现,可以完全把控制台的所有的输出写入到日志文件中,包括System.out.println这样的输出.
snoics
posted @
2006-03-03 09:10 snoics 阅读(3828) |
评论 (7) |
编辑 收藏
2006年2月23日
1. 把opencms.war复制到Tomcat\webapps目录下,并复制classes12.jar到Tomcat\common\lib目录下,然后启动Tomcat,在启动完成之后,删除opencms.war
2. 在oracle中新建一个表空间opencms
3. 用
http://localhost:8080/opencms/setup进行安装
4. 安装过程中,数据库类型选择oracle9i, 用户名为system,另一个用户名是准备用来分配给opencms使用的用户名,这个地方可以按照具体的情况自己进行设置,这个用户可以是本身在oracle中并不存在的用户,安装程序会自动的创建这个用户,并把opencms表空间分配给该用户,接下来的表空间和Index的输入框中都输入opencms.
5. 接下去只需要按照提示一路Continue,最后当文件都导入完成之后,opencms就安装完成了,初始管理员和密码是Admin,admin
6. 安装完成之后,
修改/system/workplace/resources/commons/explorer.js
中的行:
"<td>"+vr.langadress+"&</td>\n"
为:"<td nowrap>"+vr.langadress+"</td>\n"
然后把org.opencms.locales.zh.zip包复制到Tomcat\webapps\opencms\WEB-INF\packages\modules目录下,使用Admin进入opencms系统,选择Administrator管理界面,然后选择模块管理,导入org.opencms.locales.zh.zip包.然后解压org.opencms.locales.zh.zip,把org.opencms.locales.zh\system\workplace\locales\zh\messages下的templateone_form_zh.properties和templateone_zh.properties以及org整个文件夹复制到Tomcat\webapps\opencms\WEB-INF\classes目录下.
7.重启Tomcat,使用Admin进入opencms系统,选择Administrator管理界面,然后把语言类型设置成chinese,这时就能使用中文界面的opencms了
posted @
2006-02-23 09:57 snoics 阅读(4100) |
评论 (9) |
编辑 收藏
2006年2月20日
/*
* Encrypt 字符串加密
*
* @author shiwei 2004-8-28
*/
package com.snoics.base.util;
/**
* Encrypt 字符串加密
* @author shiwei
*
*/
public class Encrypt {
public Encrypt() {
}
/**
* 加密字符串
* @param encryptstring
* @return String
*/
public static String encrypt(String encryptstring){
String newstring="";
if(encryptstring.length()<1){
return encryptstring;
}else{
String tempstring=StringClass.remove(encryptstring,0,(int)(encryptstring.length()/3));
tempstring=StringClass.getConvertString(tempstring);
encryptstring=StringClass.getConvertString(encryptstring);
newstring=encrypt(encryptstring,tempstring);
return newstring;
}
}
/**
* 普通加密字符串
*
* @param encryptstring1
* @param encryptstring2
* @return String
*/
public static String encrypt(String encryptstring1, String encryptstring2) {
int strcount = 0; //字符串ASCII码的总和
int newpasswordlength = 0; //生成的密码长度
int seed1 = 0; //种子
int seed2 = 0;
String str = "";
String newpassword = ""; //生成的密码
char newchar;
int newcharint = 0;
int thechar = 0;
str = encryptstring2 + encryptstring1;
if (str.length() > 0) {
for (int i = 0; i < str.length(); i++) {
strcount = strcount + str.charAt(i);
}
newpasswordlength = (strcount * strcount) / str.length() + str.length();
int temp = 0;
int temp2 = 0;
while ((newpasswordlength <= 0) || (newpasswordlength > 100)) {
temp = temp + str.length();
temp2 = temp + temp2;
newpasswordlength = 100;
}
for (int i = 0; i < encryptstring1.length(); i++) {
seed1 = seed1 + encryptstring1.charAt(i);
}
for (int i = 0; i < encryptstring2.length(); i++) {
seed2 = seed2 + encryptstring2.charAt(i);
}
for (int i = 0; i < newpasswordlength; i++) {
if (i < str.length()) {
thechar = str.charAt(i);
} else {
thechar = str.charAt(i % (str.length() - 1))
+ str.charAt((str.length() - 1)
- (i % str.length()));
}
newcharint = thechar * (seed1 * (i + 1) + thechar);
newcharint = newString(newcharint);
newcharint = thechar * (seed2 * (i + 1) + thechar);
newcharint = newString(newcharint);
newchar = (char) newcharint;
newpassword = newpassword + String.valueOf(newchar);
}
newpassword = newpassword.substring((encryptstring2.length() + encryptstring1.length()) % 100);
return (newpassword);
} else {
return ("空字符串不能被加密");
}
}
private static int newString(int charint) {
while ((charint > 127) || (charint < 32)) {
while (charint > 127) {
charint = (charint - charint/2+1) / 2;
while(charint==60||charint==62||charint==34||charint==32||charint==39){
charint = charint + 1;
}
}
while (charint < 32) {
charint = (charint + charint/2-1) * 2;
while(charint==60||charint==62||charint==34||charint==32||charint==39){
charint = charint + 1;
}
}
}
return (charint);
}
public static void main(String[] args) {
String theusername = "1abc1";
String thepassword = "1def1";
String theusername1 = "1def1";
String thepassword1 = "1abc1";
String newstring=Encrypt.encrypt(theusername,thepassword);
System.out.println("newstring="+newstring);
String newstringa=Encrypt.encrypt(theusername1,thepassword1);
System.out.println("newstringa="+newstringa);
String newstring2=Encrypt.encrypt(newstring);
System.out.println("newstring2="+newstring2);
String newstring3=Encrypt.encrypt(newstring2);
System.out.println("newstring3="+newstring3);
}
}
执行结果:
newstring=*?C4%;V[GKOoUX[_#i%ptvy)!!#01&c(46*o;=?y{?AB#4HI7%7LM:==U?@?AXBZFGHH`IJKfgO4QlmR7qrt::wxz=
newstringa=(=A4$;TYDHLmTW[_#d#kpvx*!#-/$a(56)m89;vy@AB!2DE4$7LN::;P==?AYBXCDEE^IJKceL3NikR6opq89uvw;
newstring2=ij887i)54)?!@A!!!Ab##eBf##ddd#efff#b#cadc#bc_!!]@
newstring3=(qI}!+A!#z%%4?((
posted @
2006-02-20 10:45 snoics 阅读(1743) |
评论 (0) |
编辑 收藏