2008-03
07

最近遇到的一个任务是要将散落在系统各个文件中的 use lib '/opt/mysoft/lib'; 这样的绝对路径引用改成相对路径, 以便整个系统能够轻易地移动到其他的目录中。系统是工作在Apache2 + mod_perl 下的,cgi程序位于 /opt/mysoft/cgi-bin 下。

初看起来似乎很容易:

use lib '../lib';    # 错误!

但实际尝试一下就会发现,这里的 '..' 似乎找错了位置。当前目录并不是cgi程序所在的 /opt/mysoft/cgi-bin。 经过一番实验后,发现在 use lib 时,当前目录居然是在 / 下!这样这条路就走不通了。

另一个想法是通过 $0 获取到CGI程序的路径,再根据此路径来找到 lib 目录不就可以了么?

$dir = dirname $0;
use lib "$dir/../lib";     # 错误!

print "$_\n" for @INC;

实际运行就会发现,这一招也行不通。原因是use lib是在编译时执行的。编译时代码并没有被执行, 因此 $dir 变量为空(甚至都不存在),于是就成了 use lib "/../lib",当然不正确了。 这样看来 use lib 似乎必须要书写完整路径了。

CPAN文档的解释如下:

lib - manipulate @INC at compile time

实际上 use lib 可以理解为 BEGIN { unshift @INC, '/opt/mysoft/lib'; }。 BEGIN段的内容在这一段编译结束后立即执行。

回到本来的问题上,如何能避免在系统中使用绝对路径? 其实使用mod_perl的功能一次性地指定好@INC,那么在CGI和pm模块中就无需再use lib了。

在mod_perl的官方文档中有关于如何调整@INC的说明。

一种方法是在 startup.pl 中书写完整路径:

use lib '/opt/mysoft/lib';

令一种方法是直接在httpd.conf中修改@INC:

PerlSwitches -I/opt/mysoft/lib

这样虽然不能完全避免绝对路径,但至少在产品代码中可以不再使用 use lib 了。


同样地,use 也是在编译时执行的。(参考)use Module;相当于

BEGIN { require Module; Module->import( LIST ); }

程序代码中的所有use指令都会在代码执行前被执行,因此use不论放在哪里,效果都是一样的。因此

if ($use_first_lib) {
  use FirstLib;
  ...
}
else {
  use SecondLib;
  ...
}

这样的代码是毫无用处的,不论$use_first_lib的值如何,FirstLib和SecondLib都会被加载。



2008-03
03

首先安装前端 scim:

# emerge scim

常见的日文输入法是服务器/客户端模型的,Canna就不错(可内嵌在SCIM中)。安装方法也很简单:

# emerge canna
# /etc/init.d/canna start
# rc-update add canna default

然后安装scim的Canna支持:

# emerge scim-canna

最后启动scim,从输入法语言中选择日语即可。

注意:当初我认为要装FreeWnn,装上后发现关机时老是死掉,查了半天发现原来是 /etc/init.d/freewnn stop时死掉了。 后来发现不要freewnn也能正常输入日文。



2008-02
04

这个东西应该是很老很老很老了,不过很奇怪在国内为什么没几个人知道呢?虽然跟本blog的主题——技术——没有太大的关系,但因为实在是太常用了,就在这里贴一下吧。

原文来自Jorma Oksanen’s Origami,版权为非商用免费,但作者要求写出他的名字。另外本文的图和说明文字来自这里:A4用紙1枚で2枚収納できるCDケースをつくる。这篇文章要比原文说明得详细一些。

阅读全文 »


2007-10
31

这两天一直在忙着做一个新的主题,暂且命名为Crystal吧。希望能带来一些新的体验。

做这个主题并没有花多大工夫,由于没有使用透明png图片,因此IE6的透明png问题就不用考虑,减少了很多工作量。而且也没有在Photoshop里打稿子而是直接写的CSS,因此页面设计上感觉有些粗糙,也是一个缺点吧。页面风格参考了awflasher的blog,在此向他表示感谢。


2007-10
28

这两天一直在策划着做一个新的主题,一个看起来更干净些的主题。 风格么,自然还是选择Web 2.0的那些特性了。 首先要做的第一件事儿就是做个logo。

以前做logo都是用photoshop,不过做好的大图缩小之后总是达不到想要的效果,于是斗胆尝试了一下Illustrator。 在网上找了好半天Illustrator,除了一个视频教程之外就没有入门级教程了,而那个视频教程看起来会急死人。 没办法只好自己摸索了,好在Adobe的东西基本操作都差不多,弄了一个晚上也弄了个八九不离十。 在这里诚心请教各位Illustrator高人指点。

先秀一下新做的图标吧。这是大图:

idv2-logo-big.png

将图标应用到页面上的效果。背景加了些黑色条纹。

idv2-logo-2.png

Update:被fcicq说那个图标和网址放在一起不太协调。的确,自己也觉得图标上的衬线字体与网址的无衬线字体不般配。 但图标中若使用无衬线字体,那么一个简单的“i”字母又显得过于单薄。干脆重新设计图标吧。

阅读全文 »

2007-10
16

这篇文章翻译自这里, 是一篇关于制作RPM包中的一个比较难于理解的地方。 不做开发的同学就不要看了。

阅读全文 »

2007-10
15

响应realazy的号召努力学习算法中。 这个莱文斯坦算法(Levenshtein Distance)还是比较好理解而且很实用的,放在这里做个备份吧。

原文请见 http://www.merriampark.com/ld.htm

什么是莱文斯坦距离?

莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为 s (原字符串) 和 t (目标字符串)。莱文斯坦距离被定义为''将字符串 s 变换为字符串 t 所需的删除、插入、替换操作的次数''。

例如:

  • s="test", t="test", 那么 LD(s,t)=0,因为不需要做任何变换两者已相等;
  • s="test", t="tent", 那么 LD(s,t)=1,因为s变换为t只需做一次替换(将"s"替换为"n")。

莱文斯坦距离越大,字符串的相似程度越低。

莱文斯坦距离以俄国科学家Vladimir Levenshtein命名,他于1965年发明了这个算法。 如果你对Levenshtein这个词的发音有问题,也可以称这个距离为编辑距离

莱文斯坦距离被应用于以下领域:

  • 拼写检查
  • 语音识别
  • DNA分析
  • 剽窃检测

算法

  1. 设 s 的长度为 n,t 的长度为 m。如果 n = 0,则返回 m 并退出;如果 m=0,则返回 n 并退出。否则构建一个数组 d[0..m, 0..n]。
  2. 将第0行初始化为 0..n,第0列初始化为0..m。
  3. 依次检查 s 的每个字母(i=1..n)。
  4. 依次检查 t 的每个字母(j=1..m)。
  5. 如果 s[i]=t[j],则 cost=0;如果 s[i]!=t[j],则 cost=1。
  6. 将 d[i,j] 设置为以下三个值中的最小值:
    1. 紧邻当前格上方的格的值加一,即 d[i-1,j]+1
    2. 紧邻当前格左方的格的值加一,即 d[i,j-1]+1
    3. 当前格左上方的格的值加cost,即 d[i-1,j-1]+cost
  7. 重复3-6步直到循环结束。d[n,m]即为莱茵斯坦距离。

代码

代码请参考原文网站。 该网站给出了 Java、C++、Visual Basic三种语言的实现, 又在页面最下方的链接中给出了Perl、PL/SQL、TSQL、C#、Delphi、PHP 等数十种语言的实现方式。

所以我在这里就不献丑啦~。



2007-10
11

下面是 tech.idv2.com 上推荐阅读的技术文章,按照主题分类。其中标有★的为强烈推荐阅读的文章, 通常都是原创教程,也有翻译的优秀文章。

阅读全文 »

2007-09
27

最近看到一个Tag丢失事件,想到最近随着Wordpress的不断升级, 各位blogger或许都在考虑着将自己的blog升级吧。但是又有几人考虑到自己数据的安全性呢?

相信okevin就是因为太过于自信而直接在正式服务器上运行升级程序而造成的惨剧吧。 插件本身没有错,自由软件免费提供的前提就是“as-is”,作者不需承担责任的。 当然,作者肯定会尽力让自己的程序没有bug,但谁都不能保证程序不出错。 所以在对你的blog进行改造或升级之前,请务必要备份,备份,再备份。

我采用的方法是:

  1. 在自己的电脑上安装Apache、PHP和MySQL,并搭建好blog程序,数据也要和正式blog相同。在升级blog或安装插件之前,要先在本机上测试并验证没有错误之后才能上传到正式服务器上。
  2. 在自己的电脑上安装subversion来管理blog的代码。这样万一升级导致代码错误,能够轻松地恢复到升级之前的内容。
  3. 修改插件、模板时,先在自己的机器上调试通过后再传到服务器上。不要使用wordpress的模板在线编辑功能。
  4. 服务器上要定期备份数据库,可采用phpMyBackupPro,设置每天自动备份并将备份文件发送到自己的信箱里。
  5. 写个php脚本每个月备份当月的 wp-content/uploads 下的文件。
  6. 如果在正式服务器上有shell权限,上面的备份就可以通过cron来进行。

如果你能做到上面这几点,你的blog的程序和数据基本上就万无一失了。不过它的缺点也是显而易见的——升级一次程序会花掉你几天的时间。所以,没事儿就不要去无休止地升级啦。



2007-09
26

常用的那些技巧,论坛的帖子上都有,相信也是众所周知的内容了,就不再多说。 这里介绍一些不常用的技巧——虽然比较偏僻,但记住之后能让你事半功倍。

本文的部分内容参考了《BlackBerry Hacks》这本书,其他的都是作者自己的使用经验。

阅读全文 »