2007-07
06

某个功能被编译到so文件中,那么如何通过php来调用它? 一个方法是写一个php模块(php extension),在php中调用该模块内的函数, 再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是Fedora Core 6。

阅读全文 »
2007-05
14

我们知道VMware的硬盘镜像会随着空间利用的增加而自动增长, 但使用的空间变少时,硬盘镜像文件却不会随之减小。 幸好VMware提供了shrink工具可以将镜像瘦身到最小。 这时需要注意的一些事项总结如下:

  • 分区:不要使用RedHat Enterprise Linux的默认分区方式,默认的LVM分区无法瘦身。
  • Snapshot:分发之前不要做snapshot,有snapshot的系统无法瘦身。
  • 安装软件:如果你不用图形界面,就不要安装英文之外的语言包,它会给你安装许多输入法的东西,而这些东西都是要依赖于图形界面的。 不要安装开发包,那会一股脑地装进许多根本用不到的开发包。

基本的步骤如下:

  1. 建立虚拟机。
  2. 安装Linux,注意用手动分区,别选LVM,别装图形界面别装X,别装开发工具,别装英文之外的语言。
  3. 装好Linux之后用rpm手动安装需要的软件包。
  4. 配置你的开发环境。
  5. 用rpm删掉用不着的软件包,像蓝牙红外线glib图形库等。一般可将Linux瘦身到1G左右。
  6. 安装VMwareTools。这个工具需要 xorg-x11-libs 软件包,别忘了装。
  7. 在别的Linux机器上开个X-server,然后启动虚拟机上的VMwareTools,用shrink工具给镜像瘦身。

2007-02
11

关于Trac的介绍请参见前一篇文章

这里我们要构建一个基于Trac的项目管理系统。代码管理使用subversion,项目管理使用Trac。所需要的软件包如下:

很遗憾subversion现在仍然不支持最新的Apache 2.2系列,因此我们只能使用Apache 2.0系列。 而pyPgSQL 2.5.1版和ClearSilver 0.9.4不支持Python 2.5,因此只能用 Python 2.4。

另外,虽然Trac支持SQLite,但SQLite支持的SQL语法有限,实际应用中会有诸多不便, 因此我们选择了PostgreSQL作为后台数据库。

阅读全文 »
2007-02
10

今天介绍一下Trac,一个基于Web的bug管理系统。

Trac拥有强大的bug管理功能,并集成了Wiki用于 文档管理。它还支持代码管理工具Subversion,这样可以在 bug管理和Wiki中方便地参考程序源代码。

bug管理

在Trac中,项目中出现的问题称为ticket。像bug、功能改进、 TODO等都可以写成一个ticket。

  • 可设置ticket的优先级别。
  • 可以设置ticket的里程碑,表明这个ticket应在何时完成,并能够通过条形图方式显示里程碑的完成度。
  • 可以自定义条件生成bug报告,并可以通过SQL语句自定义报告的格式。

Subversion集成

通过Subversion集成,开发者可在Trac中以Web方式浏览代码库中各个版本的代码 和代码的修改历史,并可方便地比较各个版本间的差别。

Wiki

支持常用的Wiki语法。同时增加了许多bug管理的专用标记, 可以方便地创建到ticket、代码行甚至修改历史的链接。

Trac使用Python写成,后台使用SQLite或PostgreSQL数据库, 因此构筑一个完整的Trac系统需要安装以下软件:

  • Apache
  • Python
  • Subversion
  • PostgreSQL(可选)

下回继续介绍Trac的安装方法。


2007-02
05

如何统计代码的修改规模?如果肯花钱,则能买到统计代码修改规模的专业工具。这里介绍一种利用subversion和grep组合的方法简单统计代码修改规模。下面假设程序代码中的注释有两种格式,一种以 // 开头,另一种是Javadoc格式,即

/**
 * This is a function.
 * @param {String} v str
 */

为清晰起见,下面的统计命令分成了几行来写。

svn diff -r4:320                    # 获取rev4和rev320之间的差异
    | sed -e 's/\r//g'              # 删除行尾的换行符^M。Windows下必须
    | grep "^+[^+]"                 # 取得修改部分
    | grep -Ev "^+[[:space:]]*(\/\*)|(\*)|(\/\/)"     # 删除注释
    | grep -v "^+[[:space:]]*$"     # 删除空行
    | wc -l                         # 统计行数

2006-09
10

这篇文章的思想来自于Michael Feathers的Offensive Coding。标题直译过来是“攻击性编程”,但是为了避免与攻击性代码混淆。

这篇文章说,与其被动地做参数检查,不如一开始就避免传递错误参数。我们在书写一个函数时习惯于下意识地检查参数的合法性,不合法则返回null呀-1等表示错误的值。这种“防御”式的代码通常会导致不必要的代码复杂度。换个角度思考,如果能通过某种方法确保使用者不会使用错误的参数进行调用,就可以省却函数内部的参数检查。当然不是说参数检查有什么不对,而是要避免不必要的检查。

阅读全文 »
2006-08
13

前一讲中我们制作了一个能够随机更换背景的Flash。本章我们将制作一个稍有些用处的Flash - 时钟。 为了降低美工难度,我们仅做一个黑底白字的电子钟。

阅读全文 »
2006-08
11

适用于日本的手机。

现在绝大部分的手机都支持Flash功能,对于我们这些喜欢自定义手机的人自然会想到自制Flash做手机桌面和菜单等。那么我们就来研究一下Flash的制作方法。

阅读全文 »
2006-04
10

从C FAQ上看到的一个程序,可以将C语言源文件变成难以识别的代码。文件从http://www.faqs.org/ftp/usenet/comp.sources.misc/packages/opqcp/下载得到。


2006-04
10

从水木精华区看到的,作用是求比 x 大的最小的 2的幂的整数倍,其中 n 必须为2的幂。简单地说,这个宏是用来对齐的。比如 _ROUND_UP(7,4)=8, _ROUND_UP(7,8)=8 等。

#define _ROUND_UP(x, n) (((x)+(n)-1u ) & ~((n)-1u))