Aiur – ZelluX 的技术博客

Security, Kernel, Virtualization, Programming Languages

Archive for December, 2009

Ubuntu下编译Linux-xen的问题

without comments

在Ubuntu下编译Linux-xen时碰到arch/i386/kernel/head-xen.o无法找到的问题,而该目录下有head-xen.S这个文件,说明make之前的的工作并没有把这个.S文件编译成.o。而同样的代码,在ArchLinux和Fedora上svn checkout后编译没有任何问题。

最后发现问题在于Ubuntu默认会把/bin/sh指向/bin/dash,在scripts/Makefile.build里面加上一行SHELL=/bin/bash指定$(shell)使用bash即可。后来还搜了一下为什么Ubuntu使用dash而不是bash,其理由是dash的执行效率更高,但不可否认的是这个改动也导致了一些项目无法成功编译,虽然无法成功编译的原因可能是Makefile里使用了一些bash的特性而非POSIX shell所提供的那些。

另外在debug过程中在网上找到了一些debug Makefile的技巧:

make -n 可以仅仅打印出将要被执行的命令,而不去实际执行

make -np 可以打印出更多的信息(使用的规则和变量),并执行每一条命令

remake也是个不错的选择:“remake is a patched and modernized version of GNU make utility that adds improved error reporting, the ability to trace execution in a comprehensible way, and a debugger.”

在检查shell命令的时候,可以使用set -x使得所有shell命令在执行前都能被输出。

Written by zellux

December 17th, 2009 at 2:41 pm

Posted in Tools

Tagged with , ,

Chomp游戏

without comments

把一堆石子排成n行m列,两人轮流从里面取出石子,条件是取出一个石子后所有在它右边和上面的石子也要被取走。谁取走最后一个石子就算输。以3*5的棋盘举例来说,先手取了(2,5),因此(3,5)也要被取走;后手取了(3,3),同时也要取走(3,4)。现在棋盘的状态如下(O代表这个位子的石子还没被取走,x代表已经被取走):

3 O O x x x
2 O O O O x
1 O O O O O
  1 2 3 4 5

接下来先手又取了(2,1),于是第二排和第三排就一颗石子都不剩了

3 x x x x x
2 x x x x x
1 O O O O O
  1 2 3 4 5

后手取(1,2)

3 x x x x x
2 x x x x x
1 O x x x x
  1 2 3 4 5

接下来先手就只能取最后一个石子了,后手胜。

这个游戏像是Nim Game的二维版本。于是问题也来了,能不能保证先手或者后手有必胜策略呢?

答案是除了1*1的棋盘,对于其他大小的棋盘,先手总能赢。有一个很巧妙的证明可以保证先手存在必胜策略,可惜这个证明不是构造性的,也就是说没有给出先手怎么下才能赢。证明如下:

如果后手能赢,也就是说后手有必胜策略,使得无论先手第一次取哪个石子,后手都能获得最后的胜利。那么现在假设先手取最右上角的石子(n,m),接下来后手通过某种取法使得自己进入必胜的局面。但事实上,先手在第一次取的时候就可以和后手这次取的一样,进入必胜局面了,与假设矛盾。

另外这个证明是基于Zermelo’s theory,这个理论保证在这样一种游戏中(两人博弈,信息完全公开,不存在偶然事件且能在有限步里面决出胜负),先手或后手肯定存在一种必胜策略。

相关链接:

http://en.wikipedia.org/wiki/Zermelo’s_theorem_(game_theory)

http://www.win.tue.nl/~aeb/games/chomp.html

Written by zellux

December 13th, 2009 at 6:07 pm

Posted in Algorithm/Mathematics

Tagged with

Emacs中对不同项目指定不同的风格

without comments

我的Emacs配置里C语言默认的缩进风格是用4个空格,最近要修改Chromium的代码,而Google的C/C++风格统一为2个空格缩进,所以改代码的时候要把c-basic-offset设置为2。这样在不同项目间切换的时候很不方便。

stackoverflow上发帖求助后发现了Emacs 23.1一个很好用的新功能,Per-Directory Local Variables,只需要在项目主目录下放一个.dir-locals.el文件,里面设置该项目特有的变量值,就能应用到整个项目了。

以我的Chromium为例,Google已经提供了一份C/C++风格的配置,只需要在~/chromius/src/.dir-locals.el里把google-c-style常量粘贴进去即可。另外我不知道为啥加上c-offsets-alist那段后Emacs缩进会变得很奇怪,所以我把它删了。附修改后的.dir-locals.el

((c++-mode . ((c-recognize-knr-p . nil)
              (c-enable-xemacs-performance-kludge-p . t) ; speed up indentation in XEmacs
              (c-basic-offset . 2)
              (indent-tabs-mode . nil)
              (c-comment-only-line-offset . 0)
              (c-hanging-braces-alist . ((defun-open after)
                                         (defun-close before after)
                                         (class-open after)
                                         (class-close before after)
                                         (namespace-open after)
                                         (inline-open after)
                                         (inline-close before after)
                                         (block-open after)
                                         (block-close . c-snug-do-while)
                                         (extern-lang-open after)
                                         (extern-lang-close after)
                                         (statement-case-open after)
                                         (substatement-open after)))
              (c-hanging-colons-alist . ((case-label)
                                         (label after)
                                         (access-label after)
                                         (member-init-intro before)
                                         (inher-intro)))
              (c-hanging-semi&comma-criteria
                . (c-semi&comma-no-newlines-for-oneline-inliners
                    c-semi&comma-inside-parenlist
                    c-semi&comma-no-newlines-before-nonblanks))
              (c-indent-comments-syntactically-p . nil)
              (comment-column . 40)
              (c-cleanup-list . (brace-else-brace
                                  brace-elseif-brace
                                  brace-catch-brace
                                  empty-defun-braces
                                  defun-close-semi
                                  list-close-comma
                                  scope-operator)))))

Written by zellux

December 1st, 2009 at 4:05 pm

Posted in Tools

Tagged with

FireStats icon Powered by FireStatsBetter Tag Cloud