如何禁用闪烁光标

喜欢 OSX 或 FreeBSD 的一个原因是,光标默认为块状不闪烁,这给人以一种坚毅沉着,并且自信的美感。它静观其变,随需而动,没有半点多余。而跳动的光标则充斥着急迫感,浮躁且功利。

gvim 中要启用块状不闪烁光标,在 .gvimrc 中加入:

set gcr=a:block-blinkon0

gcr 是 guicursor 的简写,a 表示所有模式,冒号后面是对应模式下的行为参数,每个参数用 – 分隔,block 说明用块状光标,blinkon 表示亮起光标时长,时长为零表示禁用闪烁。也可以是 blinkoff0 或者 blinkwait0。具体参考 :help gcr。

新站开张

原来的服务器硬件故障,拆了硬盘换到另一台测试机器上,竟然不认网卡,再挂到 FreeBSD 机器上,一写数据就断开了原先 mount 上的分区,好不容易 fsck 之后导出了 svn 仓库的数据,又发现若干文件有损坏,在另一台 FreeBSD 机器上配置 WordPress 又碰到 php5-mysql 编译出错,郁闷死了。 决定不能在 svn 一棵树上吊死。决定不用 WordPress 苟且偷生。 昨天花了点时间研习了下 git。没完全搞明白,不过暂时已经能用起来了。今天花了半天时间,把原来的 blog 里面的数据导出来,重新用 Catalyst 作了一个站,这就跑起来了。 出于格式自由的缘故,写了这个目前不算是 blog 的站点。我想适时的时候用 pod 或者 Textile 或者 wiki 格式写,同时不想让所见即所得的编辑器给我横加减些东西。出于对服务器要求自由的缘故,不使用数据库,直接将文章以文件的形式保存。这样另外有个好处,就 是我可以用 git 来维护这些文章,不必担心单点故障。也可以非常方便地发布成静态页面的站点,就像 MT 那样。 好了,回家休息。

Google Ads

sshfs

客户的机器是 FreeBSD 两年多前配的,内网,无法连接到外部,只有 cvs 没有 svn。希望在该服务器上修改代码测试,也希望使用 svn 管理和维护。罪敏捷的方法就是用 sshfs 挂接,然后在本地 ubuntu 的文件系统上进行 svn 操作和更新。实践证明行之有效,服务器不用作任何改动,只需要一如既往提供 ssh server。 sshfs 就是通过 ssh 连接挂载远端文件系统的工具,基于 fuse 软件。ubuntu 下面只需要安装它并将自己用户加入 fuse 组:

$ sudo apt-get install sshfs
$ sudo adduser chunzi fuse

然后重新登录下就可以用:

$ mkdir remote
$ sshfs username@server:/path/to/remote/fs remote -o workaround=rename

后面的参数用来在 svn up 的时候可以自动更新文件。

bash -i + tee vs. script

之前我用 script 命令记录 shell 中的输入输出数据,或者到一个普通日志文件,或者到一个管道文件。

重新阅读了《BSD HACKS》Hack #11 之后,这才意识到,script 实质上是重新创建了一个新的 shell 。所以类似的有:

$ bash -i 2 > &1 | tee shell.log

-i 参数使新的 shell 按交互模式(interactive)启动,然后将 STDERR 重定向到 STDOUT,再通过管道把 shell 的输入(我们在 shell 下键入的)输出(命令输出的信息和错误信息)都传给命令 teetee 是个简单而有用的小工具,它接受输入,并同时输出到文件和 STDOUT。所以这里 tee 一面让我们看到 shell 的交互情况,一面悄悄地把它们记录在案。自然,shell.log 就是保存的日志,可以在另一个窗口中实时观看变化:

$ tail -f shell.log

很好玩吧~

代码进化

我现在的工作内容之一是写 Anti-Spam 规则,规则保存在若干 .cf 文件中,每个规则都必须有个唯一的名称。发 Spam 的人知道你会写规则,所以有些关键的地方,他们都会尝试多种变形以逃过滤网。而取规则名的时候按意思或者元信息,所以不经意间就会出现规则名重复。尽管不多,但总不好。

四天前,我写了一个 one-liner :

$ less *.cf | awk ' $0 !~ /^#/ && $0 !="" {print $2}' | sort | uniq -c | sort -nr | awk ' $1 > 1 {print}'

less 读取当前目录下的规则文件,然后给 awk,找到不是注释的行,也不是空行的那些,打印第 2 列,也就是规则名,然后排序,再用 uniq 计数把重复次数追加在行首,然后再用 sort 按照数字倒序排列,最后取出数字大于 1 的,也就是有重复的那些规则名打应出来,包括重复计数。

这两天翻过《BSD HACKER》 之后,就觉得这个好罗嗦,于是重写:

$ sed '/^#/d;/^$/d' *.cf | awk '{ print $2 }' | sort | uniq -dc

直接用 sed 读规则文件,将注释行删除,将空行删除,然后给 awk 打印规则名,给 sort 排序,然后让 uniq 只输出重复的行并计数。

怎么说呢,这就是知道什么不知道什么的差别。开始我愚蠢的用 less 传文件内容,这是思维定势,自己总用 less 看文件,就觉得程序也该用 less 看文件。uniq 的 -d 参数一下子把最后一段罗嗦的 awk 代码斩掉。原先用 awk 的模式来找规则行,不如 sed 的两个替换干脆明快,两个 d 命令让我觉得很爽。

买了三本 hack 书

我想我的乐趣之一就是买书了。昨天去了上海书城,五分钟内买了三本,《PERL HACKS》,《BSD HACKS》和《SKYPE HACKS》。

当然了,都是 O’reilly 的书,封面看起来就非常喜欢。现在只要是 O’reilly 的书,并且和我的兴趣沾上一点边的,我都会买。

随后的零碎时间里,随便翻翻。Skype 的那本在一开始最让我兴奋,我几乎有冲动要马上构建属于自己的电话系统了。然后读得最多的就是 BSD 那本。虽然是讲 BSD 系统的,不过 Unix 的东西大同小异,看了一些章节受益颇丰。似乎永远都有许多充满魔力的工具可以帮你解决困扰多时的烦恼,只是好像你不知道它叫什么,怎么把玩。Hack 一词恰到好处地诠释了用优雅而高效的方法完成任务的方式和思想,让人 be cool。Perl 那本书也不错,点点滴滴的给你些提示,也很受用。

Vmware 设置

用了大约半年,我的笔记本开始频繁出现各种异常。速度也越来越慢,实在不堪忍受,于是终于下定决心重灌。目前我的开发都是在 Windows XP 下面安装了 Vmware 的虚拟机,跑一个 FreeBSD 来做的。以前配置 Vmware 的时候也是痛苦万分,总也不得正果,这次又要重配,按理说按照原来的思路做下来应该不会有问题,可事实无情的嘲讽了我,一度让我怀疑是不是老了,很多次解决掉的疑难问题再次出现的时候,只记得曾经发生过并且成功解决过,可就是死活记不起来具体是如何做的。这让我的内心无比痛苦。但是问题出现,就必须解决,上帝保佑,这次我还是在经历了很多个小时后,终于重见天日。回过头来看看,多么简单阿。

虚拟机在我的笔记本上,需要能够连接到外网。我工作中有两种上网方式,公司里,有一个 IP 为 192.168.1.2 的 ADSL 路由器拨号上网,windows 被 DHCP 分配一个内网的 IP 192.168.1.x 。家里通过有线通的 Cable Moden ,windows 直接获取外部 IP 地址。所以我需要在两种环境下都能使 FreeBSD 能够访问外网。

FreeBSD 设定为一个固定的内部 IP 地址,192.168.1.10 网关 192.168.1.2 。在公司内部,使用 Bridge 方式,将虚拟机直接挂到公司的内部网段中。简单而完美。

回到家里,或者无线拨号上网,则改为 host-only 方式,选择 Vmnet1 网段,该网段设为 192.168.1.0 ,而在 windows 的网络连接中对应的 Vmnet1 设置一个固定的 IP 192.168.1.2 。也就是说,这个时候 192.168.1.0 网段在我的 windows 内部,windows 本身作为 1.2 连到这个虚拟网络,之所以选这个 1.2 ,是因为如此可以不用修改 FreeBSD 的网络配置。FreeBSD 依然通过 1.2 这个 Gateway 出去。同时我们不需要 Vmware 自己提供的 DHCP 功能,直接从 dhcp adaptor 中删除 vmnet1 网段即可。

本来事情就是这么简单的。我从 1.2 ping 到 1.10 通。从 1.10 ping 1.2 不通。这个问题困扰了我很久。最后把 windows 的防火墙关掉,就通了。现在 FreeBSD 虽然可以 ping 到 1.2 可却 ping 不到外网地址。第一反应是共享连接。于是将连接到外网的连接属性中设置共享,于是提示将会改为 192.168.0.1 的 IP 地址。我立马选择否,因为我不需要使用 0.x 网段。于是事情依然没有进展。在万般无奈下,我选择了是,然后 Vmnet1 的网络连接从原来我设定的 192.168.1.2 被强制改为 192.168.0.1 。这让我很不爽。再手动改回来。到此为止,天空变得蔚蓝蔚蓝。

我遗漏了这两步,想来该是以前配置的时候,稀里糊涂地先做了这两步,而后才做之前的那些配置。所以我明白了,并不是记性不好,实在是以前解决问题的时候囫囵吞枣,迷迷糊糊的走过来的,所以自然不能回想起来喝醉酒时走过的路。还好不是老年痴呆,万幸万幸。知其所以然比起知其然,更为重要,否则冤枉路要走不止一回。

PerlChina 上海聚会

在昨天的聚会上仓促的作了简短的演讲,本计划讲五分钟的,结果因为还有些时间,就扯得有些远,结果有些不伦不类,很多可以扩展出去的地方都没有讲,多少有些遗憾。估计听得人也稀里糊涂的。这里还要检讨一下,没有作充分的准备,比如说 ppt 。热情的赞助商 alan 请大家吃饭,上馆子吃,虽说大家可以联络感情,不过我觉得很多人大老远赶火车来,这点时间花费得着实有些奢侈,而之后的避风塘,则形散且神散,作讲演的效果要差很多。所以我想,以后再要搞,就简朴一些,面包饮料之类的就可以了,尽量多的时间让各家都来发言和交流,达到启迪和推广的效果,这样才更务实些。

顺及今天尝试在 FreeBSD 上安装 trac 碰到一些问题,不过基本上过了,稍后再熟悉熟悉。