Monday, December 25, 2006

TortoiseSVN 共享文件夹下一样显示图标

虽然是 TortoiseSVN 既有功能,猜想很多人都不知道的。

正常情况下,如果你在一个网络共享文件夹下面 checkout 一个 subversion 控制的项目。这个项目的文件夹并不会像在本地文件夹中一样,以各式各样的图标来表示文件状态。你需要做的是稍许改一下配置:
TortoiseSVN -> Settings -> Look and Feel -> Icon Overlays -> Network Drivers

选中 Network Drivers,就能看到文件状态图标了。

货比三家

时常在网上书店买书,本着货比三家的原则,往返于各书店的价格页面,甚是累人。

也听说过用来比较价格的搜索网站,乘兴而去,败兴而归!

http://www.tejiawang.com/
收录站点少(2),价格信息单一

http://www.uobuy.com/
收录站点多(4),但是没有 china-pub,价格信息单一、滞后

http://www.danawa.com.cn/
不知所云

http://www.souchang.com/
收录站点少(1)


罢罢罢!

自己动手,丰衣足食。
http://sym.noticpan.org/

暂时只收录了当当和卓越,做了简单的消重再确认。

感想,卓越的页面要比当当规整一些,比较容易解析。

Sunday, December 24, 2006

也谈 Google 和百度

“百度更懂中文”,大家都这么说,著名用例:马勒隔壁的。

就当挑刺吧,正好刚才碰到了,举个例子
测试站点:
www.google.cn
www.baidu.com
搜索用例:
site:www.joyo.com Perl语言入门

从结果看,Google 给我的就是我要的;百度?不知道在干什么。

在中国,恐怕 Google 最痛的莫过于“不能用”。不谈 GFW,百度能做到,Google 为什么做不到?一样是企业,Google 确实逊人一筹。不过我没有这个烦恼,至少现在没有,所以我只用 Google。

Sunday, December 10, 2006

小心时区陷阱(二)

测试用例
#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece qw//;
use Date::Simple qw//;
use POSIX qw//;

sub show_info {
my $msg = shift;
my $hour = (localtime)[2];
printf "tz=$ENV{TZ}, tzname=%s:%s, hour=%2d # $msg\n", POSIX::tzname, $hour;
}

$ENV{TZ} = 'JST-9';
print "Date::Simple version is $Date::Simple::VERSION\n";
show_info('start');
my $date = Date::Simple->new;
show_info('after new');
$date->strftime("%Y-%m-%d\n");
show_info('after strftime');
POSIX::tzset;
show_info('after tzset');


输出结果
tz=JST-9, tzname=JST:JST, hour= 8 # start
tz=JST-9, tzname=JST:JST, hour= 8 # after new
tz=JST-9, tzname=UTC:UTC, hour=23 # after strftime
tz=JST-9, tzname=JST:JST, hour= 8 # after tzset


另外,关于 $ENV{TZ},提醒一下。
假设机器的时区设置为 UTC+9,不考虑非法的时区设置,那么根据值的不同,分别会是这样的结果
1.  not exists $ENV{TZ}        UTC+9
2.1 if ( $ENV{TZ} ) {...} UTC+0
2.2 else {...} UTC+9


Patch for Date::Simple 3.02
$ diff -r Date-Simple-3.02.orig Date-Simple-3.02
diff -r Date-Simple-3.02.orig/lib/Date/Simple.pm Date-Simple-3.02/lib/Date/Simple.pm
158a159
>
160,161c161,174
< local $ENV{TZ} = 'UTC+0';
< return POSIX::strftime ($format, _gmtime ($self));
---
> my $exists_env_tz = exists $ENV{TZ};
> my $tz = $ENV{TZ} if $exists_env_tz;
>
> $ENV{TZ} = 'UTC+0';
> my $result = POSIX::strftime ($format, _gmtime ($self));
>
> if ( $exists_env_tz ) {
> $ENV{TZ} = $tz;
> } else {
> delete $ENV{TZ};
> }
> POSIX::tzset();
>
> return $result;

参考链接
rt#23875

Tuesday, December 05, 2006

小心时区陷阱(一)

不知道大家有没有碰到过这样的问题,原本好好的当前时区时间突然变为 0 时区时间。

这个问题困扰了我很久,原因有二:
1、程序不是个单文件脚本
2、单元测试无法重现错误

后来在同事的帮助下,总算找到了问题所在

localtime(3) calls tzset(3), but localtime_r(3) not.
threaded perl localtime() calls localtime_r(3) instead of localtime(3)

来看一下 Date::Simple 的一段源代码

sub format {
my ($self,$format)=@_;

$format= $fmts{refaddr($self)||''} || $fmts{ref($self)} || $Standard_Format
if @_==1;

return "$self" unless defined ($format);
require POSIX;
local $ENV{TZ} = 'UTC+0';
return POSIX::strftime ($format, _gmtime ($self));
}

POSIX::strftime() 调用 tzset() 时看到的环境变量 $ENV{TZ} 是 UTC+0。在这之后就有问题了,如果使用 localtime(),因为 localtime_r(3) 并不会调用 tzset(),所以即使环境变量 $ENV{TZ} 已经恢复原值,localtime() 查看内部变量的时候,还是之前的 UTC+0。

至于为什么 localtime_r(3) 不像 localtime(3) 一样调用 tzset(3) 根据环境变量重设时区,我理解下来的主要原因是因为,它是线程不安全的。可能会出现下面这种情况

thread1
thread2
tzset()
tzset()
localtime()
localtime()

另外,关于环境变量 $ENV{TZ}存在(exists),但其值为空的时候,也会得到 UTC+0 的结果。

相关链接:
perlbug #26136