技术文章
各种编程技术,Perl, PHP, C, C++, C#, .Net, Java, J2EE, Ruby, Rails …
Xapian的检索
8月8日
Xapian中有关查询的代码比索引复杂的多,因为它支持多种查询机制,而索引就只是循环叠加。如下面的多种查询机制:
- 概率性搜索排名
- 相关度反馈
- 词组和邻近搜索
- 全方位的布尔型搜索器
- 支持提取搜索关键字的词干
- 支持通配符查询
- 支持别名查询
- Xapian支持拼写纠正
xapian索引的term处理
7月31日
Xapian 是一个用C++编写的全文检索程序,License是GPL,它的作用类似于Java的lucene。Xapian 的 官方网站是http://xapian.org/,采用trac作为项目管理软件。如果想要了解更多则可以查看xapian的文档。Xapian的索引不支持中文切词,不管是单字切词还是多元切词,中文是同英文一样的处理方式。下面就来分析Xapian怎样索引英文文档。
nVidia 显卡在 Debian sarge 最新 linux 内核中的驱动
7月30日
我的笔记本安装的是 Debian sarge,上次升级内核到 linux 2.6.32-5, nVidia 的驱动就一直没有跑起来,今天下班后,仔细研究了一下。
先说一下 nouveau 和 nVidia 驱动的历史
Linux 和 Windows 相比,让用户觉得上手比较难,一个很重要的原因就是驱动不易安装。
- Windows 本身内置了大量的设备驱动
- 因为 Windows 的普及,硬件厂商首选是开发针对 Windows 的设备驱动
- 再有一个就是 Windows 升级比较缓慢,Windows XP 的历史都快10年了,硬件厂商的支持难度要小
就 nVidia 显卡来说,其实 Linux 的支持也是满不错的:
- Linux 内置了 nv 驱动:xserver-xorg-video-nv 。对 2D 支持尚可,3D 则是完全的不支持
- nVidia 官方曾经发布过开源的驱动 nvidia-glx 但不久就宣布不再支持。现在 nVidia 提供非开源的 Linux 驱动,在官网提供下载链接: http://www.nvidia.com/object/unix.html
- 因为 nVidia 官方的驱动和 Linux 操作系统的开放版权向背,各个 Linux 发行版都没有将 nVidia 官方的驱动集成到发行版中,造成用户安装 Linux 不能像 Windows 那样下载拆包即装的硬件驱动,只能使用功能较弱的内置驱动。
为了发挥显卡的最大功效,使用 3D 桌面或者运行 Google Earth 之类软件,我是这样安装 nVidia 驱动的:
- 首先在 Linux 中要安装 gcc,g++ 等软件开发环境,因为编译硬件驱动需要。
- 下载 nVidia 驱动。见官方驱动下载网页:http://www.nvidia.com/object/unix.html
- 启动 Linux 到文本控制台。如果进入了 X Window,需要杀掉 X,进入控制台界面。
- 运行从 nVidia 下载的软件包,按照界面一步一步操作,即可编译出内核模组和 Xorg 的设备驱动
- 编辑 /etc/X11/xorg.conf 设置: Driver “nvidia”
- 如果 Linux 升级?需要重新执行上面的步骤。
是不是太繁琐了?谁让你频繁升级呢? 
好消息是 Nouveau 来了,你看其中有字母 n 和 v,猜出来了么?这是 nVidia 在 Linux 下新的开源驱动名称。Nouveau 是通过针对 nVidia 显卡驱动反向工程,实现的 nVidia 开源显卡驱动,目标是提供完全的 3D 驱动支持。较 Linux 之前提供的 nv 驱动大大的前进了,甚至有一天会盖过官方的驱动。
阅读全部内容 »
reST 输出文档中页眉和页脚的定制
7月28日
群英汇采用 reStructuredText(简称 reST)文本标记语言进行文档维护。在 cuirui 解决了 rst2pdf 对 reST 转换 PDF 的图片缩放问题之后,如何让生成的 PDF 更有表现力,下了一番功夫去研究。
- 页眉和页脚根据转换的格式(HTML,PDF),自动进行选择
- PDF 的页眉显示章节标题以及页码,而页脚则显示文档标题和公司名称及相关链接
- HTML 的页眉显示文档标题以及到官方文档的链接(公司网站该文档的安装位置),页脚显示网址
- 文档版本号和文档编译时间由 Debian 软件包配置文件中的 changelog 动态替换
阅读全部内容 »
rst2pdf图片处理(续)
7月26日
继在上一篇博客 《rst2pdf中图片的处理》 中提出问题,本文通过一个简单的实现,解决 rst 转换为 HTML 和 PDF 时图片显示不一致(尤其是PDF中不同格式图片忽大忽小)的问题。
图像分辨率是用于度量位图图像内数据量多少的一个参数。通常表示成ppi(每英寸像素 pixel per inch)和dpi(每英寸点 dot pre inch)。包含的数据越多,图形文件的长度就越大,也能表现更丰富的细节。但更大的文件也需要耗用更多的计算机资源,更多的内存,更大的硬盘空间等等。在另一方面,假如图像包含的数据不够充分(图形分辨率较低),就会显得相当粗糙,特别是把图像放大为一个较大尺寸观看的时候。Ppi和dpi经常都会出现混用现象。从技术角度说,”像素”(p)只存在于计算机显示领域,而”点”(d)只出现于打印或印刷领域。

为 TestLink 增加从 LDAP 同步用户的功能
7月19日
管理员在配置 TestLink 时,经常会问我们一个问题:用户管理平台(使用LDAP)中创建的用户,并没有出现在 testlink 的用户数据库中,如何为用户指派权限?
之前我们的实现是这样的:
- 用户帐号已经在 LDAP 中存在了
- 用户访问 testlink,点击“登录”则跳转到“单点登录系统”
- 在“单点登录系统”认证成功后,浏览器重定向,跳转到 TestLink
- TestLink 发现用户已经登录,但是内置帐号不存在,会自动从 LDAP 中查询登录用户的信息,自动为该用户创建 TestLink 内置帐号,并设置缺省权限(缺省是游客,管理员可配置)。
所以,我们之前会告诉客户:“先让用户登录一次 TestLink,再为他分配权限。” 就是因为这个原因。 
最近 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 也许在学习曲线上看比较容易上手,但是长远来看,代码的维护量和开发难度还是要大很多。
rst2pdf中图片的处理
7月19日
一般情况下,使用reStructuredText(ReST) 生成PDF 格式的文件需要先转化成LaTeX 格式。而rst2pdf 通过调用reportlab 工具包直接生成PDF 文件。
如果绿坝开源怎么样
7月13日
今早的一篇新闻《绿坝软件运营公司未获国家经费 北京项目组遣散》,让前两年纷纷扰扰的 “绿坝护航——居家旅行,装机上网,必备之佳品”, 尴尬的画上一个句号。
商业软件或者说闭源软件,其技术支持是很不确定的,或者说很不可靠
新闻中提到工信部花费了4170万元人民币,为全国的装机用户买来一年的免费使用和技术支持。但是商业软件公司的运作,是以利益最大化作为公司唯一的目标,如果断奶或者说国家经费掐断之后,这类商业公司真的除了早点关门,减少既得利益的损失之外,别无它法。
因为该商业软件公司的关门,将导致绿坝从此绝迹江湖,已经依赖绿坝保护孩子干净上网的父母们将无所适从。这一切最核心的问题是关于 源代码 的掌控:
- 如果把安装在电脑里的绿坝软件,比喻为已经组装下线的一辆车
- 软件公司,就好比汽车工厂
- 开发软件的工程师,好比汽车工厂里生产线上的工人
- 软件开发中的项目管理,别管是瀑布模型还是敏捷实践,相当于整个汽车生产的流水线
- 软件的源代码,就相当于汽车的图纸,以及为了研制耗费无数人力的试验数据:风洞试验、碰撞试验等等
绿坝本身是闭源软件,一旦负责开发和维护的商业公司倒闭,没有了源代码,就像汽车工厂没有了生产图纸,没有了整个生产线,徒有工人也无济于事。
如果“工信部”当初选择开源来运作绿坝软件,如今就会是另一番景象
如果最初,选择了“开源”作为项目的运作方式,不但会让“绿坝软件”好评如潮,而且政府部门会大赚一笔。你不相信么?
如果我是“工信部”部长,我会选择:
- 买断商业软件公司的部分核心源代码,并将买断的代码开源
- 组织一个社区,核心开发团队人不用很多,负责“绿坝”的开发,整个开发流程是开放的,源代码是开源的
- 向这个社区输血一年到两年(有个几百万就已经很够了吧)
- 一些IT厂商,如: 联想,HP,DELL,会挤破脑袋的要加入该社区:
- 能够在全国都用的软件的起始页面中出现自己公司的 LOGO ,是多大的宣传效应啊
- IT 巨头会挤破脑袋加入社区,并大把大把提供赞助费
- IT 巨头,还会贡献部分开发力量,以便让自己的电脑里的“绿坝”功能更强
- 政府要退出么?如果只是卖出50%的股份,就能把先前所有的投资都收回了,我还要再拿着另外的50%股份,等着升值呢。
对公司老板们的启示:采购开源软件服务
如果国家尚且有些家底可以去败,可以去不计成本的采购没有未来保证的商业软件,那么公司这么去做,就真的是自寻死路。
采购开源软件服务,是商业公司避免投资失败的保证:
- 采购开源软件服务,可以获得持久的技术支持保障,因为源代码开放,即使一家公司倒掉了,还有千万家公司起来
眼里浮现出老电影的画面:电影里的英雄人物身中数枪,高呼“开源万岁”,仍然毅力不倒。。。 - 选择开源软件,节省投资成本
- 选择开源软件,减少软件拥有成本
- 关于成本的更多分析,参见: http://www.ossxp.com/doc/about-us/about-us.html
Debian 文件偷换
7月9日
Debian “文件偷换”?在我们对开源软件定制的时候,用到了很多“偷换”的技术实现 Linux 的定制。当然群英汇大部分应用属于彻底的定制开发,采用软件包重新发布的形式提供服务。但是也有少部分的软件,例如 Apache2,PHP5,shorewall,只是对这些软件包自身的配置文件进行定制修改,这时如果采用软件包重新发布就显得非常笨拙和多此一举。采用配置文件“偷换”,起到事半功倍的效果。
为什么要文件“偷换”,而不是“光明正大”的覆盖呢?
- Debian 会检查文件包的文件冲突,不允许两个不同的软件包(A 和 B)安装相同的文件。
如果新安装的软件包(B)提供的文件已经由其它的软件包(A)安装过了,则拒绝安装新的软件包(B)。 - 如果新的软件包(B)在 POSTINST脚本(安装后自动执行的脚本)中,以拷贝文件的方式覆盖其它软件包(A)提供的文件,当然是可以的。但是,如果软件包A 有了新的版本,升级软件包A,会导致软件包B的定制文件被软件包A新的文件所覆盖。
Debian 本身提供的 dpkg-divert 提供了光明正大的文件“偷换”功能:
- 软件包 A 安装,配置文件保存在 /etc/a/file 中。
- 软件包 B 安装,执行 dpkg-divert 命令,声明将原来 /etc/a/file 移动到其它位置 /etc/other/place
- 软件包 B 自己的配置文件 /etc/b/file 链接到 /etc/a/file
- 软件包 A 升级的时候,会发现自己的配置文件 /etc/a/file 被指定到新位置 /etc/other/place,会将新的配置文件保存到 /etc/other/place 中。
Debian 文件偷换有两个常见的模式。
- 模式1:文件链接方式:
- 软件包 A 提供配置文件 /etc/file
- 软件包 B 提供配置文件 /etc/file.ossxp
- 软件包 B 的 postinst 脚本执行 dpkg-divert
- 将 /etc/file 重命名为 /etc/file.ossxp-orig
- 将 /etc/file.ossxp 链接为 /etc/file
- 模式2:文件移动方式
- 软件包 A 提供配置文件 /etc/fileA
- 软件包 B 提供配置文件 /etc/fileB。注意该配置文件不能是 /etc/fileA(第三模式)。
- 软件包 B 的 POSTINST 脚本执行 dpkg-divert,将 /etc/fileA 移动到 /usr/share/B/etc-fileA 中
在之前的一篇博客《群英汇部分应用的 /etc/init.d/ 下脚本名称改变》中曾经提到用 Debian Config Package 软件 和 CDBS 脚本,可以非常简单的实现上述两种文件偷换模式。而且根本无须编程,只是修改配置而已。
但是简单是有代价的。我们被限制在这两种“文件偷换”的模式中,而这两种模式都只在特定的场合可行,也就是说在特定情况下,都有副作用。当我们需要第三种模式的时候,就无法实现了,需要在彻底了解文件偷换机制后,脱离 CDBS ,手工编程实现。这两种模式有什么问题,以及怎么实现第三条道路呢?
阅读全部内容 »
在 reST 格式文档中,嵌入 Creative Commons 授权信息
7月9日
群英汇的用户手册文档以 Creative Commons 许可协议发布,但是仅仅在文档中用两个单词“Creative Commons”进行标识是不够的,因为:
- Creative Commons 不是一个,而是一组(六个)License 组成的许可协议家族
- 要在网站上的许可协议上,建立链接。链接到 creativecommons.org 网站上对应许可协议
- 只有在页面中建立到 creativecommons.org 的链接,才能被搜索引擎识别出网页/资源对应的许可协议
- 只有建立链接后,也才可能让您的共享资源,在 Search@CC 上搜索到
如何使用 reStructuredText 格式(简称 reST)编写的文档中嵌入 CC 许可证链接呢?我们公司的很多文档都是用 reST 格式维护的。



最新评论