随笔-153  评论-235  文章-19  trackbacks-0
 
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的主要改动:
  1. solrj     solr的java客户端,可以嵌入搜索(不是http/xml交互)
  2. multi-core     多核心——1个web应用可以用多种的搜索服务,即可以多个schema.xml
  3. search components    搜索组件。
  4. distributed search    分布式搜索。

api的变动:

  1. org.apache.util 包下的大部分类移到org.apache.common.util包下面。
  2. org.apache.solr.request包下面的很多类移到org.apache.solr.common.params包下面。
  3. org.apache.solr.request.StandardRequestHandler 类改为 org.apache.solr.handler.StandardRequestHandler,同时它改为org.apache.solr.handler.SearchHandler的子类
  4. 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就一次回车。
它在/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的矩阵存储距离值。算法大概过程:

  1. str1或str2的长度为0返回另一个字符串的长度。
  2. 初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
  3. 扫描两字符串(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三者的最小值。
  4. 扫描完后,返回矩阵的最后一个值即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)编辑 收藏
仅列出标题
共16页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last