两个电话

一大早上班的时候,父亲打来电话,关切地问道,上班第一天吧,到公司了吧,没事情吧。我说嗯,没什么事情啊,上班了。下班前两分钟,父亲又打来电话,问道今天没事情吧,我说嗯,就是挺忙的,没什么事情,就快要下班了,就要走了。父亲呵呵笑笑,然后说他今天眼睛跳,生怕我有什么事情,这下放心了。

挂掉电话我心里很不是味道。

春节看电影

春节长假结束,在奔波了8天半后,终于留下半天给自己消遣。于是这半天成了电影联播。

最重要的自然是看《Lost》8,9两集,非常过瘾。然后看《爱情呼叫转移》,满好笑的,编剧大抵抄了《神奇遥控器》,若干表演和剪辑还是比较粗糙的,也道出了人人都可能碰到的现实问题,还不错。再接着,冲着全篇的玛雅语和 Mel Gibson 看了《启示录》,极其血腥,开头的四分之三都很沉重,最后的一段令人振奋。在后来看了三分之一的《皇家赌场》,节奏满紧凑的,老婆要睡觉,今天继续。

《Lost》一如既往的扑朔迷离,论坛上发现有人推荐若干值得一看的悬念电影,大多还都看过。我现在最喜欢的就是悬念片,以前最喜欢科幻,只是现在的科幻片大多幼稚得不行。前两天看电视放早年的《尼罗河上的惨案》,一边看一边和老婆分析讨论,最后死掉五个人,果然是惨案。然后是美国的动作片和韩国的煽情片,最后是那些可看可不看得娱乐快餐电影。不过讽刺的是,过去的一年里,去电影院看得最多的就是无聊的国产快餐烂片。

喜欢悬念片是因为这可以证明自己至少还是个有点脑子的人,而当看不太懂的时候和人家一起讨论,就算没有结果,也会让我觉得自己是个有思想有追求的人。这让我欣慰。看科幻片则纯粹是要满足和享受假想的快乐。动作片不说了,有点雄性激素的本能的都会爱看。韩国片大多用固定的画面长镜头,色彩绚烂的展示细腻而淡然的生活态度,这是我所欣赏和享受的。虽然总觉得韩国人叫骂和打头的样子极为弱智。

Google Ads

与神同在 – screen

2005 年 PerlChina 上海聚会的时候,Joe Jiang 就兴致勃勃地向我们就介绍说 screen 如何奇妙。只可惜当时的我木呐有余,就当是看变戏法一样,过后就没放心上。许久以来,这多少也是我心中未决的事情之一。既然 《BSD HACKS》也提到了这个命令,不如像模像样的学学用用看吧。我买的是中文版的书,印刷还不错,谬误却不少。此乃题外话。

ssh 远程连接到服务器,当你正在编辑一个文件调试错误的时候,公司的破网再次断线,你一定会抓狂。网通了,再连上去,重新 cd 重新 vi 。或者,你正在服务器上运行一个漫长的测试,而下班时间到了,是中断现在的进度,回家从新开始呢还是继续加班? screen 就是你的救星。

screen 想象成服务器上的一个无形的 windows 窗口。在你登录到服务器上之后,打开这个窗口,然后在里面干活吧。在你要暂时离开或者意外断线,就好比暂时最小化了这个窗口。在你重新登录到服务器上的时候,你再最大化这个窗口,继续做事。就这么简单。

下面的示例都在远程的服务器上运行,当然你也可以在本地的 Ubuntu Desktop 上测试。这个无所谓。

开一个终端,输入:

$ screen -S chunzi

-S 参数指定一个名字,以后我们可以通过这个名字再打开这个虚拟窗口。

貌似 clear 了一下,然后还是在 shell 里面。实质上,我们这个时候已经在 screen 里面了。screen 有很多命令,要键入这些命令,都需要先键入 CTRL+a。我们可以在里面先 ls 一下,然后 CTRL+a, d 离开虚拟窗口。d 就是 detach。你会看到又回到了之前的 shell ,输出的那一行告诉你暂时离开了 screen。

$ screen -S chu
[detached]

窗口到哪里去了?用 -ls 参数,也可以用 -list

$ screen -ls
There are screens on:
        9309.chunzi        (Detached)
1 Sockets in /var/run/screen/S-chunzi.

我是个好奇的人,到 /var/run/screen/S-chunzi 下面一看:

$ ls -l /var/run/screen/S-chunzi
prw------- 1 chunzi chunzi 0 2007-02-16 16:52 9309.chunzi

看到开头的 p 了吗?嘿嘿。

现在如果重新进入 screen,可以:

$ screen -r chunzi

-r 是 reattach 的意思。自然的,我们看到了先前在 chunzi 那个虚拟窗口下的 shell 内容,原先操作的记录都还在。

假如你没有 detach 出来,就到同事的位子上,要给他看你刚才做的事情,可以登录服务器之后,用

$ screen -rd chunzi

来断开之前你自己座位上的那个。d 还是 detach 的意思,-rd 就是说,我要接管。如果回到座位,你会看到:

$ screen -r chunzi
[remote detached]

当然 screen 用起来不止于此,你可以在 screen 里面开几个不同的终端窗口。比如 CTRL+a, c 就是 Create 一个新窗口。CTRL+a, x 就可以锁定你这个 session,必须要键入密码才能继续。

有趣的是,当一处用 x 命令锁定的时候,你是可以用 -r 没有 d 的形式连到相同的虚拟窗口中。此时你再解锁,无论你在哪一个窗口操作,都可以在另一个窗口中观看操作的过程!这样,你和你的同事可以一起做一件事情,XP 结对开发从此可以让两个人天各一方!

有了 screen 你就不再担心什么,随时随地都可以继续停留在虚无中的桌面。就好像神在替我们保管一样。现在我才明白 Joe 以前为什么那么兴奋地要于我们分享,只要家里的机器开着,他在任何仅有 putty 的地方,都可以继续写 blog,看书,上 irc 聊天,随时随地,无所限制。典型的 hack 作风。

给 WordPress 增加标签插件

Ultimate Tag Warrior 3 – 好像现在网上说得最多的就是这个标签插件了。昨天试了下,蛮不错的,不过有些地方还需要自己动手修改。今天花了点时间,大致上对所有的文章都加上了 tag ,然后废止 Category 。

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

很好玩吧~

mkfifo 和 script

刚才说到 script 可以录下操作,并可以稍后回放,后来发现结合 mkfifo 还可以实时分享。有点象 net meeting 或者 VMware 的共享终端。

$ mkfifo bar
$ file bar
bar: fifo (named pipe)
$ ls -l bar
prw-r--r-- 1 chunzi chunzi 0 2007-02-14 16:45 bar

我用 mkfifo 新建了一个文件 bar,然后用 file 命令查看这个文件的信息,它告诉我这是 fifo 类型,也叫作 named pipe 。然后我在 ls -l 看看,发现最前面是 p ,猜想这个 p 就是 pipe 的那个 p。

先另外开一个终端,执行:

$ cat bar

当然什么都没有输出,也没有退出,好,现在在原先的终端窗口中用 -f 参数指定 script 在写数据的时候立即 flush 到日志文件 bar

$ script -f bar
Script started, file is bar

这时候你在 cat 的那个窗口中看到了什么?试着在原先的窗口做些操作,同时看看 cat 窗口中发生了什么?其实你先 script -f bar 起来,然后再去 cat 也行。任何一个窗口中退出都会使另一个结束。

最后再来看看 fifo 文件类型的说明:它允许独立的进程通讯。一个进程打开 FIFO 文件进行写操作,而另一个进程对之进行读操作,然后数据便可以如同在 shell 或者其它地方常见的的匿名管道一样流线执行。

所以把这种文件想象成管道就好了!你看,我们其实好比是

$ script -f | cat

在本地的用户通过 script 把当前的操作信息,通过管道,传给远处的人 cat 出来看,多么美妙啊~

Lodd 生了,可喜可贺~

昨晚手机没电,今天才知道 Lodd 也得了个千金,本说是预产期在三月,却没料想到赶在情人节的前一天降临人间,真是开心啊~ 也恭喜 Zoe 终于做妈妈了~

script 和 scriptreplay

这是两个命令。script 好比是摄影机,它帮你录下在 shell 里操作的全过程。scriptreplay 就好比是录像机,把录下来的东西回放给你看。Joe 用它来帮助教学,这样就不必每次上课的时候重复操作演示。这里是 joe 的演示

$ script
Script started, file is typescript

script 开始运行,并把操作记录保存到默认的日志文件 typescript 中。然后随便你做些什么,比如说 ls 之类的,然后 Ctrl+D 或者输入 exit 退出:

$ exit
Script done, file is typescript

现在你可以 more typescript 一下,其中可以看到你一系列操作的痕迹。包括退格键之类的。

单是如此还不能用 scriptreplay 播放,因为每个操作没有对应的时间索引信息。所以这次试试看:

$ script -t 2> time.log
Script started, file is typescript

-t 的意思是把时间点数据往 STDERR 输出,当然我们不希望这些时间数据混杂在我们稍后的操作中,所以用 2 > time.log 重定向到 time.log 文件中。然后试着做些操作,最后退出。这时候就可以回放了,如下,scriptreplay 的第一个参数是时间索引文件,然后才是 script 的日志文件:

$ scriptreplay time.log typescript

看到了什么?如果你想 2x 的速度回放,可以

$ scriptreplay time.log typescript 2

试试看把 2 改为 0.5 ?

谢谢 joe 分享了这两个奇妙的工具。除了教学中可以用之外,我想诸如报告 bug ,协作开发,或者记录 cron 作业或者其他 shell 脚本的操作过程等方面也都可以用。比起用 flash 录制,它更轻便,而且保存了 native 的字符编码,便于调试分析。绝对 Coool。

代码进化

我现在的工作内容之一是写 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 命令让我觉得很爽。

WordPress Plugin: Preserve Code Formatting

以前我的 blog 里面很少出现 code 片段,那是因为 WordPress 默认情况下支持不好,而且我很懒,所以宁可什么也不做。

刚才安装了来自 coffee2code.com 的插件,貌似不错。我不喜欢在文章中语法高亮,以及什么行号,干净最好。

单此可用了,不过默认的编辑器上面的按钮只有 Code 没有 Pre 也没有 PreCode。于是编辑 /wp-includes/js/quicktags.js ,找到定义 code 按钮的那一行,照样画葫芦加了两个。回来再修订下 css ,这下满意了。