新闻
新闻类
GitHub新书通告及邀请您关注微博账号
8月29日
关注本博客的网友会知道两件事:1、我最近刚刚出版一本书:《Git权威指南》;2、本博客最近更新近乎停滞。但有一件事可能不知道,就是我又写了一本书(尚未完稿),将以开源、免费的方式发布。
我从今天开始到上海出差一个星期,要四坐高铁,危险重重,故此把未完稿的书稿提前发布:
* 《GotGitHub》电子版: http://gotgit.github.com/gotgithub/
* 《GotGitHub》版本库: https://github.com/gotgit/gotgithub/
也许是写书的缘故,再写一些半长不短的博客打不起精神,而且由于很少登录本博客,导致对评论的审核和回复也非常不及时。如果希望更快找到我,可以关注我在新浪微博的账号。
《Git权威指南》官方网站上线
5月20日
《Git权威指南》已于6月底出版,各大书店和网上书店有售,具体参见官网相关链接。
官方网站地址:http://www.ossxp.com/doc/gotgit/
这个网站是用 Git 维护的,人人皆可参与的哦。
《Got Git》完稿
2月24日
2011/2/22,当我把第8篇文稿发给编辑后,长长的舒了一口气,这真是一个漫长的旅程。
写一本关于Git的书的想法始于2010年9月,在给客户做了Git培训后,发现还有很多想法难以浓缩在区区几百页的PPT中,为什么不把它扩展成一本书呢?
如果当初知道写一本书需要花这么久,真不知道能不能够坚持下来。感谢家人的支持,感谢华章出版社编辑们的鼓励和辛苦的工作,感谢我的朋友们和客户为本书初稿提出宝贵的修改意见。
关于这本书的名字,我很长时间决定不下来,曾经一度把本书的名字叫做《Got Git》,因为这样我就不用太费力的校正很多人对 Git 错误的发音。不过出版社从商业角度上决定采用《Git权威指南》这个让我倍感压力的名字。不管怎样,名字只是名字,重要的还是内容本身。
把全书的目录(不包含前言和附录)摘录如下,目录中的页码来自Word稿件,正式排版后会压缩至80%。
阅读全部内容 »
群英汇邮件列表更新
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用户手册

pySvnManager 新功能:LDAP用户同步
8月8日
pySvnManager 升级到 0.5 版本,引入了数据库支持,数据库主要用于保存和 LDAP 用户帐号同步的用户帐号信息。
数据库采用 sqlite 数据库(如果需要也可以使用其它类型数据库),无须手动创建数据库,在 pySvnManager 运行时,会根据需要自动创建数据库。
在没有使用 LDAP 用户信息之前,pySvnManager 是读取 SVN 授权文件,从该授权文件中获取用户名单并显示。
可以看出这种实现的问题是:
- 在权限检查的用户列表中,只能看到用户登录ID,而看不到用户 ID 对应的用户名
- 显示的用户帐号很少(只有在 SVN 授权文件中引用的用户帐号才能显示)
- 为新用户授权,如果用户不在授权文件中,需要手工输入用户名,容易出错。
pySvnManager 0.5 增加了内置数据库和LDAP用户同步功能之后,再看 pySvnManager 中显示的用户列表:
你会发现新版本的用户列表(已经完成和LDAP同步):
- 除了显示用户ID外,还显示用户名
- 显示的用户多了很多,除了在 SVN 授权文件中引用到的用户外,LDAP 中授权的 SVN 用户也显示出来了
- 在为新用户授权时,不必手工输入用户,只需要进行一次 LDAP 用户同步,用户帐号信息自动显示出来。
那么如何进行LADP 同步呢?
我们把 LDAP 用户同步的按钮放在“角色管理”界面,只要点击其中的“和LDAP用户同步”图标按钮,自动完成同步。
其它改进还包括:更好的 IE6 支持,UI 的重新设计等等。我们会陆续协助客户完成软件升级。
用户手册也已经更新,参见: 《pySvnManager 用户手册》
关于如何升级到新版本的 pySvnManager,参照《pySvnManager 0.5 升级指引》
群英汇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/






最新评论