setTimeout(script,millisecond); 是從現在算起多少微秒后運行該代碼(只運行一次)
setInterval(script,millisecond); 是每隔多少微秒運行一次代碼
示例:
1.執行一次
<span id="time"></span> 秒
<script type="text/javascript">
var i = 1;
var txt = document.getElementById("time");
function addT(i) {
txt.innerHTML=i;
}
setTimeout("addT(i++)",1000);
</script>
2.復制執行
<span id="time">3</span> 秒
<script type="text/javascript">
var i = 1;
var txt = document.getElementById("time");
function addT(i) {
txt.innerHTML=i;
}
setInterval("addT(i++)",1000);
</script>
setTimeout也可以做成重復執行
<span id="time"></span> 秒
<script type="text/javascript">
var i = 1;
var txt = document.getElementById("time");
function addT(i) {
txt.innerHTML=i;
setTimeout("addT(i++)",1000);
}
addT(i);
</script>
posted @
2008-07-10 21:36 流浪汗 閱讀(1080) |
評論 (0) |
編輯 收藏
linux下的很軟件都是 tar.gz后綴的,解壓久了不用就忙了,寫備忘。現我知的直接解壓方法有兩種
1.gunzip與tar
gunzip < *.tar.gz | tar -xvf -
2.只用tar
tar -zxvf *.tar.gz
說明:
z表示:通過gzip指令處理備份文件
x表示:解壓
v表示:輸出解壓過程信息
f表示:指定備份文件
posted @
2008-07-08 11:14 流浪汗 閱讀(2531) |
評論 (0) |
編輯 收藏
solr 1.3 還沒有正式發布,在這里記錄下從solr 1.2的主要改動:
- solrj solr的java客戶端,可以嵌入搜索(不是http/xml交互)
- multi-core 多核心——1個web應用可以用多種的搜索服務,即可以多個schema.xml
- search components 搜索組件。
- distributed search 分布式搜索。
api的變動:
- org.apache.util 包下的大部分類移到org.apache.common.util包下面。
- org.apache.solr.request包下面的很多類移到org.apache.solr.common.params包下面。
- org.apache.solr.request.StandardRequestHandler 類改為 org.apache.solr.handler.StandardRequestHandler,同時它改為org.apache.solr.handler.SearchHandler的子類
- org.apache.solr.request.DisMaxRequestHandler 類改為 org.apache.solr.handler.DisMaxRequestHandler,同時不推薦在 StandardRequestHandler 的初始參數用'defType=dismax' 。
posted @
2008-07-08 10:20 流浪汗 閱讀(452) |
評論 (0) |
編輯 收藏
solr 分布式其實是分發,這概念像Mysql的復制。所有的索引的改變都在主服務器里,所有的查詢都在從服務里。從服務器不斷地(定時)從主服務器拉內容,以保持數據一致。
先描述下我的環境:
solr-master(192.168.1.181), solr-slave(192.168.1.155), jdke1.6.0_06, tomcat-5.5.26, solr-1.2
tomcat_home在 /home/chenlb/tomcat-5.5.26
solr_home在 /home/chenlb/solr-home
solr解壓后的目錄 /home/chenlb/solr-1.2.0
最好兩機可以ssh無密碼交互,ssh無密碼登錄請看:
http://www.tkk7.com/chenlb/archive/2008/07/03/212293.html
solr的分發是用rsync的。
快照與分發過程:
1.
snapshooter 命令在主服務器產生快照。一般在commit和optimize之后被solr調用。
2.
snappuller 命令在從服務器運行,所做的事是從主服務器拉最新的快照。 用rsync的daemon模式來運行可以獲得更好的性能與更底的CPU利用率。
3.
snapinstaller 命令在從服務器運行,當從服務器從主服務器拉完快照后才執行。它會通知本地Solr服務器打開一個新的index reader,然后預熱這個新index reader的緩存,此時有請求,原來的index reader繼續為這此請求服務。一但預熱完成,Solr 啟用新的index reader,舊的被消亡。
Solr 的Distribution(分發) 在Scripts文件里記錄。在solr_home/conf/scripts.conf文件里。
我現在這樣配置:
user=chenlb
solr_hostname=localhost
solr_port=8080
rsyncd_port=18080
data_dir=/home/chenlb/solr-home/data
webapp_name=solr
master_host=192.168.1.181
master_data_dir=/home/chenlb/solr-home/data
master_status_dir=/home/chenlb/solr-home/logs
上面的配置兩機都一樣。
1.安裝好solr后啟動它們,怎樣在tomcat安裝solr請看:
http://www.tkk7.com/chenlb/archive/2008/03/25/188459.html
[chenlb@solr-master ~]$ ./tomcat-5.5.26/bin/startup.sh
啟用且啟動rsync
[chenlb@solr-master ~]$ ./solr-home/bin/rsyncd-enable -u chenlb -v
[chenlb@solr-master ~]$ ./solr-home/bin/rsyncd-start -u chenlb -v
[chenlb@solr-slave ~]$ ./tomcat-5.5.26/bin/startup.sh
2.solr-master
先修改post.sh
[chenlb@solr-master ~]$ cd solr-1.2.0/example/exampledocs/
[chenlb@solr-master exampledocs]$ vi post.sh
[chenlb@solr-master exampledocs]$
#把http://localhost:8389/solr/update改下面的
http://localhost:8080/solr/update
提交數據
[chenlb@solr-master exampledocs]$ ./post.sh *.xml
產生快照
[chenlb@solr-master ~]$ ./solr-home/bin/snapshooter -u chenlb -v
說明:由于<listener event="postCommit" class="solr.RunExecutableListener">...</listener>沒有設置成功(出現java.io.IOException: Cannot run program "snapshooter" (in directory "solr/bin"): java.io.IOException: error=2, No such file or directory,現在還沒解決),可以只能手動生成快照(當然也可以cron)
3.solr-slave
啟用快照下拉
[chenlb@solr-slave ~]$ ./solr-home/bin/snappuller-enable -u chenlb -v
拉快照
[chenlb@solr-slave ~]$ ./solr-home/bin/snappuller -u chenlb -v
安裝
[chenlb@solr-slave ~]$ ./solr-home/bin/snapinstaller -u chenlb -v
現在可以在solr-slave里看結果了:
http://192.168.1.155:8080/solr/select?q=solr
http://192.168.1.181:8080/solr/select?q=solr
看結果是否一樣。
posted @
2008-07-04 16:49 流浪汗 閱讀(3166) |
評論 (0) |
編輯 收藏
由于svn服務器的調整,很多項目里的鏈接還是舊的服務器,又由于項目里有些東西還沒有提交,所不能刪除svn的元數據,怎樣才能適應svn的遷移呢?
我的項目全在Eclipse下面,用subclipse客戶端,在subclipse找了好久沒找到此功能,最后在TortoiseSVN找,找到了右擊本地與svn相連的目錄-->"TortoiseSVN"-->"Reloate..."在to URL那改就行了。^_^
subclipse遠不如TortoiseSVN強大,且它還依賴TortoiseSVN——如果沒有TortoiseSVN,subclipse不能保存密碼。
posted @
2008-07-04 11:06 流浪汗 閱讀(1524) |
評論 (1) |
編輯 收藏
ssh 無密碼登錄要使用公鑰與私鑰。linux下可以用用ssh-keygen生成公鑰/私鑰對,下面我以CentOS為例。
有機器A(192.168.1.155),B(192.168.1.181)。現想A通過ssh免密碼登錄到B。
1.在A機下生成公鑰/私鑰對。
[chenlb@A ~]$ ssh-keygen -t rsa -P ''
-P表示密碼,-P '' 就表示空密碼,也可以不用-P參數,這樣就要三車回車,用-P就一次回車。
它在/home/chenlb下生成.ssh目錄,.ssh下有id_rsa和id_rsa.pub。
2.把A機下的id_rsa.pub復制到B機下,在B機的.ssh/authorized_keys文件里,我用scp復制。
[chenlb@A ~]$ scp .ssh/id_rsa.pub chenlb@192.168.1.181:/home/chenlb/id_rsa.pub
chenlb@192.168.1.181's password:
id_rsa.pub 100% 223 0.2KB/s 00:00
由于還沒有免密碼登錄的,所以要輸入密碼。
3.B機把從A機復制的id_rsa.pub添加到.ssh/authorzied_keys (
打錯了,使用下面的代碼塊)文件里。
[chenlb@B ~]$ cat id_rsa.pub >> .ssh/authorized_keys
[chenlb@B ~]$ chmod 600 .ssh/authorized_keys
authorized_keys的權限要是600。
4.A機登錄B機。
[chenlb@A ~]$ ssh 192.168.1.181
The authenticity of host '192.168.1.181 (192.168.1.181)' can't be established.
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.181' (RSA) to the list of known hosts.
Last login: Thu Jul 3 09:53:18 2008 from chenlb
[chenlb@B ~]$
第一次登錄是時要你輸入yes。
現在A機可以無密碼登錄B機了。
小結:登錄的機子可有私鑰,被登錄的機子要有登錄機子的公鑰。這個公鑰/私鑰對一般在私鑰宿主機產生。上面是用rsa算法的公鑰/私鑰對,當然也可以用dsa(對應的文件是id_dsa,id_dsa.pub)
想讓A,B機無密碼互登錄,那B機以上面同樣的方式配置即可。
參考:SSH-KeyGen 的用法
http://blog.163.com/chen98_2006@126/blog/static/158584272007101862513886/
posted @
2008-07-03 12:19 流浪汗 閱讀(13739) |
評論 (3) |
編輯 收藏
我用CentOS為例。
簡介:
cron來源于希臘單詞chronos(意為“時間”),是linux系統下一個自動執行指定任務的程序。例如,你想在每晚睡覺期間創建某些文件或文件夾的備份,就可以用cron來自動執行。
CentOS的cron默認是開機啟動的,如果沒有開機啟動可以用chkconfig
[root@chenlb-pc ~]# chkconfig crond on
查看crond是否開機啟動
[root@chenlb-pc ~]# chkconfig --list crond
crond 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
說明已經是開機啟動。
cron是執行crontab里的任務,所以要把任務加到crontab里。
1.查看當前用戶的任務。
[chenlb@chenlb-pc ~]$ crontab -l
no crontab for chenlb
現在還沒有任務,可以用crontab -e來編輯任務(可以直接輸入crontab是新建,然后回車,Ctrl+D保存,注意這樣會覆蓋以前的,不建議直接用crontab),然后再新的文件里輸入以下內容。
2.編輯任務
[chenlb@chenlb-pc ~]$ crontab -e
*/1 * * * * echo `date` >> /home/chenlb/cron-log.txt
上面的意思是指每一分鐘打印時間放到/home/chenlb/cron-log.txt文件里,過一分鐘后看是否有效,如下命令。
[chenlb@chenlb-pc ~]$ tail /home/chenlb/cron-log.txt
Wed Jul 2 15:43:01 CST 2008
3.刪除任務
[chenlb@chenlb-pc ~]$ crontab -r
說明:如果是root除了有以上的功能,還有-u參數為用戶查看、編輯、刪除任務,如用chenlb編輯任務。
[root@chenlb-pc ~]# crontab -u chenlb -e
解說下任務的語法:
min hour day month week user command
忽略用“*”,每多少的用“/多少”,多個的用“,”,到關系的用“-”
---------------------------------來自htmlor's blog的示例----------------------------------------------
以下是cron語句中的字段與字段說明:
字段 |
說明 |
1 |
分鐘(0-59) |
2 |
小時(2-24) |
3 |
日期(1-31) |
4 |
月份(1-12;或英文縮寫Jan、Feb等) |
5 |
周幾(0-6,0為周日;或單詞縮寫Sun、Mon等) |
6 |
用戶名(執行命令時以此用戶的身份) |
7 |
要執行的命令(路徑) |
|
|
現在來看第一行:
12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
這條語句將在每天的凌晨3點12分(03:12)運行 tar czf /usr/local/backups/daily/etc.tar.gz /etc
命令。>> /dev/null 2>&1
表示把所有標準輸出發送到 /dev/null(linux的回收站),把標準錯誤輸出(2)發送到和標準輸出(1)同樣的地方(即 /dev/null)。運行這行命令將不會產生任何輸出。
這條語句可以變得稍微復雜一點:
30 15 13 6 1 * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
它將在6月13日周一的15:30運行 tar czf /usr/local/backups/daily/etc.tar.gz /etc
命令。
以下語句可以達到同樣的效果:
30 15 13 Jun Mon * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
如果你想以用戶joey的身份每小時的第15分鐘運行某個程序,可以使用:
15 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
其中的星號(*)是通配符,表示cron將忽略這個字段。
如果你想每兩小時就運行某個程序,可以在小時字段里使用 */2
。它將會在2點,4點,6點……22點,24點運行。具體語句如下:
0 */2 * * * joey /usr/bin/somecommand >> /dev/null 2>&1
cron語句中還可以使用逗號(,)來指定多個時間。例如你想在每小時的15分和30分運行某個程序,可以在分鐘字段使用 15,30
:
15,30 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
如果你想在每月的第一周(即1號到7號)每天的指定時間運行某個程序,可以在日期字段使用 1-7
:
15,30 */2 1-7 * * joey /usr/bin/somecommand >> /dev/null 2>&1
這條語句將在每月的第1-7日每兩小時的15分和30分(02:15,02:30……22: 15,22:30等)運行 /usr/bin/somecommand
命令。
如果你想在每天的16:18執行一個腳本集合,可以把所有要執行的腳本放到一個目錄中(如 /home/username/cron),可以使用:
18 16 * * * root run-parts /home/username/cron >> /dev/null 2>&1
如果你想保存某個程序的輸出結果, 可以把 >> /dev/null 2>&1
替換為 >> /home/user/somecommand.log 2>&1
。
參考:
http://blog.htmlor.com/2006/07/25/cron_guide/
posted @
2008-07-02 16:23 流浪汗 閱讀(5387) |
評論 (0) |
編輯 收藏
Solr 涉及的術語,簡單介紹下:
- Auto-warming(自動預熱) 當打開一個新的緩存時,它把在舊緩存里命中較高的鍵/值添加到新的緩存里。
- Constraint(限制) 限制對象集的方法。
- Facet(層面) 對象集的一個方面或特定的一部分,這可以用來資源分類。
- Filter(過慮器) 它由上下方決定,可能是:
1. Constraint(限制)的那稱呼。
2. 限制查詢結果的"fq"參數。
3. 涉及特定的Lucene的"Filter"類。
- Solr Home Dir(Solr主目錄) 又叫Solr Home Directory或Solr Home,它是Solr查找配置文件、數據、插件的主要目錄,默認是./solr目錄,可以JNDI配置solr/home屬性,也可配置系統的solr.solr.home屬性。
- Static warming(靜態預熱) 當newSearcher 和 firstSearcher 的事件監聽器強逼預熱事件時,Solr會根據solrconfig.xml配置里的"static"查詢來填充緩存。
來源:http://wiki.apache.org/solr/SolrTerminology
說的不對的地方,希望指出,一起學習。
posted @
2008-06-27 13:29 流浪汗 閱讀(470) |
評論 (0) |
編輯 收藏
兩字符串相似度計算方法有好多,現對基于編距的算法的相似度計算自己總結下。
簡單介紹下Levenshtein Distance(LD):LD 可能衡量兩字符串的相似性。它們的距離就是一個字符串轉換成那一個字符串過程中的添加、刪除、修改數值。
舉例:
- 如果str1="test",str2="test",那么LD(str1,str2) = 0。沒有經過轉換。
- 如果str1="test",str2="tent",那么LD(str1,str2) = 1。str1的"s"轉換"n",轉換了一個字符,所以是1。
如果它們的距離越大,說明它們越是不同。
Levenshtein distance最先是由俄國科學家Vladimir Levenshtein在1965年發明,用他的名字命名。不會拼讀,可以叫它edit distance(編輯距離)。
Levenshtein distance可以用來:
- Spell checking(拼寫檢查)
- Speech recognition(語句識別)
- DNA analysis(DNA分析)
- Plagiarism detection(抄襲檢測)
LD用m*n的矩陣存儲距離值。算法大概過程:
- str1或str2的長度為0返回另一個字符串的長度。
- 初始化(n+1)*(m+1)的矩陣d,并讓第一行和列的值從0開始增長。
- 掃描兩字符串(n*m級的),如果:str1[i] == str2[j],用temp記錄它,為0。否則temp記為1。然后在矩陣d[i][j]賦于d[i-1][j]+1 、d[i][j-1]+1、d[i-1][j-1]+temp三者的最小值。
- 掃描完后,返回矩陣的最后一個值即d[n][m]
最后返回的是它們的距離。怎么根據這個距離求出相似度呢?因為它們的最大距離就是兩字符串長度的最大值。對字符串不是很敏感。現我把相似度計算公式定為1-它們的距離/字符串長度最大值。
源碼:
package com.chenlb.algorithm;
/**
* 編輯距離的兩字符串相似度
*
* @author chenlb 2008-6-24 下午06:41:55
*/
public class Similarity {
private int min(int one, int two, int three) {
int min = one;
if(two < min) {
min = two;
}
if(three < min) {
min = three;
}
return min;
}
public int ld(String str1, String str2) {
int d[][]; //矩陣
int n = str1.length();
int m = str2.length();
int i; //遍歷str1的
int j; //遍歷str2的
char ch1; //str1的
char ch2; //str2的
int temp; //記錄相同字符,在某個矩陣位置值的增量,不是0就是1
if(n == 0) {
return m;
}
if(m == 0) {
return n;
}
d = new int[n+1][m+1];
for(i=0; i<=n; i++) { //初始化第一列
d[i][0] = i;
}
for(j=0; j<=m; j++) { //初始化第一行
d[0][j] = j;
}
for(i=1; i<=n; i++) { //遍歷str1
ch1 = str1.charAt(i-1);
//去匹配str2
for(j=1; j<=m; j++) {
ch2 = str2.charAt(j-1);
if(ch1 == ch2) {
temp = 0;
} else {
temp = 1;
}
//左邊+1,上邊+1, 左上角+temp取最小
d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp);
}
}
return d[n][m];
}
public double sim(String str1, String str2) {
int ld = ld(str1, str2);
return 1 - (double) ld / Math.max(str1.length(), str2.length());
}
public static void main(String[] args) {
Similarity s = new Similarity();
String str1 = "chenlb.blogjava.net";
String str2 = "chenlb.javaeye.com";
System.out.println("ld="+s.ld(str1, str2));
System.out.println("sim="+s.sim(str1, str2));
}
}
不知sim方法中的公式是合理,個人認為差強人意思,^_^
參考: http://www.merriampark.com/ld.htm
posted @
2008-06-25 10:08 流浪汗 閱讀(3833) |
評論 (2) |
編輯 收藏
發現中國科學技術大學有快速的CentOS的鏡像。具體設置如下:
1.以root用戶進入CentOS系統。
[root@chenlb ~]# cd /etc/yum.repos.d
2.備份repo
[root@chenlb yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.save
3.從USTC下載新的repo
[root@chenlb yum.repos.d]# wget http://centos.ustc.edu.cn/CentOS-Base.repo
現在可以yum了。^_^
鏈接:
http://centos.ustc.edu.cn/
posted @
2008-06-24 23:45 流浪汗 閱讀(1521) |
評論 (2) |
編輯 收藏