
		 
		2005年12月12日		  
	
 
	
			
			在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 阅读(12449) | 
评论 (7) | 
编辑 收藏
			    下载地址:
http://code.google.com/p/snoics-retrieval/
    版本更新说明
V1.01:
                1、提高创建索引的效率
         2、通过对象池管理IndexWriter和IndexReader对象
         3、修正若干BUG
V1.0:
         初始版本
基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。
    项目地址:http://code.google.com/p/snoics-retrieval/
    
   环境要求
Java1.5+
Lucene 3.0+
			posted @ 
2010-09-28 16:33 snoics 阅读(2422) | 
评论 (1) | 
编辑 收藏
做了一些小的修改和调整
基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。
    项目地址:http://code.google.com/p/snoics-retrieval/
    
环境要求
Java1.5+
Lucene 3.0+
			posted @ 
2010-08-18 15:00 snoics 阅读(2100) | 
评论 (0) | 
编辑 收藏
			     摘要:        对四则运算表达式字符串进行解析后计算出结果,可以使用逆波兰表达式进行处理。
       首先说明一下什是逆波兰表达式:
        逆波兰表达式又叫做后缀表达...  
阅读全文
			posted @ 
2010-07-29 17:44 snoics 阅读(3426) | 
评论 (2) | 
编辑 收藏
			     摘要:         基于自己的兴趣,利用业务时间在Lucene基础上做的一个搜索框架,请大家多多指教。
一、        介绍 
基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。
 &nbs...  
阅读全文
			posted @ 
2010-07-26 08:06 snoics 阅读(2774) | 
评论 (0) | 
编辑 收藏
			    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
    将下面这段代码编译后执行:
    
 1 package test;
package test;
 2
 3 import java.io.File;
import java.io.File;
 4 import java.util.ArrayList;
import java.util.ArrayList;
 5 import java.util.List;
import java.util.List;
 6
 7
 8
 /** *//**
/** *//**
 9 * Descript:
 * Descript: 
10 *
 *
11 *
 *
12 */
 */
13
14
 public class CreatePluginsConfig
public class CreatePluginsConfig  {
{
15 private String path;
    private String path;
16 
    
17
 public CreatePluginsConfig(String path)
    public CreatePluginsConfig(String path) {
{
18 this.path=path;
        this.path=path;
19 }
    }
20 
    
21
 public void print()
    public void print() {
{
22 List list=getFileList(path);
        List list=getFileList(path);
23
 if(list==null)
        if(list==null) {
{
24 return;
            return;
25 }
        }
26 
        
27 int length=list.size();
        int length=list.size();
28
 for(int i=0;i<length;i++)
        for(int i=0;i<length;i++) {
{
29 String result="";
            String result="";
30 String thePath=getFormatPath(getString(list.get(i)));
            String thePath=getFormatPath(getString(list.get(i)));
31 File file=new File(thePath);
            File file=new File(thePath);
32
 if(file.isDirectory())
            if(file.isDirectory()) {
{
33 String fileName=file.getName();
                String fileName=file.getName();
34
 if(fileName.indexOf("_")<0)
                if(fileName.indexOf("_")<0) {
{
35 continue;
                    continue;
36 }
                }
37 String[] filenames=fileName.split("_");
                String[] filenames=fileName.split("_");
38 String filename1=filenames[0];
                String filename1=filenames[0];
39 String filename2=filenames[1];
                String filename2=filenames[1];
40 result=filename1+","+filename2+",file:/"+path+"\\"+fileName+"\\,4,false";
                result=filename1+","+filename2+",file:/"+path+"\\"+fileName+"\\,4,false";
41 System.out.println(result);
                System.out.println(result);
42
 }else if(file.isFile())
            }else if(file.isFile()) {
{
43 String fileName=file.getName();
                String fileName=file.getName();
44
 if(fileName.indexOf("_")<0)
                if(fileName.indexOf("_")<0) {
{
45 continue;
                    continue;
46 }
                }
47 String[] filenames=fileName.split("_");
                String[] filenames=fileName.split("_");
48 String filename1=filenames[0];
                String filename1=filenames[0];
49 String filename2=filenames[1].substring(0, filenames[1].lastIndexOf("."));
                String filename2=filenames[1].substring(0, filenames[1].lastIndexOf("."));
50 result=filename1+","+filename2+",file:/"+path+"\\"+fileName+",4,false";
                result=filename1+","+filename2+",file:/"+path+"\\"+fileName+",4,false";
51 System.out.println(result);
                System.out.println(result);
52 }
            }
53 
            
54 }
        }
55 }
    }
56 
    
57
 public List getFileList(String path)
    public List getFileList(String path) {
{
58 path=getFormatPath(path);
        path=getFormatPath(path);
59 path=path+"/";
        path=path+"/";
60 File filePath=new File(path);
        File filePath=new File(path);
61
 if(!filePath.isDirectory())
        if(!filePath.isDirectory()) {
{
62 return null;
            return null;
63 }
        }
64 String[] filelist=filePath.list();
        String[] filelist=filePath.list();
65 List filelistFilter=new ArrayList();
        List filelistFilter=new ArrayList();
66
67
 for(int i=0;i<filelist.length;i++)
        for(int i=0;i<filelist.length;i++) {
{
68 String tempfilename=getFormatPath(path+filelist[i]);
            String tempfilename=getFormatPath(path+filelist[i]);
69 filelistFilter.add(tempfilename);
            filelistFilter.add(tempfilename);
70 }
        }
71 return filelistFilter;
        return filelistFilter;
72 }
    }
73 
    
74
 public String getString(Object object)
    public String getString(Object object) {
{
75
 if(object==null)
        if(object==null) {
{
76 return "";
            return "";
77 }
        }
78 return String.valueOf(object);
        return String.valueOf(object);
79 }
    }
80 
    
81
 public String getFormatPath(String path)
    public String getFormatPath(String path)  {
{
82 path = path.replaceAll("\\\\", "/");
        path = path.replaceAll("\\\\", "/");
83 path = path.replaceAll("//", "/");
        path = path.replaceAll("//", "/");
84 return path;
        return path;
85 }
    }
86 
    
87
 public static void main(String[] args)
    public static void main(String[] args) {
{
88 new CreatePluginsConfig("C:\\eclipse-plugins\\plugins\\JBossTools-2.1.2.GA-ALL-win32\\eclipse\\plugins").print();
        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 阅读(8525) | 
评论 (13) | 
编辑 收藏
        乍听之下,这一句话似乎是很有道理。确实在很多情况下,这句话是很有道理。可是殊不知在这一句冠冕堂皇的理由下,有多少的创意、多少的激情被抹杀了?
        在很多情况下,有些中国的程序员只要自己想做一些有创造性的工作,确总是被上级或其他的某些同行嘲笑“你要做的这个东西已经有现成的了,有必要再花时间去做吗?你能做的比别人做出来的东西更好吗?你这是在重新发明轮子,而且是不好的轮子。”
        结果,一个接着一个的萌芽被‘不要重新发明轮子’这个古训扼杀了。
        想起来真是觉得很悲哀也很无奈,中国的程序员永远只能使用外国人的技术,甚至其中有不少都是已经快要过时了才开始在中国普及开。一个接着一个的流行框架在国外的人手中产生出来,为什么他们就可以重新发明轮子,而我们就不行呢?死守古训导致的唯一的结果就是无法进步,永远只能使用别人的东西,最多就是罗列了一堆会使用的框架,真正的技术都是掌握在别人的手里。
         有一次面试,简历上列出了会使用:JSF,SPRING,HIBERNATE(还有不少其他的,具体的记不太清了),而且已经参与开发过了两个WEB类型的项目,并且已经通过了SCJP认证。结果确连几种List的区别,HashTable和HashMap的区别都分不清,设计模式方面更是惨不忍睹,甚至更不可思议的是连使用HTML语法画出一个稍显复杂的表格都办不到。回答是:因为都是使用框架和框架提供的标签,所以不需要接触这些……
        还是那句话:有时候是该反省反省,除了框架,自己还剩下什么?
			
posted @ 
2008-04-24 12:52 snoics 阅读(1840) | 
评论 (2) | 
编辑 收藏
			     摘要:  
        数据分页显示是一项挺烦人的工作,涉及到数据来源,数据生成,数据显示这几个方面。数据有可能是从任意地方以任意方式获取到的,而且获取到的数据又有可能是经过了任意的方式处理之后,再以任意的方式显示给最终用户。
        这...  
阅读全文
			posted @ 
2008-03-25 11:39 snoics 阅读(2971) | 
评论 (3) | 
编辑 收藏
			IE有时会在打开一些页面时出现
此对话框出现错误。
错误:53
存储空间不足,无法完成此操作
的错误提示框,导致页面最终无法打开
经过很长时间,终于发现在IE7中解决这个问题的解决方法
在IE7中进行如下操作:
Tools-->Internet Options-->Programs-->Advanced-->Reset-->Reset
这样讲IE7中的各项配置,包括插件全部都恢复到IE7刚安装完时的最初始化的状态,之前的那个错误也解决了。
			
posted @ 
2008-03-24 20:38 snoics 阅读(6144) | 
评论 (5) | 
编辑 收藏
			        迷惑了一段时间,现在终于想通了,还是继续以前的执着,继续朝以前的那个目标不断努力吧。差点就放弃了,不过还是终于还是又回来了。
        一定要,也一定会变得更强,对自己有信心    ^_^
			
posted @ 
2007-11-25 18:51 snoics 阅读(1110) | 
评论 (2) | 
编辑 收藏
        下载地址:
                         snoics-reptile2.1.part1.rar
                         snoics-reptile2.1.part2.rar
                         snoics-reptile2.1.part3.rar
                         snoics-reptile2.1.part4.rar
          (大家有什么意见可以在这里提出,只要有时间,我会尽量更新,有什么建议可以在blog里面提出,或者加我的MSN一起讨论。  ^_^ )
| 版本历史 
 
 | 
| 2.1: 
 
 | 1、不用再配置snoics-configpath.xml中的路径。 2、定时自动保存Cache
 3、修改了一些Bug
 
 | 
| 2.0: 
 
 | 核心代码全部重写,增加了扩展性,通过扩展之后,基本上能实现对整个网站完整的解析 
 
 | 
| 1.0: 
 
 | 实现了整站抓取的基本的功能,不能解析特殊的URL,对javascript无法辨认 
 | 
			posted @ 
2006-10-27 21:05 snoics 阅读(4859) | 
评论 (21) | 
编辑 收藏
			发现猫扑的电台不错,把它作成遨游的插件了,放上来与大家分享。
下载以后把文件解压到遨游的插件目录下,就会在侧边拦出现MOP的电台,用起来很方便。
http://www.blogjava.net/Files/snoics/MOP.rar
			posted @ 
2006-09-06 19:28 snoics 阅读(1320) | 
评论 (0) | 
编辑 收藏    有些人说不知道snoics-reptile中的snoics-systemconfig.xml不知道怎么配置,这里就给出一个CSDN中Java文档中心的抓取配置的抓取配置。
     在抓取完了之后往Apache的httpd.conf中加入
Listen 10001
<VirtualHost *:10001>
    DocumentRoot D:\\temp\\reptile\\website
</VirtualHost>
     这段配置。
     最后删除抓取下来的文件夹中的D:\temp\reptile\website\author\index.html这个文件。不知道为什么文档中心的这个URL是一个空的页面http://dev.csdn.net/author  ,把这个URL的相对应的抓取下的文件删除就可以正常使用了
     在抓取的过程中,有些图片文件可能会出现错误,不过不影响使用,因为这些图片的路径本身大概就有些问题。
      附件-配置文件:http://www.blogjava.net/Files/snoics/snoics-systemconfig.rar
			posted @ 
2006-08-19 14:30 snoics 阅读(1579) | 
评论 (0) | 
编辑 收藏
				
						
								| 
												
														
																| 源代码发布 
 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 阅读(4563) | 
评论 (13) | 
编辑 收藏
				
						
								|  | 
						
								|  | 
						
								| 
												
														
																| 
 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 阅读(2835) | 
评论 (3) | 
编辑 收藏
			     现在各种各样的框架满天飞,几乎随便找个人都能把各种框架,模式,说的头头是道.弄的好象如果不懂这些,你就是落伍,就不懂的什么是编程,什么是企业应用系统的开发.
     现在很多初学者一上来,就是这个框架,那个框架的,一会学了这个一会又学那个,往往忽略了最重要最基本的JAVA基础.     
     个人认为,框架不等同于JAVA,它只是JAVA下面的一种工具,就算学会使用再多的框架也不代表就学会了JAVA.一种工具可能一开始不会用,可是如果重复使用过几次,我想只要是正常的人,没有人学不会的,就算是条件反射也该会了(会用了和理解了是两种完全不同的情况).
     结果也就出现了这样的情况,问到一个挺简单的问题,可是却都答不上来,原因是原来都是在别人的或者是框架里面封装好的东西,自己只是负责调用而已.
     框架是比较容易过时的东西,只有基础才是比较持久的.所以当在学会了使用一大堆的框架以后,请考虑一下,如果除了框架,我还剩下了什么.
     只是对这种情况的感想,没有任何贬低框架的意思.
			
posted @ 
2006-03-09 09:43 snoics 阅读(2118) | 
评论 (4) | 
编辑 收藏
			        一般情况下,在记录日志时,只能把通过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 阅读(3869) | 
评论 (7) | 
编辑 收藏
			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 阅读(4165) | 
评论 (9) | 
编辑 收藏/*
 * 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 阅读(1770) | 
评论 (0) | 
编辑 收藏
				
1. 用户可以从外部的系统接入,模块中的用户只有用户名,密码和描述这三个最基本的系统,然后通过ID和外部系统的用户建立联系
2. 角色之间可以继承,可以有父角色和子角色,而且个数不限,允许多重继承,通过继承之后,角色可以拥有所有父角色的权限
3. 权限的划分方式
    
    a.权限用事件来划分,每个事件通过一个handle来进行处理
    
    b.一个handle就是一个class
    c.事件的来源是一个配置文件,因此配置文件的方式可以是这样的
<?xml version="1.0" encoding="GBK"?>
<control>
 <!-- 是否自动转向 默认为false-->
 <isforward>false</isforward>
 <!-- 组件 -->
 <cmp id="cmp1" name="组件一">
  <!-- 事件 -->
  <event id="event1" name="事件一">
   <handle>com.snoics.cmp.event.Event1</handle>
   <view>/url1/pagename1</view>
  </event>
  <event id="event2" name="事件二">
   <handle>com.snoics.cmp.event.Event2</handle>
   <view>/url2/pagename2</view>
  </event>
 </cmp>
 <cmp id="cmp2" name="组件二">
  <event id="event3" name="事件三">
   <handle>com.snoics.cmp.event.Event3</handle>
   <view>/url3/pagename3</view>
  </event>
  <event id="event4" name="事件四">
   <handle>com.snoics.cmp.event.Event4</handle>
   <view>/url4/pagename4</view>
  </event>
 </cmp>
</control>
  
通过解析这个配置文件,可以得到每个事件的ID,这个ID就是以后的权限标志
给角色分配的权限就是这样的一个一个的标志
4.  通过AOP给应用系统加入权限控制
     系统在执行的过程中,能自动的进行拦截,如果发现当前的class是处于配置文件中的某一个handle的时候,自动进行权限验证,分析当前用户所拥有的角色中是否具有执行相关的handle的权限,在验证通过以后允许执行这个handle中的操作,否则拒绝执行
这样做的好处就是能够不在业务系统中写入任何和权限相关的代码,与权限相关的部分全部都是通过配置文件的配置来进行处理的,同时实现了权限控制的完全组件化.
如果大家有什么好的建议欢迎一起讨论
			posted @ 
2006-02-16 13:11 snoics 阅读(1885) | 
评论 (3) | 
编辑 收藏
			     摘要: 经过一段时间终于把分页完善了,可以实现JDBC分页(可以根据配置屏蔽不同的数据库之间的差异,并能对自动根据具体的数据库类型进行SQL优化),HIBERNATE2,和HIBERNATE3的分页,对内存中的数组进行分页,并且都支持快速的查询功能,不过hibernate分页的除外.使用HIBERNATE进行分页的时候,需要实现一个接口,将POJO转换成二维数组的形式.同时支持将已经读取到的数据在显示到表...  
阅读全文
			posted @ 
2006-02-16 10:09 snoics 阅读(2784) | 
评论 (4) | 
编辑 收藏
能实现整个网站的抓取,暂时还不支持javascript形式的连接
能抓取网页,网页中的所有的URL重新生成,图片,文件,包括所有格式的文件,全部都能保持原有的路径结构
抓取下的网页,通过apache搭建成网站,能在本地保持成一个完整的网站的形式
能直接使用,也能支持二次开发使用,不过暂时还会存在比较多的不完善的地方.
提供内置线程,能控制抓取操作执行的时间,循环执行
东西还不是很完善,欢迎大家提出意见
下载地址  http://www.blogjava.net/Files/snoics/snoics-reptile.rar
			posted @ 
2006-02-10 09:20 snoics 阅读(3003) | 
评论 (11) | 
编辑 收藏
			首先配置摸板
 <!-- 代理模板 -->
 <bean id="txProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
  <property name="transactionManager"><ref local="transactionManager"/></property>
  <property name="transactionAttributes">
      <props> 
                <prop key="*">PROPAGATION_REQUIRED</prop> 
            </props>
  </property>
 </bean>
摸板配置好以后,每次要添加一个新的代理,只需要类似下面这样添加
 <bean id="servicerProxy" parent="txProxy"> 
        <property name="target">
              <ref local="serviceTarget"/>
        </property>
    </bean>
从而大大简化了代理的配置
			
posted @ 
2005-12-13 10:25 snoics 阅读(652) | 
评论 (0) | 
编辑 收藏--角色继承关系表
create table SNOICS_RI  (
   RI_PARE_ROLEID       VARCHAR2(32)                    not null,
   RI_CHILD_ROLEID      VARCHAR2(32)                    not null,
   constraint PK_SNOICS_RI primary key (RI_PARE_ROLEID, RI_CHILD_ROLEID)
);
--角色表
create table SNOICS_ROLE  (
   ROLE_ID              VARCHAR2(32)                    not null,
   ROLE_NAME            VARCHAR2(32)                    not null,
   ROLE_FORBID          VARCHAR2(1),
   ROLE_DESCRIPT        VARCHAR2(500),
   constraint PK_SNOICS_ROLE primary key (ROLE_ID)
);
角色资料存放在SNOICS_ROLE中
角色之间可以继承,而且可以多重继承,
角色的继承关系存放在SNOICS_RI
可以使用SNOICS_ROLE自己到自己的多对多的关系来进行配置
-----------------------------------------------------------------------------------------------------
POJO:
package com.snoics.cmp.security.dao.spring.hibernate.pojo;
import java.io.Serializable;
import java.util.Set;
public class RolePOJO implements Serializable {
 private static final long serialVersionUID = -4776193447586778294L;
 private String roleid;
 private String rolename;
 private String roleforbid;
 private String roledescript;
 
 private Set user;
 private Set rolePermission;
 private Set roleP;
 private Set roleC;
 /**
  * @return Returns the roleC.
  */
 public Set getRoleC() {
  return roleC;
 }
 /**
  * @param roleC The roleC to set.
  */
 public void setRoleC(Set roleC) {
  this.roleC = roleC;
 }
 /**
  * @return Returns the roleP.
  */
 public Set getRoleP() {
  return roleP;
 }
 /**
  * @param roleP The roleP to set.
  */
 public void setRoleP(Set roleP) {
  this.roleP = roleP;
 }
 /**
  * @return Returns the rolePermission.
  */
 public Set getRolePermission() {
  return rolePermission;
 }
 /**
  * @param rolePermission The rolePermission to set.
  */
 public void setRolePermission(Set rolePermission) {
  this.rolePermission = rolePermission;
 }
 /**
  * @return Returns the user.
  */
 public Set getUser() {
  return user;
 }
 /**
  * @param user The user to set.
  */
 public void setUser(Set user) {
  this.user = user;
 }
 /**
  * @return Returns the roledescript.
  */
 public String getRoledescript() {
  return roledescript;
 }
 /**
  * @param roledescript The roledescript to set.
  */
 public void setRoledescript(String roledescript) {
  this.roledescript = roledescript;
 }
 /**
  * @return Returns the roleforbid.
  */
 public String getRoleforbid() {
  return roleforbid;
 }
 /**
  * @param roleforbid The roleforbid to set.
  */
 public void setRoleforbid(String roleforbid) {
  this.roleforbid = roleforbid;
 }
 /**
  * @return Returns the roleid.
  */
 public String getRoleid() {
  return roleid;
 }
 /**
  * @param roleid The roleid to set.
  */
 public void setRoleid(String roleid) {
  this.roleid = roleid;
 }
 /**
  * @return Returns the rolename.
  */
 public String getRolename() {
  return rolename;
 }
 /**
  * @param rolename The rolename to set.
  */
 public void setRolename(String rolename) {
  this.rolename = rolename;
 }
}
-----------------------------------------------------------------------------------------------------
role.hbm.xml中的继承关系部分的配置
  <set name="roleP" table="SNOICS_RI" cascade="all" inverse="false" lazy="true">
       <key column="RI_CHILD_ROLEID"/>
      <many-to-many column="RI_PARE_ROLEID" class="com.snoics.cmp.security.dao.spring.hibernate.pojo.RolePOJO"/>
  </set>
  <set name="roleC" table="SNOICS_RI" cascade="all" inverse="false" lazy="true">
     <key column="RI_PARE_ROLEID"/>
     <many-to-many column="RI_CHILD_ROLEID" class="com.snoics.cmp.security.dao.spring.hibernate.pojo.RolePOJO"/>
  </set>
			posted @ 
2005-12-12 16:28 snoics 阅读(707) | 
评论 (1) | 
编辑 收藏