less +F 等效于 tail -f

unix 的命令就是这样,选项暴多,看不过来,隐藏功能又经常会让人眼睛一亮。

大家都知道用 tail -f 来看正在更新的文件的尾部的新内容。但如果想回溯查一些特定的内容,比如时间,名字什么的,就只好 quit 以后用 grep 或者 less 打开来搜索。

实际上,直接用 +F 选项就是进入“Forward 模式”,定位到文件末尾实时更新数据。要退出到普通模式,直接 Ctrl+c,要再进此模式,按 Shift+f 即大写 F 键。要退出,先回普通模式,再 q 出去。

声明,这是从人家的博客上读来的,地址在此

contest.github

contest.github

昨天看到 github 正在举办项目排名推荐的竞赛。要求开源实现一段代码,通过给定的数据计算出推荐给用户的 10 个相关 repos,奖品是一瓶老酒外加无限制的 github 账号权限。后面这个比较诱人。竞赛成绩显示在排行榜上,不断有人在刷新记录。

说白了就是推荐系统,和豆瓣的推荐,和 Google Reader 右上角的推荐,和 Amazon 的类似商品推荐一样。许久以前买了《集体智慧编程》,说的就是怎样做推荐系统。不过当时也就走马观花看了前面两章。这回正好有机会实践一下,反正参加这个 contest 也没什么限制,我不指望排名,也不指望代码优雅。

以前从未写过类似的东西,上手了发现还满搞脑子的。基本上是用第二章介绍的最简单的,基于欧几里德距离评价的算法,也就是计算不同因素决定的多维空间中,两个点之间的距离,越近越相似。开始的时候,尝试比较所有给定仓库之间的相似性,但性能实在太糟糕。仓库数量远大于用户数量,这么做不经济。于是再改,把给定用户当前关注的仓库的所有特点拿出来,分配一个量,然后和所有其他仓库比较相似度。这样的计算大约在用户数乘以仓库数的级别,比起原来好很多了。后来又发现,量化数值时直接用编程语言所占行数表示,于是后边算平方和开根直接导致之前的性能问题。再后来,缩短参与计算的数据范围也改善了不少性能。现在基本上算一个用户的推荐,差不多花 2 到 10 秒左右。也不知道出来的结果能有多少击中率。

等算好了 push 一下,希望不要垫底,呵呵。

Google Ads

chinese-perl-book

虽然 fayland 自己没提,不过我忍不住要提一下了,这位兄弟在 github 上正在撰写关于 Perl 的中文书,叫做 chinese-perl-book

Fayland 结合自己的开发经验,介绍了几个现今比较流行的模块的使用,特别是 Moose,值得花时间拜读学习。从目前完成的一部分内容来看,更多的是理念的分享,这点非常难能可贵。模块的使用总会过时,行事的思想和方法却一直可以受用。

和书籍本身开源一样,相互协作带来的好处绝不是单方面的。Fayland 鼓励大家 fork 他的项目来共同推进。如果学到了什么,请对他道声感谢;如果有不明白的地方,请立即向他提问,这会有助于改善此书,以及更多将来有类似问题的读者。

vim 的中文输入

因为 vim 有输入模式和命令模式,所以输入中文的时候,免不了会乱套。上次和 Lodd 说到 vim 的时候,他就说用不惯,中文输入太麻烦。我基本上不在 vim 里面写中文,所以也没怎么在意。

因为开始翻译 progit,主要工作是编辑中文,所以这个问题浮上水面。问了下 cnhacktnt,记得有个 vimim 插件的,于是拿来试试,结果喜出望外。

下了两个词库,vimim.pinyin.hugefcitx.phrase.pinyin。我承认我很土,只会拼音,还是全拼。

八月十日倒计时

今天产检,B 超出来孩子依然不大,腹径 110mm 左右,头也就 56mm,胎位 ROP。定了八月九日早上入院,十日开刀。这个周末再出来办预约床位的手续。

其他的都已经准备就绪,就差名字。这个令人纠结的问题一直还没有解决。现在有个候选的,盛芮秋。不过我不太喜欢当中那字,反正还是待选。我想可以取名像是盛墨,这样以后它就可以叫墨子,老了可以叫墨老。

当然这么说多少有些玩笑的成分,不过一直没有十分中意的字。唉,若是哪位有灵光闪现,不吝赐教啊~

《Pro Git》

book-pro-git

github 总可以给我带来惊喜。作为一个社交圈,我发现朋友 cnhacktnt 正在 watching progit 项目。于是就发现了这样一本关于 git 的图书,将在 Amazon 上卖,而图书原始内容就在这个项目内。迫不及待 git clone 下来。有点想要翻译的念头。先看一遍再说。

vim 使用 smartindent 时,粘贴代码缩进问题

有时候从 web 上复制一段代码要粘贴到 vim 中,因为启用了 set smartindent 选项,粘贴后的缩进完全乱套。查 vim.cn 的 FAQ(14.14节) 知,可用 paste 选项禁用或启用 smartindent 选项。虽然前后麻烦些,至少问题解决了,smartindent 还是不能缺的。

在粘贴文本到 vim 前,先:

:set paste

完了再恢复:

:set paste!

其实先禁用 smartindent 也一样的,不过至少 pastesmartindent 短 6 个字符,呵呵。

日全食

还是在“宇宙的惊喜”讲座上第一次听到今天日全食的消息,一转眼四个月过去了。时间就像日全食一样,当你留意的时候它缓慢前行,不留心的话,什么时候流逝而去的都无从知晓。

世茂佘山艾美酒店的气味

上回去艾美度假,一进大堂我就闻到一种味道。淡淡的,有些松木的气息,毫不张扬,但却无处不在。

这味道让我回想起去年出差美国,刚下飞机来到 ironport 总部时,清冷的空气中夹杂的松木味道。这个味道伴随着我后来的整整两个星期。这味道让人觉得自信,坚忍,沉稳,有种历经沧桑后的淡泊,以及醇厚揣测不透的底蕴。

我一直跟老婆提这个味道,几次去超市想找相仿的沐浴露或是空气清新剂,未果。下午终于让老婆打电话去艾美问,原来是他们特调的香薰。

网上有两处可以印证。一处是这里,其中提到了“通过艾美的标志香味、声音”;另一处是这里,明明白白地说了这种味道的来由和作用。确实是起作用了。如果以后我再有机会去艾美,最大的一条理由必然是追逐那种特别香气。

很遗憾,身边算是得不到这种味道了。

数据驱动测试框架 Test::Base

写测试时,经常会遇到一堆类似的输入和输出要循环迭代同一组功能。简单点的,可以先构造几个数据数组,然后在循环中依次套数据。稍微复杂点看起来就乱哄哄的。

今天看到这个模块,简单易用,条例清晰,扩展方便。

use strict;
use warnings;
use utf8;
use Test::Base;
use URI::Find::UTF8; 
 
filters { raw => 'chomp', uri => 'chomp' };
plan tests => 2 * blocks;
 
run {
    my $block = shift;
 
    my $f = URI::Find::UTF8->new(
        sub {
            my($uri, $orig) = @_;
            is $uri->as_string, $block->uri, "$uri";
            is $orig, $block->raw, "raw path";
        },
    );
    $f->find(\$block->input);
}
 
__DATA__
 
===
--- input
アンサイクロペディアのホームページはhttp://ja.uncyclopedia.info/wiki/メインページ foo bar
--- raw
http://ja.uncyclopedia.info/wiki/メインページ
--- uri
http://ja.uncyclopedia.info/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
 
===
--- input
Home page <URL:http://www.google.com> Google
--- raw
http://www.google.com
--- uri
http://www.google.com/

要测试的数据放在 __DATA__ 块内,三个等号标志一个 block。然后三个减号定义一项数据的名字,下接其内容。看程序,use Test::Base; 后,就有 filters, plan, blocks, run 这几个方法可用。

filters 定义提取数据时,要做的休整操作。blocks 在 scalar context 返回定义了多少 block,因为每组 block 将要在 run 里面做两次 is 测试,所以 plan 要做的测试总数为 2 * blocks。接下来 run 定义了一个匿名 subroutine,在其内部接受 Test::Base 传来的 block 对象,然后依次测试,访问 block 数据就直接用定义好的数据名字,清爽。

这里是 cpan 上的连接