Samson's Machete

最近要做的几件事

最近事情实在太多了,我不得不记下来:

1、为Guile的port-conversion-strategy添加ingore选项,使得invisible字符不要打印出来,但是仍然保留其ascii值;

2、把TCP/IP协议栈过一遍;

3、《principle of concurrency...》读完;

4、Machine Learning课程作业别忘了做。

如何针对不同的git repository使用不同的设置

我们都知道,git-config本身提供了两种作用域,systemglobal
对于system来说,选项会存放到/etc/gitconfig中,作为系统变量;
而对于global,则会存放到~/.gitconfig中,作为当前登录用户的全局变量。
但实际上很多人忽略了第三种作用域,暂且称它为local,因为git-config本身并没有这个参数,稍候我将介绍这种方式。
三种作用域的优先级为 local > global > system ,这意味着优先级高的设置项将获得最终效果。
有时候我们可能需要为不同的repository设置不同的邮件帐号,这个帐号将会显示在我们提交的补丁上面。这对于大部分开发者来说,偶尔换个名字和邮箱来打补丁倒是无所谓,但是对有一部分开发者来说却非常重要。不过我仍然将这个方法分享出来,因为除了邮件帐号之外,对其他设置项也是有用的。
举个例子,我有两个常用帐号,NalaGinrut At gmail.com和mulei At gnu.org。
1、我在Guile社区使用的是NalaGinrut at gmail.com,由于我作为Guile开发者曾经签署过一份FSF的版权转移表格,该表格上限定了我所在的社区(guile)以及我所用的别名(nalaginrut),所以我最好的选择是为Guile打补丁的时候继续采用NalaGinrut At gmail.com这个帐号;
2、我作为GNU/Xmlat的maintainer需要使用mulei At gnu.org这个帐号。
这样就产生了一个麻烦,当我正常维护项目时需要用gnu.org这个帐号,而心血来潮想要给Guile打补丁时需要用gmail帐号。
解决方案就是对local进行单独设置:
将你想要的设置项添加到 .git/config 就可以了。比如:

[user]
         name = nalaginrut
         mail = nalaginrut At gmail.com
这样你commit的时候就会使用当前repository的name和mail。
别忘了,其他设置项也是一样的,你可以为每个repository单独设置,如果确实有必要的话...

geiser在Emacs-23.1.1中无法使用的问题

geiser是目前在Emacs中最好的scheme开发环境,只支持Guile和Racket。之后在专门弄个geiser的介绍文章吧...
Emacs-23.2之后的NEWS中有一条:
called-interactively-p now takes one argument and replaces interactive-p
而最新的geiser兼容了23.2之后的Emacs,所以如果你想在Emacs-23.2之前的版本中正常使用geiser,需要打个小小的补丁,进入geiser的源码目录:
sed -i "s:called-interactively-p nil):called-interactively-p):g" elisp/geiser-autodoc.el

[ragnarok-dev] epoll rocks!

刚才ragnarok的最新event模块测试总算是出了正确结果,该模块试图统一select/epoll/kqueue的接口,并在ragnarok编译时就根据不同平台自动选择最优的IO multiplex接口。虽然不少bug要解决,但event module是目前为止ragnarok中最复杂的设计。event模块采用Guile+C的混合实现,因为之前缺乏混合编程的调试经验,所以调试起来难度不小,不过现在好多了。
最早ragnarok采用的是最挫的block方式来轮询监听。那时候CPU占用率奇高,每次都99%,我一直以为是block方式的副作用。直到昨天IO multiplex正常运作之后我发现CPU占用率仍然是99%,于是我知道错怪了block IO。最终的解决方案是在daemon的infinite loop中加入sleep。这是个很简单的解决方案,只要遇到基于daemon的服务器设计都必须有这一步,否则会导致主daemon进程的死循环占用几乎所有的CPU资源——而实际上主daemon进程在subserver全部启动之后根本不做任何工作,但它必须存在一个死循环,否则整个server就退出了。
event模块还有很多需要改进的性能瓶颈,不过暂时先保证它能运作,计划接下来的工作是完成HTTP1.1的所有功能。

[TODO] Register VM for Guile

这个东东其实我很早就想做,不过现在guile-dev有人提了。我估计我只能尽可能参与而不大可能自己完成。毕竟我的TODO list虽然不长但东西蛮大的。

确切地说,我希望能在guile社区至少跟随完成这两样东西:AOT compiler和Register VM。让我独立完成是不可能的,只能跟随完成。有了这块的经验之后,我决定去GCC社区玩玩。

编译器和语言这块照例说不应该是我做的,应该是小猫来做。现在反正已经这样了,我在操作系统方面的进度差太远了,如果可能的话编译方面的TODO不要再增加了——不过有时候我是控制不了自己 ;-) happy hacking~