招聘 - 反垃圾邮件规则开发工程师

我们渴望贤才。chunzi.sheng@sonataservices.com

Required Experience And Skills:

- Minimum of 3 year professional experience developing rules and computer programming
- Programming in Perl, including Perl regular expressions
- Debugging and profiling code
- Familiar with source control systems such as CVS, Subversion or Perforce
- Expert command of some UNIX variant; writing shell scripts,
- Highly skilled using UNIX tools such as egrep, sed, tr, uniq, sort, awk
- Must be able to utilize written and verbal communication skills to coordinate effectively with Leads and peers in both local and distant geographic locations
- Proven record of delivering quality in a highly available, scalable environment
- Experience with email (both RFC-2821 and RFC-2822)
- Understanding of 2-byte character encodings is a plus
- Technical proficiency with administering email related infrastructure is a plus
- Knowledge of open source and/or commercial anti-spam solutions and of network DNS blacklists is a plus

代码进化

我现在的工作内容之一是写 Anti-Spam 规则,规则保存在若干 .cf 文件中,每个规则都必须有个唯一的名称。发 Spam 的人知道你会写规则,所以有些关键的地方,他们都会尝试多种变形以逃过滤网。而取规则名的时候按意思或者元信息,所以不经意间就会出现规则名重复。尽管不多,但总不好。

四天前,我写了一个 one-liner :

$ less *.cf | awk ' $0 !~ /^#/ && $0 !="" {print $2}' | sort | uniq -c | sort -nr | awk ' $1 > 1 {print}'

less 读取当前目录下的规则文件,然后给 awk,找到不是注释的行,也不是空行的那些,打印第 2 列,也就是规则名,然后排序,再用 uniq 计数把重复次数追加在行首,然后再用 sort 按照数字倒序排列,最后取出数字大于 1 的,也就是有重复的那些规则名打应出来,包括重复计数。

这两天翻过《BSD HACKER》 之后,就觉得这个好罗嗦,于是重写:

$ sed '/^#/d;/^$/d' *.cf | awk '{ print $2 }' | sort | uniq -dc

直接用 sed 读规则文件,将注释行删除,将空行删除,然后给 awk 打印规则名,给 sort 排序,然后让 uniq 只输出重复的行并计数。

怎么说呢,这就是知道什么不知道什么的差别。开始我愚蠢的用 less 传文件内容,这是思维定势,自己总用 less 看文件,就觉得程序也该用 less 看文件。uniq 的 -d 参数一下子把最后一段罗嗦的 awk 代码斩掉。原先用 awk 的模式来找规则行,不如 sed 的两个替换干脆明快,两个 d 命令让我觉得很爽。

Google Ads

PerlChina 会员中心站点恢复

很久以前,不知怎么的,访问的时候报错,看似底层没有正常加载 CDBI 的表关系定义,也不知道怎么解决,当时心情烦躁,很快不了了之。

这次写简历,提到了这个站点,却不得不注明当前维护中,觉得是个心病。于是刚才抽了点时间再看看。花了一个多小时,搞定。可能是 Catalyst 的一个小版本的 Bug 导致的,同时还更新了 Class::DBI 这个模块也升了好几级了。再后来页面能出来了,但一个 Tag 或者 Place 下的人却只有一个,确定 tag.persons 失效,调试发现,Class::DBI::Loader::Relationship 用到的转换英文单复数的 Lingua::EN::Inflect::Number 的模块,把 person 的复数修订为 people. 所以 tag.persons 当然是什么都不返回,改成 tag.people 就好了。

svn status 了下,很久以前的最后更新(大约是一年之前了)都没有 commit,现在看看很多代码都已经过时了。而且还有很多想法没有实现,幻想着能有有时间重新整合下。虽然这个站点访问量不高,不过下线的这段时间有很多人问及,所以不管怎样,还是先挂上来,以后再说。

还有 wiki.perlchina.org 一直是我的心病,自从遭受 Spam 攻击以来,Instiki 一直表现不好,连它自己的站点和 Rails 的 wiki 站点也惨遭毒害,现在的 Instiki 老吃资源然后死掉,用 cron 程序定期启动也快一年了吧,还要定期删除 /tmp 下的 ruby_session 文件。