
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 閱讀(12401) |
評論 (7) |
編輯 收藏

2010年7月26日
摘要: 基于自己的興趣,利用業務時間在Lucene基礎上做的一個搜索框架,請大家多多指教。
一、 介紹
基于Lucene的全文檢索框架,提供快速方便的索引創建及查詢方式,并提供擴展功能對框架進行擴展。
&nbs...
閱讀全文
posted @
2010-07-26 08:06 snoics 閱讀(2759) |
評論 (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
將下面這段代碼編譯后執行:
1
package test;
2
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.List;
6
7
8
/** *//**
9
* Descript:
10
*
11
*
12
*/
13
14
public 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 閱讀(8471) |
評論 (13) |
編輯 收藏

2008年4月24日
“不要重新發明輪子?。?!”
乍聽之下,這一句話似乎是很有道理。確實在很多情況下,這句話是很有道理??墒鞘獠恢谶@一句冠冕堂皇的理由下,有多少的創意、多少的激情被抹殺了?
在很多情況下,有些中國的程序員只要自己想做一些有創造性的工作,確總是被上級或其他的某些同行嘲笑“你要做的這個東西已經有現成的了,有必要再花時間去做嗎?你能做的比別人做出來的東西更好嗎?你這是在重新發明輪子,而且是不好的輪子。”
結果,一個接著一個的萌芽被‘不要重新發明輪子’這個古訓扼殺了。
想起來真是覺得很悲哀也很無奈,中國的程序員永遠只能使用外國人的技術,甚至其中有不少都是已經快要過時了才開始在中國普及開。一個接著一個的流行框架在國外的人手中產生出來,為什么他們就可以重新發明輪子,而我們就不行呢?死守古訓導致的唯一的結果就是無法進步,永遠只能使用別人的東西,最多就是羅列了一堆會使用的框架,真正的技術都是掌握在別人的手里。
有一次面試,簡歷上列出了會使用:JSF,SPRING,HIBERNATE(還有不少其他的,具體的記不太清了),而且已經參與開發過了兩個WEB類型的項目,并且已經通過了SCJP認證。結果確連幾種List的區別,HashTable和HashMap的區別都分不清,設計模式方面更是慘不忍睹,甚至更不可思議的是連使用HTML語法畫出一個稍顯復雜的表格都辦不到?;卮鹗牵阂驗槎际鞘褂每蚣芎涂蚣芴峁┑臉撕?,所以不需要接觸這些……
還是那句話:有時候是該反省反省,除了框架,自己還剩下什么?
posted @
2008-04-24 12:52 snoics 閱讀(1818) |
評論 (2) |
編輯 收藏

2008年3月25日
摘要:
數據分頁顯示是一項挺煩人的工作,涉及到數據來源,數據生成,數據顯示這幾個方面。數據有可能是從任意地方以任意方式獲取到的,而且獲取到的數據又有可能是經過了任意的方式處理之后,再以任意的方式顯示給最終用戶。
這...
閱讀全文
posted @
2008-03-25 11:39 snoics 閱讀(2949) |
評論 (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 閱讀(1761) |
評論 (0) |
編輯 收藏
IE有時會在打開一些頁面時出現
此對話框出現錯誤。
錯誤:53
存儲空間不足,無法完成此操作
的錯誤提示框,導致頁面最終無法打開
經過很長時間,終于發現在IE7中解決這個問題的解決方法
在IE7中進行如下操作:
Tools-->Internet Options-->Programs-->Advanced-->Reset-->Reset
這樣講IE7中的各項配置,包括插件全部都恢復到IE7剛安裝完時的最初始化的狀態,之前的那個錯誤也解決了。
posted @
2008-03-24 20:38 snoics 閱讀(6119) |
評論 (5) |
編輯 收藏

2007年11月25日
迷惑了一段時間,現在終于想通了,還是繼續以前的執著,繼續朝以前的那個目標不斷努力吧。差點就放棄了,不過還是終于還是又回來了。
一定要,也一定會變得更強,對自己有信心 ^_^
posted @
2007-11-25 18:51 snoics 閱讀(1083) |
評論 (2) |
編輯 收藏

2006年8月19日
??? 有些人說不知道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.tkk7.com/Files/snoics/snoics-systemconfig.rar
posted @
2006-08-19 14:30 snoics 閱讀(1562) |
評論 (0) |
編輯 收藏

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 閱讀(4524) |
評論 (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 閱讀(2810) |
評論 (3) |
編輯 收藏

2006年3月9日
現在各種各樣的框架滿天飛,幾乎隨便找個人都能把各種框架,模式,說的頭頭是道.弄的好象如果不懂這些,你就是落伍,就不懂的什么是編程,什么是企業應用系統的開發.
現在很多初學者一上來,就是這個框架,那個框架的,一會學了這個一會又學那個,往往忽略了最重要最基本的JAVA基礎.
個人認為,框架不等同于JAVA,它只是JAVA下面的一種工具,就算學會使用再多的框架也不代表就學會了JAVA.一種工具可能一開始不會用,可是如果重復使用過幾次,我想只要是正常的人,沒有人學不會的,就算是條件反射也該會了(會用了和理解了是兩種完全不同的情況).
結果也就出現了這樣的情況,問到一個挺簡單的問題,可是卻都答不上來,原因是原來都是在別人的或者是框架里面封裝好的東西,自己只是負責調用而已.
框架是比較容易過時的東西,只有基礎才是比較持久的.所以當在學會了使用一大堆的框架以后,請考慮一下,如果除了框架,我還剩下了什么.
只是對這種情況的感想,沒有任何貶低框架的意思.
posted @
2006-03-09 09:43 snoics 閱讀(2098) |
評論 (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 閱讀(3846) |
評論 (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 閱讀(4131) |
評論 (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 閱讀(1751) |
評論 (0) |
編輯 收藏