星期五, 十月 31, 2008

玩数独

最近几天玩数独游戏。发现在电脑上玩还是不方便。
难怪很多日本人都是买的数独的书在电车上玩。
为了自己玩方便,最近写了一个小程序,利用SudokuExplainer
生成数独。再用iText打印成PDF来玩。

这个程序放在GoogleCode上。
http://code.google.com/p/sudoku-pdf

截图

星期三, 十月 22, 2008

hugin制作全景图

今天使用hugin制作了一张全景图。工具还是不错的,虽然是不是的会出错。
过程就不写了,它的网站上有很多。

修改Bazaar的bzr-email成Server-side hook.

bzr用插件来实现Hook的功能,用起来实在是不方便。为了在每次提交的时候都有邮件通知,从Lunchpad上下在bzr-email插件。

bzr co lp:bzr-email
cd bzr-email
./setup.py install
这样可以安装到系统级别,如果只是自己用的话,安装到~/.bazaar/plugins(WINDows是另外的目录)。

在要使用这个插件的分支的.bzr/branch/branch.conf文件里加入配置参数

post_commit_to = someone@example.com
post_commit_sender = bzr@example.com
post_commit_mailer = smtplib
smtp_server = mail.example.com

发现本地提交的时候能发送邮件,但是远程通过bzr+ssh提交是不能触发。而且这个只是post_commit的Hook,在PUSH的时候恐怕也不会触发。
一通搜索发现,bzr的文档实在是不完整,很多新功能没有好的文档。还好找到了一个BUG日志

有查看了branch.py的源代码。
把bzr-email的__init__.py按如下patch修改。

=== modified file '__init__.py'
--- __init__.py 2008-08-05 21:51:27 +0000
+++ __init__.py 2008-10-22 09:38:12 +0000
@@ -86,16 +86,19 @@
_emailer.EmailSender(master, new_revid, master.get_config(),
local_branch=local).send_maybe()

+def post_change_branch_tip_hook(params):
+ """Hook for email. """
+ _emailer.EmailSender(params.branch, params.new_revid, params.branch.get_config()).send_maybe()

def install_hooks():
"""Install CommitSender to send after commits with bzr >= 0.15 """
install_named_hook = getattr(Branch.hooks, 'install_named_hook', None)
if install_named_hook is not None:
- install_named_hook('post_commit', branch_commit_hook, 'bzr-email')
+ install_named_hook('post_change_branch_tip', post_change_branch_tip_hook, 'bzr-email')
else:
- Branch.hooks.install_hook('post_commit', branch_commit_hook)
+ Branch.hooks.install_hook('post_change_branch_tip', post_change_branch_tip_hook)
if getattr(Branch.hooks, 'name_hook', None) is not None:
- Branch.hooks.name_hook(branch_commit_hook, "bzr-email")
+ Branch.hooks.name_hook(post_change_branch_tip_hook, "bzr-email")


def test_suite():


改完之后的bzr-email可以作为server-side的hook使用。而且push和commit的时候都可以触发发送邮件。

星期五, 十月 17, 2008

SSH访问局域网内的机器

SSH有TUNNELS功能,一直没有用过。最近有一个工作上的事情只能用公司的机器做,对方限制了访问IP。
想了想远程控制公司里的机器不就可以在任何地方都用了吗?

远程控制的话如果暴露端口就太危险了。目前在众多网络服务中比较信任的就是SSH了。
在公司的服务器上安装最简单的debain。(装在colinux里,公司的服务器都是WIN。)
下载putty
用PUTTYGEN.EXE生成密钥对,把PUBKEY拷贝出来,注意保存成文件不能被OPENSSH识别,authorized_keys里必须一行一个key,保存成文件就不止一行了。
把PUBKEY添加到服务器的~/.ssh/authorized_keys里面。
修改/etc/sshd_config,设置PasswordAuthentication no
安装denyhosts。(apt-get install denyhosts
用PUTTY连接服务器时在选项里Connection->SSH->Auth里加上privatekey的路径。在Tunnels里加入本地的端口如4489到远程的局域网里的机器TargetHost:3389
3389为Windowx远程桌面的端口,所以在目标机器上要打开远程桌面,并且用户要有远程桌面的权限。
如果机器关着就不好用了,所以目标机器的BIOS里打开WOL(Wake on LAN)远程唤醒功能。
在服务器上安装wakeonlan程序。(apt-get install wakeonlan)以后再关机的时候只要wakeonlan 目标机器的MAC就能开机。

实际试验非常成功,远程桌面连接是在机器里输入localhost:4489就连到目标机器了。

Excel 日期BUG

今天用APACHE的POI读取Excel时发现日期型的单元格是比预想的差一天。
我都的是数字,应该是 1900-1-1加上读出来的数字减去1就是日期。
后来试了一下发现 1900年1月份的日期算出来的是对的。
怀疑Excel把1900年当成闰年了。
上网搜了一下,发现Excel果然有日期BUG

星期三, 十月 15, 2008

用ant同步文件夹

经常在多台电脑上工作,有些文件会需要同步。
对于一般的工作文件,用版本控制系统可以完成,我的源代码都是用bazaar来管理,以前使用SVN的。

有些文件我不纳入版本管理,比如我的maven仓库,我没有服务器,所以没有maven代理。这些jar包我不想把它纳入版本控制。换机器的时候我也不希望再从网上下载一次。以前我都是把我的.m2文件夹拷贝到移动硬盘,再从移动硬盘拷到要用的机器上。
XP的拷贝实在不适合拷贝大量的小文件,而且每次都覆盖也没有必要。所以想用增量拷贝工具。想到了rsync以前用过,好像在路径名太长是会出问题,而且cygwin的rsync对于中日英混合的文件名处理也会出问题。

由于一直用Java开发,想到ant有一个sync的任务,反正ant在我的每台机器上都是必备的。
所以利用它来同步我的文件,应该是个理想的方案。

这是我的build文件


<?xml version="1.0" encoding="UTF-8"?>

<project name="nexus" default="sync">



<target name="check" description="check dest property." >

<condition property="run">

<and>

<isset property="dest" />

</and>

</condition>

</target>

<target name="usage" depends="check" description="usage of this build file" unless="run">

<echo>

ant -Ddest=&lt;destPath&gt;

</echo>

</target>

<target name="sync" depends="usage" if="run" description="Sync files between usb disk">

<echo message="sync to ${dest}" />

<sync todir="${dest}" verbose="true" granularity="500">

<fileset dir="."/>

</sync>

</target>

</project>