HELLO,遗传算法!

这篇文章讲述如何利用遗传算法解决一个二元函数的最大值求解问题。由于我对遗传算法的理解还处于菜鸟级别,所以本文所讲的方法以及所写的程序不一定 正确。之所以写这篇文章,是因为我已经烦透了教科书或论文里对遗传算法那么刻板的叙述,所以很想写一篇稍微轻松一点的入门文档,娱乐一下。

继续阅读

GLib 学习笔记(未完成)

用 ConTeXt MkIV 排的,源文档及 pdf 位于 http://code.google.com/p/way2ctx/downloads/list

继续阅读

矩形选择

本来是灵机一动,考虑在 gtkglext widget 上使用 cairo 在窗口中动态绘制一个矩形框表示所选的 OpenGL 三空间中的局部区域,然后将这个矩形框映射到 OpenGL 三维空间中得到三维选区,并将 OpenGL 的视景体调整为这个三维选区,从而实现 OpenGL 图形的放大效果。可惜,这个灵机一动没成功,cairo 所绘制的矩形框被 gtkglext 的双缓冲区里的图形淹没了。

尽管如此,我还是要将这个 cairo 效果拿出来展展,用于揭示虽然我一直都喜欢 gtk+,但是这实际上是我第一个具有现实意义的 gtk+ 程序 :)

继续阅读

写了两个 elisp 函数

第一个:

(defun c-header (project module)
  "Insert some macro to prevent the header file included multiply"
  (interactive "sWhat's the project name? \nsWhat's the module name? ")
  (let ((p (upcase project)) (m (upcase module)))
    (insert (format "#ifndef %s_%s_HEADER\n" p m))
    (insert (format "#define %s_%s_HEADER\n\n\n\n" p m))
    (insert (format "#endif /* %s_%s_HEADER */\n" p m))
  )
  (let ((l (- (line-number-at-pos) 3)))
    (goto-line l)))

用于自动生成类似这样的 C 语言头文件代码:

#ifndef PM_POINTS_HEADER
#define PM_POINTS_HEADER



#endif /* PM_POINTS_HEADER */

第二个:

(defun gobject-macro (project object)
  "Insert some macroes about gobject"
  (interactive "sWhat's the project name? \nsWhat's the object name? ")
  (let ((P (upcase project)) 
	(O (upcase object))
	(p (downcase project))
	(o (downcase object))
	(pp (capitalize project))
	(oo (capitalize object)))
    (insert (format "#define %s_TYPE_%s (%s_%s_get_type ())\n" P O p o))
    (insert (format "#define %s_%s(object) (G_TYPE_CHECK_INSTANCE_CAST((object), %s_TYPE_%s, %s%s))\n" P O P O pp oo))
    (insert (format "#define %s_%s_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), %s_TYPE_%s, %sClass))\n" P O P O pp oo))
    (insert (format "#define %s_IS_%s(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), %s_TYPE_%s))\n" P O P O))
    (insert (format "#define %s_IS_%s_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), %s_TYPE_%s))\n" P O P O))
    (insert (format "#define %s_%s_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), %s_TYPE_%s, %s%sClass))\n" P O P O pp oo))))

用于生成类似这样的 GObject 类型宏:

#define PM_TYPE_POINTS (pm_points_get_type ())
#define PM_POINTS(object) (G_TYPE_CHECK_INSTANCE_CAST((object), PM_TYPE_POINTS, PmPoints))
#define PM_POINTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PM_TYPE_POINTS, PmClass))
#define PM_IS_POINTS(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), PM_TYPE_POINTS))
#define PM_IS_POINTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PM_TYPE_POINTS))
#define PM_POINTS_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), PM_TYPE_POINTS, PmPointsClass))

lua 5.1 中的函数常量表大小限制

用 lua 的 table 来构造一份数据文件,这个数据文件包含了43w 多个三维点数据。用 lua 加载该数据文件时,结果出现“constant table overflow”错误。
这个错误是因 lua 的函数最多可以接受包含 2^18 个常量的表。

问:为什么要有这个限制?

曰:是因为 lua 虚拟机是基于寄存器的,而非堆栈。lua 的访问常量表的指令码所占据的寄存器长度为 18 位,因此它最多能接受的常量表大小为 (2^18 -1)。 

问:为啥要基于寄存器来实现虚拟机?

曰:为了快。

问:那我该如何处理元素数量大于 (2^18 -1) 的表?

曰:可将一个大型的表分割为多个子表。

又曰:lua 5.2 将常量表的大小提升到 (2^26 - 1)。

使用 cloc 统计代码行数

可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释、空行所占用的文本行都统计在内。如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做此类工作,那么可以考虑使用 cloc

cloc 是一个 perl 脚本,它可以统计很多种编程语言的代码文件中的空行、注释以及实际的代 码行数。

示例 1:统计一个 tar 包中的代码行

$ > cloc small-2.0.tar.gz 
      42 text files.
      41 unique files.                              
       4 files ignored.

http://cloc.sourceforge.net v 1.50  T=1.0 s (38.0 files/s, 3451.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               21            435            482           1695
C/C++ Header                     8            102            161            275
m4                               4             18              4            136
make                             4             18             72             29
Bourne Shell                     1              2             20              2
-------------------------------------------------------------------------------
SUM:                            38            575            739           2137
-------------------------------------------------------------------------------

示例 2:统计项目目录中的代码行数

$> cd m2boxtree
$> cloc ./
      68 text files.
      65 unique files.                              
      23 files ignored.

http://cloc.sourceforge.net v 1.50  T=0.5 s (88.0 files/s, 9258.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               17            611             94           2490
C/C++ Header                    14            230            301            381
Bourne Shell                    10             56            155            252
make                             2              3              0             25
Python                           1              4              4             23
-------------------------------------------------------------------------------
SUM:                            44            904            554           3171
-------------------------------------------------------------------------------

有关 GObject 的几份文档

这几日心甘情愿地放着正事不做而被 GObject 虐,又看了一遍 GObject 参考手册,结果还是一头雾水,感觉这个手册不是写给像我这般愚蠢的人看的。

发现对岸那边有人用 OOo 制作了 4 份演示文档,并提供了一些较具说明性的示例代码,可从其项目主页下载。演示文档做的很是言简意赅,提供的示例也很有代表性。

最后,比较值得阅读的资料是 cloverprince 写的一系列笔记,不过是英文的,内容上自下向上的分析了 GObject 的一些重要的知识点。

建议想学习 GObject 的同学,最好是先阅读以上笔记,然后再去阅读官方的 GObject 参考手册。