日志标签 新闻
群英汇邮件列表更新
11月12日
经过近两周的工作,群英汇邮件列表系统(Mailman)更新了,主要修正了以下四个方面的问题。
归档附件链接由绝对路径改为相对路径
发给邮件列表的邮件若有附件,Mailman 在生成归档网页时会将附件保存到相应文件,并在归档网页中建立链接。通常会用华丽的分割符“—”来界限,然后是相应的链接。链接是相应归档附件的绝对地址,即用 http打头,紧跟着是域名,可以点击链接查看或下载附件。
群英汇邮件列表有一个改进就是将绝对地址转换为相对地址,这样当用户的邮件列表主机的域名修改后或者因为安全上的需要由HTTP转换为HTTPS协议的时候,归档的链接也依然有效。否则,在更换域名时这些网页必须重新生成,这对有大量邮件存档的服务器来说将是一个梦魇。
但是,群英汇之前的实现有一个副作用,就是当使用相对路径则没有生成链接,而只是文本显示出来
-------------- next part -------------- 一个HTML附件被移除... URL: </mailman/private/tech/attachments/20101111/79f938b2/attachment.htm>
在经过反复的研究之后,终于定位在代码 Mailman/Archiver/HyperArch.py:
158 # Argh! This pattern is buggy, and will choke on URLs with GET parameters. 159 # MAS: Given that people are not constrained in how they write URIs in plain 160 # text, it is not possible to have a single regexp to reliably match them. 161 # The regexp below is intended to match straightforward cases. Even humans 162 # can't reliably tell whether various punctuation at the end of a URI is part 163 # of the URI or not. 164 urlpat = re.compile(r'([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])', re.IGNORECASE)
神马意思呢?就是说:
当你看到这个正则表达式的时候,它已下了一个艰难的决定,就是以http://开头的文本行将进行一系列操作,添加上<a>标签,制作成链接,否则无视。
我们为了让相对URL和绝对URL不再打架,不再让用户为难,我们做出一个超级强大的正则表达式,并和QQ 100% 兼容。
index a532c81..9aa8c6f 100644
--- a/Mailman/Archiver/HyperArch.py
+++ b/Mailman/Archiver/HyperArch.py
@@ -161,7 +161,7 @@ emailpat = re.compile(r'([-+,.\w]+@[-+.\w]+)')
# The regexp below is intended to match straightforward cases. Even humans
# can't reliably tell whether various punctuation at the end of a URI is part
# of the URI or not.
-urlpat = re.compile(r'([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])', re.IGNORECASE)
+urlpat = re.compile(r'(?P<prefix>url:\s*<)?(?P<url>(?(prefix)[^\s\'">]+|[a-z]+://.*?))(?:_\s|_$|$|[])>\'"\s])', re.IGNORECASE)
# Blank lines
blankpat = re.compile(r'^\s*$')
@@ -1224,19 +1225,19 @@ class HyperArchive(pipermail.T):
if kr is None:
k = -1
else:
- k = kr.start(0)
+ k = kr.start('url')
if j != -1 and (j < k or k == -1):
text = jr.group(1)
length = len(text)
... ...
URL = 'mailto:' + text
pos = j
elif k != -1 and (j > k or j == -1):
- text = URL = kr.group(1)
+ text = URL = kr.group('url')
length = len(text)
pos = k
else: # j==k
上面的正则表达式有哪位网友不解,待我有时间,下回分解。
归档html附件取消转义
默认Mailman会将HTML格式文本进行转义,在点HTML附件链接时看到的是HTML源码。而实际上用户更希望看到的是实际显示的内容。仔细分析以后发现,原来有一个转义函数,将文本里的HTML标签进行了转义,然后还自己定义了一个<tt>标签把这些内容括起来,为的是让显示更加规整。
整个注释掉此转义函数,这样邮件的 HTML 附件能够在归档中直接以 HTML 显示了。风险也是有的,就是会让列表的 HTML 归档被滥用,如用 HTML 链接进行 SEO 等,不过公司或团队范围使用,大可放心,没有哪个用户胆敢发送垃圾邮件。
自动回复邮件首选reply-to地址,其次是From地址
有时我们发邮件不希望自动回复到发件人地址,就需要提供一个 reply-to 地址。
我们的一个客户在使用邮件列表时,设置了自动回复器用于人员招聘等工作,发现从 51job 发送的简历的求职者的邮件地址都放到了 Reply-To 邮件头。由于 Mailman 自动转发器没有使用 Reply-To 邮件头,导致自动回复失败。
我们的改进也很简单,就是先对 reply-to 邮件头进行判断。有了这个改进后,自动回复器在复杂的环境中也可以使用了。
自动回复邮件内容取消自动折行
Mailman在发送自动回复器在回复的时候先对回复内容进行了处理,以70字符为界断行,结果显示效果不是很好看。这可能是历史原因造成的,可能当时的显示屏比较小,一行只能显示70字符,段行比较美观。但现在的显示屏比当时先进多了,而且大多数邮件都有自动换行显示的功能,这个就没必要了。修改也很简单,取消掉这个自动折行的函数即可。
维基升级——搜索功能改进
8月29日
通过对虾片(Xapian)一段时间的研究,终于能够实现中文网页的全文检索。MoinMoin 维基中的搜索终于可以使用虾片了!
使用Xapian改进全文检索的效率
MoinMoin维基缺省的全文检索机制是简单的内容查询,用到正则表达式匹配。MoinMoin维基还可以使用可选的Xapian(虾片)进行全文检索。
- 虾片是由C++语言实现的全文搜索引擎,类似于Java世界中的Lucene
- 虾片通过 SWIG 提供各种语言绑定的 API 接口。对于Python来说,安装 python-xapian 即可
- 虾片不支持中文切词,因此中文检索无法实现
- MoinMoin维基还使用自己的切词方法,以便能够正确处理 Wiki Word 的切词,但是也没有考虑到中文切词
我们增加的切词机制,最终让虾片能够支持维基中中文内容的检索。将搜索效率提高十倍以上。
支持附件(Word文档,PDF文档)的全文检索
使用MoinMoin维基内置的搜索引擎不能对附件进行全文检索,是因为缺省的检索是简单的内容查找,而不能动态的(高效的)从附件中提取内容。
改用Xapian搜索引擎后,很容易的就可以实现对Word文档和PDF文档的全文检索:
- 检索是基于事先生成的索引文件
- 每当有附件上传,自动提取附件中的中文内容,并根据内容建立索引
- 搜索时,同时能够显示命中的网页以及附件
那么,如何能够获取Word文档中的内容呢?难道需要安装 Microsoft Office 并通过相应API实现内容提取么?实际上,有一个开源软件 antiword 已经实现了Word文档的中文提取。Antiword支持 Word 2, 6, 7, 97, 2000, 2002 和 2003 等格式。
如何升级到最新维基版本?
升级到最新版本的维基很简单,因为我们已经将升级需要的大部分手工操作都自动化了:
- 更新APT源
sudo apt-get update
- 安装新版本的 MoinMoin
sudo aptitude install ossxp-moinmoin ossxp-moinmoin-xapian
- 自动进行 Xapian 索引数据库的初始化。建立索引的时间根据网站的规模,可能从几十秒种到数十分钟。
- 自动更新 MoinMoin 配置文件,使用 Xapian 作为缺省的全文检索引擎
- 需要手动重启Apache
- 对于老版本库的群英汇Apache,执行
sudo /etc/init.d/ossxp-apache2 restart
- 对于新版本库的群英汇Apache,执行
sudo /etc/init.d/apache2 restart
- 对于老版本库的群英汇Apache,执行
- 自此,您的知识管理平台,将使用新的搜索引擎,进行享用新引擎带来的便利吧。

Redmine任务日程安排(类似Mylyn)的功能
8月9日
当开发人员登录Redmine后,页面将跳转到我的工作台界面。在这里默认可以看到指派给当前用户的任务(仅显示10条,通过左下角查看所有问题的链接才能看到所有指派给当前用户的任务),以及当前用户报告的问题。因此开发人员可以清晰看见指派给自己的任务,进而逐一解决。
但当指派给某一开发人员的任务达到数十个以上时,开发人员每天都就会陷入筛选任务的琐碎事件中,而且还会产生无从下手的茫然:任务太多了,不知先处理哪些,后处理哪些。
群英汇为Redmine添加任务日程安排功能,正是基于此需求实现的,为开发人员带来了福音。
该功能允许开发人员对指派给自己的问题设置计划日期,Redmine自动根据设置的计划日期分组显示指派给自己的任务。这样以来,开发人员的工作就井然有序了,可以把主要精力放在项目开发中了。
更多关于此功能的介绍可以移步到 Redmine用户手册
群英汇redmine增强版ossxp-3.0成功上线
7月20日
经过三个多月努力,群英汇Redmine 增强版ossxp-3.0终于成功上线。
下面介绍一下 ossxp-3.0 版本的新特征:
- 上游版本库升级到Redmine官方的1.0.0版本. Redmine 1.0.0 引入的新特征:
- 支持子任务(subtask)
当发现起初的任务划分过于粗粒度,可以将起初的任务再划分成若干个子任务,每个子任务指派给某个成员。这样从另一方面实现了一个父任务指派给多人。 - 支持通过邮件提交问题时设置指派者和问题(issue)的起始日期
- 支持从POP3服务器读取邮件
redmine-1.0.0之前仅支持从IMAP服务器读取邮件。
关于redmine通过邮件提交问题,具体可以参考 http://redmine.ossxp.com/redmine/documents/4 - 增强了wiki功能
wiki底层库升级,使redmine的wiki更加稳定、健壮
- 支持子任务(subtask)
Redmine关于敏捷Scrum的插件
7月19日
这几年来,敏捷开发风靡全球,尤其是Scrum这股风。那么Redmine作为优秀的项目管理工具,是否支持Scrum流程呢?Redmine Sprints 正是在这种呼吁中应运而生。
借助于Redmine Sprints 插件,可以有效地将Scrum流程包含进Redmine的管理流程:
- 产品负责人(Product Owner)可以登录Redmine,在Backlog页面向产品Backlog中添加用户故事(User Story),并根据功能的重要程度,设置适当的优先级。
- 在Scrum计划会议上,登录Redmine,进入Backlog页面,根据User Story的优先级来确定即将开始的Sprint要完成哪些User Story,并将这些User Story挪到这个Sprint的Backlog中。
- Scrum团队成员可以登录Redmine,进入任务板页面,根据具体情况,将Sprint中的User Story划分成一个个小的功能模块(即任务),各个成员根据自己的能力来领取这些小任务。
- 接下来Scrum团队的成员就可以集中精力完成自己领取的任务了。并且应该每天都要在任务面板里更新自己的任务状态,同时燃烧曲线(BurnDown)会自动根据任务的完成情况发生变化,从而真实反映项目的进展情况。
具体细节请参考 http://www.ossxp.com/doc/redmine-plugins/redmine-sprints/

为 TestLink 增加从 LDAP 同步用户的功能
7月19日
管理员在配置 TestLink 时,经常会问我们一个问题:用户管理平台(使用LDAP)中创建的用户,并没有出现在 testlink 的用户数据库中,如何为用户指派权限?
之前我们的实现是这样的:
- 用户帐号已经在 LDAP 中存在了
- 用户访问 testlink,点击“登录”则跳转到“单点登录系统”
- 在“单点登录系统”认证成功后,浏览器重定向,跳转到 TestLink
- TestLink 发现用户已经登录,但是内置帐号不存在,会自动从 LDAP 中查询登录用户的信息,自动为该用户创建 TestLink 内置帐号,并设置缺省权限(缺省是游客,管理员可配置)。
所以,我们之前会告诉客户:“先让用户登录一次 TestLink,再为他分配权限。” 就是因为这个原因。 :-P
最近 TestLink 上游发布新版本,在迁移我们的特性分支之时,重新考虑了这个问题,决定动手实现“LDAP用户同步功能”。
增加这个功能后,管理员就可以更加方便的为 TestLink 用户授权,而不用再要求用户在授权前先前登录系统。
实际上这个功能在我们支持的其它系统中也有类似实现。例如 Redmine 我们也实现了类似功能。比较一下 Redmine 和 Testlink 中增加同样功能的代码行,是一个很有意思的事情。
- TestLink 实现 “LDAP用户同步” 功能: 增加了 365 行
$ tg patch t/ldap_account_sync | grep "^+" | wc -l 365
- Redmine 实现同样功能,只用了不到一半的代码量:141 行
$ tg patch t/synchronization_account_from_ldap | grep "^+" | wc -l 141
Redmine 是用 ROR 框架开发的,而 TestLink 使用的是 PHP。PHP 也许在学习曲线上看比较容易上手,但是长远来看,代码的维护量和开发难度还是要大很多。

pySvnManager 升级
6月11日
pySvnManager 升级为 0.4.1,并撰写了用户手册和开发者手册。相关的更新:
- 重新设计的用户界面,更加人性化。不知道我当初为什么手那么懒,呵呵。

- 能够发现 svn 授权文件手动更改,并在警告信息中提供保存的链接

- 能够运行在最新的 Pylons 1.0 框架中,并且支持 virtualenv,可以彻底解决 python 包依赖问题
- pySvnManager 用户手册,提供详细的安装以及操作指南
- pySvnManager 开发者文档,提供 pySvnManager 软件架构的详细解说,供爱好者改进时参考
redmine同步变更集属性插件
6月7日
上个星期有客户反映他们在提交代码说明时总是忘记使用使用引用关键字(refs, references等)或者关闭问题关键字(fixes, closes等),导致代码提交不能有效跟问题建立关联,关闭问题状态。虽然版本库(如SVN)提供了修改提交日志的功能,但redmine对于已经自动获取的变更集是不能再重新获取的,除非在版本库配置处删除再重新导入。显然,对于仅仅一次提交的失误,这样做代价似乎太大了。
因此为了更好地满足客户的需求,我花了一星期时间写了一个同步变更集属性(如committer、date、commit log)的插件 redmine-sync-revprops。该插件是基于redmine 0.9 开发的,无须任何数据迁移操作,只需将该插件放在vendor/plugins目录下,重启服务器就可以使用。
具体的使用手册可以参考 http://www.ossxp.com/doc/redmine-plugins/redmine-sync-revprops/user_manual/user_manual.html
我在 OpenParty 上的报告
5月24日
在参加了北京的OpenParty聚会之后,上周末又赶场式的参加了首届石家庄OpenParty活动。说实话,如此抛头露面前所未有,因为以前一直忙着写代码,眼中看到的一直只是 coding,coding。
石家庄信息工程学院的倪老师是群英汇今年开博后认识的新朋友,禁不住他的一再动员,在半个月前终于下定决心参会。也正是借着倪老师的邮件,使我也发现了北京的OpenParty。上次在北京的OpenParty,我的报告只是停留在一个脑图上,欠了 cleverpig 一个“类PPT”演示文档。这个欠账,终于在上周在为石家庄OpenParty的准备过程中给补上了。
此次石家庄之行,让人印象深刻的除了学院领导老师的热情款待,大大的啤酒的干活,还有石家庄宽宽的城市街道,美丽又宜居的楼房,低的让人眼馋的房价,和谐的行人和机动车(很多斑马线压根没有红绿灯)。石家庄信息工程学院老师们例如倪老师,创造性的将开源融入教学和学生实践之中,更是让人感到振奋,他们真的在做事。这里记录着倪老师他们的教学与参与开源的实践: http://code.google.com/p/teaching-as-community/
我在会议上的报告下载: http://www.ossxp.com/doc/openparty/oss-hacking/ 。其中:
- .odp 格式的是OpenOffice的“类PPT”(超PPT?)格式文档,Windows用户受累到 openoffice.org 上下载最新的 3.2.1 版本并安装
- .pdf 格式,是提供给无法运行 openoffice 的用户的,一些页面的动画效果可能会失去,但不会有太多的影响。
- 没有提供微软的 PPT 格式,因为我不用盗版软件。微软公司的职业诉讼团队还是不要打我们公司的主意了。
北京五月柳燕隙阳
5月17日
Open Party 5月的主题日的名字起的真好—— “柳燕隙阳”。这一天的北京也是阳光明媚,虽柳燕难觅,却也柳絮飘飘,轻舞飞扬。
头一次参加 Open Party 活动,不好两手空空,于是匆忙之中也拟了一个题目:“开源软件定制开发中的软件工程”,吃过午饭,便载着几个公司的同事出发了。好在 ThoughtWorks 的 Office 也并不难找,总算在计划开始前10分钟抵达现场。




最新评论