Geek & Joke

今天给自己整了个geek code,如下:

——-BEGIN GEEK CODE BLOCK——-
Version: 3.1
GCS/CC d- s: a— C++ UL++ P+ L+++ E- W++ N++ o? K- w—() !O !M !V
PS+ PE Y+ PGP+ t+ 5? !X R? tv b+++ DI? D+ G e++ h+(—) r z—
———END GEEK CODE BLOCK———

在我的首页上也可以看到,email签名也换成这个了。至于这是什么意思,自己对着官方主页去领悟吧!

另外,看到关于vim的一个笑话,很搞笑,摘录一下。

Q: What to you actually use Vim for?

A: I use vim to pick up women. It sucks.

A: I use women to pick up vim skills.

A: :he sex

A: $ vim ~/.emacs

A: I use vim to remind me why I use Emacs. ;-)

A: feeding the cat, walking the dog, doing the grocery shopping, dry cleaning, climbing mountains, vanquishing demons and sometimes I use it to edit text.

上面的回答都很牛X,尤其是第一个和最后一个。。。

一些信号的处理

SIGKILL和SIGSTOP都是既不能被捕捉,也不能被忽略的,他们是用来给系统管理用的。鉴于此,一般来说用SIGKILL结束一个进程是一个坏主意,因为受害进程将没有时间来做善后工作。所以,你应该优先考虑SIGTERM,然后才是SIGKILL。这也是为什么kill(1)和killall(1)默认发送SIGTERM的原因。同样,这也是关机时init首先发送SIGTERM,然后发送SIGKILL的原因。

一个例外是init进程,它是可以忽略SIGKILL的。僵尸进程也有点儿特别,它们是等待其父进程收养的进程,因此也无法被KILL掉。(想想电视上就知道,僵尸都是杀不死的。^_^)

SIGABRT是中止一个程序,它可以被捕捉,但不能被阻塞。处理函数返回后,所以打开的文件描述符将会被关闭,流也会被flush。程序会结束,有可能的话还会core dump。 当程序调用abort(3)时,该进程会向自己发送SIGABRT信号。所以,SIGABRT一般用于信号中一些关键的处理,assert失败时也会使用它。你不应该去捕捉SIGSEGV和SIGABRT信号,如果收到这种信号,说明进程处于一个不确定的状态,很可能会直接挂起。

No newline at end of file!

初学gcc的人通常会遇到这种警告:

$ echo -n -e “t” | gcc -xc -E -

1 “<stdin>”

1 “<built-in>”

1 “<command line>”

1 “<stdin>”

<stdin>:1:2: warning: no newline at end of file

一些聪明的人很快就可以修复这个警告,在文件结尾回车一下就行了。可以很少会有人去仔细探究,为什么gcc会给出这么一个警告?

原因其实也很简单,因为标准规定如此。C99第5.1.1.2节这样写道:

Each instance of a backslash character () immediately
followed by a new-line character is deleted, splicing
physical source lines to form logical source lines.
Only the last backslash on any physical source line
shall be eligible for being part of such a splice. A
source file that is not empty shall end in a new-line
character, which shall not be immediately preceded by
a backslash character before any such splicing takes
place.
C99 Rationale中进一步指出:
A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a backslash/newline sequence.
这么规定的初衷有两个:一是为了每一行都要以换行结束。二是,因为行尾的表示连接下一行,如果一个文件最后一行行尾有,那么,紧跟它也被包含进来的下一个源文件的第一行就会被连接!而如果一个文件以一个空行结束就会避免这种情况的发生。

我为什么要表扬深信服

第一次听说深信服这个公司还是从董溥同学那里。他说这个公司的笔试题一向很难,问我愿不愿意去试试。既然说难,咱当然是要迎难而上了,去试试。;-) 去了做了笔试题,也不是很难,都是C/C++和Unix上很基础的东西。我还趁机提前半个多小时交了卷子。这是后话。

如果这个公司仅仅这样的话,是不会值得我在这里表扬,我甚至也不会给他们发送简历(我是霸王笔)。后来听董溥一再说起,这个公司更牛B的地方是其独特的口号:

没过四级、N门挂科、文科专业,甚至您拿不到毕业证怎么办? 没关系,只要您技术够牛,我们要。
我虽然一直是中国教育的强烈批评者,可看到这个口号时还是让我着实惊讶了一下。在我印象中,能喊出这个口号的公司深信服是第一个!在现在这个社会,到处充斥着学历歧视,专业歧视,学校歧视,甚至考试成绩歧视,四六级歧视,某些脑子严重进水的公司甚至将此发挥到淋漓尽致的地步!这种公司让我看一眼都我觉得是浪费!

哥们,我们都是中国大学里出来的,里面什么熊样我们都清楚!四六级我都过了,可我知道这种考试是多么地没用!奖学金我年年拿,可我深知期末考试是多么地无聊+简单+不可信!我拿毕业证也只是时间的问题,可我知道拿这种学历是多么地容易,是个人就能拿!不是人的出大钱也照样能拿!!

你丫清华出来的就牛B了?如果一个只有高中文凭的和一个清华毕业的有同样的能力,我会毫不犹豫地选择前者!原因很简单,你是清华的,你比别人强是应该的,而且强得少了都不算强!谁叫你们清华整天吹得那么牛B呢!如果你和一个没上过大学的一样,那只能说明人家比你强!而且强很多!

毫不过分地说,任何一个公司都应该把利益最大化放第一位。如果一个人能给公司带来更大的利益,有什么理由非得再看一下人家的学历呢!能力和实力摆那里,就算他没上过学又如何呢?!这么简单的道理,很多公司的HR们都不懂,而这些人据说还是从名校毕业的呢!我看八成还是为了回去给别人吹嘘:看,我这次又招了N个xx学校的博士!多有面子!这么装B何必呢!

无论如何,深信服这样的做法都很值得赞赏。我坚信他们能招到更多的真正的人才,衷心祝愿这个公司越办越大,一路走好!

见到了Herbert Xu!

前几天突然接到Bryan Wu发来的email,说Herbert Xu要到西安了,问能否安排见个面。当时看了感到很惊讶,虽然早就听说Herbert要来中国,可没想到他已经到了,更没想到他还会来西安!前一篇文章中已经提到久仰Herbert大名,能见到其人那真是再好不过了。真是一个巨大的惊喜!

Herbert上周周末就到西安了,和他在电话中约定好定于这周二来我们学校给我们做个讲座,Herbert很爽快地就答应了。如约今天请他到我们学校这边过来,下午提前去了实验室。没想到Herbert到了之后才给我打电话,还让他因此在学校门口等了好一会儿。因为在Kernel Summit 2007的合影上见过Herbert,所以能一眼认出他来。;) 见到Herbert的第一感觉就是,比照片上还要年轻!

把Herbert带到我们小组的实验室,和我们大家围坐在一起聊了起来。Herbert其实很健谈的,问他的问题他都能够详细解答,而且还能展开话题。一谈起TCP/IP来他就滔滔不绝,听他这么一说我就感觉自己的计算机网络就相当于没学过!-_-!谈话中,Herbert谈到了他丰富的工作经历,他说他在做kernel之前还做过卫星网络,写过IPSec……

不知不觉中,时间就过去了。快到4:30时就带Herbert去教室。到了那一看,整个教室坐满了人,其中还有一些大一的年轻人。我们稍作准备就开始了讲座。我简单介绍了Herbert之后,Herbert就正式开始讲了。这时我才注意到,Herbert特意把外套脱了,想给大家看一下他参加内核峰会时的T-shirt,以此激励更多同学参加Linux内核开发。这么冷的天,还能这么心细地照顾大家,真的很佩服他!

在下面一个多小时的时间里,Herbert向我们详细讲述了内核开发的历史,内核社区的运作,和他自己的一些经验。这虽然是Herbert第一次用中文做讲座(后来听他说的),但讲得确实非常精彩!讲座生动而且平易近人,一些专业术语解释得很清楚,其中还不乏一些有趣的比喻,老师和学生都很称赞!陈老师还夸他讲课水平不低于大学里的老师。

Herbert的讲座给我的最大收获有两个:一是,要多做一些发行版开发的工作,Herbert自己就是这么走过来的,这话分量自然不轻。好好记一笔。二是,做开发,不仅仅是内核开发,最关键的还是多读代码,读不同人的代码,读得多了自然就会对这种庞大的项目得心应手。调试程序也就不用依赖gdb这样的工具,只用printf就够了。他现在调试程序,包括内核,就靠backtrace信息和额外打印的一些变量值就足够了!如果你做不到这一点,那只能说明你对代码还是不熟悉,继续读代码吧!这是Herbert的亲身经验,一定要学习!

Herbert讲完后我还趁机提两个问题,一是问他如何处理这么多邮件,二是问他如何管理patch。原来他和我一样是用mutt。不过说到管理patch时,Herbert说他维护的crypt子系统patch比较少,基本上都人工解决可能的冲突,用git就足够了。这也说明了另一点,牛人们都追求简单,有些复杂问题是我们把它想得更复杂了!其实很简单的处理就足够了。

讲座完后我们还邀请Herbert一起吃饭。和他聊天时发现,Herbert不仅在内核开发方面经验丰富,而且对世界历史,中国历史,数学等知识也很有见解,谈到中国政治时他比我们这些土生土长的中国人知道得还多!崩溃……他知识太渊博了!佩服佩服!Orz

牛人之言不我欺!与牛人一席话,胜读十年书。;)

明天就能见到Herbert Xu了!

呵呵,传说中的牛人,以前都是在网上听说其大名的,记得第一次去Herbert Xu的主页还是在加入内核邮件列表之前,那时就已经很佩服他了。他对Debian作出了很大的贡献。进了内核邮件列表之后,对Herbert Xu的工作有了更多的了解。他是一个资深的内核开发者,是网络领域我所知道最厉害的华人了。他负责维护Linux内核的Crypto API部分,他维护的git tree是:

http://www.kernel.org/git/?p=linux/kernel/git/herbert/cryptodev-2.6.git;a=summary

Herbert Xu应该是Kernel Summit的常客,今年的亮相可以在这里看到:

http://lwn.net/Articles/248891/

更让我们佩服的是Herbert Xu还是一个很爱国人,当他听说Debian里要设定台湾为Taiwan,而不是原定的Taiwan, Province of China时,他就愤然离开了自己工作已久的Debian社区。下午在和我们系主任聊时,他也对此颇加赞扬!恩,牛人这一点也值得我们好好学习!

啥都不说,就得着明天一睹牛人风采了~!

虚拟机啊,虚拟机~!

前一段时间不怎么走运,配了两个虚拟机都没配好,相当郁闷。

这两天否极泰来。Qemu在Fengguang Wu的指点下终于又跑起来了,原因还是配置内核时一些选项没有设置成y,郁闷。相当不容易啊,这次说什么不能不备份了,也顺便上传到网站上一份,可以在<-这里->看到。顺便说一句,FC7自带的虚拟机管理器不错,不过调试内核还是不能用它。没事玩儿的时候用用不错。而且FC7把Xen也给集成了,很强悍,可惜我还不知道怎么用它……

另一个虚拟机是UML,可能有不少人还不知道它,它其实是在用户空间的运行的Linux,把Linux内核放到一个用户空间进程里来跑。这两天看它的源代码时发现,其实它的中断什么的全都是用用户空间的东西模拟出来的。UML其实不需要多麻烦的配置,关键是我正好赶上UML子系统出问题(我用的是非稳定版内核),去UML用户邮件列表上发了N个邮件问Jeff,然后加了三四个patch之后,UML才总算运行起来。使用当前Linu-tree的同学可以试一下Jeff和Al的补丁[1],以及Al的另一个补丁[2],加这三个patch之后UML就可以顺利运行了。

UML其实挺好用的,而且编译迅速,以后就准备用它来测试内核了。现在一个很关键的问题是,虚拟机和主机之间的通信问题。Qemu以前弄好过,可现在又不是怎么弄了。UML还没有思路。看来又得折腾一阵子了……

[1] http://marc.info/?l=linux-kernel&m=119332492222601&q=raw

[2] http://lkml.org/lkml/2007/10/27/253

也许(汪国真)

也许,永远没有那一天
前程如朝霞般绚烂
也许,永远没有那一天
成功如灯火般辉煌
也许,只能是这样
攀援却达不到峰顶
也许,只能是这样
奔流却掀不起波浪

也许,我们能给予你的
只有一颗
饱经沧桑的心
和满脸风霜

Plan For Next

The best way to predict the future is to invent it.

  • Alan Kay
    虽然最近已经被找工作已经弄得够烦了,可也要坚持继续学习,坚持“两手抓两手都要硬”的原则。^_^…

先给自己制定一个Todo-List,以免失去大的方向。

1. 接管hubackup,在它的基础上进一步完善,争取做成Gnome下最好的备份工具。

2. 修复UML中的几个bug,刚发现的,其中一个还不知道如何补。这完成后准备用UML搭建调试环境。

3. 做一个实际的内核项目——SwapoutClustering,足以当毕业设计了,paper还也可以乘机发一把。;-)

4. 继续目前参与的开源项目,并着手准备参与valgrind,haiku,pcc这三个我很看好的项目。

5. (远期计划)自己写一个可以跑的内核。(以前写过一个残废的)

6. (远期计划)自己写一个可以用的C编译器。

7. (更远期计划)自己设计一门编程语言,并写出其编译器。

最后三个近期可不做详细考虑。

Cheers!