2006年12月31日星期日

Go See and Become / Va =?UTF-8?Q?, _vis_et_deviens_/_=E7=94=9F=E5=91=BD=E5=9B=BD=E7=95=8C?=

电影中充斥着各种语言,猜测其中有法语、以色列语、希伯来语、阿尔巴尼亚语,反正是哪种也不认识,好在有好心的网友翻译了字幕,才得以欣赏到这部"获得2005年法国电影恺撒奖最佳编剧奖"的影片。

以色列好像从建国以来就没有消停过,犹太人获得一片栖身之地来之不易,所以今天我们在数落以色列人和阿拉伯世界之间的冲突的时候,不得不考虑这些问题。和犹太人相比,身在非洲的黑人兄弟的遭遇就更不幸了,除了少数经济发展比叫好的地方以外,经常听到新闻里说非洲这里那里又发生战乱了,非洲又有瘟疫了,诸如此类,原本富饶的非洲,似乎在近代就没有让非洲人民幸福过。从某种意义上来讲,当初被当作奴隶贩卖到美洲或欧洲的黑人幸存者的后代,或许要比他们在非洲大陆的同宗要幸福的多了。我们的小主人公,什洛莫,也是一位幸福的家伙。

电影从什洛莫9岁一直讲述到他成年、结婚,除了我们已经不愿再看的苦难、歧视之外,什洛莫还是很幸运的,有那么多的人爱他,亲生母亲为了什洛莫的幸福而送他离开非洲,村子里的大姐让什洛莫冒充自己刚刚死去的儿子来到了以色列,在以色列的学校里面,那一堆老师对什洛莫也算不错,最后,什洛莫得到了一个温暖的家庭——他被一个以色列家庭收养了。现在他除了仍然远在非洲的亲生母亲之外,又有了养父、养母、哥哥、姐姐等亲人,养父像爱亲生儿子一样爱着什洛莫(当然是以男人的方式),养母对什洛莫更是充满了母性的温柔,哥哥小的时候不懂事,但长大以后和什洛莫也象亲兄弟一样,姐姐更是对什洛莫更不错啦。随着什洛莫的成长,还遭遇了很多其他的好人,包括和他拍拖10年的妻子。幸福的什洛莫,但他那时常仰望月亮的眼睛里,仍然闪烁着埃塞俄比亚黑人的苦难。

同时,我们还看到了以色列人民对自己国家的爱,以色列人民和其他任何国家一样,都热爱自己的祖国,虽然他们和巴勒斯坦的事情总是扯不清。就像什洛莫的养父说的那样,这是我的国家,我就要在这里,哪里也不去。我们家没有人逃避兵役。。等等。为什么以色列能夠生存在一众阿拉伯国家的包围圈中,可见一斑。

最后,犹太教,说实话在玩最新的"文明3"之前我几乎没有听说过这个名词,但是"文明3"里面宗教的作用很强大与重要,所以就记住了:欧洲的基督教(广义),中东的伊斯兰教,中东的犹太教,印度的佛教,中国的道教。关于宗教没有仔细研究,在这里也就不敢乱说了,不过希望宗教是人类和平的媒介,而不是灾难的庇护所才对。

好了,再回到影片当中,什洛莫最终还是回到了非洲,用自己的医学知识来帮助同胞,同时也实现了自己的诺言,回到了生母的身边。影片到此结束,镜头从呐喊的嘴中拉高,让观众见识了一片狼藉的难民营。非洲的苦难,什洛莫能改变多少呢?

Source:http://www.fwolf.com/blog/post/275

2006年12月28日星期四

subversion中symbolic link的使用

nix操作系统中有link链接文件类型,硬链接(hard link)和符号链接(symbolic link)两种形式,硬链接只能在同一个分区内对文件使用,使用起来感觉就像是为文件创建了一份同步更新的副本,命令:ln link_target link_filename;符号链接则可用于文件和目录,纯粹就是一个指向链接目标的"指针"而已,并没有真正把内容复制过来,命令:ln -s link_target link_filename。实际应用中我个人的感觉是符号链接使用得更多一些,两种链接都比windows下的"快捷方式"要强大得多。

那么在svn的应用当中,如果两个项目共用一个库文件,使用符号链接文件就不需要两边分别更新了,不是很方便么?但是今天在一个项目中试用了一下,却不是我想像的那样。

我的情况是这样的,本来的项目中有一个dbupdater.php,现在转移到另外一个项目中了,但是在这个项目中还要继续使用,就产生了我刚才说的需要两边更新的问题,so想着采用link的方式,直接删除掉dbupdater.php,并创建了一个同名的符号链接文件覆盖了它,结果在svn commit的时候就出错了:

$ svn ci
svn: Commit failed (details follow):
svn: Entry '/home/fwolf/project/dbupdater.php' has unexpectedly changed special status

原来,svn不仅跟踪记录了文件内容,连文件类型也记录了(nix下文件分为三种类型:file, dir, link),这样直接替换是不行的。如果硬是要用链接文件替代正常的文件,只有一种办法:先用svn rm删除掉原来的文件,提交,再用svn add添加链接文件,提交。不仅如此,我还测试了一下,发现这样提交到svn服务器上的文件内容居然是:

link /home/fwolf/svn_symbolic

也就是说,使用了符号链接之后,提交到服务器上去的并不是链接指向文件的内容,而是符号链接的"符号"而已,这样,如果在另外一台不同环境的客户端checkout出来,符号链接文件也许就不能正常工作了。

所以,虽然svn支持link类型的文件,但除了在少数情况下可以使用hard link,或者在项目内部文件之间使用symbolic link之外,尽量不要link项目之外的文件,因为结果并非我们所期待的那样。

参考:
Problem replacing symbolic links
Basic question
->Re: Basic question

另外再搭车介绍一下svn的"廉价复制"功能,svn创建tag或branch的机制和cvs不同,他基本上是通过创建一份拷贝的方式来创建tag或branch的,不过你不用担心这样会占用成倍的空间,因为svn的拷贝是一种"廉价复制",只有当tag或branch中的文件被修改时才会真正的另存一份,这也是svn和cvs的一个主要区别, 延伸阅读

Source:http://www.fwolf.com/blog/post/274

2006年12月27日星期三

配置Apache的ssl安全连接

环境:ubuntu 6.06, Apache 2.0.55

第一步:生成ssl certficate文件
首先当然是正常安装apache2了,然后:

sudo apache2-ssl-certificate

生成一个1024位的RSA私钥,并保存为/etc/apache2/ssl/apache.pem,如果你已经有了CA证书,应该也是可以拿过来直接使用,或者用来生成这个私钥的(这应该属于另外一个话题了,我也没有用过)。

apache2-ssl-certificate执行过程中要回答一些问题,如下,注意如果[]里已经给出了默认值,而你又想把这项置空的话,可以输入英文句号".":

Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:
Organization Name (eg, company; recommended) []:.
Organizational Unit Name (eg, section) []:.
server name (eg. ssl.domain.tld; required!!!) []:localhost
Email Address []:fwolf@mail.com

一般来说,server name和实际的网站域名还是保持一致比较方便。

第二步:启用ssl mod

sudo a2enmod ssl

或者

:/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/ssl.conf ssl.conf
:/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/ssl.load ssl.load

第三步:添加监听端口,配置虚拟主机
添加端口:在/etc/apache2/ports.conf中增加一行"Listen 443",显然,如果你想让默认的80端口就使用ssl的话,就可以省略这一步了,并在后面的配置中略微调整。

在apache虚拟主机的配置文件conf中,段,添加SSL的定义,比如:


ServerAdmin Fwolf
ServerName www.fwolf.com

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

DirectoryIndex index.php index.html index.html.var

然后重启apache,就能够使用https访问网站了。

如果想配置成80端口默认就使用https,首先不需要在ports.conf中添加443端口的监听了,其次是在配置VirtualHost的时候也不用带上:443了,但即使这样,配置完成后使用 http://www.domain.com访问配置好的网站时,还是会提示:

Bad Request

Your browser sent a request that this server could not understand.
Reason: You're speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.

Hint: https://www.fwolf.com/

这是由于使用http协议去访问一个https的端口造成的,最简单的解决方法是使用https://www.domain.com:80/来替代,不过,通过修改apache配置,把到80端口的http访问重定向到443端口的https访问效果会更好一些,就像下面的配置:

NameVirtualHost *:80

Redirect permanent / https://localhost/

NameVirtualHost *:443

ServerAdmin Fwolf
ServerName www.fwolf.com

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

这样所有http访问就自动被重定向到https访问上了,不过如果你只能在外网开一个端口的话就比较麻烦了,同时https也只能包含一个站点(无法通过ServerName辨识多个站点)。

如果能够把http和https协议同时绑定到一个端口上,用户访问的时候似乎就更方便了,不过很多地方都说这是不可能的,加密与明文协议不可能同时存在于一个端口上, 这里有个讨论给出了一种方案,虽然经过我的实验并不成功,还是把代码贴出来,供有兴趣的朋友继续研究。


RewriteEngine on
RewriteCond %{HTTPS} != on
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=permanent]

一个小问题:我生成的pem文件怎么有效期都只有一个月?难道这是默认的?pem文件到期之后会发生什么事情呢?

参考:
Need Apache2 SSL howto
Apache2 SSL
You're speaking plain HTTP to an SSL-enabled server port. - HELP PLEASE !

Source:http://www.fwolf.com/blog/post/273

2006年12月24日星期日

伪造图像的exif信息

前两天在Gfans里面聊天的时候,聊到flickr不鼓励用户上传非数码照片的图像,而像我这样喜欢用flickr保存截图并在blog中引用的人应该不在少数,所以就谈到可以写个小程序把屏幕截图"伪装"成数码照片,当然你如果真的愿意拿数码相机对着屏幕拍照也没人拦着 :)

不过互联网上相关的资料还是比较少,搜索了半天找到一个比较类似的,结果研究了半天才发现人家并不是在修改exif信息,而是把exif信息读出来,做成水印再贴到图像上。然后又用setexif和writeexif、copyexif作为关键字来搜索,终于找到了一个 现成的程序,再进一步发掘,这个copyexif程序已经被 作者推荐使用jhead替代了,而这个jhead居然在ubuntu源中也有,嘿嘿:

sudo apt-get install jhead

这个jhead的功能还是非常强大与方便的,不过我们只需要其中一点点:

jhead -te $FROM $TO

其中$FROM是一张正常的数码照片,$TO就是屏幕截图了,这个命令就可以把正常数码照片的exif header拷贝到屏幕截图中,如果传到flickr上,他就会认为是一幅数码照片而不会被当作是屏幕截图了。注意两个图片都必须是jpeg格式。

不过这种方法也有缺点,首先是exif和图像肯定对不上,我曾尝试用exif命令来手工设置正确的图像信息到exif header,不过很多部分写入时都会提示"Not yet implemented!"不支持;其次是图像尺寸会扩大很多,一般屏幕截图使用png格式是最节约空间的,但转换为jpg之后就大了很多,比如我一张3.5k大小326×225的png截图,转换为jpg格式、再添加上exif信息、再去掉exif中的thumbnails之后, 还有43.8k,不过我们的图片是放在flickr,空间的问题可以不用考虑太多了。

还有一些其他的软件,比如jpegtran中的wrjpgcom / rdjpgcom,但他们都比较简单了,只能对comment部分进行操作,远不如jhead方便,如果jhead能夠方便的设置每一项exif信息就更好了。

好了,现在看看我"拍摄"的照片如何:
使用jhead拷贝图像的exif信息
注意它是带有拍摄相机、光圈、快门速度等exif信息的哦。

jhead还有一个非常好用的地方,就是当你要使用其他图像处理软件处理一批数码照片的时候,为了防止图像处理软件破坏掉exif信息,可以先把所有照片都拷贝一份到originals子目录,处理完成后再用命令

jhead -te originals/&i *.jpg

就可以恢复所有文件的exif信息了,不用担心,jhead会自动匹配命令中的文件名,更详细的说明可以看jhead的文档或man jhead。

Source:http://www.fwolf.com/blog/post/272

2006年12月23日星期六

好玩的有道Yodao

Yodao有道是最近(也就是2006年12月)才冒出来的一个"搜索网站",大家都说它是网易的,但我上去看在哪儿也看不到证据,甚至连 有道的论坛都是用免费的Discuz!架设的,"关于有道"是这样的:

欢迎访问有道搜索。有道的发起者是一群执着于搜索技术的年轻人,我们发现中文网络中的搜索还远未达到理想,所以希望通过我们现在和将来的努力,把设想中的服务一点点变成现实,分享给大家使用,让你更快一秒找到想要的好东西

联系邮箱是feedback@corp.yodao.com,丝毫没有网易的影子,最后,查查首页上的"增值电信业务经营许可证B2-20040095",和网易的 才挂上钩。

言归正传,yodao在这个满大街都是搜索的情况下出现,依旧十分清新于出众,套用现在流行的话说,很"Web 2.0",目前的功能虽然还不多,但用起来很舒服,行话就是"用户体验"ue比较好。针对博客口碑宣传的优势,创建伊始就开通了"博客搜索",和其他的blog搜索不同,yodao还为每个blog都建立了一个档案,比如 我的档案

Yodao上我blog的档案

也许是吸收了google"机器判断"的优势,通过自动分析,列出了blog的活跃度、关注度、习惯发文时间、习惯发文星期、习惯发文长度、blog风格等信息,结果似乎还比较准确,既有娱乐价值,也有很实用的一方面。如果你够细心的话,还可以研究一下blog档案中的两个条形图和一个饼图,他们不是图片,而是采用另外一种特殊的方式生成的:在页面中只是用canvas和div规划出了空间,然后用一个稍微复杂点的js来实现的绘图,并且似乎是为每个blog都生成了一个单独的js文件,在页面源代码的最后面进行引用,代码如下:

很有意思的方式吧。现在有道又弄出了一个好玩的东东——博客男女,还是通过机器分析,判断你的blog的"性向",比如我的:

Fwolf's Blog
100.0%男性倾向,0.0%女性倾向


评点:您的文风冷静而镇定,言语间展现出强悍的思辨能力与恢宏的胸襟,一个男子汉的阳刚形象跃然纸上。
yodao | 博客男女

很man的哦,不过博客男女的计算好像是偏向男性多一些,如果说李宇春的BLOG只有82%女性倾向还说得过去的话, 老徐(徐静蕾)却只有69%,怎么也应该比李宇春更woman一些才对吧 :)

有道论坛的名字"坐而论道"似乎很熟悉哦,在哪里听过?电影《手机》里面么?

看来好人还是有的,现如今流氓软件和垃圾网站横行的时代,能有如此清新的Yodao,可谓"出淤泥而不染",Yodao一路走好!

Source:http://www.fwolf.com/blog/post/271

2006年12月22日星期五

Hard Candy / 水果硬糖

只看截图的时候,我根本就不相信这怎么是一部惊悚片呢,看到片头的时候还觉得挺艺术,知道看到Jeff被绑在桌子上要被Hayley cut小JJ的时候,才有些惊悚的感觉了。再一直看到结尾,又是波澜不惊的感觉。

导演似乎想讲述一个类似"黑暗的公正"的故事,但我的感觉,不仅讲得很好,而且太好了,好得有些过了,过得不知道那一边是公正了。

记得早在法国流行断头台的时候,为了更"人道"一些,颇有一帮人在研究如何才能夠更快得砍下脑袋,让上断头台的人减少些痛苦,所以断头台的刀口才被设计成斜的(其实这也是断头台产生的作用)。那么在这部电影中,小女孩Hayley的手段可真是太不人道了,而且是近乎残忍的。虽然我们可以猜测她有一个很好的动机,也为这场复仇筹备了许久,可毕竟只有14岁,不知道她为复仇筹备了多久,更不知道她花费了多长时间才让自己的心理如此阴暗、歹毒。相比于还知道在心中忏悔(只是不敢说出来)的Jeff来说,这种阴暗的心理或许比恋童癖更可怕。

Jeff虽然也不是什么好鸟,但他实在不像一个专业的罪犯,不仅屡次被Hayley制服,还偏偏有那么多弱点。在劝说Hayley这个那个don't的时候话挺多,其实脑子里面就是一团乱麻,空有一身蛮力,复仇的时候一点策略都没有,家里还为别人藏了一只枪。唉,不是我想为罪犯说这么多好话,谁让他的确是"弱者"呢。

总之,看得很郁闷,这哥们儿虽然坏了点,但是更傻。Hayley虽然似乎是在维护正义,其实更坏。

Source:http://www.fwolf.com/blog/post/270

2006年12月21日星期四

Match Point / 赛末点 / 迷失決勝分 / 爱情决胜点

神话论坛下载的这部电影,不知道起名字的人看没看剧情,但他是这样介绍的:

"美国超高评分爱情新片【爱情决胜点】"

但即使是喜欢看爱情片的lp,坚持看完上半部之后也不顾Dreamworks的招牌悻然离去,留下我继续兴致勃勃的欣赏。最终我明白lp为何离去了,这根本就不是什么爱情片。但他究竟属于什么类型呢,我想了半天也没什么大主意,于是在豆瓣上只给了两个tag:剧情 欲望,不过按照中国古老的电影分类方法,它应该属于"美国故事片" XD。

不看豆瓣还真不知道导演是Woody Allen,至于Woody Allen是谁,我是真不知道,恕我孤陋寡闻,我虽然喜欢看电影,但向来都是直扑电影而去,从来不管什么导演演员是谁,影片好就行,也从来不依导演或者演员来评判电影。所以关于Woody Allen就不班门弄斧了。

最后来说说影片本身,演员们演得真好,虽然故事就是在那几个人物之间展开:爸爸、哥哥、男主人公、妻子、情人,但每个人物都很饱满,让观众看了丝毫不觉得做作,就连人物之间的情感也是那么的细腻:

爸爸&妈妈对男主人公及其妻子的爱是那么的朴实,丝毫没有贵族的傲慢,也没有过分的溺爱,从相识到有了baby,都是那样的慈祥,真是羡慕。
妻子对男主人公的爱是那么的纯洁,纵使男主人公对她的爱并不是很深,和她在一起很大程度上是对这种舒适的生活方式的依赖,但这位并不十分美貌的妻子其实真的不错。
哥哥,男主人公踏入这个家庭的跳板,戏份不多,却是一个很真实的贵族公子,喜欢美女,喜欢哥们儿,风流但不放荡。
作情人的美女,着实火辣,怪不得男主人公为他"不惜一切",不冤枉,但时间长了以后,有了身孕以后,依然回归到了女人应有的角色,很现实。
最后,男主人公,运气真的不错,我们除了羡慕,还能说他什么好呢?

关于剧情,多说就影响大家欣赏的兴趣了,只说一点,导演能让观众们对一个杀人犯产生无比怜悯的"反常"心态,是这部影片的最大亮点。

看的着实过瘾,写出来却无从下手,唉,天要下雨,dns要建国内镜像,随他去吧,最后祝大家都Luck !。

Source:http://www.fwolf.com/blog/post/268

2006年12月19日星期二

mplayer播放新的rmvb格式有图像没声音(未解决)

本来用mplayer看电影挺好的,一直没出过问题,也几乎没有不认识的格式,可最近从神话下载了几个电影,播放的时候提示错误"could not open codec",并且只有图像,好像没有声音。把声音开到最大,终于听到了一点点,细细的声音,对照字幕看,也听不出人声来,好像是极度压缩变形了的声音。以为是mplayer有问题呢,找了几个原先下载的电影放了放都正常,遂怀疑是影片压缩格式的问题。

比如说这部电影,文件名是:[绿帽子].Green.Hat.DVDRip.XViD.REPACK-PP.rmvb,用totem打开(用这个播放压根儿就没声),看音频信息是:

Bitrate: 183 kbps
Codec: Cook

看来就是解码器的问题了,好像是real这种最新的编码,linux认得还不是很好,这部电影在windows下用很早以前安装的暴风影音都能够正常播放。

在mplayer的Perferences->Codecs & demuxer中,"Audio codec family"里面没有cook选项,但如果选择"FFmpeg/libavcodec audio decoders",就有刚才那个"could not open codec"错误,如果选"RealAudio decoder",错误提示就没了,不过两种情况下声音都是老样子。

再来修改/etc/mplayer/codecs.conf(这个文件也可以拷贝到$HOME/.mplayer下,然后在$HOME/.mplayer/config中增加一行"codecs-file=codecs.conf"来覆盖默认设置),注意其中这几句:

audiocodec ffcook
info "FFmpeg COOK audio decoder"
status working
format 0×6B6F6F63 ; "cook"
driver ffmpeg
dll "cook"

如果保持原样的话,在console下播放刚才的影片会提示:

Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
MC_COOK not supported!
Could not open codec.
ADecoder init failed :(
ADecoder init failed :(
Opening audio decoder: [realaud] RealAudio decoder
opening shared obj '/usr/lib/win32/cook.so'
AUDIO: 44100 Hz, 6 ch, s16le, 183.3 kbit/4.33% (ratio: 22911->529200)
Selected audio codec: [ra10cook] afm: realaud (RealPlayer 10 COOK audio)

根本就没有声音,如果把这几句设置用";"注释掉,播放影片会提示:

Opening audio decoder: [realaud] RealAudio decoder
opening shared obj '/usr/lib/win32/cook.so'
AUDIO: 44100 Hz, 6 ch, s16le, 183.3 kbit/4.33% (ratio: 22911->529200)
Selected audio codec: [ra10cook] afm: realaud (RealPlayer 10 COOK audio)
==========================================================================

==========================================================================
Building audio filter chain for 44100Hz/6ch/s16le -> 0Hz/0ch/??…
alsa-init: 1 soundcard found, using: surround51
alsa: 44100 Hz/2 channels/4 bpf/65536 bytes buffer/Signed 16 bit Little Endian
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)
Building audio filter chain for 44100Hz/6ch/s16le -> 44100Hz/2ch/s16le…
Starting playback…

声音仍然是老样子。然后在这里看到说可能是libstdc++5的问题,可我明明安装了啊,即使是卸载掉再重新安装(同时还会卸载掉xorg-driver-fglrx,记得重新安装时不要忘记了),问题依旧。

于是又怀疑是cook.so的问题,到mplayerhq去下载了个essential-20061022.tar.bz2,解压缩,替换/usr/lib/win32下面的文件,还另放了一份在/usr/lib/codecs,可都没有解决问题, 这个包里面比w32codecs还少一个cook.so.6.0文件呢。

没办法了,网上还有人说可以安装realplayer10,然后把它下面的cook.so拷贝过来用,但我实在不愿意装这个笨重的家伙,谁有现成的?发一个过来给俺试试,windows下的也可以。

目前这些使用超新编码方式的影片,只能使用windows播放,或者干脆就不看了!real自己的封闭格式没事升什么级啊,瞎折腾。

参考:Ubuntu:Mplayer播放某些avi影片有图像没声音的解决方法

Source:http://www.fwolf.com/blog/post/267

2006年12月18日星期一

用Ooo把你的演示文档输出成flash动画吧

Openoffice能够方便的输出pdf文档已经是天下皆知了,不过今天在翻阅ooo 1.1.5的新特性的时候,发现ooo居然还能够把演示文档(有些人喜欢叫幻灯片)输出成swf格式呢。

openoffice还能够输出swf文件
看来是我火星了,这个功能应该不是最近才有的吧。

然后大概试了试这个功能,使用很简单,打开odp文档,然后选用File->Export菜单,Export对话窗口中有"Macromedia Flash(SWF)",选这个就可以了。(咦。。。macromedia不是被adobe收购了么?)

转换的swf文件可以直接在firefox中播放,如果有什么讲义需要放到网上的话,不妨考虑一下这种方式喔。文件尺寸转换后很稍微变大,大概变大的尺寸还是比较固定的,我一个30k的无图片演示文档转换后为355k,而另外一个635k有图片的演示文档转换后为952k大小,两者都增加了320k,这是flash版odp播放器的大小么?

不过还是有一个坏消息,演示文档中的部分页会乱码,看来在实际应用的时候,swf发布上网之前还要检查一下的。好的样子:
openoffice转的swf播放中好的例子

乱码的样子:
openoffice转的swf播放中坏的例子

PS: 圣诞快到了,openoffice网站上的logo居然也飘起了雪花呢。
openoffice网站上的logo居然也飘起了雪花呢

PS2: flickr最近怎么这么慢?是每月容量升级为100M刺激了大伙儿,还是年底大家都比较闲都在上传图片?

Source:http://www.fwolf.com/blog/post/265

한반도 / 韩半岛 / Hanbando / 朝鲜半岛

虽然韩片看得我都快晕到吐了,但直觉告诉我这部很出众,结果3个小时终于没有白费,至少比《暴力城市》好看多了。

表面上这是一部商业娱乐片,模仿美国好莱坞方式,拿政治、政客们开涮,讨取观众的赏识,但如果仔细想想影片所讲述的故事,你会发现,不管是《韩半岛》也好,他模仿的好莱坞模式也好,其实是一种非常高明的教育方式。

在《韩半岛》中,表面上是在拿虚构的一个当代韩国总统,讲述他抵抗日本霸权的故事,同时还对照着100年前大韩帝国皇帝的不幸遭遇,只是这个当代韩国总统运气比较好,不仅有一个执拗的史学家帮忙,日本还挺通情达理,于是我们有了个皆大欢喜的结局,在大家齐声喝彩的时候,连"内贼"都没事得以"善终"。其实,片子前面的部分都是娱乐用的,只有最后2分钟才真正精彩,也就是总理辞职时所说的那番话:"我只不过是成千上万个持这种观点人中的一个罢了,将来还会出现第二个或第三个我,他们会接替我的位置来告诉你你所犯的错误。。。"。

片中为何把国玺放在如此重要的地位?其实那不仅仅是一块纯金或者是皇帝的公章,能夠证明合同的真伪的道具,而是韩国民族精神的一种象征,是韩国人对自己民族的一种忠诚的信念,所以,这部电影在告诉韩国人,不要为日本人目前所施予的贷款投资等恩惠所迷惑,别忘了他们曾经骑在我们头上拉屎撒尿!韩国版的"呐喊",似乎是说给那些想要人血馒头的人听的。

当然当今世界还是要讲和平的,所以片中的总统也没有要求日本作什么物质补偿什么的,只是要求"道歉""而已",但这种道歉的要求,和"抗议"还是有着本质的区别的,的确,我们是要和平共处,不过要站在对历史有着正确认识的基石上才行。我们不要求你们像德国总理那样下跪,但只是动动嘴皮子道歉的要求,也过分么?

基于韩国的实际,导演其实还埋伏了一个更隐晦的政治理想——南北韩统一。刚开始用南北韩铁路签约来作故事的开端是一方面,后来那个情报局秘书官李尚铉因为总理在南北韩统一上的观点而深思乃至投诚是另一个方面。看来韩国人和我们有着类似的民族情节,不知道北韩人民和台湾人民是否也如此。

所以,以后不要总说好莱坞是"造梦工厂",其实,他们在向全世界出口教材,电影在娱乐的同时,也承担着教育人民的任务,好莱坞只是让课堂更吸引人一些而已,有什么不好么?再来看看为什么国产电影大多没啥看头,和大学讲课一样,索然无味,纵有内涵与精神,说给一群昏睡的人又有何用?

Source:http://www.fwolf.com/blog/post/266

2006年12月8日星期五

玩转fortune

fortune是一个非常简单的小程序,几乎存在于所有的unix、bsd、linux操作系统上,它的功能很简单,就是从数据库中随机返回一句话。这个数据库一般是前辈们都设计好了的,也并没有我们常用的关系型数据库那么复杂,一般情况下忽视他们的存在就是了。要使用fortune,在shell中执行就可以了,比如:
$ fortune
Q: Do you know what the death rate around here is?
A: One per person.

很显然这是一个类似脑筋急转弯的问题。fortune有一些参数可以选用,比如:

$ fortune -c
(fortunes)
%
Never be led astray onto the path of virtue.

-c参数让你知道随机的句子出自哪个文件/或者叫数据库,本例中就是fortunes了。并且,在我使用的ubuntu dapper中,这些数据文件都存储在/usr/share/games/fortune中:

$ ls /usr/share/games/fortunes/
fortunes fortunes.u8 literature.dat riddles riddles.u8
fortunes.dat literature literature.u8 riddles.dat

看来很多人都把fortune当作一个小"游戏"呢。如果想知道fortune都会从哪些文件中随机挑选句子,可以这样:

$ fortune -f
100.00% /usr/share/games/fortunes
52.24% fortunes
31.76% literature
16.00% riddles

-f参数列出fortune所用的所有数据文件,以及他们在随机选取句子过程中的权重。一般这个权重或者比例是按照各个文件中的句子总数来分配的,可以看到ubuntu只带了三个数据文件:fortunes预言,literature名句,riddles谜语。fortune也可以控制每个数据文件的权重大小,比如-e参数让大家平均比例,或者在每个数据文件前面加上百分比:

$ fortune -f 20% fortunes 30% literature riddles
30.00% /usr/share/games/fortunes/literature
20.00% /usr/share/games/fortunes/fortunes
50.00% /usr/share/games/fortunes/riddles

可以看到比例就随之调整了,当然比例只和要等于100%,不过也可以省略riddles前面的百分比,那么它就是100%减去其他文件所占比例之和。还有其他一些参数可以用,比如:

先用-n指定一个句子长度,然后用-l只返回比这个长的,或者用-s只返回比这个短的。
-m regxp返回符合正则表达式的句子
-i在使用-m参数的时候忽略大小写
-o只返回具有攻击性的句子(不建议在网上对他人使用)
-a在所有句子中随机选择,包括具有攻击性或者不具有的。
-w 程序结束前等待一段时间,如果每次关机之前来一下,可以让你有时间来阅读

除了系统给定的那些数据文件之外,我们当然想自己创建啦,这个就要用到strfile命令了,首先来创建一个数据文件test:

test1
%
test2
%
test3

句子可以是多行,句子之间用独占一行的字符%来分割,然后用strfile为test创建索引文件,就可以在fortune中使用了:

$ strfile test
"test.dat" created
There were 3 strings
Longest string: 7 bytes
Shortest string: 6 bytes

$ fortune test
test3

注意如果不使用strfile创建索引,数据是不会被索引到的,所以要在新建和每次更新数据文件之后重新创建索引。

用法就介绍到这里,那么fortune有什么用呢?这就要看用户们怎么发挥了,比如我想在mutt的签名中随机附上一个脑筋急转弯,或者为网站生成"每日技巧"等等都可以,nix下的工具就是这样,只作一件事,并且作到最好,然后由用户来自由组合。

谁有兴趣把唐诗宋词弄进来玩玩?

Source:http://www.fwolf.com/blog/post/264

2006年12月7日星期四

用abook来管理mutt的地址簿

平时与别人联系使用最多的恐怕就是email和电话了,既然mutt有邮件别名文件alias,那为什么不能利用它把邮件地址和电话号码都管理起来呢?

有很多工具可以,扩展mutt alias文件的用途,lbdb可以用来收集邮箱地址,并可以从不同格式的文件或数据库中进行查询,用于mutt; Rolo可以把地址存为vCard格式,不过好像2003年底就停止开发了,最后, abook可以让alias文件除了保存邮箱之外,再多几个保存其他信息的"字段"。

首先安装abook:apt-get instal abook。

然后来进行配置,首先创建abook的配置文件~/.abook/abookrc,内容如下,我把所有的配置都加上了说明:

# Auto save when exit
set autosave=true

# All email of a contact are shown in main list
set show_all_emails=true

# Display email from which column of screen
set emailpos=25

# Which field is to display in main list view as the third column
# frequently used values:
# -1 disabled
# phone Home Phone
# workphone Work Phone
# fax Fax
# mobile Mobile Phone
# nick Nickname/Alias
# url URL
# notes Notes
set extra_column=mobile

# If extra_column have no data, display this instead
set extra_alternative=workphone

# Extra field display from which column of screen
set extrapos=55

# Command used to start mutt
set mutt_command=mutt

# Return all email addresses to a mutt query
set mutt_return_all_emails=true

# Command used to print the addressbook
set print_command=lpr

# Command used to start the web browser to view a contact's URL
set www_command=firefox

# Address formatting used when export or print(eu,uk,us)
set address_style=us

# Use only ascii in abook file
set use_ascii_only=false

# Drop duplicate address in data?
set add_email_prevent_duplicates=true

# Sort addresses sort by which field?
set sort_field=nick

由于abook自己具备独立的功能,所以配合mutt使用还需要一个script,接下来创建可执行文件~/.abook/abook-autoexport如下:

#! /bin/sh
abook ${@}
abook –convert \
–informat abook –infile $HOME/.abook/addressbook \
–outformat mutt –outfile $HOME/.mutt/aliases.new
mv $HOME/.mutt/aliases $HOME/.mutt/aliases.bak
mv $HOME/.mutt/aliases.new $HOME/.mutt/aliases

可以看出,这个脚本的作用就是首先执行abook干活,然后把abook的数据文件转换为mutt的alias格式,然后替换掉原有的muttalias文件。

现在可以把原来的mutt alias文件转换为abook格式了,存储于~/.abook/addressbook中,这个是abook的默认数据文件:

abook –convert –informat mutt –infile $HOME/.mutt/aliases \
–outformat abook –outfile $HOME/.abook/addressbook

最后,配置muttrc,通过macro在mutt中调用abook,添加下面两句:

macro index,pager A "!~/.abook/abook-autoexport\n:source ~/.mutt/aliases\n" "Start abook"
macro index,pager a \
"|~/.abook/abook-autoexport –add-email-quiet\n:source ~/.mutt/aliases\n" \
"Create new alias from the actual message"

这样,在使用mutt的时候,按A就进入abook进行联系人管理了,按a则可以把当前邮件的sender保存到abook中。

一点使用感觉和经验:
abook肯定不是最好的联系人管理软件,不过他使用很方便,在联系人不超过几百个的情况下,应该没有问题,况且除了能够存储邮箱信息之外,还能够保存电话、手机等很多信息以及4个自定义信息,哪怕是脱离mutt使用,也十分方便,所以用来管理电话本应该是没有问题的。

abook的最大缺点是不能很好的处理一个联系人有多个邮箱的情况,我的解决办法是,再创建一个alias文件,把常用的包含多个收信人地址的别名都存到这里手工管理,abook只用来管理每个联系人一个邮箱的情况,在大多数情况下够用了。

还有一个缺点是如果发信人中有中文,则不能正确识别=GB2312….=这样的编码,不过可以自己写程序转换。

abook,管理我的联系人

abook,管理我的联系人

参考:

Source:http://www.fwolf.com/blog/post/263

2006年12月5日星期二

Dragon Tiger Gate/龍虎門

很"美"的影片,不过也光剩下美了,没什么情节,甚至可以说故事十分乏味。发表几条拙见,算是看过此片了:

  • 开头谢霆锋我踢、我踢、我踢踢踢,一看就是甄子丹的招牌架式,现在传授给谢霆锋了,他运气真好,谁都帮他。
  • 谢霆锋和甄子丹的岁数应该差一辈儿了,片中演亲兄弟。。。
  • 片中都是机器人,打败几百人也不累,空手把倭刀打弯也不会受伤,连衣服都不破,圣斗士好歹还穿件圣衣捏。
  • 小龙小虎的两个女人纯属多余。。。
  • 罗刹门好像只有两个人:boss和罗刹女,拿三节棍和分水刺的两个怎么看都像是花钱雇的职业杀手。并且只有两个人的罗刹门居然能够颁发走私营业执照——罗刹令。
  • 最终boss是窝囊废,只会欺负老头子,最后和后生仔们斗的时候嘴里说着还有什么厉害的招数没有,其实自己的绝招根本就使不出来(杀元华时用的拳头发亮的那个)
  • 中式功夫片和老外动作片的最大区别是,老外动作片用的炸药多,车子、房子全要炸,中式动作片用的风扇多,我吹~~~袍子鼓来了,头发飘起来了,人也飞起来了,so cool~
  • 片尾,小龙说:我们两个都是阿龙,不如你改个名字,叫阿豹吧。小虎说:阿豹,挺cool啊。。。龙虎门本是取自两个人姓名中的龙、虎,现在如果再加上个豹,那岂不成了——龙虎豹?男生们应该都知道这本杂志吧?真为编剧寒啊 -_-!

Source:http://www.fwolf.com/blog/post/262

坐火车的感受

上周末出了趟近门,坐火车从石家庄到邯郸,办完事情再返回,虽然应该只是一个半或者两个小时的车程,不过还是平添了几分感觉:
  • 火车比汽车慢
  • 的确,现在火车提速了,不过汽车也大多上高速公路了,况且快慢只论不能只看行驶速度,还要看乘客在乘坐之前订票、买票、等车,以及下车之后出站的时间,加上这些因素,火车在短途旅行中就不见得有速度上的优势了。首先火车买票慢,排队、挤队,等到窗口了还不见得有票,全石家庄市订票电话好像就那一个,经常占线或者无人接听;而汽车不仅打电话咨询要方便多了,而且河北省内的几个地级市基本每天都有固定的几趟车,也不用提前买票,卡着时间去了,5分钟买票上车搞定。火车出站要过站台、地道,然后到达虽然有6个通道但平时只开1个的出站口,和汽车比起来,哪个快?

  • 车上有空座位的时候,上车的人更拥挤
  • 本来我的理解是,如果车上有空座位,并且很多的情况下,上车的人们应该不着急了吧,基本上都能找到座位啊。其实亲身体验过之后才知道,车上的空座反而是给了下面等上车的人们一种诱惑,仿佛谁先上车谁就能得到1万块奖金似的,结果更加英勇的向前冲。不仅欧巴桑们丝毫不在乎肌肤接触比小伙子还勇猛,就连衣冠楚楚的绅士们也身不由己得在人潮中挣扎。md,谁要是再说中国缺人,应该天天让他挤火车去。

  • 奴性心理的一种体现
  • 其实站台上也有维护秩序的人员,但如果你细心的话会发现一个现象,在没有人管的情况下,上车是肯定不会排队的,而如果有人戴个袖章拿个喇叭或者穿着制服来维持秩序的话,也能排成歪歪扭扭的队伍,大致按顺序上车。当然不排队有随波逐流和身不由己的成分在里面,但是否还有一种奴性的潜意识在作祟呢?难道只有在被人管着的情况下才能遵守秩序?那我们还要法制作什么,继续大力完善人治制度得了。

  • 晚点
  • 晚点好像不是什么新闻,一般从北京出来南下的车到石家庄是不会晚点的,但特殊的情况也会晚个10分8分的,而从邯郸返回石家庄的时候,从广东、桂林、武汉北上的车到了这里可没有不晚点的(仅指我坐车的那天晚上,没有作过普遍调查,不代表所有时间、所有车次都会晚点,或许只是那天我运气差),本来因为事情耽搁匆忙赶到火车站,还怕误了火车,结果进候车室一看就不着急了——晚点22分钟,就是再去吃碗面条兴许也够了。然后我就在候车室等待这22分钟,等到的确实晚点时间从22分钟变成30分钟、40分钟、50分钟、1小时零3分。就是晚点也不能这么离谱吧,登月工程都开始了,居然连晚点多长时间都无法预测!旁边几个小伙子一直嘀咕:"不知道这火车晚点有没有补偿啊",真是说到人心坎里了,但国家不会让年年"亏损"的铁路运输行业再背上这沉重的负担的,yy一下就算了。结果从邯郸至石家庄不到两个小时的坐车时间,我就在候车室里白等了一个小时,不相信我说的第一条的同志们可以找机会亲历一下 :(

Source:http://www.fwolf.com/blog/post/261

2006年11月29日星期三

Mutt中转发邮件的几种方式

邮件转发,包括转发邮件附件,或者是转发html格式的邮件(以第一个附件的方式包含在邮件中),在强大的Mutt中,大概有以下几种方式,注意所有的操作键都为默认设置:
  • 最简单的方式,按"b"原封不动的转出去!
  • 按"Esc E",把当前邮件作为模板进行编辑,然后当成自己的进行发送,不过编辑完记得用"Esc F"把发件人改成自己,否则发信服务器有可能会拒发。
  • 按"v"查看附件,然后选中想转发的附件,按"f"把当前附件转发走,或者是用"t"标记上所有想转发的附件,然后按";f"一次全部转发走。
  • 在设置中把"mime_forward_decode"选项设置为yes,然后按"f"正常转发邮件,被转发的邮件会被整体打包为一个附件发走,虽然可用但估计浏览起来不会太方便。如果不设置"mime_forward_decode",那么手工编辑转发的邮件太痛苦了。(我测试的结果是,如果直接按"f"转发,怎么也带不上附件)

编辑转发邮件时,如果附件的说明或文件名是乱码,可以按"d"修改为正常名称。

不管怎样,转发html格式的邮件还是非常不理想。

参考:[vox-tech] HOWTO: fiddle with mutt

Source:http://www.fwolf.com/blog/post/260

2006年11月28日星期二

mysql错误:Can’t find file: ‘tbl_name’ (errno: 2)

配置好mutt收发邮件之后,才发现cron每天执行的时候,如果执行中有错误提示或者输出,虽然用户看不见,但他会发一封本地邮件给管理员,在mutt中能够收到。比如,我就收到了这么一封邮件:

From: Cron Daemon
To: fwolf
Subject: Cron backup_mysql > /tmp/backup_mysql.log
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:

mysqldump: Got error: 1017: Can't find file: 'ads' (errno: 2) when using LOCK TABLES

我也是这样才发现每天备份数据库的时候都有错误了,表ads的数据根本就没有备份出来,再衍生查询一下,好几个表都这样,恐怖啊,幸亏及时发现,看来费这么大的力气来搞mutt还是有点用处的。

再来看这个错误,"Can't find file: 'tbl_name' (errno: 2)"这个错误产生的原因在mysql手册中有解释,存储数据表的文件名是有大小写的,大小写错误了就会"找不到",即使是在不去分文件名大小写的操作系统(比如windows)下,查询中引用的表名也应保持大小写的一致性。

而我产生这个错误的表,原来是在windows服务器下使用的,现在转到linux服务器下了,并且在很长的时间里都没有访问,只是一直舍不得扔掉,每次备份的时候都带着。以前这些数据表都保存在fat32分区中,上次 倒腾硬盘的时候,都转换成了ext3分区。再查看一下文件名,果然存在文件名大小写的问题。

一般采用分散文件方式保存的mysql数据表(MyIsam默认,InnoDb也可以通过选项innodb_file_per_table设置),每个表一般有三个文件,扩展名分别是.frm .MYD .MYI,注意大小写!我那些提示出错的表,扩展名三个都是小写的!于是把扩展名MYD MYI都改成大写,问题解决!

至于这些表名为什么成了小写,应该是原来在fat32分区上,windows服务器的时候造成的,因为一般windows下文件的扩展名都是小写的。

Source:http://www.fwolf.com/blog/post/259

SVN并不完全记录文件的属性

今天刚刚发现的,新建的一个Respontory,提交了一些文件进去,有的带有+x可执行属性,有的带有700非owner不可读属性,但是从仓库中再checkout之后,发现所有的文件属性都变成了755,再一查资料,原来svn并不记录和处理文件的这些属性,也没有什么svn chmod命令。

如果项目中确实对文件属性有要求,可以采用一个笨一点的替代的办法,就是自己写个脚本,比如叫svn_fa_modifier,把所有文件属性的设定都写在里面,每当checkout之后文件属性乱套的时候,就执行一下。(如果一直是在工作目录中checkin和update,文件属性应该不会乱)

至于svn_fa_modifier文件本身每次都要chmod +x么?其实也不用,可以用svn的propset命令来为其设定一个"可执行文件"属性,比如:

svn propset svn:executable ON svn_fa_modifier

这样svn_fa_modifier应该就永远都会带有+x属性了,不过propset中再也没有找到其他更改文件属性的资料。

参考一 参考二参考三 参考四(似乎svn中checkout出来的文件默认属性都是755?)。

PS: 顺便响应一下豆瓣的blog claim,doubanclaim8b95642ba743d85d,呵呵。

Source:http://www.fwolf.com/blog/post/258

2006年11月26日星期日

用unison来同步你的远程文件夹

不知不觉从邮件客户端切换到使用web的gmail已经很久了,以前使用客户端时的习惯早以丢弃了,同时还养成了把gmail当作工作台的习惯 :) 。不过时间流逝,以前只能在公司上网(速度快)收发邮件,现在家里的宽带也不错,同时工作越来越忙,很多时候都要在家里处理一些事情,那么,如果我在公司用mutt把邮件都收下来了,在家里怎么才能看到呢?有没有一种软件能够让我同步公司和家里两台电脑上的maildir目录呢?

答案当然是肯定的,不过不是rsync,rsync只能用来单向传输数据,可如果我在家里收、发了邮件,我希望回到公司之后也能够继续处理,所以我需要双向传输。顺藤摸瓜,就又找到了 unison这个好东西,它可以实现双向传输,并且为了节省带宽,只传输变动了的文件,甚至还能够在不同文件系统之间同步。

安装:

apt-get install unison

我安装的版本为2.13.16,不过据unison的官方网站介绍,它已经不再作新的开发了,只是继续维护和小的改进,原来的创始人 Benjamin C. Pierce现在在带头搞Harmony,另外一个更广泛意义上的同步工具,不过查了下harmory的资料太少了,并且ubuntu的源中也没有,所以还是先用着unison吧。

直接运行一下unison,就会创建空的配置文件$HOME/.unison/default.prf了,unison的配置文件很有意思,默认的叫default.prf,还可以任意创建多个单独的配置文件(在unison文档中,这些被叫做preference file),在调用的时候,可以指定不同的配置文件,这一点还是非常方便的。

现在,我来创建一个配置文件mail2home.prf,用来同步家里和公司电脑上的$HOME/mail目录,就是mutt的邮件存储目录,内容如下:

# Unison preferences file
# Sync between these too folders
# .prf file cannot recoginize ~, and NOTICE // in ssh address
root = /home/fwolf/
root = ssh://address_of_company_pc//home/fwolf/

# Only process these sub-directories
path = mail
path = .muttrc
path = .unison/default.prf
path = .unison/mail2home.prf

# Include another perference file(.prf)
#Include foo

# ignore all .mp3 files anywhere
ignore = Name *.mp3

# ignore all files with .unison somewhere in their full path
#ignore = Path .unison

# Fastcheck can be open if both side are linux
#fastcheck = yes

log = true
logfile = /home/fwolf/log/unison.log

# imports settings from default.prf
include default

这样,我就可以用一行命令来同步邮件了,注意同步的两台电脑上都要安装unison:

#测试一下。。。
unison mail2home -testserver
#正常运行,有文件需要传输时会提示
unison mail2home
#批模式运行,没有需要merge的情况就不提示啦
unison mail2home -batch

unison通过在$HOME/.unison下创建控制文件来记忆两端的文件状态,并且控制文件在同步的两端也是同步的,所以如果这个文件变得庞大无比,在一次全部同步并保证两端都暂时不会改变的情况下,应该可以删除这个控制文件并且重新开始同步。注意我还没遇到过这种情况,也没有测试过是否可行。

同步位置中有ssh地址时,会提示用户输入ssh的密码,如果ssh能够配置为使用key登录,应该就更方便了,也可以放到cron中定时执行了。

unison同步的速度还是很快的,不过要注意使用-batch同步的时候,一般是以文件最后修改时间来判断覆盖关系的,所以一是要让两端电脑的时间都别太错得离谱,二是记得要使用其他手段备份重要数据!

参考一 参考二参考三

hmm…下一步打算注册个大米到gfans论坛玩玩,如果顺利的话,就可以全面启用mutt咯。

Source: http://www.fwolf.com/blog/post/257

2006年11月25日星期六

The Ringer / 圈套 / 扮猪吃老虎

健康的身体是一切好事情的开端,但是在这个世界上,有一些人虽然拥有健康强壮的身体,大脑却有残疾,学名大概称之为"智障",损一点的俗话就是叫"傻子",他们其实生活在另外一个世界中。

和很多电影一样,开始部分的装疯扮傻很无聊,不过这都是剧情需要,不然戏怎么演呢。不过智障人士并不"傻",他们只是思维方式和我们不一样而已,所以在美女Lynn都看不出破绽的时候,就已经揭穿了Steve的诡计,多么讽刺啊。同样在比赛中,智障人士也给了Steve很大的压力,作为一个正常人,想超过经过训练的智障人士也并非容易,投入就会有回报,这句话用在这里太合适了。

虽然标榜为喜剧片,但我想只是指他的结果而已,毕竟这么一个美好的故事,谁会期待其他的结局呢?故事的过程倒趋向于伦理片,只是借用了喜剧的手法罢了,因为观众们不愿看到智障人士生活的苦涩一面。在他们的大笑之后,出了Steve的烦恼,还透这一丝无奈,或许他们自己体会不到,那样就幸福多了。不管怎样,每个人都有自己的烦恼要面对,尊重自己,尊重他人,学会以苦为乐,生活就像天上的云,没准儿会变成什么样子的。

下次公司再裁员,记得学学Stavi,也许你的老板会心软的。

片中押1000美金在Steve身上的人,是听他忏悔然后把他赶出教堂的那位神父么?谁看清了?

Source:http://www.fwolf.com/blog/post/256

2006年11月22日星期三

[Ubuntu]fetchmail+procmail+mutt+esmtp初窥

以前我讲过自己的email客户端软件选择历程,现在已经很少用客户端了,大部分时间都在gmail中泡。但是由于历史的沉淀,仍然有很多邮件会发送到tom、126等邮箱中,所以我决心再次涉足email客户端,初步选定linux平台下的fetchmail+procmail+mutt+esmtp组合,主要用于一些不支持转发的国内免费邮箱,如果感觉好的话,或许我会把gmail也加进来?

在fetchmail+procmail+mutt+esmtp的组合中,fetchmail负责收信,procmail负责过滤、分拣邮件,mutt是邮件阅读、撰写工具,esmtp负责发送邮件,在ubuntu下,都可以用apt安装,并且文件都不大:fetchmail 6.3.2-2ubuntu2 332k,procmail 3.22-11ubuntu2 140k,libesmtp5 1.0.3-1 51.9k,esmtp 0.5.1-3 35.3k,esmtp-run 0.5.1-3 3.302k,mutt 1.5.11-3ubuntu2.2 908k。

注意安装mutt的时候,它依赖postfix或者mail-transport-agent,所以要先安装esmtp-run,再安装postfix,因为postfix用于个人收发邮件是有点杀鸡用牛刀了。

然后是配置,配置的时候最好倒序进行,先配发信、过滤什么的,要不然先把收信配置好了,后续的过滤处理还没配就不好玩了。

首先创建.esmtprc,包含如下内容:

# smtp服务器地址
identity fwolf@domain1.com
hostname = smtp.domain1.com:25
username = "fwolf"
password = "pass"
default

identity fwolf@domain2.com
hostname = smtp.domain2.com:25
username = "fwolf"
password = "pass"

# 设置邮件发送代理程序
mda = "/usr/bin/procmail -d %T"

有多个smtp帐号时可以用identity区分。

然后配置mutt,ubuntu中系统的muttrc文件为/etc/Muttrc,可以另存一份为~/.muttrc然后修改,不过里面的默认设置很多都不用动,所以新建一份空的.muttrc然后把个人设置写进来也不错:

# 使用esmtp发信
set sendmail = "/usr/bin/esmtp -v -X ~/log/esmtplog"

有了这一行简单的配置,就可以告诉mutt把新建转交给esmtp进行发送了。现在启动mutt,就能够发信了,试一试吧,过完瘾之后,再来点复杂一些的muttrc配置:

#——–Basic
set beep=yes # beep when an error occurs
unset confirmappend # no confirm when appending message to existed mbox
set copy=yes # whether or not save your outgoing messages for later references
set delete=yes # purge deleted messages without asking
set editor=vim
set fast_reply=yes # donot prompt for to and subject when reply
set folder=~/mail # where to keep my mailboxes
set include=yes # include origin message when reply
set markers=yes # display + before wrapped lines
set mbox="=inbox"
set mbox_type=Maildir # use Maildir storage for mails
unset menu_scroll
set pager_context=1 # display N rows of last list page
set pager_index_lines=6 # mini index rows in list page
set pgp_verify_sig=no # ??
set postponed="=postponed"
set record="=sent" # turns on recording sent message to outgoing
set save_empty=yes # keep mailbox when last message is removed
set sendmail_wait=0 # wait when send mail process run
set status_on_top=no # move status bar to top of screen
set to_chars=" +TCFL"

#——–Folder
# Define the directory where mutt looks for mailboxes to report new mail
mailboxes `echo ~/mail/*`

#——–Format
#set date_format="!%H:%M %a %d %b   "
#set folder_format="%2C %t %8s %d %N %f"
#set index_format="%4C %Z %[%b%d] %-15.15F %s"
#set pager_format="%-10.10i %[!%a %b %d %R]"
#set status_format=" %r %b %f %n   Del %d   Msgs %m %l %> (%P)"

#——–Sort
set sort=threads # sorting the mails in threads
set sort_aux=date-sent # sort brother mails inside threads

#——–Headers
#ignore X-Mozilla-Status X-Mozilla-Status2 X-Accept-Language Delivered-To X-UIDL X-MSMail-Priority X-MimeOLE In-Reply-To
# 显示邮件时,除去默认邮件头列表中的域
# 忽略所有域然后反选您想看到的
ignore *
unignore Date To From: Subject X-Mailer Organization User-Agent
hdr_order Date From To Subject X-Mailer User-Agent Organization

#set alias_file=~/.mail_aliases # Let mutt know save path to aliases.(useless, default value is .muttrc)
#source ~/.mail_alias # load user aliases

#——–Misc
# 使用esmtp发信
set sendmail = "/usr/bin/esmtp -v -X ~/log/esmtplog"

#使用 G 键运行 fetchmail
macro index G "!fetchmail -a -m 'procmail -d %T'\r"
macro pager G "!fetchmail -a -m 'procmail -d %T'\r"

这些配置也只是一些基本的设置,是我从网上搜到的几个muttrc中汇总而来的,一些复杂的功能没有加上,等熟悉了之后再介绍。

再来配置procmail,编辑~/.procmail文件,我是参照这里进行的设置,也是打算熟悉了以后再深入研究:

MAILDIR=$HOME/mail/ #您最好确认该目录存在
LOGFILE=$HOME/log/procmail.log
LOGABSTRACT=no
#VERBOSE=on #…只在调试时使用
VERBOSE=off
FORMAIL=/usr/bin/formail
NL="
"
##处方行以 :0 开始
##不要在处方行加入注解
##使用否条件 ! 禁止一个处方
##条件行以 * 开始,regex 是您的朋友
##条件并列在一起,* 以后的部分都被送到 egrep
##紧接条件的是执行行,在这里是一个邮箱的名称
#使用 formail 捕获复本
:0 Whc: .msgid.lock
| $FORMAIL -D 16384 .msgid.cache

:0 a
$MAILDIR/duplicates/

#我们总是允许邮件来自
:0
* ^From:.*(fwolf\@domain.com)
$MAILDIR/myself/

#接着冲走一些垃圾
:0
* ^Subject:.*(credit|cash|money|debt|sex|sale|loan)
$MAILDIR/spam/

#不要 html 消息
#:0
#* ^Content-Type:.*html
#$MAILDIR/junk/

#将我的邮件列表转到相应邮箱
:0
* ^List-Id:.*gentoo-user
$MAILDIR/gentoo-user/
:0
* ^List-Id:.*gentoo-dev
$MAILDIR/gentoo-dev/
:0
* ^List-Id:.*gentoo-announce
$MAILDIR/gentoo-announce/

#捕获任何其它的 gentoo 邮件
:0
* ^From:.*gentoo.org
$MAILDIR/gentoo/
:0
* ^From:.*@freshmeat\.net
$MAILDIR/freshmeat/

################################
# 最后一条规则:将到达 #
# 这的邮件送到默认邮箱 #
################################
:0
* .*
$MAILDIR/inbox/

# 文件结束

注意每个邮箱目录名的后面都有斜杠"/",这是告诉procmail创建Maildir格式的邮箱目录,和muttrc中设置的一样,都使用Maildir格式存储邮件。

最后配置fetchmail,编辑~/.fetchmailrc文件,我也是参照Sucha's Homesite简单配置了一个,仍然是等熟悉了再详细介绍:

defaults
mda "/usr/bin/esmtp -f %F %T"

# set daemon fetch per 1.5 min
#set daemon 90

poll pop.126.com
proto pop3
uidl
username uname-126
password pass-126
is fwolf
keep

poll pop3.sina.com.cn
proto pop3
uidl
username uname-sina
password pass-sina
is fwolf

最后不要忘记更改配置文件的权限,里面可有你的密码哦。

chmod 600 .esmtprc
chmod 600 .fetchmailrc

现在,在shell中执行

fetchmail -akv -m "/usr/bin/procmail -d %T"

就能看到fetchmail和procmail愉快的收信与分拣了,再进入mutt,就可以对邮件进行管理了,我们的安装到此基本结束。

其实除了esmtp以外,fetcmail、procmail尤其是mutt的配置都非常丰富,我刚开始使用也是比照前人的葫芦画自己的瓢,网上也有很多类似的资源可以搜索到。

现在真的开始担忧mutt用爽了以后,在线的gmail如何处理了,毕竟mutt把邮件都收到了本地进行存储、处理,和gmail在线处理相比,虽然有速度的优势,却又少了可以随时随地使用的特点,我应该如何取舍呢?

Source: http://www.fwolf.com/blog/post/255

2006年11月21日星期二

googlegroups悄悄的升级,forward和filter规则的顺序变了

突然在主邮箱中见到了我用其他邮箱(称之为副邮箱吧)给一个groups发的邮件,顿感奇怪,虽然主邮箱是groups的owner,但订阅方式确实"no email",同时还看到googlegroups好像升级了,同一个groups,语言设定和用户偏好设定都是english语言,却仍然时不时显示汉化了的页面,难道说googlegroups在升级的时候强制把所有邮箱都转发到owner邮箱里面了一份?仔细查看主邮箱收到的邮件信息,发现只是在邮件发送过程的最后出现了forward到主邮箱地址的记录:

X-Gmail-Received: b042f7caed4468601bac5c7c7679626991e183a5
Delivered-To: 主邮箱
Received: by 10.78.168.17 with SMTP id q17cs77154hue;
Mon, 20 Nov 2006 23:18:21 -0800 (PST)
Received: by 10.49.91.9 with SMTP id t9mr623211nfl.1164093500618;
Mon, 20 Nov 2006 23:18:20 -0800 (PST)
X-Forwarded-To: 主邮箱
X-Forwarded-For: 副邮箱 主邮箱
Delivered-To: 副邮箱
Received: by 10.49.31.9 with SMTP id i9cs32065nfj;
Mon, 20 Nov 2006 23:18:05 -0800 (PST)
…..
Return-Path: fwolf.mailer1@gmail.com
To: groups地址, 副邮箱
From: 副邮箱

以上记录中有forward to副邮箱地址的内容,这是因为在往groups发送邮件的时候,也的确给自己发了一份,这样邮件会出现在inbox中,便于管理。那为什么主邮箱地址在收信人中没有,也没有订阅groups邮件,邮件发送的最后怎么又forward到主邮箱了呢?后来再登录副邮箱查看设置,才明白原由。

我的副邮箱设置了"Forwarding and POP",把所有邮件都转发到主邮箱中,以免漏掉重要邮件,同时还设置了filter:

Matches: from:(副邮箱) to:(副邮箱)
Do this: Skip Inbox, Delete it

凡是从副邮箱发出的邮件,经过处理之后,就直接删除了。

今天主邮箱意外收到邮件的事情,应该是因为googlegroups造成的,因为以前filter规则在"Forwarding and POP"之前生效,邮件在应用filter规则时就已经被删除了,"Forwarding and POP"便无信可转。现在作了调整,"Forwarding and POP"首先应用,所以主邮箱就收到了一份邮件的拷贝,然后filter规则再生效,一切照旧。

如果还想达到以前的效果,即能自动把副邮箱收到的其他邮件自动转发到主邮箱,又能够自动处理并删除副邮箱自己发送(同时发给自己一份)的邮件,可以这么作:禁用"Forwarding and POP",现有filter不动,再增加一条新的filter规则:

Matches: from:(-副邮箱)
Do this: Forward to 主邮箱

凡不是副邮箱自己发的邮件,再转发到主邮箱中。注意match那一行括号中有一个减号"-",在规则中是排除的意思。

Source:http://www.fwolf.com/blog/post/254