因为需要在两台机器上同步一些数据,在网上找了一下,发现 cwRsync 是可以的。尝试了一下
1、安装
安装的过程很简单,也很顺利,从 cwRsync 网站上下载的 server and client ,都安装了一下,不过后来发现,其实是不需要安装 client 的,只要 server 就可以了,server 包括了 client 的功能。安装完 server 后,会在 service 中增加 Rsync 和 ssh 服务。
2、配置
配置了一下 rsyncd.conf
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
pid file = rsyncd.pid
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[test]
path = /cygdrive/c/work
read only = false
transfer logging = yes
只是将 [test] 中的 path 改成了我本机的备份目录
[test]
path = /cygdrive/d/backup
read only = false
transfer logging = yes
3、数据同步
因为只是最简单的数据同步,所以就不使用 ssh 了,直接启动 rsync 服务就可以了。然后按照 usage 上面教的。
rsync -av /cygdrive/d/test localhost::test
完成了数据的同步工作,一切顺利。顺便说一下,/cygdrive/d 是安装完 cwRsync ,会自动将系统上所有的盘 mount 成 /cygdrive/x ,x 表示盘符,小写的,并把安装目录 mount 成 / 了。
4、绿色安装
我将 cwRsync copy 到另一台机器上,试图不安装就启动 cwRsync server,启动过程比较正常,只要运行 rsync --config=$config_file --daemon --no-detach 就可以了,这里面的 $config_file 指的是前面配置的 rsyncd.conf ,路径要写成 /cygdrive/d 这样的形式。
5、安装成服务
程序包中带了 cygwin 的 cygrunsrv ,可以通过这个命令将 rsync server 做成 windows 服务,但我试了一下,路径中有空格没有成功,命令是这样的
cygrunsrv.exe -I "Rsync" -p /cygdrive/d/cwRsyncServer/bin/rsync.exe -a "--config=/cygdrive/d/cwRsyncServer/rsyncd.conf --daemon --no-detach" -f "Rsync"
也很顺利的安装成服务了。
6、问题二
惨的是当我在第二台机器上同步数据的时候,权限却成了问题,同步过去的文件(目录)所有者是 SYSTEM,不是我,而且我没有访问的权限,只有在安全中把自己加进来(我用管理员帐户),给自己权限,才能访问。
或者在 cygwin 下使用 chmod 给自己授权,和在 windows 中给自己授权没什么区别。
最后:
问题2已经解决
方法:只要把 cwRsyncServer 这个目录 mount 到 / ,就可以了,估计是 rsync 同步数据的时候,会调用 /bin/chmod 来授权,如果是安装版的,这个目录会在安装的时候 mount 好。 (好象不是这个问题了)
posted @
2007-05-20 14:36 哈哈的日子 阅读(13861) |
评论 (2) |
编辑 收藏
PMD 在 check 的时候,告诉我不要使用 new Interger(int i) 方法,要使用 Integer.valueOf(int i) 方法,如我所料,Integer 将-128~127 之间的 Interger cache 了,好啊,就用这个方法了。
后来悲惨的发现,JDK 5.0 才有这个方法 1.4 中是没有的。
苦在我开发的时候使用的是 JDK 5.0 ,部署在 1.4 的环境中,运行出错。
sigh,不小心被 PMD 撞了一下,它怎么也不告诉我不能用在 1.4 里啊。^_^
posted @
2007-05-16 10:41 哈哈的日子 阅读(267) |
评论 (0) |
编辑 收藏
今天安装了一下 jira 的 svn acceptance,遇到了不少问题,实际上这些问题在之前学习 subversion hooks 的时候也有遇到,没记下,又弄一次,真是心烦得很。
1、hooks 中不能使用任何环境变量,svn acceptance 使用的是 pre-commit ,里面调用 python 的脚本。python 要写绝对路径,脚本 jira-client.py 也要写绝对路径,将 python 放在 path 中是没有用的。(这个在 svn acceptance 安装步骤中有,没有细看就安装,苦啊!)
2、pre-commit.bat 中路径或者使用老 DOS 的方式,如 @D:\Progra~1\Python25\python.exe" E:\SVN\repos\hooks\jira-client.py %1 %2。或者加上双引号,如@"D:\Program Files\Python25\python.exe" E:\SVN\repos\hooks\jira-client.py %1 %2
3、jira-client.py 中的路径也一样,或者使用 DOS,如 svnlookPath = 'D:\\Progra~1\\svn-win32-1.4.3\\bin\\svnlook.exe'。或者加上双引号,如svnlookPath = '"D:\\Program Files\\svn-win32-1.4.3\\bin\\svnlook.exe"'
4、hooks 中 exit 1 就是拒绝提交,exit 0 或什么都不写就是允许提交(windows 2000 中好象必须要 exit 0)
5、提交显示的错误信息在脚本中放在 system err 中,bat 文件只要 echo "haha" >&2 就可以了,python 中 print >> sys.stderr, 'haha' 就可以了
6、用户信息是通过 svnlook author 得到,注释信息是通过 svnlook log 得到
ps:subversion acceptance plugins 安装容易得很
posted @
2007-05-14 11:14 哈哈的日子 阅读(1376) |
评论 (0) |
编辑 收藏
奇怪为什么 fisheye 一直都找不到 crack?难道是我寻找 crack 的水平有限?
崩溃了,自己弄了一个,再这么下去,都要成愤青了。
fisheye-1.3_20070424_crack.rarcopy 到 fisheye 安装目录,针对 fisheye 1.3 build 20070424 版本
posted @
2007-05-13 22:53 哈哈的日子 阅读(2146) |
评论 (17) |
编辑 收藏
当数据库字段类型为 Number 时,IBatis 可以映射 Java 类型为 Integer,这样就一切没问题了。
不过这样比较麻烦,尤其是在使用 JDK 1.4 的时候。
如果选择映射为 int 类型,在数据库字段可以为 null 的情况下,需要设置 result 的 nullValue ,否则会出错。
posted @
2007-04-30 16:17 哈哈的日子 阅读(2032) |
评论 (0) |
编辑 收藏
6.0 的 crack 不能用了,就自己弄了一个 7.0 的 crack ,如果有什么问题,给我留言。
http://www.blogjava.net/Files/haha1903/jp7.0-crack-20070530.rar
crack by Sea Chang
posted @
2007-04-13 15:35 哈哈的日子 阅读(4605) |
评论 (21) |
编辑 收藏
教你如何注册msn.com的 邮箱
在很久很久以前,我们注册的时候,可以选择注册hotmail.com还是msn.com的信箱。而现在微软把注册页面改掉了,进入hotmail.com只能注册以hotmail.com结尾的信箱了,而msn.com则找不到北了。而很多很多人还是很想注一个msn.com的,好记嘛,这么短小精悍。
说了半天,到底怎么注册呢?简单!
点这个链接https://accountservices.passport.net/reg.srf?ns=msn.com
就可以注册msn.com的信箱啦,哈哈哈~~~
当然,如果你的电脑上装有msn browser的话,那用那个创建用户,就默认是msn.com的用户啦,不过好像那个玩儿在国内用的不多好像,我是两三年前用过的。
(提示:您必须在没用登陆 spaces或者 MSN hotmail油箱的前提下才可以申请 )
转自:
http://my.opera.com/hotel/blog/show.dml/112387
posted @
2007-04-11 20:13 哈哈的日子 阅读(9804) |
评论 (16) |
编辑 收藏
设置 Header Content-disposition 可以
如果设置为 attachment 就下载
如果设置为 inline 就直接打开
response.setContentType("application/msexcel");
加上
response.setHeader("Content-disposition", "attachment; filename=\"export.xls\"");
或
response.setHeader("Content-disposition", "inline; filename=\"export.xls\"");
posted @
2007-02-06 16:47 哈哈的日子 阅读(1234) |
评论 (2) |
编辑 收藏
背景:
EasyMock 2 版本必须要 JDK5 才能使用 EasyMock 1.2 可以在 JDK 1.4 使用
也可以使用 Retrotranslator 将 EasyMock 2 版本改为 JDK 1.4 也可以使用的。
目前使用的是 EasyMock 2.2
准备:先弄个接口 Haha 用来 Mock 的,两个方法
void haha(String s);
String hehe(String s);
开始 Mock:静态导入 EasyMockimport static org.easymock.EasyMock.*;
然后Haha haha=createMock(Haha.class);
无返回值的调用可以直接调用 Mock 方法
haha.haha("haha");
有返回值的可以
expect(haha.hehe("hehe")).andReturn("ok");
这样做完后你要 replay(haha); 一下,表示录完 mock ,准备重放了。
就可以调用 haha.haha("haha") 了,同样的,调用 haha.hehe("hehe") 的返回值是 "ok"
全部调用完了,使用 verify(haha); 查看一下预期的调用是不是都调了,如果预期要调用一次,却没调,那就会 AssertionError 哦。
调用次数上面这些都是默认调用一次,就相当于 expect(haha.hehe("hehe")).andReturn("ok").times(1); 或 expect(haha.hehe("hehe")).andReturn("ok").once();
如果想调用任意次,就 expect(haha.hehe("hehe")).andReturn("ok").anyTimes();
如果想最少调用一次,就 expect(haha.hehe("hehe")).andReturn("ok").atLeastOnce();
如果想调用 1 至 3 次,就 expect(haha.hehe("hehe")).andReturn("ok").times(1,3);
预期的结果
还可以 expect(haha.hehe("hehe")).andReturn("ok").andReturn("ok too").andThrow(new RuntimeException());
这样,第一次调用 haha.hehe("hehe") 时返回 "ok" ,第二次返回 "ok too",第三次调用就比较惨了,会抛出一个 RuntimeException,需要注意的是,如果抛出的异常是 unchecked 的,就是 Runtime 的,就随便抛,如果是 checked 的,那就一定要抛这个方法定义的,否则会在 andThrow 这行出 IllegalArgumentException 。
终极解决办法还可以使用 andAnswer(IAnswer<T> answer) 传一个实现 IAnswer 接口的实例,这个接口只有一个方法
T answer() throws Throwable;
随便你返回什么,或是抛出什么异常。
调用顺序不过如上面所说,haha.haha("haha") 与 haha.hehe("hehe") 是没有顺序的,将 createMock 改成 createStrictMock 或在 createMock 后面加一行 checkOrder(haha,true) 就可以了,这时,就一定要按照定义的顺序来调用了。
如果多个不同的 mock 也要保证顺序呢?那就不能使用 createMock 来创建这些 mock 了,因为每次 createMock 都会使用一个新的 IMocksControl 实例来单独控制这个 mock ,我们希望将多个 mock 用同一个 IMocksControl 控制,只需要
IMocksControl ctrl = createStrictControl();
Haha haha1= ctrl.createMock(Haha .class);
Haha haha2 = ctrl.createMock(Haha .class);
haha1.haha("haha1");
haha2.haha("haha2");
ctrl.replay();
就可以了
预期的参数
刚才 haha.haha("haha") 中的 "haha" 就是预期的参数,EasyMock 提供了很多预期参数的方法,比如 haha.haha(eq("haha")),与前面的方法功能完全一样
haha.haha((String)anyObject) 随便你传什么参数都没问题。
haha.haha(not(eq("haha"))) 这个只要不传 haha ,其它什么都成
同样可以自定义,只要调用 public static void reportMatcher(IArgumentMatcher matcher) 方法,将自定义的 IArgumentMatcher 传进去就可以了,这个接口有两个方法 boolean matches(Object argument) 和 void appendTo(StringBuffer buffer) 第一个方法的参数是调用实际传入的值,返回是否匹配,第二个方法是错误时向 buffer 中 append 错误信息。
将方法弄成 Stub
Stub 方法,我想应该就是随便调,爱怎么调就怎么调,返回的都是那个值,最后也不会验证到底调用了多少次。
如果想把一个方法弄成 Stub,无返回值的只要 asStub() 就是 expect(haha.haha("haha")).asStub() ,有返回值的就 andStubReturn() , andStubAnswer() 这样就可以了。
友好的Mock我们使用 createMock 创建出来的 mock 对象,如果没有录过,调用这个方法都会出 AssertionError ,但如果使用 createNiceMock 就不会了,会返回 0 , null , false 这样的。
posted @
2007-01-18 23:03 哈哈的日子 阅读(3062) |
评论 (5) |
编辑 收藏
RandomAccessFile file
=
new
RandomAccessFile(lockFile,
"
rw
"
);
FileChannel channel
=
file.getChannel();
FileLock tryLock
=
channel.tryLock();
System.out.println(
"
try lock ok
"
+
tryLock);
posted @
2007-01-17 09:34 哈哈的日子 阅读(391) |
评论 (0) |
编辑 收藏