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
25

所谓交互式的rpm包,就是说在安装过程中接受用户输入,来完成诸如许可证确认、创建配置文件等工作。

首先要说明,不推荐使用rpm创建交互式安装包。rpm的设计目标就是在完全不需要用户干涉的前提下完成软件的安装、升级等工作,这样可以通过cron或者yum/apt/up2date等脚本完成自动安装和自动升级。而交互式rpm包将破坏这种特性。另外,通过图形界面安装rpm包时,交互式脚本将完全不能执行(因为没有终端)。因此,在rpm中执行脚本时,标准输入是被关闭的,也就是说你无法在rpm安装过程中获得任何用户输入。

但有时真的需要创建交互式rpm包,如迫于工作压力,或者创建内部使用的安装程序,或者作为产品分发给完全不懂计算机的用户等。虽然rpm中的脚本无法获取用户输入,但方法总是人想出来的。

我们知道在spec文件的%post节中可以书写bash脚本,而通过read命令可以获取用户输入。但如果在%post中使用read命令,你会发现read并不等到你输入而是直接就结束了。原因就是rpm安装时关闭了标准输入。我们可以手动将它重新打开,方法就是在read之前加入以下代码:

exec 6<&0 0</dev/tty       # 将标准输入保存到6,然后在标准输入上打开/dev/tty
read MYVAR
exec 0<&6 6<&-               # 恢复备份的标准输入并关闭6

当然标准输入(0)本身就是关闭的,所以不备份应该也无所谓。/dev/tty是指向用户控制台的一个链接,在命令行控制台和远程终端的情况下都可以正确使用。



2007-10
19

原文链接:http://www.avatarfinancial.com/pages/cake/

这篇文章可以说是CakePHP教程中最经典的了。虽然不是完整的手把手系列, 但作者将自己使用CakePHP的经验总结了21条,这些尤其是对新手十分有用。

翻译时故意保留了一些CakePHP中特有的词语没有翻译, 如controller、model等。相信学过CakePHP的人应该马上就能理解它们的意思吧。

另外,CakePHP的wiki已经失效,取而代之的是一个名为bakery的网站。 原文中引用的wiki的链接也都已更新到了bakery上。

阅读全文 »

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
12

我习惯于将照片按照拍摄时间保存到硬盘上的 YYYYMMDD 目录下,但每次都手工查看拍摄时间再建目录、复制实在是费时费力,于是写了这个程序,放在桌面上只要双击一下就可以将照片按照日期复制过来。当然只考虑了Win32版,估计我不太可能在Linux下用相机……需要安装ActivePerl,并用ppm安装Win32::DriveInfo模块。

照片复制程序

另外,我只有一台T10,所以这个程序只考虑了T10的情况,各位读者不妨说说自己的相机的目录结构?我的相机目录结构如下:

型号:SONY Cybershot T10
根目录:DCIM
照片目录:101MSDCF, 102MSDCF, 103MSDCF, …, 999MSDCF


2007-10
11

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

阅读全文 »

2007-10
09

Test::Base是什么?用官方的说法是“数据驱动的测试”。Test::Base是一个测试框架, 只要给它提供测试数据,它就能自动进行单元测试,省却了手工编写测试程序的麻烦。

可能有人用过Test::More模块进行自动测试,那么我推荐你使用Test::Base。Test::Base 与Test::More完全兼容,也就是说你可以仅仅将use Test::More;换成use Test::Base; 而不用改动任何其他代码;其次,Test::Base可以提供更为简单的测试方法, 让你不必在繁琐的测试程序上花费时间。

阅读全文 »

2007-10
08

这两天一直被一个问题所困扰。同样的一段程序,在自己的机器上调试完全没有问题,放到服务器上时间显示就快了8个小时。显然这8个小时就差在时区设置上。我在自己的机器上写代码时,对timestamp进行了时区调整($now += 8 * 3600)之后再进行getdate()转换,结果完全正确;放到服务器上执行,就要将时区调整代码去掉之后才正常。一时百思不得其解。

写了个小测试程序:先用 time() 取得当前时间戳,再用 getdate() 获取当前的小时、分、秒,分别放到开发环境和服务器上执行。结果很显然,服务器上显示的时间是正确的(22点显示为22点),而我的机器的时间是错误的(22点显示为14点)。从时区的角度来看,服务器使用了正确的CST时区(中国时区),而我的开发环境的时区则是UTC的。但开发环境操作系统是Windows,时区设置也正确,为什么会出错?

窄多的blog上看到,通过date_default_timezone_set()函数可以设置默认时区名。天啊,居然有这样的函数,查了查资料发现它的反义函数date_default_timezone_get(),将这个函数分别在开发环境和服务器上执行,果然,我的时区设置为 UTC。

知道了原因就好修改了。打开开发环境中的 php.ini,找到 date.timezone,去掉注释并将其设置为 Asia/Chongqing,再运行,这次结果正确了。