unix 的命令就是这样,选项暴多,看不过来,隐藏功能又经常会让人眼睛一亮。
大家都知道用 tail -f 来看正在更新的文件的尾部的新内容。但如果想回溯查一些特定的内容,比如时间,名字什么的,就只好 quit 以后用 grep 或者 less 打开来搜索。
实际上,直接用 +F 选项就是进入“Forward 模式”,定位到文件末尾实时更新数据。要退出到普通模式,直接 Ctrl+c,要再进此模式,按 Shift+f 即大写 F 键。要退出,先回普通模式,再 q 出去。
声明,这是从人家的博客上读来的,地址在此。
Published on July 31, 2009 4:19 pm.
Filed under: 开发 Tags: grep, less, tail, unix
昨天看到 github 正在举办项目排名推荐的竞赛。要求开源实现一段代码,通过给定的数据计算出推荐给用户的 10 个相关 repos,奖品是一瓶老酒外加无限制的 github 账号权限。后面这个比较诱人。竞赛成绩显示在排行榜上,不断有人在刷新记录。
说白了就是推荐系统,和豆瓣的推荐,和 Google Reader 右上角的推荐,和 Amazon 的类似商品推荐一样。许久以前买了《集体智慧编程》,说的就是怎样做推荐系统。不过当时也就走马观花看了前面两章。这回正好有机会实践一下,反正参加这个 contest 也没什么限制,我不指望排名,也不指望代码优雅。
以前从未写过类似的东西,上手了发现还满搞脑子的。基本上是用第二章介绍的最简单的,基于欧几里德距离评价的算法,也就是计算不同因素决定的多维空间中,两个点之间的距离,越近越相似。开始的时候,尝试比较所有给定仓库之间的相似性,但性能实在太糟糕。仓库数量远大于用户数量,这么做不经济。于是再改,把给定用户当前关注的仓库的所有特点拿出来,分配一个量,然后和所有其他仓库比较相似度。这样的计算大约在用户数乘以仓库数的级别,比起原来好很多了。后来又发现,量化数值时直接用编程语言所占行数表示,于是后边算平方和开根直接导致之前的性能问题。再后来,缩短参与计算的数据范围也改善了不少性能。现在基本上算一个用户的推荐,差不多花 2 到 10 秒左右。也不知道出来的结果能有多少击中率。
等算好了 push 一下,希望不要垫底,呵呵。
Published on July 31, 2009 12:54 pm.
Filed under: 开发 Tags: git, github
虽然 fayland 自己没提,不过我忍不住要提一下了,这位兄弟在 github 上正在撰写关于 Perl 的中文书,叫做 chinese-perl-book。
Fayland 结合自己的开发经验,介绍了几个现今比较流行的模块的使用,特别是 Moose,值得花时间拜读学习。从目前完成的一部分内容来看,更多的是理念的分享,这点非常难能可贵。模块的使用总会过时,行事的思想和方法却一直可以受用。
和书籍本身开源一样,相互协作带来的好处绝不是单方面的。Fayland 鼓励大家 fork 他的项目来共同推进。如果学到了什么,请对他道声感谢;如果有不明白的地方,请立即向他提问,这会有助于改善此书,以及更多将来有类似问题的读者。
Published on July 29, 2009 9:20 pm.
Filed under: 开发 Tags: cpan, fayland, github, moose, perl, 阅读
因为 vim 有输入模式和命令模式,所以输入中文的时候,免不了会乱套。上次和 Lodd 说到 vim 的时候,他就说用不惯,中文输入太麻烦。我基本上不在 vim 里面写中文,所以也没怎么在意。
因为开始翻译 progit,主要工作是编辑中文,所以这个问题浮上水面。问了下 cnhacktnt,记得有个 vimim 插件的,于是拿来试试,结果喜出望外。
下了两个词库,vimim.pinyin.huge 和 fcitx.phrase.pinyin。我承认我很土,只会拼音,还是全拼。
Published on July 29, 2009 9:50 am.
Filed under: 开发 Tags: cnhacktnt, lodd, progit, vim, vimim
今天产检,B 超出来孩子依然不大,腹径 110mm 左右,头也就 56mm,胎位 ROP。定了八月九日早上入院,十日开刀。这个周末再出来办预约床位的手续。
其他的都已经准备就绪,就差名字。这个令人纠结的问题一直还没有解决。现在有个候选的,盛芮秋。不过我不太喜欢当中那字,反正还是待选。我想可以取名像是盛墨,这样以后它就可以叫墨子,老了可以叫墨老。
当然这么说多少有些玩笑的成分,不过一直没有十分中意的字。唉,若是哪位有灵光闪现,不吝赐教啊~
Published on July 28, 2009 3:43 pm.
Filed under: 女儿欣宜
github 总可以给我带来惊喜。作为一个社交圈,我发现朋友 cnhacktnt 正在 watching progit 项目。于是就发现了这样一本关于 git 的图书,将在 Amazon 上卖,而图书原始内容就在这个项目内。迫不及待 git clone 下来。有点想要翻译的念头。先看一遍再说。
Published on July 28, 2009 3:30 pm.
Filed under: 开发 Tags: amazon, cnhacktnt, git, github, progit, translate
有时候从 web 上复制一段代码要粘贴到 vim 中,因为启用了 set smartindent 选项,粘贴后的缩进完全乱套。查 vim.cn 的 FAQ(14.14节) 知,可用 paste 选项禁用或启用 smartindent 选项。虽然前后麻烦些,至少问题解决了,smartindent 还是不能缺的。
在粘贴文本到 vim 前,先:
完了再恢复:
其实先禁用 smartindent 也一样的,不过至少 paste 比 smartindent 短 6 个字符,呵呵。
Published on July 23, 2009 11:38 am.
Filed under: 开发 Tags: paste, smartindent, vim
还是在“宇宙的惊喜”讲座上第一次听到今天日全食的消息,一转眼四个月过去了。时间就像日全食一样,当你留意的时候它缓慢前行,不留心的话,什么时候流逝而去的都无从知晓。
Published on July 22, 2009 9:17 am.
Filed under: 东拉西扯
上回去艾美度假,一进大堂我就闻到一种味道。淡淡的,有些松木的气息,毫不张扬,但却无处不在。
这味道让我回想起去年出差美国,刚下飞机来到 ironport 总部时,清冷的空气中夹杂的松木味道。这个味道伴随着我后来的整整两个星期。这味道让人觉得自信,坚忍,沉稳,有种历经沧桑后的淡泊,以及醇厚揣测不透的底蕴。
我一直跟老婆提这个味道,几次去超市想找相仿的沐浴露或是空气清新剂,未果。下午终于让老婆打电话去艾美问,原来是他们特调的香薰。
网上有两处可以印证。一处是这里,其中提到了“通过艾美的标志香味、声音”;另一处是这里,明明白白地说了这种味道的来由和作用。确实是起作用了。如果以后我再有机会去艾美,最大的一条理由必然是追逐那种特别香气。
很遗憾,身边算是得不到这种味道了。
Published on July 20, 2009 4:44 pm.
Filed under: 东拉西扯
写测试时,经常会遇到一堆类似的输入和输出要循环迭代同一组功能。简单点的,可以先构造几个数据数组,然后在循环中依次套数据。稍微复杂点看起来就乱哄哄的。
今天看到这个模块,简单易用,条例清晰,扩展方便。
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 上的连接。
Published on July 20, 2009 3:36 pm.
Filed under: 开发 Tags: cpan, module, perl, test