Archives

两个和gcc相关的脚本

Sunday, 25. February 2007, 07:16:44

Linux内核源代码中有这么一个脚本文件:scripts/gcc-version.sh。它的主要代码如下:


9 compiler=”$*”
10
11 MAJOR=$(echo GNUC | $compiler -E -xc - | tail -n 1)
12 MINOR=$(echo GNUC_MINOR | $compiler -E -xc - | tail -n 1)
13 printf “%02d%02dn” $MAJOR $MINOR
14

从上面我们很容易看出它的用法,它要带一个参数,指明该平台上 GNU C编译器的命令(可能有些平台是cc)。它会给出GNU C编译器的版本号,以如下格式:XXYY,其中XX是主版本号,YY是次版本号,比如gcc-4.1的版本号就是0401。

这个脚本的实现很简单,它通过把GNU C编译器预先定义的宏GNUCGNUC_MINOR展开后交给编译器的预处理器处理,处理后其实就应该是想要的结果了,但gcc会自动在前面插入自己的一些东西,所以,要截取最后一行才是真正的结果。-E选项是指明只进行预处理,注意:如果没有-o,-E默认的输出是标准输出;-x选项是要指明所使用的语言,这里指明的是c;-是说明输入来自标准输入,这主要是照顾管道。

另一个和gcc相关的脚本是scripts/gcc-x86_64-has-stack-protector.sh,它用来测试x86_64(x86_64是AMD的,IA-64才是Intel的)上是不是有堆栈保护,代码如下:


3 echo “int foo(void) { char X[200]; return 3; }” | $1 -S -xc -c -O0 -mcmodel=kernel -fstack-protector - -o - 2< /dev/null | grep -q “%gs”
4 if [ “$?” -eq “0” ] ; then
5 echo $2
6 fi

-fstack-protector选项是指明要检查堆栈是否会溢出,这是为了保护程序免于缓冲区溢出的攻击;-mcmodel=kernel是指明要为内核模式生成代码,Linux内核似乎要使用此选项。第3行的命令使用得更妙,还把中间命令的错误重定向到了/dev/null,而且还为grep开启了安静模式。似乎是从生成的汇编中找到”%gs”这个寄存器就说明有堆栈保护,但原理还是不明白;-(。

Linux内核中的红黑树

Friday, 2. February 2007, 06:07:27

王聪@西邮
红黑树是平衡二叉树的一种,它有很好的性质,树中的结点都是有序的,而且因为它本身就是平衡的,所以查找也不会出现非常恶劣的情况,基于二叉树的操作的时间复杂度是O(log(n))。Linux内核在管理vm_area_struct时就是采用了红黑树来维护内存块的。

先到include/linux/rbtree.h中看一下rbtree的定义,如下:

struct rb_node
{
        unsigned long  rb_parent_color;
#define RB_RED          0
#define RB_BLACK        1
        struct rb_node *rb_right;
        struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));
struct rb_root只是struct rb_node*的一个包装,这样做的好处是看起来不用传递二级指针了。不错,很简单。再看一下下面几个重要的宏,细心的你一定会发现,rb_parent_color其实没那么简单,Andrea Arcangeli在这里使用了一个小的技巧,不过非常棒。正如名字所暗示,这个成员其实包含指向parent的指针和此结点的颜色!它是怎么做到的呢?很简单,对齐起了作用。既然是sizeof(long)大小的对齐,那么在IA-32上,任何rb_node结构体的地址的低两位肯定都是零,与其空着不用,还不如用它们表示颜色,反正颜色就两种,其实只要一位就够了(估计此处也是照顾16位的机器)。 这样,提取parent指针只要把rb_parent_color成员的低两位清零即可:
#define rb_parent(r)   ((struct rb_node *)((r)-
取颜色只要看最后一位即可:
#define rb_color(r)   ((r)-
测试颜色和设置颜色也是水到渠成的事了。需要特别指出的是下面的一个内联函数:
static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, struct rb_node ** rb_link);
它把parent设为node的父结点,并且让rb_link指向node。 我们把重点集中在lib/rbtree.c上,看看一些和红黑树相关的重要算法。开始之前我们一起回忆一下红黑树的规则: 1\. 每个结点要么是红色要么是黑色; 2\. 根结点必须是黑色; 3\. 红结点如果有孩子,其孩子必须都是黑色; 4\. 从根结点到叶子的每条路径必须包含相同数目的黑结点。 这四条规则可以限制一棵排序树是平衡的。 __rb_rotate_left是把以root为根的树中的node结点进行左旋,__rb_rotate_right是进行右旋。这两个函数是为后面的插入和删除服务,而不是为外部提供接口。 新插入的结点都设为叶子,染成红色,插入后如果破坏了上述规则,通过调整颜色和旋转可以恢复,二叉树又重新平衡。插入操作的接口函数是
void rb_insert_color(struct rb_node *node, struct rb_root *root);
它把已确定父结点的node结点融入到以root为根的红黑树中,具体算法的分析可以参考MIT的《算法导论》第14.3节,这里的实现和书中的讲解几乎完全一样!怎么确定node的父结点应该在调用rb_insert_color之前通过手工迭带完成。值得指出的一点是,虽然插入操作需要一个循环迭代,但是总的旋转次数不会超过两次!所以效率还是很乐观的。 删除操作多多少少都有点麻烦,它要先执行像普通二叉查找树的“删除”,然后根据删除结点的颜色来判断是否执行进一步的操作。删除的接口是
void rb_erase(struct rb_node *node, struct rb_root *root);
其实它并没有真正删除node,而只是让它和以root为根的树脱离关系,最后它还要判断是否调用__rb_erase_color来调整。具体算法的讲解看参考《算法导论》13.3和14.4节,__rb_erase_color对应书中的RB-DELETE-FIXUP。此处的实现和书上也基本上一致。 其余的几个接口就比较简单了。
struct rb_node *rb_first(struct rb_root *root);
在以root为根的树中找出并返回最小的那个结点,只要从根结点一直向左走就是了。
struct rb_node *rb_last(struct rb_root *root);
是找出并返回最大的那个,一直向右走。
struct rb_node *rb_next(struct rb_node *node);
返回node在树中的后继,这个稍微复杂一点。如果node的右孩子不为空,它只要返回node的右子树中最小的结点即可;如果为空,它要向上查找,找到迭带结点是其父亲的左孩子的结点,返回父结点。如果一直上述到了根结点,返回NULL。
struct rb_node *rb_prev(struct rb_node *node);
返回node的前驱,和rb_next中的操作对称。
void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root);
用new替换以root为根的树中的victim结点。 红黑树接口使用的一个典型例子如下:
static inline struct page * rb_search_page_cache(struct inode * inode,
                                                 unsigned long offset)
{
        struct rb_node * n = inode-_
        struct page * page;

        while (n)
        {
                page = rb_entry(n, struct page, rb_page_cache);

                if (offset > page-
                        n = n-
                else if (offset < page-
                        n = n-
                else
                        return page;
        }
        return NULL;
}

static inline struct page * __rb_insert_page_cache(struct inode * inode,
                                                   unsigned long offset,
                                                   struct rb_node * node)
{
        struct rb_node ** p = &inode-
        struct rb_node * parent = NULL;
        struct page * page;

        while (*p)
        {
                parent = *p;
                page = rb_entry(parent, struct page, rb_page_cache);

                if (offset > page-
                        p = &(*p)-
                else if (offset < page-
                        p = &(*p)-
                else
                        return page;
        }

        rb_link_node(node, parent, p);

        return NULL;
}

static inline struct page * rb_insert_page_cache(struct inode * inode,
                                                 unsigned long offset,
                                                 struct rb_node * node)
{
        struct page * ret;
        if ((ret = __rb_insert_page_cache(inode, offset, node)))
                goto out;
        rb_insert_color(node, &inode-
 out:
        return ret;
}
_

Linux进程管理中队列的使用

Friday, 2. February 2007, 05:58:24

王聪@西邮

Linux内核中大量使用了队列,这里仅列举它在进程管理中的几处应用。

状态为TASK_RUNNING的进程都会被放入运行队列(runqueue)中,这是通过task_struct(定义在include/linux/sched.h)中的run_list成员来链接的。不过,为了让内核每次都能选取优先级最合适的进程,Linux为每个优先级构建了一个queue!这是通过struct prio_array来实现的,struct prio_array的定义(在kernel/sched.c)大致如下:


struct prio_array {
int nr_active;
unsigned long bitmap[BITMAP_SIZE];
struct list_head queue[MAX_PRIO];
};

queue成员就是队列数组。每个CPU有各自的runqueue,每一个runqueue又有包含两个prio_array,一个是活动队列,一个是时间片耗尽的队列。当运行队列空时,内核便会交换两个队列的指针!原来的耗尽队列就成了新的活动队列!这和prio_array中的bitmap是决定调度算法为O(1)的关键!

状态为TASK_STOPPED,EXIT_ZOMBIE或EXIT_DEAD的进程不会被放入专门的队列中,它们直接通过pid或者通过父进程的孩子队列来访问。

TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的进程会被放入等待队列。不同的是,每个等待事件都会有一个等待队列,该队列中的进程等待同一事件的完成(不要惊慌!“事件”一个动态的过程,不好通过具体的结构来定义一个“事件”。这里等待一个事件就是查看某个条件是否为真,比如某个标志变量是否为真。)。wait_queue_head_t的定义(include/linux/wait.h)如下:


typedef struct _ _wait_queue_head {
spinlock_t lock;
struct list_head task_list;
}wait_queue_head_t;

wait_queue_t的定义如下:


typedef struct _ _wait_queue {
unsigned int flags;
struct task_struct task;
wait_queue_func_t func;
struct list_head task_list;
}wait_queue_t;

进入等待状态的接口有两类:
prepare_to_wait()/finish_wait()
wait_event()
其实wait_event
()内部也是调用prepare_to_wait(),把它放入一个循环中。而且wait_event()在事件完成时会自动调用finish_wait()。决定使用哪个要看情况而定。sleep_on*()是遗弃的接口,现在已经不再使用,虽然还支持。等待队列中的进程有两种,一种是exclusive的进程,另一种是nonexclusive的进程。所谓exclusive是指唤醒的进程等待的资源是互斥的,每次只唤醒一个(唤醒多个也可以,不过最后还是只有一个会被唤醒,其余的又被重新添加到等待队列中,这样效率会大打折扣)。一般,等待函数会把进程设为nonexclusive和uninterruptible,带“interruptible”的会专门指定状态为interruptible;而带“timeout”的会在超时后退出,因为它会调用schedule_timeout();带“exclusive”的则会把进程设为exclusive。

唤醒的接口虽然只有wake_up*(),但它内部也分成好几种。带“interruptible”的唤醒函数只会唤醒状态是TASK_INTERRUPTIBLE的进程,而不带的则会唤醒TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程;所有唤醒函数都会把等待同一事件的nonexclusive进程全部唤醒,或者把其中一个exclusive的进程唤醒;而带“nr”的则会唤醒指定个数的exclusive的进程,带“all”的会把全部exclusive进程唤醒。带“sync”会忽略优先级的检查,高优先级的进程可能会被延迟。最后,持有自旋锁时只能调用wait_up_locked()。

All about vi

Sunday, 7. January 2007, 15:21:54



1. vi的诞生

vi果然是Bill Joy所写,当时这位大牛还在Berkeley。Ken Thompson去Berkeley的时候带去了他那不完整的Pascal系统,而Bill Joy恰好在暑假就接到修复它的工作,他就修复代码时使用的编辑器ed很不满意。正好,他们从一个叫George Coulouris的家伙那里拿到了em的代码,em比ed要好用。他们就修改了em,发明了en,而最终又变成了ex(连Bill Joy本人也不知道怎么就变成了ex)。后来他熬了几个月的夜就写出了vi。

2. vi并不是一个周末就写出来的。

Bill Joy自己也宣称花了很多时间,不过似乎不是因为它有多难写,而是因为Bill的modem很慢,只有300波特。(牛人就是牛人。)

3.
一则vi的笑话::D
(user) I’m having trouble with this editor
(admin) Which one are you using ?
(user) Um, I dunno.
(admin) Emacs? Which version are you running ?
(user) Umm, I’m running version vi, and having heaps of trouble. Is vii out?
(admin) Say what?
(user) Have they done anything new?
(admin) Well… Yeah, they’re up to xv now, but that needs a special graphical
interface.
(user) Oh, well, thanks anyway.
(admin) shudder

想家

Wednesday, 3. January 2007, 15:25:25

快一年没回家了:worried: ,真有点儿想老爸老妈~~

这里的饭都吃腻了!好想回去吃老妈做的西红柿炒鸡蛋:ko: ~~nervous 不过话又说回来了,老妈做来做去也就那几样菜,在家里待三天就吃腻了~:D ~不过在家吃腻了可以去姥姥家吃,也可以出去吃,比这里要好
好久也没听见老妈的唠叨了,以前在家的时候总觉得烦,现在想想其实老妈也是为我好啊姥姥也是难道女人上年纪了都这样?:confused:

说实话,挺佩服老爸,不管什么时候家里坏了东西,经老爸一修肯定能好,这一点让偶实在佩服,虽然老爸读的书连偶的1/3都没有。老爸是个人工作很努力的人,整天忙着忙那,没闲着的时候看他年纪也大了,有时候真想替他做点儿什么,可他不让俺做,说让俺把书读好就成了不过老爸的脾气拗,以前姥爷在世的时候他们就没几天处得好的时候,为此老妈也没少骂了他~~记得小时候老爸常因为我贪玩而打我,好像从初中开始就不再打了,他也知道我长大了。:rolleyes:

姥姥身体一直不错:smile: ,年纪那么大了还能干这干那,还经常去儿子闺女那里逛。姨家的弟弟还在念小学,学习不错,有当年偶的风采,而且也挺乖,是个可爱的小鬼二舅家的妹妹还在念初中,学习不咋的,舅舅舅妈没少批评她,她就不改,这丫头的脾气挺拗大舅家的妹妹上高中,学习也不怎么好,今年应该考大学了,不知道她能考到哪里去

1
2
和我最亲的是从小玩到大的表弟,大舅家的孩子,感觉老弟从小就挺调皮,现在长大了都有女朋友了还是这么皮

挺喜欢和表弟在一起玩~~

今年最后一天

Sunday, 31. December 2006, 14:35:50


哎~~一年的最后一天了,不过做了点有意义的事……p:

今天是可爱的邱曼的生日:happy: ,俺一大早起来就给她打电话送祝福,:lol: 可爱的邱曼还是那么腼腆:whistle: 俺就觉得人家邱曼的生日好,一年的最后一天,过完这天那可是真真正正地长一岁啊~生日快乐哈邱曼啊~~回去一定要请俺吃饭啊~!:smile:

上午逃了半节课跑到办公室给老师送贺卡去了,可惜张老师,王老师和陈老师都不在啊:frown: 结果只送了杨老师和韩老师:ko: ~~韩老师说了一句:你小子也搞这一套啊呵呵,俺可不是巴结领导,俺可是打心眼里尊重韩老师啊:cool: 说啥俺也是个criti-Chineseism-ist(ps.这个单词是我自己造的!哈哈!To 小公子:猜猜它是什么意思?)

下午去老师还是不在,给那三位老师发短信,结果还是只有张老师回了(还是张老师好:happy: ),到了晚上了,王老师才发来一条祝福短信,挺搞笑的那种,老师也玩这一招啊,呵呵~~:D

纪念这最后一天~

随便写点儿

Tuesday, 12. December 2006, 16:25:52

决定这个blog不再像以前的blog那样,整天贴一些“严肃”的文章,在这里也贴一些自己的“日记”,记录自己的一些感受。这样一来可以满足广大fans的要求:ko: ,二来也算对自己有个交代。:D

今天突然发现时间过得真快,这学期马上就要结束了,六级啊,期末啊,都TMD接踵而至,烦啊~该死的考试~。:spock: 再仔细算算,发现自己待在西邮的时间也不长了,弄好了连一年都待不了就得走人了~:whistle: 真怀念这些同学和我们计算机系的老师。:rolleyes:

说到计算机系的老师,又得说两句p: 西邮计算机系的老师对学生都很好,不像电信系的那些恶女~:irked: 大概我们系有韩老师这样的领导做表率吧:smile: 这里面还是张老师最好;) ,现在她虽然不教我们了,可我遇到电路的问题都去找她,有问必答现在想想我当年连她的matlab课都没上过几节,后悔不已!:cry: 如果上天再给我一次重来的机会,我会去认真听她讲一次matlab!:cool: 期末将至,我那可怜的模电又得找她去补,真不知道该怎么感谢她~:worried:

韩老师是俺们领导,也是俺的老师,但更像一位年长的朋友:left: ,俺觉得他继承了东北人的优良传统──直率!:cool: 他从不摆领导架子,常嘻笑怒骂,说话和蔼,但铿锵有力,阴阳顿挫,有时也会严厉,有时也会亲切:coffee: 善于听取别人的意见,对学生和老师很好~他在西邮我放心~:yes: 一位老师说韩老师是快落山的太阳,要说年轻人说点不切实际的话还有可能,韩老师这样年纪的人不会说谎~这句话我信。:rolleyes: 韩老师虽然是教授+系主任,可是对中国的教育深感不满,曾当堂严厉痛斥考试制度,这也不能不让人佩服在中国,领导能当到这份上,我还能有什么意见啊~~:hat:

俺一直都很佩服陈老师,翻译了那么多经典的内核书籍不说,自己写的书还被中科院用做了招收博士生的参考教材。:eek: 她认真的工作态度也给俺留下了很深的印象:sherlock: 如今能这么认真对待教学的老师实在是不多啦西邮把自己定位于教学型大学,真没错啊比起那些整天TMD高喊弄研究型大学,背地里却不知道骗了国家多少钱的大学好多了~~:lol:

说起王老师,那就更有意思了他曾经是俺的网友,真不知道怎么就偏偏进到我们西邮来了~缘分啊~:D 现在又和他一起弄Linux兴趣小组,一起探讨Linux技术不亦乐乎~

在西邮也不错,凭良心地说~:jester:

值得收藏一生的电影经典台词

Monday, 11. December 2006, 13:18:23


超级经典~~

生活就像一盒巧克力,你永远不知道你会得到什么。
影片:阿甘正传

人生不能象做菜,把所有的料都准备好了才下锅
影片:饮食男女

星星在哪里都是很亮的,就看你有没有抬头去看他们
影片:玻璃樽

世界上总有一半人不理解另一半人的快乐
影片:爱玛

你以为我穷。不漂亮,就没有感情吗?如果上帝赐给我美貌和财富,我也会让你难于离开我的!就象我现在难于离开你一样!
影片:简爱

什么是权利?当一个人犯了罪,法官依法判他死刑。这不叫权利,这叫正义。    而当一个人同样犯了罪,皇帝可以判他死刑,也可以不判他死刑,于是赦免了他,这就叫权利!
影片:辛德勒名单

上帝会把我们身边最好的东西拿走,以提醒我们得到的太多!
影片:四根羽毛

牵着你的手,就象左手牵右手没感觉,但砍下去也会疼!(爱情的终结)
影片:一声叹息

我们要学会珍惜我们生活的每一天,因为,这每一天的开始,都将是我们余下生命之中的第一天。 除非我们即将死去。
影片:美国美人

好多东西都没了,就象是遗失在风中的烟花,让我来不及说声再见就已经消逝不见。
影片:男人四十

我听别人说这世界上有一种鸟是没有脚的,它只能一直飞呀飞呀,飞累了就在风里面睡觉,这种鸟一辈子只能下地一次,那边一次就是它死亡的时候。
影片:阿飞正传

也许每一个男子全都有过这样的两个女人,至少两个.娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是“床前明月光”;娶了白玫瑰,白的便是衣服上的一粒饭粘子,红的却是心口上的一颗朱砂痣。
影片:红玫瑰与白玫瑰

“小时候,看着满天的星斗,当流星飞过的时候,却总是来不及许愿,长大了,遇见了自己真正喜欢的人,却还是来不及。”
电影:停不了的爱

我觉得生命是最重要的,所以在我心里,没有事情是解决不了的。不是每一个人都可以幸运的过自己理想中的生活,有楼有车当然好了,没有难道哭吗?    所以呢,我们一定要享受我们所过的生活。
电影:新不了情

世界上最遥远的距离不是生和死,而是站在你面前却不能说:“我爱你”
电影:星愿

这世上只有两种人:骗人的和被骗的
电影:不夜城

爱,就是永远也用不着说对不起。
电影:爱情故事

“人生本就是苦还是只有童年苦?” “生命就是如此。”
电影:这个杀手不太冷

从现在开始,你只许疼我一个人,要宠我,不能骗我,答应我的每一件事都要做到,对我讲得每一句话都要真心,不许欺负我,骂我,要相信我,别人欺负我,你要在第一时间出来帮我,我开心了,你就要陪着我开心,我不开心了,你就要哄我开心,永远都要觉得我是最漂亮的,梦里也要见到我,在你的心里面只有我,就是这样了。
电影:河东狮吼

多年之后,我有个绰号叫西毒,任何人都可以变得狠毒,只要你尝试过什么叫做嫉妒。
我不介意其他人怎么看我,我只不过不想别人比我更开心。
我以为有一些人永远都不会嫉妒,因为他太骄傲。
在我出道的时候,我认识了一个人,因为他喜欢在东边出没,所以很多年后,他有个绰号叫东邪。
知不知道饮酒和饮水有什么区别?酒越饮越暖,水越喝越寒。
你越想忘记一个人时,其实你越会记得他。
人的烦恼就是记性太好,如果可以把所有事都忘掉,以后每一日都是个新开始,你说多好。
每个人都会经过这个阶段,见到一座山,就想知道山后面是什么。
  我很想告诉他,可能翻过山后面,你会发现没什么特别。
  回望之下,可能会觉得这一边更好。
  每个人都会坚持自己的信念,
  在别人看来,是浪费时间,她却觉得很重要。
  东邪:虽然我很喜欢她,但始终没有告诉她。
  因为我知道得不到的东西永远是最好的。
  西毒:从小我就懂得保护自己,
  我知道要想不被人拒绝,最好的办法就是先拒绝别人。
  西毒:醉生梦死,不过是她跟我开的一个玩笑。
  有些事情你越想忘记,就会记得越牢。
  当有些事情你无法得到时,你惟一能做的,就是不要忘记。
  慕容:我曾经问过自己,你最爱的女人是不是我?
  但是我现在已经不想知道。
  如果有一天我忍不住问你,你一定要骗我。
  就算你心里多不情愿,
  也不要告诉我你最爱的人不是我。
电影:东邪西毒

第一、不要叫她温柔。   
  第二、不要让她喝三杯以上,否则她会逢人就打;   
  第三、在咖啡馆一定要喝咖啡、不要喝可乐或橙汁;   
  第四、如果她打你 一定要装得很痛 如果真的很痛 那要装得没事
  第五、在你们认识的第一百天,一定要去她班上送一支玫瑰,
  她会非常喜欢;   
  第六、你一定要学会击剑,打壁球;   
  第七、要随时做好蹲监狱的思想准备;  
  第八、如果她说她会杀了你,那不要当真,这样你会好受些;
  第九、如果她的鞋穿着不舒服,一定要和她换鞋穿;   
  第十、她喜欢写东西,要好好地鼓励她.
电影:我的野蛮女友

很多时候,爱一个人爱得太深,人会醉,
  而恨得太久,心也容易碎。
  世间最痛苦的事莫过于等待,
  我不知道她等了我多久,
  我一直以为我不会再有机会见到她,
  突然间,我不知道该怎么开口,
  不知道怎么讲第一句话,
  告诉她,我真的很爱她。
  原来尘世间有很多烦恼是很容易解决的,
  有些事只要你肯反过来看,你会有另外一番光景,
  我终于明白,静花水月是什么意思,
  其实情之所至,应该你中有我,我中有你,
  谁是男谁是女,又有什么关系,
  两个人在一起开心不就行了,
  今天她是小霸王,可能明天又会轮到我了
电影:天下无双

每天你都有机会和很多人擦身而过,而你或者对他们一无所知,
  不过也许有一天他会变成你的朋友或是知己,
  我是一个警察,我的名字叫何志武,编号223。
  每个人都有失恋的时候,而每一次我失恋呢,我就会去跑步,
  因为跑步可以将你身体里面的水分蒸发掉,而让我不那么容易流泪,
  我怎么可以流泪呢?在阿美的心中里面,我可是一个很酷的男人。   
  从分手的那一天开始,我每天买一罐5月1号到期的凤梨罐头,
  因为凤梨是阿美最爱吃的东西,而5月1号是我的生日。
  我告诉我自己,当我买满30罐的时候,
  她如果还不回来,这段感情就会过期。
  不知道从什么时候开始,在每个东西上面都有一个日子,
  秋刀鱼会过期,肉罐头会过期,连保鲜纸都会过期,
  我开始怀疑,在这个世界上,还有什么东西是不会过期的?   
  在1994年的5月1号,有一个女人跟我讲了一声“生日快乐”,
  因为这一句话,我会一直记住这个女人。
  如果记忆也是一个罐头的话,我希望这罐罐头不会过期;
  如果一定要加一个日子的话,我希望她是一万年。   
  我和她接近的时候,我们之间的距离只有0.01公分,
  我对她一无所知,57个小时之后,我爱上了她,
  六个钟头之后,她喜欢了另一个男人。   
  我以为会跟她在一起很久,就像一架加满了油的飞机一样,
  可以飞很远,谁知道飞机中途会转站……   
  一个人哭喊,你给纸巾他就行;
  但如果一间屋的人哭喊,你就要做很多事情。   
  不知道什么时候开始,我变成一个很小心的人,
  每次我穿雨衣的时候,我都会戴太阳眼镜,
  你永远都不知道什么时候会下雨,
  什么时候出太阳。
电影:重庆森林

当我还是孩子的时候,妈妈带我去看白雪公主,人人都爱上了白雪公主,而我却偏偏爱上了那个巫婆。
电影:《安妮·霍尔》

恐惧让你沦为囚犯。希望让你重获自由  
  It takes a strong man to save himself, and a great man to save another.
  坚强的人只能救赎自己,伟大的人才能拯救他人   
  Remember, Hope is a good thing, maybe the best of things and no good thing ever dies!   
  记着,希望是件好东西,没准儿是件最好的东西,而且从没有一样好东西会消逝!   
  Get busy living, Or get busy dying.
  忙活,或者等死。
电影:肖申克的救赎

我爱美国,它给了我财富,我用美国方式教育子女,告诉他们不能丢家族的脸    别跟我说你是无辜的,这让我愤怒,因为它侮辱了我的智慧
电影:教父

爱情这东西,时间很关键。认识得太早或太晚,都不行。
电影:2046

一个受伤的人,不知道如何接受和给予爱
电影:菊花香

我要你知道,这个世界上有一个人会永远等着你。无论是在什么时候,无论你在什么地方,反正你知道总会有这样一个人。
电影:半生缘

我愿意游荡在你身边,做七天的野鬼,跟随你。就算落进最黑暗的地方……我的爱,也不会让我成为永久的孤魂。
电影:卧虎藏龙

世界上有那么多的城镇,城镇中有那么多的酒馆,她却走进了我的。
电影:卡萨布兰卡

我爱你,再见

Saturday, 9. December 2006, 03:41:55


象命中注定一般
如火一样的那个夏天
撩人的夏日舞会
你跳向我的身边
lady shall we dance
在你说爱我的夜晚
真甜蜜啊
我爱你到永远

可哪儿有什么永远
是非爱恨已无须再辩
下一曲舞伴更换
失去的永不再返
你后悔了吗痛得想死去的夜晚
你原谅了吗爱你又把你伤害

为什么就这样地离开
为什么就不能相爱一直到我们死去呢
都去了哪儿所有爱和誓言
我流着泪的恋人啊时光已将一切更改
当我慢慢忘记你的脸

让故事再发生吧让我的人生充满遗憾
一切都不必重来什么也无须更改
生活在继续舞会从来不曾停止
一错再错的这故事才精彩

感谢你啊我勇敢的爱人
为了那醉人的夜晚我们都满身的伤痕
我爱你啊我寂寞的爱人
我毫无保留的爱过你给我的永不会忘记
失去的我曾拥有多幸运
在你最美丽时
竟让我遇见你
于是便爱上你

我爱你,再见!

贴几张有趣的图片

Friday, 8. December 2006, 09:06:33

收集的一些有趣的图片~

汉诺塔:p:

证明girls are evil::D

UNIX灭火器::cool:

Windows & Linux::idea:

牛人大全::yes: