蒋 鑫
该用户没有分享资料
由蒋 鑫撰写的日志
Android repo 魔法
8月31日
Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。
Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将 百多个 Git 库有效的进行组织。要想克隆和管理这百多个 Git 库,还真不是一件简单的事情。
在研究 Repo 的过程中,发现很多文档在 Google Group 上,非“翻墙”不可看。非法的事情咱不干,直接阅读 repo 的代码吧。
阅读全部内容 »

Repo——另一个Git协同模型
8月31日
Git 的神奇之处在于,你可以用很多不同的方式来使用它,而不像 Subversion,只有集中式一种方式。
最近又发现了一个 Git 新的协同模型 —— Repo,这个协同模型对于一个项目用到了多个Git版本库的协同开发非常有效。
实际上,这是上周在给一个团队做 “Git培训” 时,发现该团队在 Android 开发中,需要使用 Repo 这个工具来维护 Android 代码。于是花了些时间研究,补充了新的一章到讲义中…

Redmine 计划任务增加“未来”的选项
8月29日
群英汇开发的 Redmine 计划任务插件为我的工作带来极大的便利,让我的工作更有计划性。
最近,我们公司开发人员除了对“计划任务插件”进行代码重构并解决了“星期日”Bug外,还采纳了我的一个建议,增设了一个“未来”选项。即问题的计划日期,除了今天/明天/后天/本周/下周/下下周等之外,增加一个“未来”选项。
以程序员的观点,增加“未来”选项可能没有必要,但是以项目经理/项目负责人看来,却非常需要。
- 因为项目负责人思考的问题除了一些短期目标之外,还包括一些长远的目标,甚至只是一些暂时看起来荒谬的想法。
- 如果这些长远目标或者“荒谬”的想法,不能加入到合适的计划任务,就会在“None组”(未列入计划的事件)中堆积
- 堆积如山的“None分组”,会导致新创建的问题,不能立即被发现造成拖延。
最终实现的“未来”,让我的“荒谬”的点子有家可规了。

Subversion管理后台增加对SVN容灾的支持
8月29日
群英汇Subversion版本控制系统提供的基本服务,实际上已经包含了简单的容灾实现:
- 在本机使用 gistore 进行数据备份
- 在备机上用 git pull 进行每日一次的数据同步
这个方法对于大多数公司,对于非核心数据的容灾备份已经足够,但是对于代码,不同的公司有着不同的敏感度,可能每日一次的备份就不合适了。
最近在给一个客户进行SVN版本控制系统的实施时,就碰到了SVN服务器间建立镜像和实时备份的需要
- 两个异地的开发团队,每个团队工作在不同的本地版本库,可能会参考(读取)异地不同版本库的内容
- 异地团队中间通过无线网桥互联,互联网桥的通讯质量易受到环境、气候的影响
- 如果两个异地的SVN服务器能够互做镜像,可以实现双机热备
- 一个团队可以在本地的主版本库中读写,一旦有数据写入本地版本库,就会同步到无线网桥另外一端的版本库。反之亦然。
- 由于本地还提供无线网桥另外一端版本库的镜像,因此访问远程版本库可以改用本地镜像进行访问,实现本地读取速度。
如果需要写入,配置 SVN反向代理,实现透明的远程写入。
Subversion可以使用 svnsync 这一工具实现版本库的远程镜像,但是如果使用手工配置,对于客户数量众多的版本库,难以维护。加之很多版本库本身很大,从头建立同步可能会非常缓慢。
我们通过在SVN管理后台增加了一对儿插件,实现了对SVN容灾(镜像)的图形化配置界面。
阅读全部内容 »
维基升级——搜索功能改进
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,执行
- 自此,您的知识管理平台,将使用新的搜索引擎,进行享用新引擎带来的便利吧。
Gistore 备份回滚改用分支实现
8月21日
Gistore 备份的回滚原来采用的方法是,建立和回滚 Tag(里程碑):
- 当 master 分支的提交(备份)数量达到预设次数(缺省200次),建立一个 Tag,如 gistore/1
- 当名为 gistore/XXX 的 tag 的数量达到一定程度,进行回滚,即:
- gistore/2 -> gistore/1
- gistore/3 -> gistore/2
- …
更改里程碑?!
正在写 Git 培训资料,开始写里程碑时,突然想到 gistore 实现中有更改里程碑的实现,这种实现是不好的:
- 里程碑在创建后,只在第一次同步(PULL)的时候,被获取
- 当里程碑修改后,其它人再执行 PULL 的时候,不会更新!
- Gistore原来的实现,如果发生备份回滚,远程同步的服务器不能获取更新后的Tag。在镜像服务器有失去部分备份历史的危险。
新的备份回滚用分支来实现
分支名称为 gistore/1, gistore/2, …。数字越大的分支保存近期的备份,数字小的保存老的回滚备份。

爱上Git——《Git培训讲义》摘录
8月17日
群英汇的开源版本控制系统服务和咨询主要是基于Subversion,群英汇的开源项目管理系统平台主要集成的也是Subversion。但是我们公司(群英汇)内部的开发一直在使用Git,所以实际上,我们在Git上也有着丰富的使用和管理经验。
最近一个客户选择了我们提供Git的培训和部署服务,于是从上周开始着手准备《Git培训讲义》。
这个客户是有着实际的需求,才不得不从 Subversion 迁移到 Git,虽然只是公司的部分项目组。
《Git培训讲义》中开头有一章,我给它命名为“爱上Git”,抓眼球是其次,主要是先让用户能够立刻“爱上Git”。
阅读全部内容 »
如何同步 Gistore 的备份数据?
8月14日
Gistore 在公司内部以及部分客户推广一段时间来看,还是很满意的,但是如何实施双机备份或者管理员远程克隆是一个问题。
- 每个需要同步 gistore 备份库的用户都需要建立单独的系统帐号?
- 或者引入复杂的 Git 库管理工具?
最新的解决方案非常的简单,只引入了一个系统帐号 gistore,使用该帐号进行备份库的克隆操作:
- 将同步者的公钥上传。可以使用下面的命令(需要开启 gistore 的口令认证)
$ ssh-copy-id -i id_rsa gistore@<REMOTE.SERVER>
- 使用 git 命令执行克隆操作。
例如下面的命令克隆 /etc/gistore/tasks/system 指向的 gistore 备份库$ git clone gistore@<REMOTE.SERVER>:system
那么是如何实现的呢?
- 使用了群英汇改进的 gitosis 提供 git 库访问控制服务
- 利用了改进后的 map 指令,将访问的 git 库的地址映射到对应的 gistore 备份库
例如访问 system,实际访问的是 /etc/gistore/tasts/system/repo.git 指定的代码库。相关的 map 指令:map readonly * = (.*):\1/repo
- 不对单个公钥连接进行身份识别,而是所有的登录用户都使用唯一帐号。这样简化了授权模型,降低了配置难度
实际上是在 /etc/ssh/sshd_config 中增加了如下设置:# ossxp gistore backup account settings: Match user gistore ForceCommand gitosis-serve gistore X11Forwarding no AllowTcpForwarding no AllowAgentForwarding no PubkeyAuthentication yes #PasswordAuthentication no - 以上的操作,都在安装群英汇 gistore 软件包的时候自动配置,无须人工介入。

晒晒我的计划任务
8月10日
我真的很喜欢我们最新开发出来的 Redmine 计划任务的功能。最早接触类似功能是 Eclipse Mylyn,能够管理我在 Trac 中的任务,但是 Mylyn 的存在的问题在于:设置复杂,而且 Eclipse 加载慢占用资源多。
为什么不在每天都用的基于 Web 的项目管理平台中加入这个功能呢?这就是我们开发的 Redmine 计划任务功能的由来。
今天好好的用了一下,提了几个改进意见。这不,最新改进的计划任务隐藏没有任务的时间段,缺省自动展开显示。
晒晒我的计划任务。(图中任务仅为示例,是在我笔记本演示环境中的)
从上图可以看出:
- 可以很方便的通过右键菜单为属于你的计划任务设定时间表
- 按照设定的时间段分组显示,缺省打开全部分组。没有任务的分组缺省不显示
- 到期没有完成的任务,会永远定格显示在“今天”,直到你完成并关闭之
- 如果有任务被设定了“规定的完成日期”,则会按照设定的计划任务和规定完成日期最近的日期分组
- 看到了,够 Mylyn 的吧
pySvnManager 0.5 升级指引
8月9日
对于不能提供 SSH 远程登录服务器的用户,可以参照本文进行 pySvnManager 的升级。关于 pySvnManager 的新功能,参照:《pySvnManager新功能:LDAP用户同步》
升级的步骤简单的说就是:备份 -> 软件升级 -> 重启服务




最新评论