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 流浪汗 阅读(1070) |
评论 (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 流浪汗 阅读(2510) |
评论 (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 流浪汗 阅读(440) |
评论 (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.blogjava.net/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.blogjava.net/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 流浪汗 阅读(3151) |
评论 (0) |
编辑 收藏
由于svn服务器的调整,很多项目里的链接还是旧的服务器,又由于项目里有些东西还没有提交,所不能删除svn的元数据,怎样才能适应svn的迁移呢?
我的项目全在Eclipse下面,用subclipse客户端,在subclipse找了好久没找到此功能,最后在TortoiseSVN找,找到了右击本地与svn相连的目录-->"TortoiseSVN"-->"Reloate..."在to URL那改就行了。^_^
subclipse远不如TortoiseSVN强大,且它还依赖TortoiseSVN——如果没有TortoiseSVN,subclipse不能保存密码。
posted @
2008-07-04 11:06 流浪汗 阅读(1516) |
评论 (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 流浪汗 阅读(13712) |
评论 (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 流浪汗 阅读(5367) |
评论 (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 流浪汗 阅读(466) |
评论 (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 流浪汗 阅读(3823) |
评论 (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 流浪汗 阅读(1499) |
评论 (2) |
编辑 收藏