随笔-26  评论-111  文章-19  trackbacks-0
  2006年3月9日
在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 -"s/ /_/g"`


修改成以下的内容即可

JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m -classpath ${HADOOP_COMMON_HOME}/hadoop-common-0.21.0.jar org.apache.hadoop.util.PlatformName | sed -"s/ /_/g"`


posted @ 2010-09-29 17:03 snoics 阅读(12347) | 评论 (7)编辑 收藏
    下载地址:http://code.google.com/p/snoics-retrieval/

    版本更新说明

V1.01

                1、提高创建索引的效率

         2、通过对象池管理IndexWriterIndexReader对象

         3、修正若干BUG

V1.0

         初始版本



基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。

    项目地址:http://code.google.com/p/snoics-retrieval/

    

   环境要求

Java1.5+

Lucene 3.0+



posted @ 2010-09-28 16:33 snoics 阅读(2386) | 评论 (1)编辑 收藏


做了一些小的修改和调整

基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。

    项目地址:http://code.google.com/p/snoics-retrieval/

    

环境要求

Java1.5+

Lucene 3.0+

posted @ 2010-08-18 15:00 snoics 阅读(2075) | 评论 (0)编辑 收藏
     摘要:        对四则运算表达式字符串进行解析后计算出结果,可以使用逆波兰表达式进行处理。        首先说明一下什是逆波兰表达式:         逆波兰表达式又叫做后缀表达...  阅读全文
posted @ 2010-07-29 17:44 snoics 阅读(3384) | 评论 (2)编辑 收藏
     摘要:         基于自己的兴趣,利用业务时间在Lucene基础上做的一个搜索框架,请大家多多指教。 一、        介绍 基于Lucene的全文检索框架,提供快速方便的索引创建及查询方式,并提供扩展功能对框架进行扩展。  &nbs...  阅读全文
posted @ 2010-07-26 08:06 snoics 阅读(2750) | 评论 (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

    将下面这段代码编译后执行:

    
 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)编辑 收藏

        “不要重新发明轮子!!!”

        乍听之下,这一句话似乎是很有道理。确实在很多情况下,这句话是很有道理。可是殊不知在这一句冠冕堂皇的理由下,有多少的创意、多少的激情被抹杀了?

        在很多情况下,有些中国的程序员只要自己想做一些有创造性的工作,确总是被上级或其他的某些同行嘲笑“你要做的这个东西已经有现成的了,有必要再花时间去做吗?你能做的比别人做出来的东西更好吗?你这是在重新发明轮子,而且是不好的轮子。”

        结果,一个接着一个的萌芽被‘不要重新发明轮子’这个古训扼杀了。

        想起来真是觉得很悲哀也很无奈,中国的程序员永远只能使用外国人的技术,甚至其中有不少都是已经快要过时了才开始在中国普及开。一个接着一个的流行框架在国外的人手中产生出来,为什么他们就可以重新发明轮子,而我们就不行呢?死守古训导致的唯一的结果就是无法进步,永远只能使用别人的东西,最多就是罗列了一堆会使用的框架,真正的技术都是掌握在别人的手里。

         有一次面试,简历上列出了会使用:JSF,SPRING,HIBERNATE(还有不少其他的,具体的记不太清了),而且已经参与开发过了两个WEB类型的项目,并且已经通过了SCJP认证。结果确连几种List的区别,HashTable和HashMap的区别都分不清,设计模式方面更是惨不忍睹,甚至更不可思议的是连使用HTML语法画出一个稍显复杂的表格都办不到。回答是:因为都是使用框架和框架提供的标签,所以不需要接触这些……

        还是那句话:有时候是该反省反省,除了框架,自己还剩下什么?



posted @ 2008-04-24 12:52 snoics 阅读(1809) | 评论 (2)编辑 收藏
     摘要:           数据分页显示是一项挺烦人的工作,涉及到数据来源,数据生成,数据显示这几个方面。数据有可能是从任意地方以任意方式获取到的,而且获取到的数据又有可能是经过了任意的方式处理之后,再以任意的方式显示给最终用户。         这...  阅读全文
posted @ 2008-03-25 11:39 snoics 阅读(2940) | 评论 (3)编辑 收藏
IE有时会在打开一些页面时出现

此对话框出现错误。

错误:53
存储空间不足,无法完成此操作


的错误提示框,导致页面最终无法打开


经过很长时间,终于发现在IE7中解决这个问题的解决方法

在IE7中进行如下操作:

Tools-->Internet Options-->Programs-->Advanced-->Reset-->Reset

这样讲IE7中的各项配置,包括插件全部都恢复到IE7刚安装完时的最初始化的状态,之前的那个错误也解决了。



posted @ 2008-03-24 20:38 snoics 阅读(6102) | 评论 (5)编辑 收藏
        迷惑了一段时间,现在终于想通了,还是继续以前的执着,继续朝以前的那个目标不断努力吧。差点就放弃了,不过还是终于还是又回来了。

        一定要,也一定会变得更强,对自己有信心    ^_^

posted @ 2007-11-25 18:51 snoics 阅读(1068) | 评论 (2)编辑 收藏
    
           最近因为工作太忙的原因,一直没有时间来更新,现在放出2.1的版本(包含最新的源代码)。

        下载地址:
                         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 阅读(4808) | 评论 (21)编辑 收藏
发现猫扑的电台不错,把它作成遨游的插件了,放上来与大家分享。

下载以后把文件解压到遨游的插件目录下,就会在侧边拦出现MOP的电台,用起来很方便。


http://www.blogjava.net/Files/snoics/MOP.rar
posted @ 2006-09-06 19:28 snoics 阅读(1289) | 评论 (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 阅读(1552) | 评论 (0)编辑 收藏
源代码发布

snoics-reptile 网页爬虫2.0 
作者: 施伟
EMail: snoics@hotmail.com
主页: http://www.blogjava.net/snoics


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)编辑 收藏
snoics-reptile 网页爬虫2.0

作者: 施伟
EMail: snoics@hotmail.com
主页: http://www.blogjava.net/snoics


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)编辑 收藏
     现在各种各样的框架满天飞,几乎随便找个人都能把各种框架,模式,说的头头是道.弄的好象如果不懂这些,你就是落伍,就不懂的什么是编程,什么是企业应用系统的开发.

     现在很多初学者一上来,就是这个框架,那个框架的,一会学了这个一会又学那个,往往忽略了最重要最基本的JAVA基础.
    
     个人认为,框架不等同于JAVA,它只是JAVA下面的一种工具,就算学会使用再多的框架也不代表就学会了JAVA.一种工具可能一开始不会用,可是如果重复使用过几次,我想只要是正常的人,没有人学不会的,就算是条件反射也该会了(会用了和理解了是两种完全不同的情况).

     结果也就出现了这样的情况,问到一个挺简单的问题,可是却都答不上来,原因是原来都是在别人的或者是框架里面封装好的东西,自己只是负责调用而已.

     框架是比较容易过时的东西,只有基础才是比较持久的.所以当在学会了使用一大堆的框架以后,请考虑一下,如果除了框架,我还剩下了什么.

     只是对这种情况的感想,没有任何贬低框架的意思.
posted @ 2006-03-09 09:43 snoics 阅读(2087) | 评论 (4)编辑 收藏