2008/2

内核紧急升级

vmsplice(2)惹祸了,爆出了一个安全漏洞,可以很容易提升root权限~!受影响的内核一大片。详细见下面这个bugreport:

https://bugzilla.redhat.com/show_bug.cgi?id=432229

这个bug很快就被修复:

http://lkml.org/lkml/2008/2/10/118

stable维护者今天接连推出3个稳定版升级皆是为了修复这个漏洞,见下:

2.6.24.2
http://lkml.org/lkml/2008/2/11/17

2.6.23.16
http://lkml.org/lkml/2008/2/11/19

2.6.22.18
http://lkml.org/lkml/2008/2/11/27

Fedora似乎也已经推出了新的kernel package,各位Fedora用户请尽快升级。

BTW,在Fedora7上试了试那个expliot,怎么不起作用呢?总是段错误~~

emacs的一些设置

在上一篇博客中提到emacs和gnome-terminal在alt键上的冲突,今天在摆弄发现冲突远不止这个。

最明显的一个就是和scim也有冲突!ctrl+space默认是调出scim输入法,而在emacs里其实是mark(我不想用ctrl+@,因为那要按三个键。;-)。如果在gnome-terminal下面用emacs的话就无法mark了。搜搜了,解决方法是,把mark功能映射到shift+space上,把原来的ctrl+space去了,如下:

(when window-system
(global-unset-key [?C- ])
(global-set-key [?S- ] ‘set-mark-command)
)

还有一个就是,emacs默认(最起码在fc7上如此)要在启动时显示一个启动画面,这样每次都得ctrl+l,不爽,去了它。

(setq inhibit-startup-message t)

让ctrl+y也可以粘贴来自X粘贴板的内容:

(setq x-select-enable-clipboard t)

还没完,gnome-terminal还占用着一些ctrl+*键,比如:ctrl+-,这个虽然也能屏蔽掉,但其它还有一堆。算了算了,我还是换Konsole吧~!

关于Meta键

最近在着手使用emacs,难免要和Meta键打交道。可是遇到一个小冲突。那就是,在FC上,Alt键被设置为Meta,而Alt又偏偏正好是某些窗口菜单的快捷键,比如gnome-terminal。这样问题就来了,如果我在gnome-terminal里使用emacs的话,本来是想使用M-b来移动光标,按Alt+b却调出了gnome-terminal的一个菜单,也就是说这个按键被窗口先于emacs捕捉到了。

简单搜了搜,没有太合适的方法。最理想的一个方法是把Win键映射成Meta,把Alt键上的Meta去掉。修改了一下~/.Xmodmap,倒是把Win键给映射过去了,但Alt仍然会被窗口捕捉到。估计还要修改xterm的配置,未果。最后找到的一个临时解决方法是,在gnome-terminal的“编辑->快捷键”里面把快捷键都禁用掉。反正我是基本上不会用Alt键来调用菜单~

那段C代码

上次提到了一些C语言的题目,留了两个没解决。其中第8个已经被“木天”解释了,我就不赘述了,有兴趣的看那篇文章下面的评论。还有一个,第26个,今天仔细看了看,其实也很简单。

[再链接一次原题:http://www.gowrikumar.com/c/]

具体原理如下:

首先,这个程序的作用是,把从第一个命令行参数传递进来的字符串(必须只含字母)用“点阵”打印出来。它必须至少带一个参数,否则就会崩溃。这大概是这个程序的一个瑕疵吧。

它是怎么做到的呢?很简单,既然是“点阵”,它就肯定要把“字体”存放好,然后读出。“字体”就存放在那个数组里面! 对比输出,和循环中的代码,我们不难发现,这个点阵是6x6的,因为屏幕输出的原因,必须是从上到下先逐行打印,每行必须是从左到右。而每行有多少个点,在哪个位置有点,这些信息都存放在一个数的比特位中!

再来看那个数组,一个数字表示一行,6个数就能存在一个字符的字体。所以这个数组也可以6个一组划分开。需要说明的是,A是从下标6开始的。至于前面的那6个0,主要是起保护作用,防止输入字符超出字母的范围时数组越界。

也是不错的一段代码。Enjoy it!

2008新年快乐!

今天就是大年三十了!

祝各位鼠年快乐!!

在新的一年里“数钱数到手抽筋,睡觉睡到自然醒”! ^_^..

又看了几部电影

快过年了,实在是没心思弄别的东西了,就跟着随便玩玩吧!于是乎,又看了几部电影,简单点评一下。

《凤凰》: 这个是上次看的,忘了写了。应该是一部老电影了,讲述的是一个古老,经典的爱情故事~~

《这个男人来自地球》:公子同学鼎力推荐的,不能不看。确实不错,应该算是科幻电影,虽然没有一个科幻镜头。看了之后觉得,哎,读书人啊,都是认死理,一个观点如果驳不倒它就只能被迫接受。如果你知识足够丰富,丰富到没人能揭穿你,那你就可以去撒一个弥天大谎!片中的情节和某一期《科幻世界》中的一个故事很类似,不同的是后者讲的是一个人也是活了上千年,他会也变老,只是变得很慢很慢,然后当他在进行欺骗时遇到了一个正在使用同样手法的同样的女人……

《耳朵大有福》:范伟演的又一部好电影,相当不错的国产电影!推荐一把。电影讲述的故事太贴近现实了,简直就和真实生活一样。有人评论说是“喜剧的皮包着生活的馅”,太准确了!!

《罪恶之城》:又是一部以暴力为主的电影。老大说俺是不是有暴力倾向了,当然不是了,俺是听了好几个人给俺推荐之后才决定去看这部电影的。这确实是一部好电影!通过血腥和暴力讲述爱!三个故事虽然都是处处暴力,但却又都是围绕着“爱”这个主题讲述,尤其是最后一个故事,很感人!整个电影的格调和《辛德勒名单》一样以黑白为主,仅有一些女人的衣服和一些流血为红色,还有一个恶人是恶心的黄色!对比太显著了!通过这种方式展示的爱有一种极其悲壮的意味……

解答 C Puzzles

今天看到某人列出了几十个C语言迷题,很有意思。顺手做了一下,发现其实大多数都是来自C Faq,Expert C Programming,和网上出现的一些C语言技巧,一些很好,连我自己都被难住了,一些却又狠简单狠基础。除了第8个和第26个需要进一步理解,剩下的我全都作了简单的解答,不明白的请留言提问。

题目在这里:http://www.gowrikumar.com/c/

我的解答如下:

1. 见ECP第29页,一模一样的例子。

2. OS_HP-UX_print这不是一个有效的名字。//blush 一开始我也没注意到!

3. do-while的常识,你应该知道continue到哪里。如果不知道,看看C99第6.8.6.2节。

4. 常见问题,因为stdout是带缓冲的,如果不换行的话,是会有问题的!

5. h会被展开,而g不会。见C-FAQ,Question 11.17。

6. case后面的是字符,不是整数。

7. IA-64是RISC,不能访问未对齐的地址。

8. 感觉没错,但还未发掘出其原理。。。

9. 直接比较浮点数被认为是有害的,说过多次了。

10. 常识。如果很喜欢在初始化时用逗号运算符来标新立异,请加括号!

11. 当然合法!谁还以为printf是void类型?!它返回的是成功输出字符的个数!

12. duff’s device,是用Tom Duff的名字来命名的。很有名的一个东西,用来优化拷贝的,据说和Rob Pike此牛还有点儿关系~!不过注意,原始的duff’s device中的to可是不变的,因为它指向一个映射到内存的寄存器。

13. 正确,逻辑很简单,每次都保留除最低位置的1之外的1,减去1,依次测试。

14. 说过N^2次了,int foo()和int foo(void)是不一样滴!

15. 第二个是把a的内存比特位模式用int来解释。
第一个比较有意思,因为类型不匹配,而且float在被压入压出的过程中会被扩展精度,因为IA-32的浮点数寄存器都是80bits的。所以,float会被扩展成double后再当int处理!!

16. 声明的问题,指针不是数组。

17. switch嘛,当然会跳过第一个case/default之前的东西,所以初始化就被跳过了。

18. 切,形参写得再好数组也得退化啊!

19. format string overflow?!

20. C99 第7.19.6.2节,第5条。

21. buffer overflow

22. sizeof是操作符,编译时决定的,而非运行时。

23. ECP,第25页。

24. 等号优先级高于逗号。

25. 减法和除法错误,减数和被减数反了,除法同理。

26. 蛮牛的一段代码,还没看出其中的奥妙。以后看懂会另行说明。;-)

27. 以0开头是8进制,而最后一个是十进制。

28. scanf返回成功输入的个数。

29. /和*会被当成注释处理,所以那一行实际上是y=y;

30. -也要被输入。

31. &n

32. 加号优先级高于左移。

33. 当然不合法,return不能出现在表达式中。

34. 把for括号里的最后一个i换成n。暂时就想到这一个解法。

35. 显然ptr2不是指针。

36. 错误!因为会被0除!

37. 很明显是8。

38. free的地址不对。

39. 很简单,就是把a[n]换成了n[a],本质上一样。

40. 字符a前面的所有,见C99 7.19.6.2.12。

41. 一个是定义,其余是声明。

42. 取某个成员在其结构体中的偏移。

43. 就是宏的常见错误,比如:SWAP(a++, ++b)。

44. 某个表达式及其对应的值。

45. 参见Python源代码,Objects/intobject.c::int_add。

46. n/x向上圆整!

47. c会被自加两次。

48. 不能一个参数都没有就使用“…”。

49. 用?:三元操作符。;-)

50. 把输出字符的个数存入某个变量中,见过。

51. -_-b

52. %%

53. 后一个指针只读,前一个指针指的东西只读。

54. 前者不能重叠,后者可以。

55. %lf, %f, %g。就记起来这仨。

56. 写过N遍了。。。

57. 厄,看我这个:

include <stdio.h>

int main(void)
{while(printf(“Hello World!”)<0){}}

很美的一段词

人间离魂多

添憔悴

谁记冷香

终只剩两茫茫

释然隔江

既是云鬓染霜

莫为落花断肠

————孤单的分割线————

不知道这段词的作者,在网上搜居然也搜不到任何有用的信息~ !

知道的人请吱一声。