[Perl]散列的效率出人意料

那天和人讨论一个简单的应用:集合减法,即给定集合 A 和 B ,计算 C = A - B, 也就是说求属于A但不属于B的元素。集合A和B使用数组来存储,元素仅限于整数。 求计算方法。

Perl自身没有集合运算函数,为了这一个功能也犯不上去安装CPAN模块, 所以我们考虑了以下几个方案:

  1. 利用foreach作最直白的循环来判断
  2. 利用grep代替foreach
  3. 将元素用逗号连接之后用正则表达式匹配
  4. 将数组转化成散列之后判断

四种方法都能实现,但效率如何?本以为使用foreach应该是最快的, 没想到测试之后发现散列居然是最快的。

              Rate    use grep  use regexp use foreach    use hash
use grep     359/s          --        -58%        -63%        -90%
use regexp   861/s        140%          --        -11%        -77%
use foreach  965/s        169%         12%          --        -74%
use hash    3769/s        950%        338%        291%          --

如果元素不是整数而是随机的字符串,正则表达式的效率会急剧下降,而散列依然能保证领先的地位。 看来Perl的散列算法不可小觑啊。

(Read More)

[PBP]代码布局(1)

最近在阅读《Perl Best Practices》(Perl最佳实践)这本书。 Damian Conway这这本大作从各个方面 阐述了Perl编程上的一些经验,是Perl编程人员的必读之物。 标题上的PBP即Perl Best Practices的缩写。 鉴于这本书目前还没有中译本,我准备将这本书摘录一些翻译过来, 给各位Perler作为参考。

(Read More)

如何用CakePHP处理自连接

自连接,就是自己引用自己,比如员工表,某个员工的上司也保存到员工表中, 那么想要同时得到一个员工和他的上司的信息就得使用自连接。 表如下所示:

employees

PKidINT自动编号id
nameVARCHAR(64)员工姓名
FKsuper_idINT上司id,引用自身

那么查询时就需要这样写:

SELECT A.name,B.name FROM t_employees A, t_employees B
  WHERE A.parent_id=B.id

而在CakePHP中如何实现,就需要一点小技巧。 这篇文章 简单介绍了如何做到这一点,其实不难,能把model建好了就80%了。

原文讲得比较罗嗦, 我就不再重复了,仅将要点写在这里。

(Read More)

Feed统计插件My Feed Stats发布

这个Wordpress插件可以统计Feed的订阅者,并可以生成类似于FeedBurner那样的条形统计图。 有如下的一些特点:

  • 可以输出FeedBurner样式的统计图;
  • 支持在线、离线阅读器的统计;
  • 可以自定义各种阅读器的UserAgent标识,自行判断某个UserAgent是否为合法的阅读器;
  • 可以生成FeedBurner样式的订阅者数图片。

my-feed-stats.png

安装方法

首先说明,这个插件仅适用于那些没有使用FeedBurner、FeedSky烧制feed的blogger们。 如果你使用了这些烧制服务,该插件将无法统计到烧制后feed的订阅数。

Windows下的安装方法很简单,解压插件到plugins目录下,在控制台中启动插件即可。 Linux下安装方法略为复杂,因为涉及到目录权限的问题,需要一些简单的Linux知识。

另外,本插件由于需要自己定义阅读器的标识符,所以最初安装时无法识别任何阅读器。 为解决这个问题,我在附件中放了一些阅读器的标识符数据,这是我一个月以来积累下的数据, 虽不敢保证很全面,但一般常见的浏览器都在里面。安装插件之后将其导入到数据库中即可。

下面是完整的安装方法:

  1. 解压缩插件到 wp-content/plugins 目录下;
  2. 进入Wordpress管理界面,在“插件”中找到“My Feed Stats”插件,启用;
  3. 利用phpMyAdmin等工具导入插件附带的 mfs_readers.sql。(如果你修改了wordpress的表前缀,请打开mfs_readers.sql并自行修改其中的表名。)
  4. 进入“管理->Feed统计”,设置订阅者图片的路径、颜色和显示的文字。这里图片路径是相对于wordpress根目录的路径,比如设置路径为 a/feeds.png,实际的图片URL就是 http://yoursite/a/feed.png;
  5. 如果操作系统是Linux,请设置插件目录下的 feeds-sample.png 的权限为 777,并利用touch命令手工创建上一条订阅者图片的文件(空文件即可),设置权限为777。
  6. 等待一天之后看统计结果吧!

关于版权

本插件的版权遵循GPL,请阅读插件内附带的license.txt文件。

本插件使用的字体文件 terminal6-modified.gdf 来源于 http://www.widgnet.com/gdf_fonts 。

下载地址

my-feed-stats-10.zip

更新

2007/11/15,版本1.0.1:修改插件安装之后feed访问出错的一个bug。

(Read More)

AviSynth: 无比强大的视频合成软件

用过之后第一感觉:太强大了,让那些商业的共享的软件都去死吧!

AviSynth,可以进行视频合成、编辑、添加字幕,支持所有格式(只要能播放出来), 甚至可以将图片转换为视频。

AviSynth的原理是通过一个脚本,将视频流、音频流处理之后再以流的方式输出。 输出流可以通过播放器直接播放,也可以利用ffmpeg、 VirtualDub等软件将流保存为各种视频格式。 而正是强大的脚本使它具有了强大了视频处理能力。

(Read More)

CakePHP 1.2的五个新特性

前些日子就知道CakePHP发布了1.2 pre-beta版。 偶然在delicious上看到这篇文章: CakePHP 1.2的五个方便的新特性。 好文不敢独享,现将其大意记录如下。图片就不转载了,想看图的话可以直接去原文上看。

  1. 集中显示友好的错误信息

    使用框架时最郁闷的莫过于调试,PHP会报告框架出错,而实际上我们代码中的错误则很难发现。 CakePHP 1.2版中,错误信息会集中显示在页面上方,并且单击错误信息就能看到错误所在的位置, 可以节省大量的调试时间。

  2. 内建分页功能

    CakePHP 1.1时必须手动书写分页代码,而1.2版则内建了分页功能,还支持单击标题排序。 只需书写下面的代码:

     class MembersController extends AppController {
         var $paginate = array('order'=> 'Member.created DESC');
         function listall() {
             $this->set('data', $this->paginate());
         }
     }
    
  3. 复杂的表单验证

    原来1.1版的表单验证只能使用正则表达式,因此无法验证类似于“包含数字、字母并且长度不大于10且可以为空” 这样的复杂规则就很难通过表单验证实现。而1.2版则支持下面这种复杂的验证。

     var $validate = array(
     'title' => array(
         'required' => VALID_NOT_EMPTY,
         'length' => array( 'rule' => array('maxLength', 100))
         ),
     'body' => VALID_NOT_EMPTY
     );
    
  4. 内置电子邮件功能

    1.2版添加了发送电子邮件的模块。

  5. HTTP请求生成、XML解析

    1.2版支持HTTPSocket、XML模块,通过它们可以直接调用外部的WebAPI了。

(Read More)

新主题Crystal上线

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

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

(Read More)

idv2新标志设计

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

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

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

idv2-logo-big.png

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

idv2-logo-2.png

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

(Read More)

创建交互式的rpm包

所谓交互式的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是指向用户控制台的一个链接,在命令行控制台和远程终端的情况下都可以正确使用。

(Read More)

CakePHP你必须知道的21条技巧

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

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

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

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

(Read More)