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

Monday, November 13, 2006

Friday, November 03, 2006

AppLocale 和乱码

在安装 AppLocale 之后,微软安装程序包(MSI)的执行就会出现乱码。
网上广为流传的一个方法是把下面这个文件的内容清空,并将属性改为只读。

C:\WINDOWS\AppPatch\AppLoc.tmp


另有说法是直接删除亦可,并不会影响 AppLocale 的正常使用。

Monday, October 30, 2006

不那么成功的 Mozilla Firefox 2.0

在经历了短暂的亲密接触之后,工作和娱乐我都降级成了 1.5.0.7,很遗憾。

我很少降级软件,除非迫不得已。

2.0 的 UI 改进并不大,但是挺漂亮的,我很喜欢。至于把关闭按钮添加到每个标签页上,我倒觉得是个见仁见智的事情。除此以外,对我来说,就没有什么变化了。

工作环境下,2.0 本身并没有什么问题,蛮好的。但是,LiveHTTPHeaders 还没兼容 2.0,而对于我的工作来说,有时候它还真是那么得重要。在没找到替代插件之前,我能做的只能是降级 2.0。

娱乐环境下,出于不知名的原因,2.0 频频死机。好好的就失去响应了,还是缓不过神的那种。我现在用的网络本来就不好,这样一来,简直就是雪上加霜。没辙儿,怎么地我也犯不着跟自己过不去,降!

就这样,恋恋不舍地,我离开了 2.0。

Tuesday, October 24, 2006

外壳程序意外停止,Explorer.exe 被重新启动。

被这个问题困扰了一个星期,症状为:

在某些(我没能归纳出来)情况下,按下 Ctrl 键,Explorer.exe(不是浏览器,是最基础的那个 Explorer) 就崩溃重启了。没有错误报告,只能在事件查看器中发现来源于 Winlogon 的上述信息,事件 ID:1002。对其他程序倒是毫无影响,但是我就完全用不了 Ctrl+C/V 来操作文件了,甚是痛苦。

网上搜索了好几圈,看到有类似的问题,但是都没能解决我的问题。期间还差点弄爆系统,只要一按键盘,鼠标键盘全部失去响应,亏得有系统还原(擦把汗 -_-||)。最后总算撇到一文提到了金山词霸,嘿,还真对上号了!关闭 CB 就 OK。后来装了 CB 2005 的 SP1,就没有问题了。

小记一把,留作备忘。

Friday, October 20, 2006

MySQL 连接 localhost

在使用 mysql 连接 localhost 时,情况并不是表面上看起来的那样子。

举个例子:
$ mysql -u root test

这里没有指定主机,所以连接的是 localhost,若你是用 yum/apt-get/urpmi 等 RPM 管理工具安装了 MySQL 的话,这里称其为数据库 A,那么应该是很顺利地连接上了。然后,再安装一个 MySQL,称之为数据库 B,使用其他端口,比如 3307,再尝试连接。
$ mysql -u root -P 3307 test

你会发现,连上的还是数据库 A,而不是 B。

为啥乜?
因为连的是 localhost。

这种情况下,mysql 是通过 unix socket 而不是 tcp/ip 连接数据库的。所以,在本地有多个数据库的时候,用 -S 参数连接能保证 DWIM。举个例子:
$ mysql -u root -S /tmp/mysql_another.sock test

当然,也可以这样:
$ mysql -u root -h 192.168.0.1 -P 3307 test

只是 unix socket 方式可以获得更高的效率,闻得一说有 30% 之多,啧啧。