2006-10
12

前面这篇文章简单地阐述了用Perl创建守护进程(daemon)的方法。 实际上,创建一个多进程的守护进程需要注意很多事情。

阅读全文 »

2006-10
09

wp-cache 这个插件能够将 WordPress 的页面输出内容进行缓存, 这样第二次访问该页面时就不必访问数据库,从而加快页面生成速度,并降低服务器负载。 但很可惜这个插件是为 Unix/Linux 系统设计的,如果服务器是 Windows,该插件将会出现错误。 在Windows下使用该插件需要做些修改。

  1. 修改 wp-cache/wp-cache.php,找到 wp_cache_check_link() 函数,紧接着该函数的 global 变量声明 加入下列语句:
    return true;
    该函数的功能是检查符号链接,而Windows系统不支持符号链接,所以加入 return true 让该函数短路。
  2. 将 wp-cache/wp-cache-phase1.php 复制到 wp-content 下并改名为 advanced-cache.php。 官方安装手册上要求使用 ln -s 命令建立符号链接,而Windows并不支持符号链接,只能直接复制了。
  3. 修改 wp-cache/wp-cache-phase2.php,查找 ob_end_clean (大约在 220 行前后)将其修改为 ob_end_flush, 再将约10行之后的 flush 语句注释掉。

这样在插件面板中激活wp-cache,并在选项面板中 Enable Cache 即可。

另一个常见的问题就是 cache 不起作用,浏览任何页面 wp-content/cache 下也不会生成 cache 文件。 很可能因为当前的主题末尾忘记使用 </html> 标记。修改主题的 footer.php 文件并在最后添上 </html> 即可。



2006-10
08

sshd服务是一种安全连接,它能让你访问服务器上的命令行界面。Windows本身没有提供该服务,所以我们可以通过 cygwin 来进行安装。

阅读全文 »

2006-10
06

PrimoPDF是个免费的PDF转换工具,安装之后它模拟一台打印机,只要把想转换的内容打印到 PrimoPDF 上即可生成 PDF 文档。最新版本为 3.0,但是我安装之后发现打印速度非常慢,从Windows打印结束到PrimoPDF的保存对话框出现需要几分钟的时间,不得已只好卸载之重新安装了 1.0 版。但是1.0版试图保存PDF文件时出现了DLL invalid的错误。Google了一下原来是 v2.0、v3.0 卸载时会在注册表中留下垃圾,影响了 1.0 的工作。只要删除注册表的 HKLM\SOFTWARE\AFPL Ghostscript\8.50 键 1.0 即可正常使用。



2006-10
03

调试 Perl 程序时使用最频繁的就是 print 语句了,不过它只能输出普通变量的内容, 而不能输出数组和哈希。使用 Data::Dumper 模块则可以输出数组和哈希等复杂变量。

#!/usr/bin/perl
use Data::Dumper;
my $hashref = { name=>'charlee', age=>25, gender=>'male', interest=>[ 'computer', 'movie', 'cooking' ] };
print Data::Dumper::Dumper($hashref);

注意Dumper函数的参数为引用。输出结果为:

$VAR1 = {
          'name' => 'charlee',
          'interest' => [
                          'computer',
                          'movie',
                          'cooking'
                        ],
          'age' => 25,
          'gender' => 'male'
        };


2006-10
03

Devel::SmallProf 是个很好用的模块,可以方便地测量出代码每一行的执行时间,以便进一步优化。

例如以下程序,文件名为 prof_sample.pl。

#!/usr/bin/perl
my $str = "0";
for (my $i = 0; $i < 100; $i++) {
  $str =~ s/\d+/($&+1)/e;
  print $str."\n";
}

该程序的功能是输出整数 1 到 100。当然实际写程序时可不要用这么低效率的方法。 安装 Devel::SmallProf 之后我们来测量一下它每一行代码的执行时间。

perl -d:SmallProf prof_sample.pl

执行之后会在当前目录下生成一个 smallprof.out 文件,其内容如下:

           ================ SmallProf version 1.15 ================
                           Profile of prof_sample.pl                   Page 1
       =================================================================
    count wall tm  cpu time line
        0 0.000000 0.000000     1:#!/usr/bin/perl
        0 0.000000 0.000000     2:
        1 0.000006 0.000000     3:my $str = "0";
      101 0.006418 0.010000     4:for (my $i = 0; $i < 100; $i++) {
      200 0.002581 0.000000     5: $str =~ s/\d+/($&+1)/e;
      100 0.001509 0.000000     6: print $str."\n";
        1 0.000003 0.000000     7:}

前三列的数字分别为执行次数、消耗时间、消耗CPU时间。

如果你的程序使用 use 语句引用了其他模块,那么所有被引用的程序都将被分析,生成一个长长的报告。这时可以使用下面的命令来迅速找到耗时最长的命令。

sort -k 2nr,2 smallprof.out | less


2006-10
03

Weighted Categories 这个插件经过修改之后可以用来显示 TagCloud。 但是这个插件显示出的 TagCloud 总觉得有点别扭。一般人都是擅长某几个方面,很少样样精通的, 因此一般的博客总是会出现几个文章数非常多的标签,以及大量仅有一两篇文章的标签。 而 Weighted Categories 插件使用四则运算来计算标签的大小(附图公式(1)),结果就造成几个巨大标签混杂在大量的小标签中的 “众星捧月”的现象。

例如,假设有四个标签,文章数分别为 tagA=100、tagB=10、tagC=5、tagD=1,标签级别为 1~10,则各个标签的级别如下:

标签文章数计算式级别
tagA100100 / 99 * 9 + 110
tagB1010 / 99 * 9 + 11
tagC55 / 99 * 9 + 11
tagD11 / 99 * 9 + 11

显然,由于tagA的存在,其他标签都被挤到了最底层。

解决这个问题的方法就是利用对数函数。(对数函数的效果可见本文。) 计算公式见附图公式(2)。

公式(2)的结果与对数的底是无关的,见公式(3)。

用公式(2)计算上例得到下面的结果:

标签文章数计算式级别
tagA100log(100) / (log(100)-log(1)) * 9 + 110
tagB10log(10) / (log(100)-log(1)) * 9 + 15
tagC5log(5) / (log(100)-log(1)) * 9 + 14
tagD1log(1) / (log(100)-log(1)) * 9 + 11

显然这个结果要比原来的结果漂亮多了。

tagcloud-ev.png


2006-10
03

阅读全文 »


2006-10
02

今天客户发过来一个bug报告,说发送邮件时内容中书写はぁ~,收信时会显示成はち。 懂日文的朋友大概能明白,感叹词はぁ~怎么就变成了蜜蜂はち呢?

后来找到了原因。我们的邮件系统是用 Perl 写成的。其中有一个空格删除功能, 就是在显示时将邮件中的全角空格全部删除,其实现方法如下:

$body =~ s/ //g;

看起来似乎没有问题,但就是这条语句将はぁ~变成了はち。日文 euc-jp 编码下, 这几个字符串的编码如下:

字符串编码
はぁ~A4CF A4A1 A1C1
はちA4CF A4C1
全角空格A1A1

的后半个字符和的前半个字符恰好都是 A1,所以就被删除了,于是就出现了有意思的乱码现象。 修改方法也比较简单,只要正确识别出每个汉字的起止位置即可。

my $twoBytes   = '[\x8E\xA1-\xFE][\xA1-\xFE]';
my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
while($body =~ s/\G(($twoBytes|$threeBytes|[\x00-\x7F])+?) /$1/g){};  # 识别汉字,如果汉字后面有空格则删除
$body =~ s/^ //g;        # 最后删除最开始处的全角空格


2006-10
01

mysql 从版本 4.1 起增加了多国语言字符集功能。 数据在插入到数据库或者从数据库中取出时,mysql会自动进行字符集变换。 在创建数据库时必须要指定数据库字符编码,而客户端在连接mysql时也必须要指定客户端字符编码。 假设数据库字符编码utf8,而客户端字符编码gb2312, 那么执行select时mysql会将字符串从 utf8 转换成 gb2312, 而在执行 insert、update等时会将客户端输入的数据从 gb2312 转换成 utf8。

WordPress的数据使用 UTF-8 编码,因此在 mysql-5.0中创建数据库时应当将字符集指定为 utf8。 遗憾的是 php 等脚本语言不会自动设置客户端字符编码,因此mysql会选择默认的 latin1 , 这样在执行 select 时mysql会将数据从utf-8转换到latin1,造成乱码现象。

解决方法就是在执行 mysql_connect 之后执行以下语句

mysql_query("SET NAMES utf8");

使用phpMyAdmin-2.8.0.2完整的升级方法如下:

  1. 从原有的数据库中导出表结构和数据。
  2. 在mysql-5.0中创建数据库,设置字符校对为 utf8_general_ci。
  3. 向数据库中导入数据,导入时设置数据编码为utf8。
  4. 修改 wp-includes/wp-db.php,在wpdb类的wpdb函数中(57行前后)添加以下内容。
    function wpdb($dbuser, $dbpassword, $dbname, $dbhost) {
        $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
        ......
        $this->query("SET NAMES utf8");          // 添加这一行
        $this->select($dbname);
    }
mysql-5-update.png