2009-09
16

非root用户没有权限写 /usr/lib/perl5,所以编译Perl模块时必须将PREFIX设置到自己的主目录下。使用CPAN时可以这样设置:

第一次启动CPAN,执行设置时,以下问题回答 PREFIX=~/perl:

Parameters for the 'perl Makefile.PL' command?
Typical frequently used settings:

    PREFIX=~/perl       non-root users (please see manual for more hints)

Your choice:  [INSTALLDIRS=site] PREFIX=~/perl

然后编辑~/.bashrc,添加这样一行,然后重新登录或直接执行 source ~/.bashrc。否则CPAN中的make test会出错。

export PERL5LIB=`echo ~/perl/*/perl/* | sed 's/ /:/g'`

2009-08
04

这些插件都可以在 Trac Hacks 上下载到。 直接在首页搜索名字即可,因此本文就不再给出下载链接。

AdvancedTicketWorkflowPlugin

添加几种常用的ticket工作流动作,如转给上一个人、转给模块负责人、转给报告者、执行外部程序等。 如果你想要自己打造一个适合项目的工作流,这个插件肯定会派上用场。

BatchModify

批量修改ticket属性。

TracAccountManager

可以从后台管理Trac帐号,但更重要的是,它可以提供一个基于Web的登录页面。

TracAuthRequired

要求使用者必须登录才能查看Trac内容。在企业应用中,项目的资料一般都需要保密, 这个插件跟TracAccountManager配合使用,正好能满足要求。

TracReportManager

Trac可以自定义报告,但报告管理功能很弱,一不小心就会把辛辛苦苦写成的SQL语句删掉。 TracReportManager可以给ticket报告做备份,在修改报告之前先备份一下,就不用担心误删的问题了。

TracSectionEditPlugin

可以按照章节编辑wiki内容(就像WikiPedia那样)。一些手册页可能会很长很长,一次性编辑很不方便, 而单独编辑某一章节就比较容易了。

TracTicketTemplate

ticket模板,可以给不同类型的ticket做不同的模板,能节约输入ticket的时间,规范ticket的格式。

TracWikiRename

给wiki页面改名,在整理wiki时很有用。


2009-07
26

注:本文使用的CakePHP版本为 1.2.3.8166。

使用CakePHP开发时,免不了要将调试级别设置为2, 这样页面上会显示出执行的SQL语句及结果,很方便。 但在做API页面时就比较麻烦。一般API页面的输出结果是XML或者JSON格式, 如果后面多了些调试信息,客户端就无法正确解析了。

解决方法很简单,只要在API的action函数中改写调试等级即可:

function api_index() {
  ...
  Configure::write('debug', 0);
}

不过,每个action都要写这么一行,太麻烦了。能不能想个办法,自动地关闭所有API页面的调试信息?

阅读全文 »
2009-07
22

第一次看到这个标题时我也很惊讶,Apache居然还能做负载均衡?真是太强大了。 经过一番调查后发现的确可以,而且功能一点都不差。 这都归功于 mod_proxy 这个模块。 不愧是强大的Apache啊。

废话少说,下面就来解释一下负载均衡的设置方法。

阅读全文 »
2009-07
08

很多软件都支持gettext,比如WordPress、ZenPhoto等。那么要想做个语言包,就得用到gettext这个工具。以ZenPhoto为例,使用方法如下:

首先要找出所有需要翻译的文件:

$ cd zenphoto
$ find . -name "*.php" > filelist.txt

然后从所有需要翻译的文件中提取出英文字符串。

$ xgettext --from-code utf-8 -f filelist.txt -d zenphoto

这样,xgettext命令就会分析所有文件,找出其中需要翻译的字符串(即php中调用gettext所用的字符串)并输出到zenphoto.po中。--from-code参数指定源代码的编码格式。ZenPhoto的源代码中,gettext函数参数中含有一些UTF-8的字符(实际上应该没有),如果不指定这个参数,xgettext就无法正确识别这些UTF-8字符。-f 指定要分析的文件列表。-d指明输出文件的名称,扩展名为.po。

然后创建语言文件夹,把.po文件放进去。ZenPhoto的话,操作方法如下(当前目录为zenphoto根目录):

$ mkdir -p locale/zh-CN/LC_MESSAGES
$ mv zenphoto.po locale/zh-CN/LC_MESSAGES
$ cd locale/zh-CN/LC_MESSAGES

接下来翻译zenphoto.po文件就行了。

翻译完成后,执行如下命令将.po文件编译成.mo文件:

$ msgfmt -o zenphoto.mo zenphoto.po

然后重启httpd就能看到翻译的效果。

忘了说了,如果系统上没有xgettext和msgfmt命令,只需安装gettext包即可。


2009-06
28

今天想用摄像头录一段视频,上网找视频录制的软件,发现好用的都是收费的。 没办法,想起VirtualDub也能录制视频,于是尝试了一下,发现它的效果还是很不错的。 而且是免费的哦!

以下演示的版本是Virtual 1.5.10,摄像头是罗技的QuickCam系列。

首先要设置好音频源。打开控制面板->声音和视频设备,选择音频选项卡。 如果摄像头的驱动已经装好,那么“录音”中的“默认设备”中应该有一项“USB Audio Device”, 选择该项,确定。

record-video-with-virtualdub-01.png

然后启动VirtualDub,选择菜单File->Capture AVI...,进入视频捕捉的界面。 此时即可看到摄像头的图像。

record-video-with-virtualdub-02.jpg

接下来,需要做一些设置:

  • 按P,打开视频预览,以便随时观察视频录制情况。
  • 按F,选择视频录制的分辨率、颜色深度等。根据摄像头的功能及自己的需求设置即可。
  • 按S,启动摄像头的设置对话框,在这里调节摄像头的亮度、对比度、快门速度、光圈、白平衡等参数,直到画质满足需要。
  • 按Shift-C,选择视频的压缩方式。一般选择DivX即可。如果不压缩,录下来的AVI文件会有几十G之大。
  • 按A,选择录音的音质。一般选择CD音质。
  • 按V,打开声音显示,测试摄像头自带的麦克风是否好用。
  • 按F2,选择将视频保存到哪里。

OK,这样就全部设置好了。接下来按 F6 键开始录制,按 Esc或单击鼠标结束录制。 效果还不错吧?

唯一的一点遗憾就是,这样录下来的AVI中,音频是没有压缩的,需要用VirtualDub做后期处理, 将视频中的音频分离出来,选好压缩算法之后重新保存成AVI。


2009-06
24

熟悉J2EE开发的人应该对此不屑一顾吧,俺是Java新手,没办法……做个笔记先。 Tomcat 5.5下测试通过。

首先要添加管理员用户。打开 conf/tomcat-users.xml,在其中加入这样一行:

<user username="manager" password="password" roles="standard,manager"/>

然后重启Tomcat。

之后访问以下地址:

http://localhost:8080/manager/status

输入刚才设置好的管理员用户名和密码,就能看到服务器状态的页面。 其中几个比较重要的数值:

  • Max threads: 150 最大线程数
  • Min spare threads: 25 最小空闲线程数
  • Max spare threads: 75 最大空闲线程数
  • Current thread count: 25 当前线程数
  • Current thread busy: 2 当前繁忙线程数

2009-04
21

谢谢fcicq指出书中的一些错误。也请其他读者在发现错误后告诉我,如果这本书有幸重印,我会在重印时改正这些错误的。给大家阅读带来不便,真是对不起。

P3,倒数第2段第3行:
用户想把音量调低,但我却没有把它设置到一个较高的音量,以便用户能通过软件来控制它。
修改为:
音箱的音量太小了,我根本没想到应该把音量调大些,这样用户才能通过软件来控制音量。

P5,最后两行:
以及如何进行高可用性的开发。
修改为:
以及如何开始符合高可用性的开发。

P37,“试一试”的第一行:
什么沟通障碍可能会阻碍项目创建高可用性?
修改为:
什么样的沟通障碍可能会阻碍项目创建高可用性?

P57,第2段第4行
请习惯这个思维。
修改为:
拥有这种想法很重要。


2009-04
12

UML中的联系(association)、聚合(aggregation)和组合(composition)三个概念很相似,也很难理解。 今天看到这篇文章解释得很清楚,所以在这里转一下, 希望能对需要的人有所帮助。

联系

联系(association)表明某个对象可以向另一个对象通过某种方式发送消息。发送消息的方法可以通过指针成员变量, 也可以是方法参数、局部变量等等。例如:

uml-aac-diff-01.png
class A
{
  private:
    B* itsB;
};

聚合

聚合(aggregation)是一种特殊的联系,它表明了“部分”到“整体”的关系,显著的特点就是不能包含循环的联系 (就是说,部分中不能包含整体)。如:

uml-aac-diff-02.png
class Node
{
  private:
    vector<Node*> itsNodes;
};

上述代码只有当子节点不会成为父节点的父节点时(即,必须是树结构,不能是图结构),才能称之为聚合。

组合

组合(composition)跟聚合几乎相同,唯一的区别就是“部分”不能脱离“整体”单独存在,就是说, “部分”的生命期不能比“整体”还要长。例如:

uml-aac-diff-03.png
class Car
{
  public:
    virtual ~Car() {delete itsCarb;}
  private:
    Carburetor* itsCarb
};

2009-04
08

今天拿到了一台Dell Vostro 1200,准备安装Windows XP。没想到第一次安装就出了问题,安装程序进行到分区这一步,报告找不到硬盘(下面的分区列表中显示没有硬盘)。用Linux急救盘进去之后用fdisk删除了所有分区,再次安装Windows XP,结果故障依旧。后来问了技术支持的人说,这台笔记本的硬盘是SATA接口,必须要用集成了SATA驱动的Windows XP安装盘才能正常安装。晕,原来Windows XP安装盘还有各种不同的版本哪。

拿到集成了SATA的Windows XP安装盘后继续安装,这次倒是一切顺利,但装完之后进入系统一看,咦?怎么两个硬盘分区变成了 E: 和 F:,系统装到了 E: 上?而C:呢,却被读卡器占了位置。后来试图通过修改注册表的方式把系统改到C:盘上,可是失败了。上网查了查发现Dell的本子这个问题居然是人所皆知的,解决方法也简单,就是进入BIOS把所有板载的USB设备都关掉,再安装就没有问题了。

于是进入BIOS关掉所有USB设备,安装,这次顺利完成,没出任何毛病。