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-12
05

今天在solidot上看到了这个极其巧妙的算法,能够计算平方根倒数,即1/sqrt(x),据称是Quake 3中的代码。简单测试了一下,速度要比math.h提供的sqrt函数快上一倍左右。

float InvSqrt(float x){
  float xhalf=0.5f*x;
  long i=*(long*)&x;
  i=0x5f3759df - (i>>1);
  x=*(float *)&i;
  x=x*(1.5f-xhalf*x*x);
  return x;
}

看完后觉得十分巧妙,于是开始读Chris Lomont于2003年撰写的一篇分析论文, 看到一半的时候发现fcicq比我捷足先登, 并给出了一个中文版的算法分析页面。 该网页的作者自称看完GameDev.net的算法后觉得自己火星了,看来我还真是从冥王星来的,哈雷彗星也未可知。


2006-10
28

阅读 O'reilly 的书籍免不了要执行书上的示例代码,而手工输入代码又十分浪费时间。其实只要将书上的代码利用 O'reilly Code Search 搜索,即可得到该代码的电子版,然后复制粘贴即可。


2006-10
20

查看myprog(二进制文件)依赖的库文件

ldd myprog

查看myprog的符号表

nm myprog

删除myprog中的符号,减小文件大小

strip myprog

myprog的详细信息

readelf -a myprog

另外这篇文章可以在调试时作为参考。


2006-10
14

最近在用 perl 写一个Linux下的多进程守护进程,因此研究了一下Linux下的进程相关的知识。 现将心得总结一下。主要是关于进程创建和回收。

阅读全文 »
2006-10
12

前面这篇文章简单地阐述了用Perl创建守护进程(daemon)的方法。 实际上,创建一个多进程的守护进程需要注意很多事情。

阅读全文 »
2006-09
28

如何在Linux下创建这样一个程序,执行之后返回shell,但程序本身驻留在内存之中继续执行?其实很简单,创建一个子进程,然后父进程结束即可。例如下面的Perl程序:

#!/usr/bin/perl
exit if fork();       # 创建子进程,然后父进程退出
while (1) { sleep 1; }       # 测试用死循环

不过需要考虑到一点,守护进程通常在系统启动时以root身份启动,但是由于安全问题,通常并不以root身份运行。这一点使用perl如何实现呢?可以使用下面的 sudo 函数。

sub sudo {
    my ($user, $group) = @_;
    my $uid = (getpwnam($user))[2];
    my $gid = (getgrnam($group))[2];
    ($(, $)) = ($gid, "$gid $gid");
    ($<, $>) = ($uid, $uid);
}

所以,一个基本的守护程序应当这样写:(sudo函数代码省略)

#!/usr/bin/perl
&sudo("myuser", "mygroup");     # myuser、mygroup为启动守护进程的用户和组
exit if fork();
while (1) { sleep 1; }

2006-09
10

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

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

阅读全文 »
2006-08
13

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

阅读全文 »
2006-08
11

适用于日本的手机。

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

阅读全文 »