标签归档:Open source

Subversion pre-commit hooks


pre-commit内容如下

#!/bin/sh

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -c`

if [ "$LOGMSG" -lt 5 ];
then
  echo -e "***** Comment must be at least 5 characters. *****" 1>&2
  exit 1
fi# All checks passed, so allow the commit.
exit 0

添加完成之后需要修改文件具备执行权限,否则会提示

svn: Commit blocked by pre-commit hook (exit code 255) with no output.

java.sql.Date.valueOf 使用注意事项


最近在帮同事解决了一个日期格式化的问题,总结如下,以飨读者。

java.sql.Date.valueOf()方法提供了把yyyy-mm-dd类型字符串转换成java.sql.Date类型的功能。但是在使用的时候有以下注意事项:

  1. valueOf参数必须是一个有效日期的yyyy-mm-dd格式类型的日期。
    在jdk1.4中,valueOf的参数可以设置为0000-00-00,jdk能够正确转换,不出现异常。但是在jdk 6中,使用该参数时提示IllegalArgumentException异常。修改为0001-01-01正常。
  2. valueOf参数必须严格符合yyyy-mm-dd格式。
    修正之前的代码通过Calendar类获得年月日,这时获得的年月日都是int类型的, 当月份和日小于10的时候是一位的,此时JDK源码中判断月、日位数的检查生效,不会再进行转换,直接抛出IllegalArgumentException异常。通过Calendar类获取年月日之后,要对不足位的字段进行补位,保证能够正常转换。

题外话:关于第二点问题,同事很疑惑为什么之前可以,现在不可以了。阅读jdk源代码并结合Bug发生的时间来看,没问题的时间2010年12月下旬,此时月、日都是两位;而出问题的时间是2011年1月上旬,月、日都不足位。通过这个经验教训来看系统边界测试有时候是很有必要的。

Linux平台的“ipmsg”——使用iptux与windows平台ipmsg通信


一直在寻找一个比较简单的方案,能够解决Ubuntu和Windows平台的ipmsg互相通信的问题,网上很多的观点都是编译g2ipmsg。试验过这种方法。

在我的Ubuntu系统上看不到用户列表,当然也就无法实现正常的通信功能了。

偶然发现iptux能够兼容windows的ipmsg,于是安装试验之,结论当然是简单好用!

安装方法:直接在新立得软件包管理器里搜索iptux,最新版本是0.5.1,安装即可。

打开防火墙的 TCP/UDP 2425 端口

然后打开主界面的Tools/Prefrences,在Network中添加网络范围,在System中设定编码为GBK,然后执行Tools里的Update,这样子就能看到局域网其他的用户了。

iptux还支持多种列表组织方式,通过主界面的左右箭头能够进行选择。

效果图

设置昵称

设置编码

设置网络范围

iptux官方主页:http://code.google.com/p/iptux/

发布自己的Spark版本


1. 安装客户端控制插件(Client Control),在这个插件的帮助下,我们可以把新的Spark版本上传到服务器,然后用户就会收到更新通知。

image

2. 增加自定义设置。
在Spark中指定聊天服务器地址:打开org.jivesoftware.resource包中的default.properties文件,设置HOST_NAME属性即可。
修改User Guide手册地址:org.jivesoftware.MainWindow中的viewHelpGuideAction内部类即可。
另外,还可以添加自定义的菜单等等。

3. 上面的修改完了之后,修改org.jivesoftware.sparkimpl.settings.JiveInfo中的版本号,使新创建的版本高于已经安装的版本。

关于版本号,Spark在判断自身的版本时,如果是beta版,版本号有一定的规则限制:最后一个小数点右边的版本只能是一位,如果是两位,也只会取出一位来。比如2.6.0.01 Beata 2,最后得到的版本号2.6.0.0,为了避免出现这个问题,一种方法就是把Beta字样从getVersion()方法的返回值里移除。这样版本比较的逻辑不会运行到会出问题的代码就返回结果了。另外一个就是修改问题代码——CheckUpdates的getVersion()方法
int lastIndexOf = version.lastIndexOf(“.”);
if (lastIndexOf != -1) {
return version.substring(0, lastIndexOf);
}
有兴趣的可以看看怎么改。

4. ant运行build.xml,编译,生成target目录。
build.xml存放在build目录下。

5. 下载install4j 4.0.8
地址:http://www.ej-technologies.com/download/install4j/version40.html

关于install4j,这是一个跨平台的编译平台,可以在windows, unix, linux, mac操作系统使用,他可以在这些平台上编译运行于windows, linux, unix, mac的安装包。在编译spark的时候,碰到了一点小问题,从网站上下载最新的install4j 4.2.4编译好了之后,在安装的最后一步会报java.lang.abstractMethodError错误。换成4.0.8版本的就好了。

6. 使用install4j打开Spark项目用spark.install4j文件。
该文件存放在buildinstaller

7. 在install4j中下载JRE,并指定安装包使用的JRE版本。
下载JRE,找到Download按钮,一步步执行就可以了。
下载完了之后,在Media选项卡中设置Windows和Unix Archive用到JRE。如下图
image
8. 修改install4j项目设置中的版本号
org.jivesoftware.sparkimpl.settings.JiveInfo的getVersion()方法返回的版本需要和install4j的版本号一致。
客户端在判断是否有新版本的时候,本地的版本号从JiveInfo的getVersion()方法取得。
服务器上的版本通过文件名区分,而文件名是在install4j中通过设置版本号来完成的,如下图:
下图的设置生成的文件名是spark_2_6_0_01

image

9. 上传,设置更新信息,更新信息在用户下载的时候,会出现在下载的会话框中。

image

10. 客户端收到更新提示

image

11. 点击yes后,客户端开始下载新版本,之前设置的更新信息也出现在会话框中

image

12. 下载完了之后提示用户是否安装

image

13. 安装完成之后,用户就用上了我们自己打包的Spark.