星期六, 六月 23, 2007

C函数 插入(interposition)

这个词怎么翻译都别扭-interposition,意思就是实现某个函数来代替库的相应函数,比如用自己的malloc来替换标准malloc,下面这篇文章(确切的说是代码)提供Linux下的三种方法,分别对应运行时刻,链接时刻或编译时刻:
http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15213-s03/src/interposition/mymalloc.c

三种方法使用三种技术:
编译时刻使用c/c++的预处理
链接时刻使用连接器的符号替换
运行时刻使用LD_PRELOAD
不过达到的效果是类似的。

星期五, 六月 22, 2007

复杂命令行参数:gcc的-Wl,

-Wl,表示后面的参数将传给link程序ld(因为gcc可能会自动调用ld),如果后面的ld参数有空格,怎么传呢?比如想加一个-rpath /path? 下面几种方法:
1. -Wl,rpath /path
2. -Wl,rpath:/path
3. -Wl,rpath=/path
4. -Wl,rpath,/path
5. -Wl,"rpath /path"
6. -Wl,'rpath /path'

经过20分钟摸索和google,我才找到正确答案是 4,记下来。

星期三, 六月 20, 2007

FFTW

FFTW-快速傅立叶变换库,这个应该是很高深的东东(我数学学的不好,已经忘的差不多了),这里有一个非常好的介绍,这么牛的软件(算法非常快),不愧是MIT牛人开发的。我却连软件的名字都没有搞清楚(后面的in the west 啥意思?)

之所以"用"到它,是因为今天下载的一个软件需要它才能编译通过,不过我是不准备看FFTW的源码了。 :)

星期五, 六月 15, 2007

2G file 限制

我们在很多情况下都会遇到2G限制,最典型的是FAT16分区下文件不能超过2G,在此之后,FAT32已经突破这个限制,可以到4G,NTFS更是远远超出这个限制,但还是经常遇到2G文件的限制,我最近一次遇到是在Linux下gdbm数据库也不能超出2G大小。

原因在于,很多程序使用int作为文件指针的数据类型,int在32位环境下有2G的限制,导致了即使操作系统已经突破2G限制,还是有很多程序有2G文件限制,这需要修改程序(或者重新编译)来解决问题,这里有 Linux下关于大文件访问的详细的信息

星期四, 六月 14, 2007

File uploader插件

http://www.rjonna.com/ext/fireuploader.php

我用box.net提供的在线存储服务,但一旦用的多了,就希望能有一个客户端来代替Web界面,于是就找到了上面这个链接对应的firefox插件, 它可以支持box.net,flickr,picasa,youtube,似乎作者是这种online storage的忠实fans,将这些流行的应用一网打尽啦。

我目前只用它提供的box.net,界面比较简洁,不知道是否稳定可靠,用一段再说。

星期一, 六月 11, 2007

Windows下的python tempfile

python的tempfile用于方便的使用临时文件,tempfile提供了多种临时文件的使用方法,比如常用的NamedTemporaryFile和TemporaryFile。

可我发现,这两种方法在Windows下使用都不太方便,问题在于Windows与Linux在文件锁定机制的差异,Windows下缺省是锁定的(继承自Dos),Linux下缺省是不缩定的,而使用tempfile时,通常我们都是希望它不锁定,这使得在Windows下需要额外的处理,而NamedTemporaryFile和TemporaryFile都是在close时自动删除,所以处理起来比较麻烦。

后来我放弃了NamedTemporaryFile和TemporaryFile,转而使用mktemp,mktemp只是生成一个临时文件名,后续的open/read/write/close/delete操作完全取决于应用程序,这样在Windows下似乎好处理一些,可以绕过一些文件锁定的问题。

星期五, 六月 08, 2007

python IDE初评

到目前为止,我还没有发现满意的python IDE,不过老实说,我不需要IDE,我需要的是一个好用的编辑器和一个调试器,即使是分开做成两个程序也可以。

对于编辑器,我用Geany和VIM比较多,但对于Python编程来说,都不是很满意,调试器我用Eric的时间多一些,还基本满意(Eric应该算是一个IDE,我只用调试的功能)。

这些软件都可以用apt-get安装。

星期四, 六月 07, 2007

GtkSourceView可控的undo

GtkSourceView是GNome下常用的编辑控件,常用于源码的编辑和显示,gedit就是用了这个控件,并且因为它有undo功能(标准的TextView没有),所以我也喜欢把它用在各种地方替代TextView。

一个小问题是,undo功能有时是不需要的,确切的说是不能要的,比如你实现一个简单的文本编辑器,load一个文本文件之后,显然GtkSourceView会被更新,但这时候如果undo,就会回到load之前的内容,这应该是不正确的逻辑, GtkSourceView当然考虑了这种情况,它提供了begin_not_undoable_action和end_not_undoable_action接口,意思很直白,将load操作嵌入在这两个调用中间,就不会出现undo回到load之前的情况了,实际上以后的undo只能回到调用end_not_undoable_action的时候了。

星期三, 六月 06, 2007

ChangeLog 的维护

开发软件过程中,ChangeLog是很重要的历史记录,这个甚至被GNU写进项目规范了,但是另外一点是,随着版本控制系统的使用,又不得不在这些版本控制系统里维护另一份ChangeLog,对于程序员来说,重复是极其不爽的一件事。但程序员是聪明的,在cvs时代有个有名的工具叫做cvs2cl(就是CVS-log-message-to-ChangeLog的意思),就可以自动抓出cvs的log到Changelog文件中,这样就只需要维护cvs的log就可以了。

到了svn时代,很多程序员很怀念这个小工具,于是有人完成了svn2cl,算是向cvs致敬。

星期二, 六月 05, 2007

python file的模式与可移植性

python的file对于Windows和Linux有一个细微的差别(这是操作系统引起的,与python无关),打开文件的时候,需要一个模式的参数,Windows支持文本模式和二进制模式,缺省是文本模式,所以需要加b来表示二进制方式,而Linux不区分(起码在我的Ubuntu上不区分),加不加b效果一样。

所以为了更好的可移植性, 当使用二进制文件时,还是应该加上b。

星期一, 六月 04, 2007

使用py2exe

py2exe可以把python程序在windows下转换为exe,生成的exe可以让使用者不用再安装python就可以直接运行了,实际上py2exe除了exe外,还把需要的库,python解释器都统统放在exe所在的目录下了,但通常python解释器很小(2M左右),所以也是可以接受的,还有附带的一个好处是隐藏了源码。

有很多windows下的python程序使用了py2exe,比如wikidpad(一个桌面wiki程序,我曾经用了一段时间,使用wxPython,不错),bittorrent(这个就大名鼎鼎了)。

py2exe是在python的distutil基础上使用的,因此用起来很简单,这里有一个简单的教程: http://www.kadjo.net/softdev/?p=56
不过由于gtk有些庞大,作者使用了一些exclude语句,是为了把gtk运行库不放在最终的dist目录下,但实际上放也是可以的,只是需要更多一些的空间(gtk运行库加上python绑定还是蛮大的)。

星期日, 六月 03, 2007

Subversion的merge

刚开始用svn的时候,不太敢相信它的自动merge,不过人总是比较懒惰的,时间长了,就逐步丧失了对svn merge的监视能力,不过说实话,svn 自动merge的结果相当的不错,少有出错的时候,而且它总是留给用户再修改的机会。

svn的merge实际上是diff and patch,但只要你给它正确的指示(主要是做diff的两个版本号要给对),它工作的很好,不知道其它版本控制系统是怎么做merge的?

星期六, 六月 02, 2007

gtkTreeView的展开

既然是TreeView,肯定需要提供一个展开节点的接口,比较早的gtk版本提供了gtk.TreeView.expand_row接口,后面的版本又提供了一个gtk.TreeView.expand_to_path接口,我第一次用的时候选择了expand_row接口,顾名思义,这个接口可以展开一个节点的子节点,但是如果这个节点的父节点没有被展开的话,怎么办?expand_row是不管这些的,它傻乎乎的展开这个节点,而不管这个节点是否可视(父节点没有展开,自然就看不到了)。

现在我转而使用expand_to_path了,它"聪明"的替你从上到下一溜全展开了,如果要用expand_row的话,可能要一个for循环才搞的定了。

官方文档的信息: http://www.pygtk.org/docs/pygtk/class-gtktreeview.html