2008/3

一个实用的shell脚本

刚写的一个编译C/C++用的脚本,觉得好用的话把它保存起来加上可执行权限放到$PATH目录中去。
emacs虽然mode-cc很不错,可惜执行还得另开一个shell的window,不如用这个了。

#!/bin/bash #Copyright (C) 2008, WANG Cong #GPLv3 applies. if (( $# < 1)); then

        echo "Bad usage!"

        exit 1

fi FILENAME=$1 CC="gcc" CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align         -Wnested-externs -Waggregate-return -Wundef         -Wbad-function-cast -Wmissing-prototypes -Wstrict-prototypes         -Wmissing-declarations -Wconversion -Winline -Wformat-nonliteral         -Wformat-security -Wunknown-pragmas -Wredundant-decls         -std=c99 -s -g3 -O" CPPFLAGS="-Wall -W -Wshadow -std=c++98 -ffor-scope -Wpointer-arith -s -g3 -O" while [[ "$FILENAME" != "" ]] do

        OUTFILE=${FILENAME%.*}

        POSTFIX=${FILENAME##*.}

        if [ $OUTFILE = $FILENAME ] || [ $POSTFIX = $FILENAME ] || 

                [ -z $OUTFILE ] || [ -z $POSTFIX ];

        then

                echo "Bad file name!"

                exit 2

        fi

        if [[ "$POSTFIX" = "cpp" ]] || [[ "$POSTFIX" = "cxx" ]] || 

                [[ "$POSTFIX" = "cc" ]] ;

        then

                CC="g++"

                CFLAGS=$CPPFLAGS

        fi

        $CC $CFLAGS -o $OUTFILE $FILENAME

        if (($?!=0)); then

                exit 1

        fi

        echo "Result of exec $OUTFILE:"

        /bin/bash -c "./$OUTFILE"

        echo "End of $FILENAME"

        echo "========================"

        rm -f $OUTFILE

        shift

        FILENAME=$1

done exit 0

喜欢方文山的词

最初听说方文山也是因为周杰伦,知道他给他写了不少的歌词。再后来听周杰伦的歌时都忍不住要看一下哪些歌词是方文山写的。而现在,只要能听懂周杰伦唱的歌词(不得不承认有时候很难)就能知道这首歌是不是方文山写的。

当然了,方文山也不只给周杰伦一个人写词,他还给蔡依琳,S.H.E等人写。他给周杰伦写的应该是最多的,他的风格在周杰伦的歌里体现得最明显。听多了他作的词,就慢慢地上瘾。喜欢他那种风格,歌词写得如诗如画,优美,还经常有押韵,才华横溢!对他的文采很是钦佩。

(题外话:方文山老师的学历只有高职,按照我们天朝的学历论,又得把人家打入十八层地狱了!何其悲哀!)

下面就从方文山的词里选一些我觉得写得精彩的,一起欣赏一下。

“小学篱笆旁的蒲公英,是记忆里有味道的风景。”(周杰伦《蒲公英的约定》)

风景在他的笔下居然是“有味道的”,确实很美。这句开门见山地就点了题,很是精彩。整首歌都充斥着一种回忆和思念的味道,确实被他写活了。

“月色被打捞起,开了结局”(周杰伦《青花瓷》)

“打捞”“月色”,很形象的用法,而那一个“晕”字更是画龙点睛之笔!用神了!绝对是《青花瓷》中最精彩的一句!和此类似的还有下面的“惹”字。

“帘外芭蕉骤雨,门环铜绿”(周杰伦《青花瓷》)

不得承认,这两个字用得太有想象力了!

“你从雨中来,诗化了悲哀,我淋湿现在”(周杰伦《千里之外》)

把悲哀表现得如此“诗化”,让人惊叹。而且还押韵!

说起押韵,不得不提《菊花台》,整首词几乎全都押韵不说,流露的凄凉更是让人感动不已。

“你的泪光柔弱中带伤,惨白的月弯弯住过往。夜太漫长凝结成了霜,是谁在阁楼上冰冷地绝望。”(周杰伦《菊花台》)

在这里,一个“勾”字又被他用神了,而且“绝望”也变成了“冰冷地”,怎一个伤感了得?

在所有他给周写的词中,这个是我第二欣赏的,排第一位的肯定当推《东风破》。整首词可谓处处优美,再配上悠扬的琵琶,更是令人叫绝。感慨一句:我特别特别特别喜欢这首歌结尾那悠扬的琵琶旋律!词我就不全贴了,窃以为,最美的应属下面几句:

“岁月在墙上剥落 看见小时候”“枫叶将故事染色 结局我看透”

一个“剥落”,一个“染色”,堪为经典之笔。而这一句更是神奇:

“一壶漂泊 浪迹天涯难入喉”

短短一句就把游子浪迹天涯描绘得淋漓尽致!

你要以为方文山只能写《娘子》《龙拳》《青花瓷》这种中国味浓的词就错了,他写的词里不乏描写异域风情的,像《威廉古堡》,《印地安老斑鸠》,《米兰的小铁匠》,用词更是幽默风趣,简直绝了!

篇幅有限,下面的就不分析了,拿出来供各位自己慢慢品味。
“经过苏美女神身边我以女神之名许愿,思念像底格里斯河般的蔓延”(周杰伦《爱在西元前》)
“秋刀鱼的滋味猫跟你都想了解”(周杰伦《七里香》)
“那温暖的阳光象刚摘的鲜艳草莓,你说你舍不得掉这一种感觉”(周杰伦《七里香》)
“孩子们眼中的希望是什么形状,是否院子有秋千可以荡”(周杰伦《止战之殇》)
“镜头的另一边,跳接我成熟的脸”(周杰伦《爷爷泡的茶》)
“那长城像五千年来待射的梦”(周杰伦《龙拳》)
“蒙古高原南下的风些什么内容”(周杰伦《龙拳》)
“火炉烫 小铁匠存钱买期望 在流汗”(周杰伦《米兰的小铁匠》)
“在硝烟中想起冰棒汽水的味道 和那些无所事事一整个夏天的年少”(周杰伦《最后的战役》)
“跟夜风一样的声音 心碎的很好听”(周杰伦《夜曲》)
“世事看透江湖上潮起潮落什么恩怨过错 在多年以后还是让人难过心伤透”(周杰伦《娘子》)
“印第安老斑鸠平常话不多 除非是乌鸦抢了他的窝 他在灌木丛旁邂逅 一只令他心仪的母斑鸠”(周杰伦《印地安老斑鸠》)
“管家是一只会说法语举止优雅的猪,吸血前会念约翰福音做为弥补”(周杰伦《威廉古堡》)
“走下乡寻找哪有花香 坐车厢朝着南下方向 鸟飞翔穿过这条小巷 仔细想这种生活安详”(周杰伦《三年二班》)
“小城里 岁月流过去 清澈的勇气 洗涤过的回忆 我记得你 骄傲地活下去”(周杰伦《霍元甲》)
“黄金葛爬满了雕花的门窗 夕阳斜斜映在斑驳的砖墙”(周杰伦《上海一九四三》)

关于e820

很久没接触BIOS中断这么陈旧的东西,再次挖出来都有些生疏了。

e820是和BIOS的一个中断相关的,具体说是int 0x15。之所以叫e820是因为在用这个中断时ax必须是0xe820。这个中断的作用是得到系统的内存布局。因为系统内存会有很多段,每段的类型属性也不一样,所以这个查询是“迭代式”的,每次求得一个段。

我们看内核源代码。主要涉及两个文件:arch/x86/boot/memory.c和arch/x86/kernel/e820_32.c。我们已经很幸运了,这部分代码已经用C重写过了。你可能会奇怪,启动调用e820时我们还在实模式,怎么能用C呢?答案是,这里用的是16位的C。gcc早已经支持.code16gcc模式了。

看detect_memory_e820()函数,里面就是e820的本质。它把int 0x15放到一个do-while循环里,每次得到的一个内存段放到struct e820entry里,而struct e820entry的结构正是e820返回结果的结构!而像其它启动时获得的结果一样,最终都会被放到boot_params里,e820被放到了boot_params.e820_map。

如果你对struct e820entry还有疑问,你可以看一下arch/x86/kernel/e820_32.c::print_memory_map(),看看里面是怎么使用它的。

当然了,在arch/x86/boot/memory.c里,你还会看到另外两个利用int 0x15查询内存的函数,不过用途不一样了。

凡是弄过操作系统启动这块的,肯定都有这么一个感慨:我的东西该往哪里放啊!怎么个放法啊!恩,或许Linux这种方式值得我们借鉴,它的虽然很科学,但也很复杂。那有啥办法呢,BIOS这块本来就已经很乱了!

欣赏STL代码

无意间看到STL代码,忍不住读了一下,写得很简练,值得我们学习。在这里贴出来和大家分享一下。

最先看的是algorithm里的next_permutation的实现,非递归,代码很精炼,值得好好研究。

template
bool next_permutation(_BidirectionalIter first, _BidirectionalIter last)
{
// concept requirements
glibcpp_function_requires(BidirectionalIteratorConcept);
glibcpp_function_requires(LessThanComparableConcept<
typename iterator_traits::value_type>);

if (first == last)
return false;
_BidirectionalIter i = first;
++i;
if (
i == last)
return false;
i = last;
i;

for(;;) {
_BidirectionalIter ii = i;
i;
if (*
i < ii) {
_BidirectionalIter
j = __last;
while (!(
i < *—j))
{}
iter_swap(i, j);
reverse(ii, last);
return true;
}
if (i == first) {
reverse(first, last);
return false;
}
}
}

去重方法unique的实现:

template template
void list::unique(_BinaryPredicate binary_pred)
{
iterator
first = begin();
iterator last = end();
if (
first == last) return;
iterator
next = first;
while (++
next != last) {
if (
binary_pred(__first, next))
erase(
next);
else
first = next;
next = first;
}
}

看完了代码才想起来,使用unique的前提是list必须是有序的。

为了看后面的reverse方法,我们先看看它用到的transfer方法,这个一个很重要的方法,好几个方法都用到了它。transfer的作用是把[first, last)之间的元素都移动到position之前。

protected:
void transfer(iterator position, iterator first, iterator last) {
if (
position != last) {
// Remove [first, last) from its old position.
((_Node*) (
last._M_node->_M_prev))->_M_next = position._M_node;
((_Node*) (
first._M_node->_M_prev))->_M_next = last._M_node;
((_Node*) (
position._M_node->_M_prev))->_M_next = __first._M_node;

  // Splice [first, last) into its new position.
  _Node* __tmp = (_Node*) (__position._M_node-&gt;_M_prev);
  __position._M_node-&gt;_M_prev = __last._M_node-&gt;_M_prev;
  __last._M_node-&gt;_M_prev      = __first._M_node-&gt;_M_prev;
  __first._M_node-&gt;_M_prev    = __tmp;
}

}

然后reverse出场:

template
void list::reverse()
{
// Do nothing if the list has length 0 or 1.
if (_M_node->_M_next != _M_node &&
((_Node*) (_M_node->_M_next))->_M_next != _M_node) {
iterator first = begin();
++
first;
while (first != end()) {
iterator
old = first;
++
first;
transfer(begin(), old, first);
}
}
}

连接操作splice,这里看的这个splice是把list上的i移到position位置上。

void splice(iterator position, list&, iterator i) {
iterator j = i;
++j;
if (
position == i || position == j) return;
transfer(
position, i, j);
}

最后是sort方法,据说用了quick sort算法,不过还没看太懂……

template
void list::sort()
{
// Do nothing if the list has length 0 or 1.
if (_M_node->_M_next != _M_node &&
((_Node) (_M_node->_M_next))->_M_next != _M_node) {
list carry;
list
counter[64];
int fill = 0;
while (!empty()) {
carry.splice(__carry.begin(),
this, begin());
int i = 0;
while(
i < fill && !counter[i].empty()) { counter[i].merge(carry);
carry.swap(counter[i++]);
}
carry.swap(counter[i]);
if (i == fill) ++__fill;
}

for (int __i = 1; __i &lt; __fill; ++__i)
  __counter[__i].merge(__counter[__i-1]);
swap(__counter[__fill-1]);

}
}

寻书记

天朝五十六年间,吾有幸闻得今有一奇书,名曰集异璧。传得此书者可以得天下,世人争相抢购,以此为荣,买到者惊喜若狂,疯癫数日,四处炫耀。

此书颇为神奇,号称集数学,音乐,绘画于一身,其道出了三者之“惊人一致性”,可谓惊世骇俗;文笔幽默,深入浅出,隐含大量潜台词,其文前后照应,互相交织,可谓空前绝后。无怪乎世人为之疯狂也。

吾先后奔走于长安各大书城,皆无此书。遂搜索于网络,才有幸寻得其电子版,翻阅若干页,大惊!吾此生未见出其右者!叹曰:此书只应天上有!书中道破之天机必令吾等凡夫俗子发狂也!

而后三年中,吾尝先后奔波于京城,泉城,申城等地寻此宝书,无果。欲购之于网络,皆缺货。大悲,吾今生与此书无缘乎?

造化弄人,苍天有眼,转眼间峰回路转。正所谓“有心栽花花不开,无心插柳柳成荫”。游玩京城时无意间于一小书店觅得此书,大喜,吾此生无憾矣!捧回家中,奉若神明,烧香拜之。遂作此文,聊表纪念。

作于天朝戌子年

买了三本书

一个星期前从当当上收了三本书,前天才到,昨天才拿到手。

一本是英文版的《瓦尔登湖》,闻其大名久已,文字据说很是优美,而且一直向往作者生活的那种生活。窃以为像这种著作,任何翻译都会使其失色,遂决定买英文原版。(上次想买的那个中文版没买到。我这里不能送货上门,但我却能选择当面付款!当当的一个bug!不过他们马上就修正了。)

另一本是比较哲学的,《科学革命的结构》,在豆瓣上的评价颇高,而且又不贵,收来看看。

最后一本是关于计算机的,叫《计算机系统要素——从零开始构建现代计算机》,MIT出的,虽然对我来说比较简单,但里面讲的虚拟机和编译器部分还比较新鲜。

号外:网上购物推荐中国农行,对firefox支持还算不错!

c.l.c是好地方呐

最近经常出没c.l.c,里面牛人多多,没事也跟着瞎掺和一下。

DMR说过这么一句话:“Usenet is a strange place”,这句话忒对了!拿c.l.c来说吧,虽然是讨论标准C的地方,但也不乏各种奇怪的争论,比如你要是不幸使用Window$,到了那里就可能受到鄙视!俺有一次因为某个言论就被指责使用很多门先生的产品,冤枉啊!俺不光不使用很多门先生的东西,而且对他的公司憎恨有加啊~!

今天看到一周一次的统计出来了,按数量算俺居然还榜上有名,按长度或者质量算嘛就不行了。有待进一步提高啊!很佩服Keith Thompson,牛人呐,对标准了如指掌不说,解答个个都是十分详尽,自叹不如……

山外有山,牛外有牛,一牛更比一牛高~

[题外话:从c.l.c上的统计方法来看,到底怎么才能反映出一个人在某个方面的实力?我认为可以看这么几点:

1. 一个人针对这方面某个话题发言的长度。因为如果他对这方面不熟悉是不可能说出长篇大论的,就算是让他抄他也未必能抄出来。当然了,如果他错了或者抄袭了,看到这些东西的同行肯定会揭发。

2. 一个人的发言被引用的次数。被引用的越多说明他的话越重要,或者越有争议。注意,有争议未必是坏事,能和一群牛人争论说明你的水平已经很高了。

其实上面两点基本上就是国外评选教授的方式,看同行对他的评价,看他的论文被引用的次数。相比之下,我天朝的科举制度就是落后不堪了,居然还是以考记忆力的方式来评价人才。殊不知科学殿堂里真正的“考试”都是开卷的。极其失败!]

在豆瓣上建了一个小组

我很奇怪像豆瓣这样书香很浓的地方居然没有一个和W. Richard Stevens相关的小组。不知道是因为Linux/Unix程序员太少,还是读过Stevens老先生的书的人太少~~

身为Stevens的忠实粉丝,我看不惯了,自己动手在豆瓣上建了一个W. Richard Stevens的小组,地址如下:

http://www.douban.com/group/WRichardStevens/

欢迎喜欢W. Richard Stevens作品的朋友加入!

《乡村爱情》

一开始CCTV放的时候没怎么在意这部电视剧,倒是老妈每天必看。

现在山东台又放,老妈要看第二遍(-_-||),我本来是没事偷看几眼,结果越看越有意思,上瘾了。里面的人物太有意思了,范伟和刘流演得忒好了,而且很具有中国农村特色。赵本山老师太有才了~!

我老家也是在农村,每年都至少回去一次,感觉里面拍的农村和现实差不多:在农村买东西没带钱可以赊账;有吆喝着四处卖东西的小贩,还可以拿东西去换;有山有水,每天都下坡种地;没事可以挨家挨户地串门……既没有大城市里的高楼大厦,也没有喧嚣嘈杂,这种生活挺好的!

前一段时候找工作的那会儿,我没事时和我们宿舍的王冬打趣说:咱要是找不到工作就回家种地去吧,说不定还能娶上个“砂锅西施”那样的媳妇! 说心里话,其实挺羡慕那种“农妇,山泉,有点田”的生活!

很喜欢三月

大概是在西安待久了吧,居然忘了一年之中的三月还有这么好的天气。

西安的天气实在不敢恭维,在西安你几乎感觉不到春天来了就到夏天了。一个同学说“西安过了冬天就是夏天”,我很认同。

现在在家,无论白天还是晚上出去,总能感觉到春风拂面,吹过脸庞的风不冷不热,很舒服,而且恰到好处。白天,阳光温和,照进我的房间,有一种暖暖的感觉。夜晚宁静惬意,站在阳台上望去,有一种温馨的感觉。

今天吃晚饭时又恰好下了点儿小雨,更是增添了一份春的气息。

古人讲“烟花三月下扬州”。看来这三月自古就是招人喜爱啊!虽不能“下扬州”,可我却能慢慢品味这“烟花三月”的味道。