三月 30, 2008

Beyond text

读和写blog已经有好几年了,但是对于音频和视频的接触才刚刚开始,这还要得益于Nokia的Internet Tablet——N800。

Nokia N800上有一个软件——Canola,通过它可以订阅podcast,也可以看youtube上的视频。其实听podcast看youtube在PC上都是很容易的事情,但我居然就一直没啥好奇的感觉,正是由于使用Internet Tablet这种新颖的方式,让我逐渐体会到了影音的魅力。刚刚开始,还不太会玩,尤其是youtube,只知道从首页上的几个视频开始,还不知道怎样找到自己喜欢的、内容精致的东西。Podcast订阅的也不多,一些使用feedburner提供的服务,只好通过google reader订阅。听了反波的几段,感觉不错,可惜好像已经不再更新了,其它的都是些英文内容,就当学学英语吧。具体参见我订阅的Podcast

三月 26, 2008

Attachment reminder

忘记在邮件里添加附件,是件很尴尬的事情,这不,昨天就又干了一回。再也不能这样活!于是乎对message-mode做了一点扩展,在发送邮件之前扫描邮件正文,如发现有"attached"或者"attachment"字样,却没有发现附件的话,就提醒一下。代码如下:

(defvar wl-message-attachment-word-regex "attached\\|attachment"
"List of words indicates the existence of attachment.")

(defun wl-message-attachment-mentioned-p ()
"If attachment is mentioned is message body"
(save-excursion
(message-goto-body)
(let ((end (or (and message-reply-headers (re-search-forward (concat (mail-header-from message-reply-headers) " writes:") nil t))
(point-max))))
(message-goto-body)
(re-search-forward wl-message-attachment-word-regex end t))))

(defun wl-message-attachment-found-p ()
"If there is really attachment"
(save-excursion
(message-goto-body)
(re-search-forward "<#part .+ filename=.+ disposition=attachment>" nil t)))

(defadvice message-fix-before-sending (after attachment-reminder
())
(message-check 'attachment
(when (and (wl-message-attachment-mentioned-p)
(not (wl-message-attachment-found-p)))
(unless (y-or-n-p "Attachment not found; continue sending? ")
(error "Attachment not found")))))

(ad-activate 'message-fix-before-sending)

三月 24, 2008

Sync subversion repositories with SVK

SVK是一个基于subversion实现的分布式版本控制工具,是用Perl实现的,可以通过CPAN安装。subversion不是分布式的,所以如果我们没有权限的话,是无法创建分支,提交修改的。通过使用SVK可以创建一个本地的镜像,然后在本地repository上进行各种操作。SVK的另一个功能是把不同的subversion repository放在同一个SVK的repository里面,就好像是同一个repository里的分支。利用这个功能,我们可以同步不同的subversion repository。

比如说有一个subversion repository http://www.example.com/svn/,我们没有权限在上面做事情,但是我们可以建一个自己的repository——如http://localhost/svn/。我们需要让http://www.example.com/svn/trunk和http://localhost/svn/trunk保持同步,然后在localhost上创建分支,做一些实验或不可能在example.com上被允许的事情。使用SVK可以实现自动化同步两个trunk的内容。方法如下:

$ svk depotmap -i /project/  # create svk repository
$ svk mirror http://www.example.com/svn /project/example/
$ svk mirror http://localhost/svn /project/localhost/
$ svk sync --all /project/ # this may take a long time
$ svk smerge --baseless --incremental --verbatim /project/example/trunk /project/localhost/trunk

以上操作完成了初始镜像,之后需要定时同步,比如使用cron job:

$ crontab -e

添加下面一行(每个整点同步一次):

0 * * * * /path/to/sync.sh

sync.sh的内容如下

#!/bin/bash

set -o verbose

svk sync --all /project/ && svk smerge --incremental --verbatim /project/example/trunk /project/localhost/trunk

三月 19, 2008

Let Emacs open file as root with TRAMP

TRAMP不仅仅可以用来打开远程的文件,还能以root权限打开本地的文件。又少了一个使用vi的理由。:-D

使用方法是:

C-x C-f /su::/etc/profile TAB

TAB可以在/su::后的任意地方使用,emacs会提示输入root密码,验证成功后还可以使用自动补全。另一种方式是使用/sudo::,这时要输入自己的密码。

三月 16, 2008

It's not hard to extend emacs

当有多个标签页打开时,关闭firefox会被询问“是否真的关闭多个标签页”;使用gnome-terminal也是一样,于是我就想,能不能让emacs在有多个frame存在的时候也询问类似的问题。写出来之后发现,还真简单:

(defun multiple-frames-kill-emacs-query-function ()
  "Ask before exiting Emacs if it has more than one frames."
  (let ((frames (length (frame-list))))
    (if (= frames 1)
	t
      (let ((msg (format "%d frames exist; exit anyway? " frames)))
	(yes-or-no-p msg)))))

(add-to-list 'kill-emacs-query-functions
	     'multiple-frames-kill-emacs-query-function)

实现了这个功能后就想,emacs有没有会话保存、恢复功能呢?找了找,发现已经有了,就是desktop-save,尽管不是emacs里面的所有东西都能保存(比如gnus就不行),但是打开的文件都没问题。

最近尝试着写了一些emacs lisp代码,自我感觉是件挺好的事情,只有不断地实践,才能学好一门语言。

三月 12, 2008

The Myths of Innovation

昨天新闻联播里面播放了很多两会委员讨论创新,让我想起了一系列IBM关于创新的广告,最新一部是这样的:

A:参加了一个关于创新的会议
B:都讨论什么?
A:创新的会议当然是讨论创新了!
B:讨论怎么执行了吗?
A:没有……
B:太糟了!

然后屏幕上打出四个大字:

停止空谈

接着又打出四个大字:

开始行动

创新为什么总是停留在空谈阶段?

  1. 能够改变大多数人的生活工作习惯,才叫创新,这需要深入生活、深入群众。
  2. 为少数特权阶层服务,再多的花样也不叫创新。
  3. 绝大多数人都希望成为特权阶层,而成为特权阶层最有效的方式就是伺候好当下的特权阶层,从而脱离生活、脱离群众,从此眼里只有领导一人。
  4. 这样形成的特权阶层整体脱离生活、脱离群众。
  5. 实现创新需要很大的人力物力,这正是深入生活、深入群众的人所缺乏的。
  6. 特权阶层具有实现创新的物质条件,却无法接受来自对立面的东西。而且创新往往会挑战特权阶层的既得利益。
  7. 特权阶层与创新者的利益冲突越大,实现创新的可能性越低。

当然我的这些观点也是脱离创新本身来讨论创新,要想真的理解创新,推荐阅读《The Myths of Innovation》。

三月 09, 2008

No Country for Old Men

晕晕乎乎地看完了《No Country for Old Men》,连男主角是谁都没弄清楚,如果说那个老警察是的话,那这个男主角的戏份也太少了点吧?!豆瓣上转了一圈,一些没看懂得情节总算完整了,洗澡时想起片中的一句台词:

都是金钱和毒品给害得!

才对该片所描述的老警察的无助感有了些体会。突然想到,如果把金钱和毒品换成股市和楼市,那不正是我的无助感所在吗?!No Country for Young Men too!

兴之所至,便做了一个计算,假设2003年(我开始工作的年份)某楼盘5000元一平米,在计入每年的通货膨胀率和10%的GDP增长之后,在2008年的价格应该是9062元,公式如下:

5000 x ( 1 + 1.2% + 10%) x (1 + 3.9% + 10%) x (1 + 1.8% + 10%) x (1 + 1.5% + 10%) x (1 + 4.8% + 10%) = 9062

没有查到上海每年的GDP增长率,也许要比10%更高些,那么,对我这种计算方式的解读是——2003年5000元每平米的房子,2008年的价格在9000~11000之间比较合理,当然前提是5000元在2003年是合理的。只是,2003年时卖5000一平的房子在哪些地段呢?现在又卖多少呢?也许,比这个价格翻了一倍也不止吧……

股市都跌成那副熊样,居然那么多人跳出来否认熊来了;那楼市这两天的萧条恐怕就更没人当回事了。其实,有好日子过的时候,便会有差年景,可惜,我还没学会怎样捱过差年景,更不知在有好日子过的时候未雨绸缪。世界变得太快,(包括我们的长辈)好多事情都没经历过,只能摸着石头过河,一头栽倒,呛几口水怕是件常事。每次感到无助的时候,对勇敢的人的佩服之情便油然而生,不管在怎样的境况下,他们都勇往直前,即使风雨依旧,彩虹不见。

既然没办法选择结果,也不能选择过程,那就让我们选择心情吧——貌似这种人生观阿Q到了极致:-(

三月 05, 2008

Load srt subtitle into mplayer

mplayer是支持srt类型的字幕的,然而我在看一部片子的时候却发现字幕出不来,mplayer报错说无法识别文件格式。几经折腾,终于理解了所谓的文件格式问题,在Linux上无法识别dos格式的字幕文件,然而用dos2unix转换失败,大概是因为里面有中文字符的缘故,只好用了一个土办法。

用Emacs创建一个新的文件,然后打开dos格式的字幕文件,把内容复制到新文件的buffer里,保存,搞定。然而这还是只成功了一半,要想字幕成功显示,还需在mplayer的Pereferences的Subtitles & OSD面板里面把Encoding设置为cp936。

虽然仍有少许乱码出现,但绝大多数字幕都能正确显示了。

三月 02, 2008

Virtualbox

由于工作需要,每个人都要有可以使用的Linux系统。每个人再配一台电脑暂时显得有些奢侈,一个解决方案是弄一台Linux机器,每个人给个帐号,另一种方法是用virtualbox。我在virtualbox里装了debian,用下来感觉非常好,这是我第一次切身感受虚拟化技术。

第一个好处就是只需安装一次,然后其他人只需要把映像文件复制过去就可以直接用,非常方便。当环境出现问题时可以将其丢弃,把最初的映像文件拿来重新开始。另外对于试用一些新的软件也非常有帮助,避免了对现有系统的破坏。

虚拟化技术听说很久了,最早知道vmware,后来是Xen,这次使用virtualbox,算是第一次真正接触,给虚拟机384M内存(我的笔记本只有1G内存),debian在里面跑得很顺畅。现在打算在我的Fedora上也装个virtualbox,然后试用更多的系统、软件,我的电脑可是2.5G内存、80G+250G硬盘,有很大的空间来折腾,FreeBSD 7.0刚出,打算感受一下BSD系列的系统。