sparse linux checker
主要用来检查一些Kernel 代码里的bug,Linus自己写了上下文相关的C前端(代码文件到语法),
这个叫做Sparse,是一个lib,可以供各种客户端(后端)来使用,比如检查器,编译器等。
(这个前端不是用lex.yacc.flex.bison.antlr等工具实现的)
Linus也写了一个客户端也叫Sparse,来做他想要的检查,然后写了一个perl脚本cgcc用来集成Sparse
和gcc,这样就可以在编译时刻自动检查,就这些了。
c代表coding...

除了使用Eventbox外,在Image的容器上接收事件也可以,大部分容器控件的缺省event
mask为0,表示不接收事件,所以也需要更改才能接收事件,幸好glade里改event
mask很方便,需要注意的是鼠标移动事件和鼠标按下后移动事件有不同的mask。
pb = gtk.gdk.pixbuf_new_from_file (image_path)FAQ的链接在这里: http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq08.004.htp
pb = pb.scale_simple(thumb_width, thumb_height, gtk.gdk.INTERP_BILINEAR)
thumb_list_model.set_value(thumb_list_model.append(None), 0, pb)
del pb
gc.collect()
隐藏在rsync背后的就是一个rsync算法,记录在rsync原作者Andrew Tridgel的1999年的博士毕业论文 Efficient
Algorithms for Sorting and Synchronization
中,这篇论文共115页,我没有精力看完它,不过关于这个算法的介绍网上比比皆是。
在看介绍之前,我自己想了一下,大概猜测是用hash之类的算法,将文件分块得到的hash传递给对端主机以作比较,然后就可以做增量拷贝,但我很快就否定自己的想法了,比如一个文件的开头被加了一个字符,那么会导致所有的hash比较都不相等,而这种修改又是非常常见的。
迫不及待的看完rsync算法介绍之后,我明白了,原来我的想法和真正的rsync算法可以说已经接近了,但也可以说有天壤之别,问题就在于如何处理我难以解决的那个问题,rsync设置了两个hash算法,一个强一个弱,强hash就是和我想象的hash一样功能(rsync用的是MD4),关键之处在于这个弱hash,它叫做rolling
hash,说的再直白一点就是类似于checksum的算法,可以在文件中以一个固定窗口来快速移动计算。这样以弱hash来做快速滑动比较,以寻找"可能"相同的块,强hash来校验之,问题解决。这样的算法可以对付几乎所有的文件类型的增量拷贝,但我想对某些特殊类型文件,比如压缩文件,可能不那么有效。
看似微不足道的设计成就了这个经典的同步软件 --- rsync.
( 微软的Server 2003中包含的分布式文件系统(DFS)中实现了一个"类似"的RDC协议。)
Subversion的版本标识数是针对整个Repository的,每个文件的版本号实际上是这个文件在Repository的这个版本下的状态。
Subversion的merge其实不是真正的merge,而只是"diff-and-patch",这方面比clearcase差,因此要实现真正的merge操作,你必须牢记"diff-and-patch"原则,比如你想将branch1
merge到trunk上,需要对branch1的base和current做diff,再patch到当前trunk的working
copy。由于Subversion不会记录merge,所以只能在commit时的comment中记录,比如你可能两次merge同一个branch到主干,在第二次merge时,你只有参考第一次merge的comment才知道上次的merge是在哪个版本做的,这样可以从那个版本之后开始做,省去大量的工作。
Subversion的svn move也不是真正的rename,而是copy-and-delete,而且Subversion不会记住新文件的历史来源,这在大部分情况下不会造成问题,但在分支Merge时,某个分支上的move操作可能就会掩盖其它分支上对源文件的修改。
Subversion提供了一个有意思的feature--svn switch,可以高效的在分支间切换,它在本质上和svn
update同义,但svn update仅仅是在同一个路径的不同时间进行diff操作,但svn
switch则在不同路径(分支)的不同时间进行diff操作。由此引申了一个用法,在对主干文件修改后,你忽然意识到应该是在分支上做修改而不应该是主干,你可以使用svn
switch在commit,没有问题。
Tag和branch本质上完全相同,都是svn
copy,唯一的不同是我们"认为"不应该对tag进行commit,如果一旦用户做了commit,那么这个tag就变成了branch。
Subversion repository的备份不是直接的cp这么简单,因为简单的cp命令可能导致一个不一致的备份(假设有多人频繁commit),需要使用svnadmin
hotcopy....
2)创建Repository, create后的参数一定是一个本地的path.
svnadmin create /usr/path/repos
3)import当前目录下所有文件到Repository中, 这里的参数则是一个URL了.
svn import file:///usr/path/repos/ -m "Initial import"
svn可以支持符号连接文件(symbol link),但在windows系统下不支持.
4)checkout一个repos到工作目录
svn co file:///usr/path/repos
5)从repos更新文件
snv update
显示更新的每个文件都有一个字符描述更新类型: A-added, D-deleted, U-updated, C-conflict, G-Merged
6)更改目录结构, 这些命令通常对working copy执行,但也可以对URL执行,对working
copy执行时,生效要等到commit时,而对URL做时,直接生效。
svn add/ svn copy/ svn move/ svn mkdir
7)检查Working copy的修改情况 通常在commit/update前要做的事
svn status
8)对于冲突文件,需要手工解决(修改此文件),然后执行
svn resolved
当然如果不想要自己的修改了,可以用svn revert恢复服务器版本
9)提交修改
svn commit
10)放弃修改
svn revert