二月 28, 2007

Rediscover the web again

"Rediscover the web. Again."是firefox的一句广告语,其气魄可见一斑。

我从firefox 1.0时代就喜欢上了这款浏览器。之后,随着附加软件一个接一个的装上,更离不开它了。这里列出了我装的一些附加软件,使用MR Tech Local Install生成,删除了fedora缺省安装的许多language pack。

在这剩下的23个附加软件里,我最中意的有:

CHM Reader
许多电子书都是chm文件,曾几何时,在Linux下看chm文件简直是噩梦,直到它出现了。除了浏览上毫无瑕疵之外,它还有一个侧栏,用来显示目录结构,方便在不同章节之间跳转。
del.icio.us Bookmarks
在升级到1.4.27版本后,它基本可以取代firefox内置的书签功能(它真的有隐藏书签菜单的选项)。如果原来是在del.icio.us网站上装的,那么无法自动更新到这个版本,请点击上面的链接,然后安装最新版本。新版本与我原来用的1.2版差别还是很大的,它会将所有的收藏同步到本地;收藏新链接时弹出的不再是一个网页,而是对话框;原来点击后会跳转到“我的del.icio.us”的按钮功能也改变了,感觉有点多余,干脆去掉了,只留一个"Tag"按钮。新版本也提供了侧栏。
Download Statusbar
下载电子书必备。免去了因查看下载进度而不断切换窗口的烦恼,且下载状态只在最上层的窗口显示。
FoxyProxy
为不同网站配置不同的代理,最大的特点是可以配合tor来做一些顽皮的事情。“看不见我,看不见我……”。:-)
It's All Text!
最近才发现的,可以使用自己喜欢的编辑器替代textarea,而且免去了复制粘贴的烦恼。Emacs用户可以配置为/usr/bin/emacsclient,当然还要在.emacs文件里加上一句(server-start)。写好之后按C-x #,内容会出现在textarea里面,只是延迟比较明显,估计在1秒左右。
MR Tech Local Install
极大地简化了安装、更新附加软件和主题的过程。
Tab Mix Plus
不只操作标签页,而且操作窗口。最喜欢的两个功能是复制标签页到新窗口和合并当前窗口与上一个窗口(Ctrl+Shift+M),后一个功能要自己设定,缺省为合并所有窗口。

二月 15, 2007

DateTime and its format

最近写了两个程序,一个需要生成feed,另一个需要解析feed,其中最让人头疼的就是关于时间的处理。

还好,Perl有相应的module能把绝大多数事情处理好,其核心就是DateTime module。这个类用来表示某个特定的时间,并支持许多基于时间的计算。而许多DateTime::Format::XXX类则将DateTime对象输出为特定的格式,如DateTime::Format::W3CDTF可以输入符合Atom要求的时间格式,如下面的例子:

#!/usr/bin/perl
use DateTime;
use DateTime::Format::W3CDTF;

$now = DateTime->now(time_zone => 'Asia/Shanghai');

$output = DateTime::Format::W3CDTF->format_datetime($now);
print $output, "\n";

这个程序的输出为:

2007-02-15T14:30:00+08:00

下面的例子是将格式为W3CDTF的日期字符串转换为DateTime实例:

#!/usr/bin/perl
use DateTime;
use DateTime::Format::W3CDTF;

$t = DateTime::Format::W3CDTF->parse_datetime('2007-02-15T14:30:00+08:00');

二月 08, 2007

optimized feedman

一个简单的feedman终于成形了,目前只有一个功能,即按照更新时间顺序排列所有的feed,见这里。我居然一共订阅了211个feed,天知道每天在这上面浪费了多少时间。

一度担心这个程序运行时间太长,无法在dreamhost上运行,后来才发现是个笑话,还有大把的CPU时间可以利用,接下来这一年要充分利用一下。不过优化还是做了,效果比较明显,下面是优化后的profile结果:

Total Elapsed Time = 1552.900 Seconds
  User+System Time = 30.78019 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 57.2   17.62 17.627 252416   0.0000 0.0000  XML::Parser::Expat::eq_name
 25.0   7.714 25.340 720851   0.0000 0.0000  XML::Parser::Expat::within_element
 11.4   3.521 31.838 152421   0.0000 0.0002  XML::RSS::handle_char
 4.85   1.492  1.492 195848   0.0000 0.0000  XML::Parser::Expat::namespace
 3.36   1.035  1.903 384149   0.0000 0.0000  XML::Parser::Expat::generate_ns_name
 3.20   0.986  0.986 318115   0.0000 0.0000  XML::Parser::Expat::current_element
 3.08   0.947  1.766   1188   0.0008 0.0015  DateTime::new
 2.82   0.868  0.868 224071   0.0000 0.0000  XML::Parser::Expat::GenerateNSName
 2.79   0.860 34.604    117   0.0074 0.2958  XML::Parser::Expat::ParseString
 1.72   0.528  0.559   4795   0.0001 0.0001  Params::Validate::_validate
 1.55   0.477  1.881  19221   0.0000 0.0001  XML::RSS::handle_start
 1.00   0.308  0.318    649   0.0005 0.0005  URI::_init
 0.57   0.176  0.340   5605   0.0000 0.0001  LWP::Protocol::http::SocketMethods::sysread
 0.53   0.163  0.163   5605   0.0000 0.0000  LWP::Protocol::http::SocketMethods::can_read
 0.53   0.162  0.672    225   0.0007 0.0030  LWP::Protocol::collect

对比上次profile结果可以发现,User+System时间从70秒减少到30秒。既然XML::Parser已经是最快的,优化又是如何做的呢?方法是减少调用次数。首先是检查LWP::UserAgent->mirror的返回代码,判断xml文件是否更新过,如果没有更新,自然也就没有必要解析;另外对于不能使用mirror的网站,虽然每次仍然抓取,但也未必一定要解析,方法是每次抓取下来后使用Digest::SHA生成一个256位的16进制码,并保存起来,如果下一次生成的码没变,那么就可以假设该文件没变,因此也不需要解析xml文件,这样占用时间最多的Perl过程的调用次数减少了一小半。

让我困惑的是怎么总时间差那么多?上次是怎么测试的?难道只测了google reader上的订阅?

在开发这个程序的过程中真是什么问题都碰到了,当然问题最多的还是日期问题。比如排在第一的那位,最近更新时间居然是2008年!还有排在第二的(2007年2月8日)Stevey's Blog Rants,我在bloglines上好久都没看多有更新,而在我这里居然排第二,仔细检查后发现原来他在feedburner上的feed已经改过了,我用的那个已经无效,而更新时间是从其它feed上得到的。还有,Site News for A.P.Lawrence Unix, Linux and Mac OS X Resources的月份数居然是从0开始,开始的时候没仔细看,心想日期明明就在那里,怎么就解析不出来呢?在调试器里折腾了好几趟,终于发现了这个诡异的问题。再有一个让我吐血几天的是思维驱动,日期就在那里啊,而且格式也对!?原来是不能用mirror,这才使用了前面提到的Digest::SHA。

最后还是要提一句,做优化切莫想当然,一定要基于profile的结果。

二月 03, 2007

Profile Perl script with Devel::DProf

最近更新了一下feedman,使其可以打印每个feed最近更新的时间,然而运行的时候发现print.pl明显比cache.pl要耗费CPU资源,担心由于dreamhost的CPU时间限制而不能上线,于是便想做个profile看有没有优化的余地。

Perl有三个module可以做profile,分别是:

我使用了第一个,如下:

$ perl -d:DProf print.pl
$ dprofpp
Total Elapsed Time = 79.65801 Seconds
 User+System Time = 75.44801 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
48.8   36.81 36.815 418482   0.0000 0.0000  XML::Parser::Expat::eq_name
29.7   22.46 59.279 116011   0.0000 0.0001  XML::Parser::Expat::within_element
17.7   13.41 80.911 254813   0.0001 0.0003  XML::RSS::handle_char
4.18   3.154  4.948 610015   0.0000 0.0000  XML::Parser::Expat::generate_ns_name
3.85   2.903  2.903 527420   0.0000 0.0000  XML::Parser::Expat::current_element
3.27   2.469 85.910    153   0.0161 0.5615  XML::Parser::Expat::ParseString
3.13   2.360  2.360 309740   0.0000 0.0000  XML::Parser::Expat::namespace
2.38   1.794  1.794 345778   0.0000 0.0000  XML::Parser::Expat::GenerateNSName
1.49   1.123  2.080   1402   0.0008 0.0015  DateTime::new
0.79   0.597  0.610   5494   0.0001 0.0001  Params::Validate::_validate
0.67   0.509  2.503  24127   0.0000 0.0001  XML::RSS::handle_start
0.28   0.214 90.228    223   0.0010 0.4046  main::get_latest_update_date
0.26   0.194  0.433   2324   0.0001 0.0002  DateTime::_compare
0.22   0.169 86.556    205   0.0008 0.4222  XML::Feed::parse
0.16   0.119  0.177   1085   0.0001 0.0002  DateTime::Format::Mail::_parse_loose

可以看出时间都用在解析xml文件上了,google了一把发现XML::Parser已经是最快的了,没法子,只好到wiki.dreamhost.com上去看CPU时间限制的具体描述,原来每人每天不能超过60分钟,我想这对我来说足够了,至少可以先试试,反正也不会关站,不行再撤吧。

CMB, please support firefox and linux

招商银行,请让贵行的网络银行系统支持firefox和linux吧。

招商银行虽然网点不多,但因其网上银行领先同行一步,所以仍为很多用户青睐,我就是这样成为招商银行的用户。招商银行的信用卡、一卡通和网上银行我都使用过,甚至还跑过几家网点去申请“优KEY”,可惜都被告知暂时没有,推荐我先办个文件数字证书。我曾戏言送钱都找不着门路。

其实我还有几张其它银行的银行卡,但都是工资卡之类摊派下来的,只有招商银行的卡,是我主动去办理的,因为感觉招商银行无论是服务还是网银系统都非常专业。“专业”这个词是很要命的,比如我上网都用firefox,尽管某些网站在firefox下很难看,但我仍坚持使用,甚至对于那些无法在firefox下正常浏览的网站我就不再去看了,而那些能在firefox下浏览的网站则让我感到很专业,于是对该网站的业务和背后的人有一种盲目的信任感。我相信,用firefox浏览招商银行的网站是不会有太大问题的,然而,相对来讲,任何一个银行网站的内容都是有限的,最重要的是网银系统。我当初就是在对招行一无所知的情况下,单纯因其在网银系统极佳的声誉而选择了它。

招行的服务非常专业,然而这些只有老用户才能体会得到,可惜这种体会很难传达,所以吸引新用户最好的方式就是建立一套领先的网银系统。如今,各家银行都有了网银,招行的优势已不那么明显。如果招行能够支持firefox,甚至是linux,那么将再次将其它银行远远抛到后面。其实,firefox或linux用户的绝对数量多少并不是问题的关键,就像当初招行开发网银系统,恐怕也没有多少用户吧。关键是,这是一块招牌,一块让人觉得你非常专业的招牌,从而可以吸引更多的新用户。何况,firefox和linux已经逐渐流行起来,而且有越来越火的趋势,相比之下,IE在停止开发几年之后被迫升级,Vista几近难产,未发行即遭很多人诟病。谁是八九点钟的太阳可见一斑。

真的很希望看到firefox和linux能够得到银行的支持,不知道谁会是第一个尝螃蟹的人,但愿招行不会成也网银、败也网银。

最后,祝愿招行业务蒸蒸日上,引领全国银行业的发展。

另见: