2011/1

继续在红帽工作

前两天和我美国的经理通了一次电话聊了聊我的情况和想法,她想让我继续在红帽工作,而我不想留在北京。经过评估之后,她决定让我远程办公,这下可以放心离开北京了。:-)

我们部门的这个经理是个华人,但不懂汉语。她绝对是整个红帽公司最忙碌的人之一,有时我甚至觉得“之一”也不用加。她手下管理一批内核牛人,比如耳熟能详的David Miller大牛。有人说,管理程序员就像是在放养一群猫,可见她的工作也不轻松。

当初我来红帽的时候就是她面试我,于是我就成了红帽北京这边第一个做内核开发的了。所以,她对我的赏识和信任我感激不尽,绝对不是别的公司给我开出几倍的工资能换得来的,这也是我为什么一直留在红帽工作的原因之一。

在红帽北京这边工作,工资不算高,尤其是和Google这种公司比,但是工作环境很宽松。每天没有固定上下班时间,早来早走,晚来晚走,有个同事还经常吃完午饭才来上班。虽然说是每天要上够八个小时,但绝对没有什么打卡之类的东西监督你,全靠自觉。平时有事还可以在家办公,所以有的同事没干净的裤子穿了在家办公我们见怪不怪了。

这里每人每年都有15天年假,比起国外来不多,但比起国内的很多公司来不少。调休就不用说了,看我就知道,每次都是眼花缭乱。开放和自由是红帽在社区一直倡导的,其实在公司内部也大抵如此,从上面你也看得出来。这是我为什么一直留在红帽工作的原因之二。

我写这些东西不是恭维,即使是我要离职我也会这么写,因为事实就是如此。写这些也是为了让那些觉得红帽公司很神秘的人有进一步的了解,免得每次见我都要反复问。;-)

如果一切顺利的话,我会于2月19号离开北京。再见,北京!

LINUX_REBOOT_MAGIC

include/linux/reboot.h 中有五个魔数:

define LINUX_REBOOT_MAGIC1 0xfee1dead

define LINUX_REBOOT_MAGIC2 672274793

define LINUX_REBOOT_MAGIC2A 85072278

define LINUX_REBOOT_MAGIC2B 369367448

define LINUX_REBOOT_MAGIC2C 537993216

第一个的意思很了然,是feel dead的hex表示,类似于0xdeadbeef。

而后面四个就有意思了,今天在公司的邮件列表上看到一个讨论说这些其实是Linus和他女儿的生日。猛一看看不懂,这么一看就了然了:

% awk ‘/MAGIC2/ {printf “%Xn”,$3}’ include/linux/reboot.h
28121969
5121996
16041998
20112000

计时运行命令

见过好几个人问怎样可以计时运行某一个命令?比如我可能想运行某个交互式的命令(像fdisk),但我又不想让它一直永远等待输入,我就得给它指定一个时间,若没有输入则自动退出。

我之前也遇到过这个问题,当时找到的是timed-run。而最近我发现coreutils里面已经默默包含了一个等价的命令——timeout。

timed-run来自expect包,很明显是用expect脚本写的:

% cat /usr/bin/timed-run
#!/bin/sh
# 
exec expect -f "$0" ${1+"$@"}
# run a program for a given amount of time
# i.e. time 20 long_running_program

set timeout [lindex $argv 0]
eval spawn [lrange $argv 1 end]
expect

而timeout则来自coreutils,应该是用C写的。它们的用法都一样,后面第一个参数是指定的时间,在后面就是要运行的命令,比如:timeout 1 sleep 10。timeout还能接受一些选项,更强大一些。

有舍才有得

前一篇文章下面的留言我都看了,很感动,谢谢你们的关心和理解!

这些天也收到好些邮件,接到好几个电话,上网也有很多朋友和我聊天,收到了来自湖南长沙、四川成都、广东深圳、海南三亚的朋友的邀请,都说,你来吧,有你吃的也有你住的!也有上海和杭州的朋友给我介绍工作的。你们对我的好我都一一记得,有机会也一定要当面感谢!我想去的那个地方允许我暂时保密,等我到了那里你们自然就会知道了。:-)

这两天也和公司里我的两个经理聊了聊,他们都问我以后有什么打算。我说要是有机会肯定还是会找和Linux相关的工作,这是毋庸置疑的,但是找不到我也不担心,总会有别的工作我会喜欢,或者干脆就当一个自由职业者。以后挣得钱或许会少了,但是我本来就要求不多,能够我自己花的,还能给父母寄一些,对我来说就已经足够了。

你要是问我会不会放弃现在做的这些?当然不会。我很喜欢我现在做的东西,引以为豪,它们已经是我生活中的一部分了。而且这些东西都是开源的,并不会因为我的正式工作是什么而有太大的改变。

我觉得,既然我决定离开北京去寻找一种更好的生活,那么我同时也必须放弃些什么,有所舍才能有所得。这很公平,不是吗?所以我从不担心失去工作会怎么样,因为“上帝为你关上一扇窗时,就会为你开启另一扇窗。”离开北京未尝不是一种机会,一种希望。那首歌里唱得好:“之所以活得洒脱是因为懂得取舍!之所以淡漠是把一切都看破!”

我很喜欢ogmw的那句留言:

内心强大,坚定并且总能保持平静的人是美的,因为犹豫不定,懦弱而产生欺骗,躲闪,那样的人和事都很丑。
(请问这句话是吴虹飞说的吗?^_^)

我还要加上《恋爱的犀牛》里面那句:“上天会厚待那些勇敢的、坚强的、多情的人。

别的不敢说,做人方面咱绝对是很优秀的,说到做到,敢做敢当,从不亏欠别人什么。那些懦弱的,虚伪的人和咱一比,很丑,真的!

不过了!!!

考虑了很久,我决定要离开北京了。

这些日子憋了一肚子的委屈,都是生活上的事儿,付出那么多换来的只有误解和伤害。这些日子里见识了人的各种虚伪、狡猾、背信弃义,真是大开眼界。压抑了太久,我真的受够了,不过了!

来北京快两年了,在这里认识了很多的朋友,谢谢你们陪我度过这些日子。北京这种地方确实不适合生活,空气污染不说,四万一平不说,严重的物质化和城市化让我感到窒息,在这种环境里很容易迷失自己,所以我决定要走,去西部、去南方、去国外……去任何我想去的地方!世界之大,还能没有我一个容身之处?

给爸妈打了个电话,说我要离开北京,他们没有任何反对,只问了我为什么、怎么了,说心情不好就回家。在大街上我强忍住没哭出来。我知道,就算整个世界与我为敌他们也会站在我这边。对不起,儿子不孝,实在是不得以而为之!

给几个朋友打电话,说我要是没工作了去你那讨口饭吃给不给?都说没问题,看来这些人还是比较靠谱的!

我决定了,过完年回来就把工作上的事儿交接好之后就走,去南方的某个心仪已久小城市,先放松一下心情,然后或许再找一份工作,或许去探索另一种新的生活方式。

我只是像梵高那样渴望生活!

分享一些 shell 函数和 alias

省略掉公司内部用的一些东西。其中的calc()和isdigit()是从网上抄来的。:-) 希望对你有用。

[bash]
alias gts=”git send-email —cc-cmd=’./scripts/get_maintainer.pl —norolestats’ —to linux-kernel@vger.kernel.org —smtp-server XXXX”
alias v=”vim -O”
alias e=”emacs -q -nw”
alias wpas=”wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -B”
alias mutt=”LC_ALL=zh_CN.UTF-8 mutt”
alias wget=”wget —no-check-certificate”

function calc () { awk “BEGIN{ print $* }” ;}

function isdigit ()
{
[ $# -eq 1 ] || return 1;

case $1 in
[!0-9]|””) return 1;;
*) return 0;;
esac
}

function errno ()
{
if [ “$#” -eq 0 ]
then
echo “Usage: errno [ERRNO | N]”
return 1
fi
pattern=$1
if isdigit “$pattern”
then
msg=”$(awk ‘$3~// {print $0}’ /usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h)”
else
msg=”$(awk ‘$2~// {print $0}’ /usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h)”
fi

if [ -z "$msg" ]
then
    echo "BAD ERRNO!"
else
    echo "$(echo "$msg" | sed -e 's#.*/* (.*) */#1#g')"
fi

}

function kcgrep ()
{
local dest
local str
if [ -z $2 ]
then
dest=”.”
else
dest=”$2”
fi
str=$(echo “$1” | sed -e ‘s/^CONFIG_//‘)
find “$dest” -iname ‘kconfig*’ -exec grep “$str” -nwH ‘{}’ ;
}
[/bash]

从 grep 的用法说起

我本不想写这篇文章,首先我觉得这些东西大家肯定都知道,其次就算真不知道还有手册。

直到那天面试的时候我碰到一个哥们,我问他grep你都知道哪些选项?他告诉我,只有-r。我当时就乐了,既然grep是你常用的命令,你凭什么只知道-r?他回答说,他只想把精力放到内核上,没有时间来学习这些东西。我笑,正是因为你没有时间,所以你才应该提高你的工作效率,而熟悉命令行显然是Linux上一种提高工作效率的方式。有句老话说得好:“磨刀不误砍柴功。”

有的同学可能觉得我在提倡死记硬背了,事实上我比你更反对中国教育的那种死记硬背。我的观点很简单:既然你用得多,那么有些东西,比如grep的一些选项,自然而然就应该记住了,无须刻意去背。

所以,我在这里以grep为例来展示一下。注意,以下内容没有参考一眼grep的手册。

grep最常用的选项可能是-i,-n和-r了,至少于我如此。-i是忽略大小写,-n可以告诉你找到的东西在文件的哪一行。-r或者-R(看你愿不愿意多按个shift键了),可以去递归一个目录。

-A和-B,你可能就用的比较少了,前者制定显示匹配到的那一行之后的几行,后者指定之前的,比如grep -A 3 -B 4就是说也要显示匹配到的那一行之前的4行和之后的3行,可见A是After,B是Before。用得着刻意去记嘛?显然不用。

-I(大写i)可能用得就更不多了,可惜啊,它非常有用。比如你编译出的内核二进制和你的源代码在同一个目录时,你grep一些字符串的时候会发现一些.o文件中也可以找到,很明显它不是我们想要的,这时候-I就派上用场啦!它告诉grep去忽略二进制文件。

这让我想到了另一个—exclude(我记得似乎没有短选项与之对应),顾名思义,它是用来排除一些文件。比如你编译的内核目录下还有.cmd这种文件的话,它不是二进制,所以-I排除不掉,这时候你就可以用—exclude “.cmd”了。

-H,这个用得更少了,你一般不会需要它,因为grep默认就会输出文件名。然而,当grep与find联手的时候就不会了(至于为什么,留给你作为课后作业),这时候你就要用到-H了。比如,我在内核源代码目录下查找CONFIG_DEBUG_KMEMLEAK定义在哪,我通常这么做:find . -iname ‘kconfig*’ -exec grep -Hwn DEBUG_KMEMLEAK ‘{}’ ;

我上面用到了另一个选项-w,看见了嘛?它可能是另外一个被严重忽视了的选项,仅次于-I啊!它的意思是告诉grep我所查找的是一个完整的单词,也就是说,当你找DEBUG_KMEMLEAK的时候它不会给你找出DEBUG_KMEMLEAK_EARLY_LOG_SIZE,你懂的。这可以省去你手工去加b了。

噢,我差点儿忘了亲爱的-e,多数情况下你也不需要它,因为grep后面接的就是一个regrex嘛!-e神马时候派上用场呢?我建议你在这里仔细想想,一个很特殊的情况——我要搜索的字符串以”-“开头时!比如我要搜索”-wangcong”这个字符串,直接grep “-wangcong”显然是不行滴!grep会认为那是”-w -a -n -g -c -o -n -g”,无论你怎么加引号!一种解决方法是加反斜线,而另一种方法就是-e “-wangcong”了。顺便说一句,使用多次-e就相当于进行一个“或”操作,所以grep “vmx|svm”就等价于grep -e vmx -e svm。

-o我估计用的人也不多,它的意思是只输出匹配到的东西,同一行的其它东西不输出。例如,我想搜索printk.c中全部的C语言字符串时,我会这么做:grep -o ‘“.*”‘ kernel/printk.c,有点儿类似于strings kernel/printk.o。

-b,知道这个人的灰常少了吧?如果你知道,恭喜你晋级grep高手级别了!我承认我只用过它一次,是在一个脚本中,我想知道某个“字符串”出现在文件的第几个字节。我印象中这里是有bug的,因为我当时总得不到正确的结果,当然也有可能是我理解不对,没看手册而且没有再次实验,所以这个问题就留给你了。:-)

-q嘛,大家都知道,脚本中常用。

-c嘛,比如统计CPU个数:grep -c ‘^processor’ /proc/cpuinfo,实在没必要多一个管道去 grep ‘^processor’ /proc/cpuinfo | wc -l。

好了,我就想起来这么多了,欢迎补充。我觉得一个好的Linux程序员应该对他/她敲出的每一行命令的每一个选项都精益求精,不多不少。

我知道有些人对此不屑一顾,嗤之以鼻,我只想告诉这些人一句话:“天下大事必做于细,天下难事必做于易。”你要是认为我这是在教育你,你就错大了,我对教育人,尤其是教育你这种人,没任何兴趣!你倒找给我钱我都不会稀罕去教育你!有他妈的多远给我滚他妈的多远!

附我窜改的《见与不见》:

你知,或者不知它/命令就在那里/不悲不喜

你看,或者不看它/手册就在那里/不来不去

你爱,或者不爱它/程序就在那里/不吵不闹

你用,或者不用它/二进制就在你的机器上/不亢不卑

去了解它们/或者/让它住进你的心里

人机合一/融为一体

我圆了一个环岛梦

每次旅行回来都积攒一堆未读的邮件,所以回来之后的首要任务是看邮件,而且一回来就有各种饭局,这就是导致我欠下那么多篇游记的原因。小公子说,这次必须写,我就简单写写吧。没仔细理什么头绪,想到什么写什么。

我自行调整了行程,实际行程如下:

12月24号,Day 1:接车子,装码表,休息
12月25号,Day 2:三亚——天涯——崖城——黄流——板桥 (约130公里)
12月26号,Day 3:板桥——东方——太坡——昌江 (约100公里)
12月27号,Day 4:昌江——雅星——儋州——中兴镇 (126公里)
12月28号,Day 5:中兴镇——澄迈——海口 (94公里)
12月29号,Day 6:海口——灵山——三江——大致坡——潭牛——文昌——清澜镇 (100公里)
12月30号,Day 7:清澜镇——迈号——会文——长坡——嘉积——博鳌——琼海 (105公里)
12月31号,Day 8:琼海——龙滚——万宁——兴隆——陵水 (130公里)
1月1号,Day 9:陵水——英州——亚龙湾——三亚 (约100公里)
1月2号,Day 10:返回北京

第4天之所以切到中线去中兴镇是因为西线的路太差了,到处在修路,看我拍的照片就知道。

码表是在三亚装的,回到三亚之后显示941公里,除去从琼海到官塘之间白骑的一个往返20公里,除去在三亚市内骑的20公里左右,实际总路程约为900公里。

第2天路上吃午饭时碰到两个湖南的大妈,都60多岁了,还在骑车环岛,而且她们是先东线从海口到三亚,再走中线北上,然后从西线回三亚,比我骑得还多呢!所以,年轻人啊,你怎么好意思说自己做不到呢?

前6天都是我自己一个人骑,出了海口之后遇到好几个和我反方向的,直到第7天上午,出了琼海之后才遇到3个同方向的哥们。他们是从广州过来的,从海口骑到三亚就回去了。

关于路况:西线正在修路,路况很差,包括高速。从板桥到东方一路基本上都是石子路,而且上坡,而且逆风。过了东方之后路就修好了,不过迎接你的是一个又一个的连续上下坡,这种情况一直持续到过了海口。其实后面一路也都有连续的上下坡,只是没前面那么多了。东线除了偶尔有几段不太好骑,总体是非常好的。

因为我出发之前看的攻略都是说顺时针环岛,但路上碰到不少逆时针骑的,所以我在想是不是逆时针会比较容易些?我感觉除了从天涯到东方那一段,其它的路基本上都是连续上下坡或者平路,不会容易多少。

出发之前听从了tanyp的建议,把车胎换成了光头胎,确实是一个正确的选择。一路上没有爆胎,车子也没出任何问题,运气不错。

一路都在住店,没带帐篷无法扎营。其实清澜镇附近有个叫东郊椰林的地方,非常漂亮,也非常适合扎营,而且第二天起来还可以看日出,有条件的可以考虑。

住宿花费:从三亚出发后,第一天住板桥,40¥;第二天住昌江,50¥;第三天住中兴,40¥;第四天住海口,45¥;第五天住清澜镇,50¥;第六天住琼海,40¥;第7天住陵水,40¥;第8天下午抵达三亚。在三亚住了两天,出发之前的那天是40¥,等回去之后正好赶上元旦,所有旅馆都涨价,最后只找到一个70¥的。总计:415¥。

至于吃嘛,路上那些小地方吃的真不多,估计当地人很少出来吃,有也多是那种大排档,所以吃一顿饭也就10~20块钱之间。

来到这里才知道,当地人把东方市叫作八所,它前面有个地方叫九所。澹州市的市中心当地人叫那大。问路请以当地人的叫法为准。

像我这种出门不带GPS的人,找路基本上靠问。而我遇到的海南人都很热心,不管是问路还是住宿,所以海南人给我的印象真的不错。不像某个要建设成为国际都市的城市,问个路都故意给我指反,我就不点名了,免得说我地域歧视。

记得在嘉积的时候,我向一个扫马路的老大爷问路,他自己不是很清楚又去帮我问别人,然后仔细给我解释,直到我弄明白为止;路过东方的时候,路边的西瓜摊的大姐,给我打开西瓜之后看到这个西瓜里面有一部分熟过了的(其实也不多),本来是2块钱的只收我1块钱;在琼海的时候,早上吃早饭,老板看到我一身骑行的打扮,主动和我聊起骑车的经验,告诉我他有三辆车子;其实一路上有不少人看到我这身打扮之后就问我是不是在环岛……

所以回来之后别人问我这一路上安全吗,我都肯定地回答,很安全。

海南到处都有卖椰子的,一般4块钱一个,每次喝得我都很撑,喝完还可以让老板给切开吃椰子肉。有的地方还有冰冻的椰子,中午热的时候喝一个很爽。

海南最好吃的是清补凉,里面放了好多东西,怪不得那么多姑娘喜欢吃。我也很喜欢吃。而且北京似乎没有卖的。

海南的小吃除了那四个有名的,还有抱罗粉,腌粉,我就知道这些了。

海南本地的烟是椰王,16块钱一包,其实也是红塔出的。

所有花费:石家庄往返三亚的机票加税1080¥;北京往返石家庄动车170¥;自行车装码表、装车头灯200¥;自行车从北京寄到三亚,285¥,寄回来175¥;住宿一共花费415¥;路上吃饭,以及在三亚时请别人吃饭大约600¥;买其它东西,包括门票等,约140¥。总计:3065¥。

一路上感觉最疲惫的时候是到达中兴镇的晚上,当天为了赶路骑了一个小时的夜路才到,孤独四面袭来……

从博鳌回琼海的时候遇到当地的一个骑车的哥们,和他聊了两句,我告诉他我是在自己骑车环岛,他向我伸出了大拇指,说:哥们你真是条汉子!

其实,只要你下定决心出发,就已经成功了一半了。

“我独自一人,感动了所有的风和日丽。”

(照片在这里。)

活在自己的梦里

我之前从没读过三毛的书,只是一个很偶然的机会发现了这一本。去海南的时候想带两本书上路,选来选去,发现只有这本最适合旅途上读,于是在飞机上就把它读完了。

我本并不喜欢三毛的文字,她的文字没有张爱玲那种华丽,可却多了几分朴素,多了几分不羁,让我边读边感慨:好一个疯女人!

书中最让我感到惊讶的是描写她幻想的自己的前世,原来她也相信人有今生前世的轮回。更让人吃惊的是,她竟然在厄瓜多尔找到了前世的那个自己!难怪她走遍了那么多国家,难怪她要那么执着地去南美洲!

读到后面描写她自己重返故乡时,她一直把自己当作是林妹妹。我以为她大抵是读红楼着了迷,才有如此娇揉造作的文字。其实我错了,读了她的生平介绍我才发现,她原来一直孤独地活在自己的梦里!疯疯癫癫,如痴如醉……突然有一天,梦醒了,发现自己身处一个陌生的世界,于是绝然离去,去做一个永远也醒不来的梦!

今天正好是三毛去世20周年,特写此文以作纪念。与君相见恨晚。

“红尘十丈,茫茫的人海,竟还是自己的来处。”