十二月 19, 2006

manage ebooks with apache and scuttle

电子书下载了一大堆,真正看过的不多,想看时找起来更麻烦,因为目录是树状的,分类不可能准确,比如一本讲PHP和MySQL的书应该放在哪个目录里呢?没办法,只好弄了一个webdev目录,可是这么粗的分类必然导致同一目录下的文件很多,找起来也不方便。

最近想了个办法,利用apache和scuttle来管理这些“宝贝”。scuttle是一个开源的书签管理系统,类似于del.icio.us。它由PHP写成,利用MySQL作为后端数据库。方法是用apache(或其它web服务器)将电子书所在的目录发布出来,这样每个文件都将获得一个链接,然后把这些链接加到scuttle里面,并打上适当的标签。scuttle还有firefox扩展,方便操作。这种方法适合单机和局域网,放到公网上要千万当心,因为会设计到版权、流量以及安全等问题,成了别人攻击的靶子就不好玩了。

十二月 15, 2006

blog collection on other BSP

散落在其他BSP上的blog旧文:

十二月 12, 2006

automatically beautify source code with emacs

前两天接了一个任务——统一代码缩进格式。

要求不算高,确保没有TAB键并缩进四格。问题是几十个文件,总得有点手段才行,谁让咱是懒惰的程序员呢!尝试了indent和astyle,都不甚理想,indent主要是处理C,而我们用C++,astyle号称也能处理C++和Java,却把bit field当成了label。最后还是决定用emacs,毕竟它有c++-mode。

写了两个脚本——reindent.sh和reindent.el。reindent.sh是驱动程序;reindent.el则完成缩进工作,它必须放在emacs的load path里面,比如可以放在/usr/share/emacs/site-lisp/,放在当前目录或使用显式路径都是没有用的。

reindent.sh的内容如下:

#!/bin/bash

set -o verbose

for d in dir_a dir_b/subdir_c; do
   for f in `find $d -iname "*.[hc]"`; do
      emacs --no-site-file --batch $f -l reindent
   done
done

reindent.el的文件内容如下:

(add-hook 'c++-mode-hook '(lambda()
      (setq indent-tabs-mode nil)
      (c-set-style "stroustrup")
      (c-set-offset 'case-label 4)
      (c-set-offset 'inline-open 0)
      (c-set-offset 'cpp-define-intro 0)
      (c-set-offset 'func-decl-cont 0)))
(c++-mode)
(indent-region (point-min) (point-max))
(untabify (point-min) (point-max))
(save-buffer)

其中包括了一些根据特定项目需要而做的定制和hack,详见CC Mode手册

十二月 07, 2006

Open-end fund calculator

前天试图给我从前写的“中国开放式基金投资跟踪工具”增加一点功能,即提取数据源的时间信息,并在输出结果上显示出来。因为修改幅度较大,在出现错误之后险些无法回退到正确的程序,当下惊出一身冷汗。程序员做了这么久,还是没有养成良好的习惯,以为只是一个小小的Perl脚本,随便改改测测就可以了,既没有用版本控制工具管理,也没写测试。虽然在网站上有1.1版本的备份,但其后的一些小改动并没有及时备份,如果这次真的搞砸了,这些工作就要重做了。

于是想到Google Code Hosting,它用subversion做版本控制,还提供一定的缺陷管理能力,本来就想着有机会试用一下,可惜发现帮助上说只有拥有GMail帐号的人才能发评论、提交缺陷,稍微有点不爽。于是就用Dreamhost本身提供的subversion,文档记录工作还是用wiki算了。有了版本控制,心里就踏实多了,过两天再写个正规点的测试,makefile什么的也加上,才算对得起咱程序员的身份。:-)

当然,别指望有多少人会去用一个Perl脚本,尤其是还要额外安装好几个module。即使是当初在英特尔的时候,别看用Perl写程序的人不少,能够玩转CPAN的人却没见过,都是依靠Perl语言的基本功能以及Core module在做事(也有手工下载tar包自己编译的)。所以我想,等到这个Perl脚本的功能完善得差不多的时候,再写一个Web 2.0的壳包装一下,万一以后转向互联网行业,在简历上也能写上一笔。

前一段股市长红,咱改起程序来也有了劲头;这两天股市喘口气,咱就做点基础性的工作。

十二月 04, 2006

avoid core dump when building emacs 22 on cygwin

一度成功地在cygwin上编译了emacs的cvs版,可是后来出了问题,症状有两个:

  1. make bootstrap时编译byte-opt.el出现core dump;
  2. 在使用一段时间后emacs无法响应,而CPU利用率达到100%;在终端里使用emacs则没有这个问题。

不久前cvs上的emacs版本从22.0.50升级到22.0.90,似乎离Emacs 22正式发布的日子不远了,所以在所有需要使用emacs的机器上都编译了一个最新版的,在Linux上,第一次尝试了--with-gtk这个configure的选项,发现启动时流畅很多,也快了些。而在cygwin上这样编译出的emacs根本不能用(居然还可以完全通过编译?),所以仍然使用了缺省的configure选项。

避免编译byte-opt.el出现core dump的方法是把LANG环境变量设置为en_US,在我的机器上缺省为zh_CN。建议把LANG的缺省值直接设置为en_US,这样在使用一些对中文支持不太好的程序时不会出现乱码。

问题1就这样解决了,不知道是不是误打误撞,以前在使用IPC::Run的时候也遇到过LANG环境变量导致失败的情况。这次虽然用同样的方式解决了问题,但仍然不知其所以然。

问题2到目前为止还没有再次出现过,难怪有些人在论坛里提问却总是得不到解决——不能重现的问题没人能够解决,除了倒霉者自己。

the long tail

玩了几天豆瓣,不仅订阅了一堆非技术的blog,还知道一本新书——《长尾理论》。

理论本身很简单,看个三五页就明白了,精彩的是作者利用该理论对现实的剖析,道出了在网络的影响下,商业活动以及商品本身正在经历怎样的变化。读着读着我有点明白了,为什么像我这样更新不够频繁的blog也能发展到五十几个订阅者,而没有成为一个爬满“蜘蛛”的荒凉地。

与书籍相比,豆瓣上的blog种类少,翻来覆去就是那么几个,一时还很难形成长尾。作为程序员,我对web2.0的实现技术还有点兴趣,却对基于web2.0的商业创意、商业评论提不起兴致,幸好豆瓣还有个“没兴趣”功能,上个周末出离愤怒狂点了一通,终于让推荐里面出现了一些新面孔。

很想看一些程序员的blog——纯技术性的,可惜很难找到,长尾啊长尾,你在哪里?过滤器啊过滤器,人民在呼唤你!