2010/2

archlinux 编译安装内核

一离开 Red Hat 的开发环境很多东西都不顺手,编译安装内核就是一个例子。在 Fedora/RHEL 上,直接 make install 就什么都装好了,到了 archlinux 下可就不行了,它上面没有 /sbin/installkernel 不说,制作 initrd 工具也不一样,内核 config 放置不一样,就连内核版本号命名方式也不一样。所以就得自己写脚本来搞定了。

首先,你要把 CONFIG_LOCALVERSION 和 CONFIG_LOCALVERSION_AUTO 关了,前者是加自己的版本标识,后者是使用 git 来决定当前编译内核的版本号,所以说你会得到类似 2.6.33-rc7-ARCH-00010-g6339204-dirty 的东东,很烦人,直接关掉。

然后就是内核 config 文件的放置,Fedora 上都是单独放到 /boot 下,而 archlinux 是编译进内核的,也就是说在 /proc/config.gz 里,是通过 CONFIG_IKCONFIG_PROC 来控制的。我觉得放置在哪没多大关系,咱又不差内存。;)

好了,下面就是脚本了,它可以帮你完成安装内核这个最后的步骤,有点像 installkernel。但你必须在内核源代码根目录下运行,而且假设你执行完了 make modules_install 这一步,当然了,假设你使用的是 grub。

有兴趣的同学可以把它改成 installkernel 一样的接口,这样就可以直接 make install 了。

[bash]

!/bin/bash

#

1. This must be run in the top kernel source directory.

2. Assume you already install the modules.

version=make kernelversion
cp System.map /boot/System.map.${version}

Maybe only works on x86

cp arch/uname -m/boot/bzImage /boot/vmlinuz-${version}
mkinitcpio -k “${version}” -c /etc/mkinitcpio.conf -g /boot/kernel.${version}.img

kernel_args=cat /proc/cmdline
root_device=awk '/^root/ { print $2; exit; }' /boot/grub/menu.lst
if ! grep -q “Test Kernel ${version}” /boot/grub/menu.lst
then
cat >> /boot/grub/menu.lst <<eof

title Test Kernel ${version}
root ${root_device}
kernel /boot/vmlinuz-${version} ${kernel_args}
initrd /boot/kernel.${version}.img
EOF
fi
[/bash]

Integer format conversion

我们知道 C99 中引入了uint32_t,uintmax_t 这样的标准整数类型,可有一个随之而来的问题,那就是它们在 printf()/scanf() 中对应的是 format conversion 该用什么呢?

其实这个问题由来已久,比如之前就有的标准类型:ptrdiff_t,printf()有专门的一个 “t” length modifier 来对应它。再比如非标准的 pid_t,我们是没有对应的 length modifier 可用的,这时该怎么办?其实这种问题的一般处理原则是,先把它们转化成可能的最大整数类型,比如这个 pid_t,POSIX 只要求它是一个 signed integer type,所以至少转化成 long 才比较安全,所以我们可以:

printf(“%ldn”, (long)pid);

所以我们最开始的那个问题也可以这么处理,但是很明显这种处理方式并不优雅,尤其是对于标准整数类型来说。一种解决方案是像 ptrdiff_t 那样引入新的 length modifier,但这恐怕需要增加不少,所以C99采取了另一种方式——添加标准的宏来代替直接使用字符串,比如针对 uint32_t,uintmax_t 我们可以使用 PRIu32 和 PRIuMAX,像这样:

printf(“%” PRIu32 “%” PRIuMAX “n”, uint32, uintmax);

这些宏可以在 C99 标准附录 B.7 找到,可以在 <inttypes.h> 中看到其定义(在 glibc 源代码中对应 sysdeps/generic/inttypes.h)。有兴趣的可以直接去看一下源代码,其实就是对已有的 format conversion 进行的宏封装。

那些宏也挺好记的:PRI 代表 printf,SCN 代表 scanf,PRI/SCN后面的第一个字母其实就是对应的常见的 conversion specifier,比如 uint32_t 肯定对应一个u。再后面要么对应长度比如uint32_t中的32,要么对应max什么的。

最后,对于 intmax_t 和 uintmax_t 这两个类型,printf()有对对应的 “j” length modifier 可以直接用,对于 size_t 和 ssize_t ,有对应的 “z”。

dogtail

fedora 那边一哥们在搞自动化测试的东西,今天过去看了看,发现这哥们在用一个叫 dogtail 的东西,一个 Python 模块,很酷的一个东东。看来我再一次 out 了,头一次听说这玩意儿。

这玩意儿说白了其实就是图形界面程序的自动化测试工具。我们知道图形化的程序很难自动化的,它不像命令行的程序,写个脚本就搞定了。根本原因在于,点击鼠标和敲击键盘得由人来完成。这玩意儿的目的就是代替人来完成这些功能,比如点击鼠标按某个按钮。我在前一个公司时见过一个同事搞这种测试,不过他是在 M$ 平台上测的,我一直以为 Linux 上面没这个替代品。今天看来我错了,Linux 不光有,而且还有 Python 模块。

它不光可以代替人输入,也可以输出,比如说你想读某个应用程序比如 firefox 文本框里面的文字,你也可以用它。如此一来,图形界面在很大程度上就和命令行界面变得一样“程序员友好”(相对于“用户友好”一词)了,你可以 grep 它的输出,你可以用脚本来对它进行输入。

如果你看一下它的用法,你会发现如果单单是只有接口,它也是很难用的,因为我感觉它其实是对图形程序的“元数据”(其实是叫AT-SPI objects)进行读取,在图形接口层上,所以接口很面向图形界面,除非是天天搞图形界面的开发者,其他开发者很难一下子搞清楚这些东西。但是它还提供了一个很牛的 sniff 工具,通过它你可以对已有的图形程序的“元数据”有一个很直观的浏览,你想读哪一个程序的哪一部分数据很容易找到。所以配合着 sniff,这个东西就相当好用了。

这个项目也是red hat的,其主页在 fedorahosted.org 上,也有文档示例。Red Hat Magazine 上也有一个系列来介绍它:

Automated GUI testing with Dogtail
Dogtail’s Python Modules (and how to use them)
Dogtail’s object oriented tree API (and how to use it)

贵国互联网亚克西(参赛作品)

为参加韩寒的亚克西填词大赛,小生特作词一首。本词乃原创,如有巧合,纯属雷同!

哥玩的不是词,是押韵。。。

—————————-亚克西的分割线—————————-

小屁民我今天心欢喜
高高兴兴把网上
谁知道那网站
有一半都已被屏蔽

什么亚克西
什么亚克西呀
派对的政策亚克西

连接被重置了
服务器找不到
youtube来,facebook哟
究竟是什么惹了你

什么亚克西
什么亚克西呀
派对的政策亚克西

这边有绿坝娘
那边有防火墙
动不动你们还封机房
到底是什么让你这么急

什么亚克西
什么亚克西呀
派对的政策亚克西

京字备来国字号
什么网站也逃不掉
预祝贵国大局域网
早日落成创奇迹

什么亚克西
什么亚克西呀
派对的政策亚克西

贵国互联网真开放
网上都是五毛党
就你们国情最特殊
天天强烈愤慨真生气

什么亚克西
什么亚克西呀
派对的政策亚克西

09年总结,10年计划

去年的总结还记忆犹新,今天又要写年终总结了,唉,一年又这么过去了……

首先,对照去年的计划看看哪些实现了,哪些还没有完成,如下:

>1. 找到一份新工作;

完成。在 Red Hat 做内核开发工作,对我来说这是在世界上所有开源软件公司能找到的最好的工作之一。入职近10个月以来学到了很多东西,而且工作轻松,从来不加班。(“从来不加班”居然都可以作为广告似得来炫耀,国内挨踢公司的杯具!)

>2. 找一个女朋友;

果然如当初预计,没完成。。。来年继续努力吧。谁让咱做挨踢呢,这种事对挨踢宅男来说就是整个一杯具!!内牛满面……

>3. 如果2太难实现,可考虑:认识更多的新朋友;

这个还是比较容易实现的。北京人多,所以出去参加活动什么的认识的人自然也多。非常喜欢北京那些搞户外的组织,活动氛围非常好,来年继续活动!

>4. 到更多的地方去旅游;

出色完成!:-) 今年去了美丽的云南,四川,还去了东三省,体会到了真正的寒冷。北京周边就更不用说了,逛过的地方很多了。其实按理来说来年应该计划去西藏,但是考虑到计划去葡萄牙了已经,所以去西藏的计划只好搁置到后年。

>5. 如果因为种种原因4没完成,那么一定要完成这个:学到更多的知识(不可仅限计算机);

完成一半。计算机专业知识确实学到很多,但其它的就太少了,关键是没时间看那些业余书籍,感觉学的知识越来越窄了……

>6. 如果上述目标都tmd完不成,至少至少,一定要完成这个:高高兴兴地生活。

这个完成得也可以。生活越来越简单了,不想追求太多虚荣的东西,没用!有时候能和朋友们一起吃个饭,喝喝酒,这就已经很高兴了。做好本职工作,做自己喜欢的事情,该吃就吃,该睡就睡!

综上,除了有一个半没有完成外,其余目标均实现,75分。这一年过得还算不错。所以10年的目标就已经很清楚了:

1. 找到一个女朋友,感叹号!愿春哥保佑啊!

2. 做好自己现在的工作,学到更多的东西。

3. 写的书希望可以圆满完成并出版。

4. 认识更多的人,结识更多的朋友。

5. 希望7月份可以回葡萄牙一趟;如果条件允许,还准备去山西,河南,甘肃,内蒙古等地旅旅游。

6. 学到更多的非专业知识;了解更多的“好想法”。

7. 想买一个单反,学学摄影知识;想买把吉他,重新学一下弹吉他(此条非必须)。哼,等咱吉他学好了,咱也去天桥上摆个摊儿弹……挨踢男青年中的文艺青年——男青年中的好青年!!

好了,就这些吧。最后祝各位虎年快乐,愿来年不再是茶几(摆满了杯具),不再是牙缸(本身是杯具却装满了洗具),而是浴缸(大洗具)!

有一种乐观让人感动不已

偶然从朋友那看到这部电影,本是想打发一下时间的,没想到这真是一部好电影。

片中的男主角是一个非常乐观开朗的人,从头到尾他几乎一直在笑着,甚至在最后被纳粹枪决前也是。正是因为这种乐观的态度,才使得他运气非常好,才让他追到了女主角。不仅如此,他的乐观也挽救了他的儿子,让孩子在集中营里不仅毫发无损,甚至过得还很快乐。到最后孩子看到盟军的坦克开进集中营时,孩子开心的笑容让我深深地感动……这是一部让我们在笑声中感动得落泪的电影!

不知道你有没有遇到过,总有那么一种人,像片中的男主人公一样,他们永远都是那么乐观,好像他们从来没有伤心过,没有烦恼过似的。我最喜欢这种人,因为只要和他们在一起,你也会不知不觉地受到影响,再不高兴的事有时也会忘得一干二净。哦,我发现原来乐观也是会传染的!我在葡萄牙时,有一个叫 Marco 的同事就是这样的人,每天你都会看到他乐乐呵呵的,不光从不发脾气,而且也从不沮丧,低落,你沉默时他还会故意挑起话题让你说话,你不开心时他会故意逗你开心。仿佛天底下根本就没有什么悲伤的事情!和这样的人在一起真是一件幸福的事儿!

受他的影响,我也尝试去做那样的人,不仅要让自己开心,也要让别人开心。这不仅是一种心态,更是一种能力。不光把快乐带给自己,也带给周围的人,这样快乐就可以一直传下去。是的,生活没必要那么严肃认真!它可以很美好。用影片中的话说是,“生活不完美,所以它才很美!”

在乐观的人眼里,整个世界都是美好的……

洗洗更健康

宣传的功能不在于对个体进行科学训练……宣传的全部艺术在于巧妙地把群众的注意力吸引到某些事实、某些做法、某些需求上面来,……不是要去教育那些渴望教育和知识的人,宣传的功效必须大部分瞄着情绪,而只在很小的程度上瞄着所谓的智力。……因此,它试图达到的群众越广大,它的纯智性水平就将必须调得越低。……智性内涵越少,宣传就越有效。宣传的成效可不在于成功地取悦于少数学者和爱美青年。……像科学教育那样从多方面来考虑看待问题,对宣传来说是个错误。广大群众的感受性是非常有限的,他们的智力是很低的,而他们的忘性却很大。……宣传的任务可不是对真理进行客观的研究。

—— 希特勒
希特勒曾对心腹戈培尔这样说:
不需要让青少年有判断力和批判力。只要给他们汽车、摩托车、美丽的明星、刺激的音乐、流行的服饰,以及对同伴的竞争意识就行了。剥夺青少年的思考力,根植他们服从指导者命令的服从心才是上策。让他们对批判国家、社会和指导者抱持着一种动物般原始的憎恶。让他们深信那是少数派和异端者的罪恶。让他们都有同样的想法。让他们认为想法和大家不同的人就是国家的敌人。
—————————————-脑炎洁分割线—————————————-

1. 请某些人不要自觉对号入座!尤其是一小撮不明真相的群众。

2. 阿道夫同学一下子就道出了洗脑的科学依据,还有这个地球上好几个国家的最高机密……厉害!