2010年6月30日星期三

多重继承与dynamic_cast

这几天在做Ogre、CEGUI类句柄功能时,突然想起一个问题:

如果一个类继承自两个基类,比如C继承自A、B,若取类C的基类B的指针pb,那么使用dynamic_cast应该还是可以将pb转回指向类C的指针的,也就是以下代码成立:

class C : public A, public B
{
};


C c;
B *pb;
pb = &c;
assert((void *) pb != (void *) &c);
assert(dynamic_cast pb == &c);

之所以说pb可以转换让我值得琢磨,是因为C的基类A指针具有如此特性,那是非常容易理解的,如例:

A *pa;
pa = &c;
assert((void *) pa == (void *) &c);
assert(dynamic_cast pb == &c);

也就是说pa指针从数值上等于&c,这样pa指向的类使用的vtable就是类C的vtable。而pb显然不等于pa,一般也不等于&c(至于是pa等于&c,还是pb等于&c,这点也许是编译器的特性,我不能肯定C++的标准是如何定义的,但是gcc和msvc都是让pa等于&c)。也就是说pb使用的vtable不是类c的vtable。

倘若pb使用的是类B的vtable,那么dynamic_cast如何知道pb实际上是一个指向C的基类的指针呢?确切的说,它不可能知道,而dynamic_cast又能正常的工作,那么也就是说,pb使用的vtable,绝非是类B的vtable,于是我做了一下实验以确认:

#include <stdio.h>

class A
{
public:
    int a;


    virtual ~A() {};
};


class B
{
public:
    int b;
    virtual ~B() {};
};


class C : public A, public B
{
public:
    int c;
};


class D : public C
{
public:
    int d;
};


int main(int argc, char *argv[])
{
    B b;
    C c;
    D d;
    B *pb1, *pb2, *pb3;
    C *pc;


    pb1 = &b;
    pb2 = &c;
    pb3 = &d;
    pc = &c;
    
    printf("pb1.vtable = %p\npb2.vtable = %p\npb3.vtable = %p\npc.vtable = %p\n",
           *(int *) pb1, *(int *) pb2, *(int *) pb3, *(int *) pc);


return 0;
}

根据结果,同样是类B的vtable,原始B类,在C中的基类B,在D中的基类B,其vtable都是不同的。

这意味我们在定义基类时,需要关注一点,每一次派生,都会生成相当数量的vtable(具体数量看其直接、间接继承的基类数量)

我觉得类继承机制是C++语言的一个非常糟糕的机制,可能是第二差劲的语言特性。继承过程混淆不清,而且隐藏了很多指针变换的操作,不易理解,而且也非常的危险。

我更倾向于类似Java那样的接口机制。如果可以重新设计C++语言的话,我会支持这样做:

  1. 一个类可以继承若干接口
  2. 类实例有一个接口类列表,指向所有的接口类;每个接口类实力有一个owner指针,指向派生类
  3. 调用时自动选择相应的接口类,如果重名,需要指明名字空间

看病、时间、统筹

前几天预约了医生,今天下午去看病。

下午2:20出门,5:50回到家,一共用去了3个半小时。但是其中只用了10分钟和医生交流,10分钟送化验,剩下的时间都是在等待,算下来有效的时间利用率是20/210*100%=9.5%,尚不足一成。

这真是让人郁闷,每每要去医院,我都觉得格外的痛苦,因为等待实在是太浪费时间了。

下次,我应该把电脑带过去,统筹一下,也许可以节约不少的时间。

2010年6月29日星期二

诸葛亮的军事冒险与项目开发

刘备死后,诸葛亮屡次北伐,试图占据中原。当年看到这段故事,唏嘘不已。只是小时候不明事理,没有多想,后来三国历史了解的多了一些,才觉得有些不妥。

先看一下三国之后晋国时期的人口资源,以便参考:

故魏国143万户
司州 户475.7K
兗州 户83.3K
豫州 户116.8K
冀州 户326.0K
幽州 户59.0K
平州 户18.0K
并州 户59.2K
雍州 户99.5K
凉州 户30.7K
秦州 户32.1K
青州 户53.0K
徐州 户81.0K

故蜀国31万户
梁州 户76.3K
益州 户149.3K
宁州 户83.0K

故吴地74万户
荆州 户357.5K
扬州 户311.4K
交州 户25.6K
广州 户43.1K

三国时期人口略少,但比例类似。算下来魏国的地理占天下近半,人口更是占了近6成(中国南部大部分还属于无人地区或是少数民族占据),而且北方经济发达、士兵身体素质好、还占据了出产良马的地方,魏国朝政没有严重缺陷,军事力量也很稳健,魏蜀两国国力相差实在悬殊(人口相差近5倍)

注:关于地理可参见三国时期地图(请无视新疆部分)。

按照道理,蜀国丢失荆州以后,已经基本没有争取天下的能力了,后来刘备搞了一把军事冒险,结果在夷道猇亭被陆逊大破,蜀国就彻底没有机会了。诸葛亮一次又一次,连续折腾了三次,纯粹是抱着侥幸在冒险,最后死在五丈原,殊为不智。

十多年过去了,我做了几个项目,又看了若干项目才真正明白过来。诸葛亮并非不智,而是大智。我都能看到的问题,他岂能看不到?诸葛亮手里的资料齐备,各郡钱粮人马一目了然,他又是治国高手,蜀国无力和魏国争锋,孔明心中自然有数。

但是,做项目只要有一线希望,就必须坚持,各代开国帝王,有几人是很有希望夺取天下的?之前的刘邦、刘秀、曹操哪个不是从一线希望中挣扎而出的?他们运气稍微差点,早就死了无数次了。诸葛亮坚持北伐,就是指望万一捡到一个大漏(就像刘邦当年袭取三秦,简直就是捡来的),或许就做成了。

做项目成功就像是投骰子,有一定的几率,哪面朝上只能听从神的安排。但是,投几次骰子却非上天注定,而是取决于自己的意志。诸葛亮运气差点,投的是12面骰子,几率很低,虽然如此,他也要努力多扔几次。

可惜,诸葛亮还是疏忽了一点,想投几次不光看国力,还要看体力,他老人家身体不好,54岁就挂了。要是能像司马懿那样多活二十年,没准项目就让他做成了。锻炼身体才是王道啊!

所以,做项目成功的三要素:体力(能扔几次)毅力(愿意扔几次)、实力(扔的是几面骰子)

2010年6月27日星期日

头文件与正确编译

P02项目在Mac、Linux下的makefile是没有头文件的依赖规则的,如果修改了基类的头文件,往往需要重新编译整个工程。

昨天为CEGUI增加句柄功能,需要修改Window基类,以继承RootClass类。但是我在调试的时候,工程会莫名其妙的崩溃,看了一下,怀疑是依赖头文件的源文件没有编译。于是我把CEGUI & CXCentaur全部都编译了一下,并且在相应模块的源文件中打印sizeof(CEGUI::Window)看看是否一致。

结果发现sizeof(CEGUI::Window)大小一致,但是问题没有解决,很有点奇怪:

Window::d_children这个列表本应为空,但是在gdb中打印时,一开始为0,再打印却不为0,我设置了内存断点,但是并没有断下。代码中取d_children size()使用的函数是Window中的getChildCount()函数,于是在CEGUI::Window::getChildCount设置断点看看,却发现gdb提示有3个断点。想了一下,知道了原因:

因为getChildCount函数是定义在头文件中,属于inline函数。这说明还有文件引用了修改的头文件,但是未编译更新。于是我把整个工程rebuild了一次,问题即解决。

如果只是build跨平台版本,无需制作依赖关系,倘若需要在平台下开发调试,不制作依赖关系成本还是过于高昂了。

2010年6月19日星期六

取多重继承类中子类的偏移

当一个Class继承多个基类时,如何取其中各个基类相对偏移?

通过类型转换即可,如下例:


#include <stdio.h>

class CBase
{
public:
    int b;
    virtual void vbase() {}
    void base()
    {
        printf("CBase::this = 0x%p\n", this);
    }
};

class COther
{
public:
    int o1;
    int o2;
    virtual void vother() {}
    void other()
    {
        printf("CBase::this = 0x%p\n", this);
    }
};

class CDerive : public CBase, public COther
{
public:
    int d1;
    int d2;
    int d3;
    void derive()
    {
        printf("CBase::this = 0x%p\n", this);
    }
};

// Get the offset of member in class
#define GetOffsetOfMember(member, CClass) (((int) &((CClass *) 1)->member) - 1)

// Get the offset of sub class in derived class
#define GetOffsetOfClass(CBase, CSub) (((int) (static_cast <CBase *>((CSub *) 1))) - 1)


int main(int argn, char *argv[])
{
    printf("COther@CDerive = %d\n", GetOffsetOfClass(COther, CDerive));
    printf("o1@CDerive= %d\n", GetOffsetOfMember(o1, CDerive));
    printf("b@CDerive= %d\n", GetOffsetOfMember(b, CDerive));
}




需要注意的是,不要直接使用指针0进行转换取类指针偏移(这是计算类成员变量的常用方法)

2010年6月18日星期五

清、民国地图


民国

清朝丢了海参威、库页岛,真是让人痛心疾首啊!否则何惧第一岛链?

元、明地图

元初

元末

明初

明末

五代、宋地图

五代十国

北宋

南宋

隋、唐地图


初唐

中唐

晚唐

南北朝地图

宋、北魏

齐、北魏

粱、东西魏

陈、齐、周

三国、两晋地图

三国

西晋

东晋

2010年6月17日星期四

秦、汉地图


西汉

东汉

商周地图


西周

东周

2010年6月16日星期三

丁原、荆州、并州

这两天在家里看了一下新三国,无意中想起一件事,吕布第一个侍奉的主人丁原,三国演义中说是荆州刺史,而刘表一直据荆州,为荆州刺史、进荆州牧,有丁原什么事情?另外,吕布、张辽都是并州人氏,这么看上去丁原是并州刺史还差不多。

查了一下资料,果然如此,演义弄错了,丁原是并州刺史,而非荆州。

当年司马懿装死,忽悠李胜的时候,李胜说自己要去荆州,司马懿故作听说,说是去“并州”?

没想到罗贯中自己用了这个典故,却也弄错了荆州、并州。

2010年6月15日星期二

blog搬家完毕

昨天折腾到夜里一点,早晨起来折腾到16:45,终于将所有的帖子从baidu搬迁到了blogspot。

说起来真是有点累,所有的帖子要复制,调整格式(直接复制格式不美),设定时间,还要填写天杀的注册码(一天发帖太多,网站有限制),这个过程很是繁琐。所以,工具是个好东西,可以极大地提高效率。倘若由机器来同步,那多省事呢?还好我的帖子比较少,不到300。当然,如果帖子真的很多,我非写工具不可。

大雨倾盆

昨天看天气预报,据说南方7省会有大雨,福建就是其中之一。

早晨起来,看外面地上有点湿,以为雨已经过去,心想这雨并不算多大。早饭吃饭,发现开始下雨了,短短几分钟,雨已经很大,风更大,吹得雨都打横了,真可谓倾盆大雨。这个天气躲在家中不用外出真是幸福!

ps:这个房子的开放式阳台设计的不错,虽然风如此之大,但是阳台上晾晒的衣服却纹丝不动,几乎不受风。

2010年6月14日星期一

文章搬家

前几天看了看自己以前写的blog,觉得有些帖子有点意思,但是现在仍然留在baidu的blog。为了将来整理方便,我决定完成统一大业。

查了一些搬家工具和网站服务,也试了一些,觉得不是很靠得住,想想原来的帖子也不多,干脆就人肉搬家算了。

说实话,我还是很喜欢baidu的blog的,风格很简约,只是有几点觉得不爽:
  1. 不能管理评论
  2. 不支持Chrome(按照道理RT控件应该是支持的,但是JS里面多了一个判断,不是IE和FF自动枪毙了)
  3. 会管制文章(这倒不是baidu的错)
顺便我把blog的风格换了一个,看看效果如何。

Mac下菜单栏没有响应的问题

测试P02的Mac下版本的时候,无意中发现菜单栏点击没有响应,虽说这不是什么大问题,毕竟玩游戏时基本不会点击上面的菜单栏,但是我感觉很不舒服。

我记得以前曾经遇到过这个问题并且解决了 (后来项目组的人把代码框架重构以后又引发出来了),但是我却不记得原因了。仔细查了一下,应该是没有使用系统提供的RunApplicationEventLoop(),而是用了自己编写的消息循环的缘故,代码如下:


        // 从队列中取消息,不要等待
        while (noErr != ReceiveNextEvent(0, NULL, kEventDurationNoWait, true, &theEvent))
        {
            // 获取到了消息,传送给分发器目标
            SendEventToEventTarget(theEvent, target);
            ReleaseEvent(theEvent);
        }

因为游戏有自己的主循环,每次循环时会PumpMessage,而RAEL是阻塞的,不适合使用。如果用Timer来控制每帧渲染的话,一是定时器本身不准确,另外则是会影响应用程序框架。倘若是一开始设计的时候倒也无妨,现在去修改消息框架显然不是什么好主意。

因为RAEL会自动给应用程序安装一个事件处理器,用于处理menu bar,而我无法模仿这个过程(没有RAEL的源代码),而且网络上也没有人给出RAEL的实现,所以只好迂回一下。

每次PumpMessage的时候,我不用自己写的消息循环,而是给自己发送一个自定义消息,然后启动RAEL,RAEL可以自行处理所有的消息,而我的自定义消息时会使用QuitApplicationEventLoop()通知退出消息循环。

代码如下:

    // 检测队列中是否有消息
    if (ReceiveNextEvent(0, NULL, kEventDurationNoWait, false, NULL) != noErr)
        // 没有消息,不需要处理
        return;

    // 给自己发送一个自定义消息,当收到此消息的时候则中止消息循环
    if (CreateEvent(NULL,
                    kEventClassCustomSignal,    // Class
                    0,                          // Kind
                    GetCurrentEventTime(),
                    0, &event) != noErr)
        // 无法创建事件 - 异常
        return;

    // 将消息发送到主队列中
    PostEventToQueue(GetMainEventQueue(), event, kEventPriorityStandard);
    ReleaseEvent(event);

    // 进入消息主循环
    RunApplicationEventLoop();

当然,事先需要注册对kEventClassCustomSignal的处理函数:

    switch (eventClass)
    {
    ///////////////////////////////////////////////////////////////////////////
    // kEventClassCustomSignal
    ///////////////////////////////////////////////////////////////////////////
    case kEventClassCustomSignal:
        // 这个消息是进入RunApplicationEventLoop之前应用程序自己发送的一条
        // 消息,用于通知消息循环结束了
        QuitApplicationEventLoop();
        break;

    ...

注册这个消息的代码很简单,略去。

这样做可以解决菜单栏没有响应的问题,但是仍然有一个缺点,就是RAEL在处理菜单消息时会阻塞,这样帧渲染就会停止,还是有一些遗憾。我想了一下,在不能深入了解Carbon实现过程的情况下,只能通过多线程解决这个问题。由一个线程专门处理RAEL,而消息回调的函数必须Take全局的Mutex以免出现回调的问题,当然这样仍然可能出现重入的问题,要想解决这个问题就要保证主循环在运行时RAEL没有访问临界资源,这样必须让主循环每次希望渲染时和RAEL进行同步,就目前来说,我暂时还不打算把事情弄得如此麻烦。

在做完以后,检索资料的时候发现原来有一个人已经给出了类似的解决方案了,而且似乎比我的方案更加完善,当然,他也没有解决会卡住主循环这个问题。具体资料见:developer.apple.com/legacy/mac/library/qa/qa2001/qa1061.html

Carbon毕竟是已经被淘汰的技术,也许使用Cocoa可以根治这个问题。但是目前应用程序框架有一些不太合理的地方,部分操作系统界面、消息相关的代码分散在几处,没有抽象成单独的中间键,这导致想切换到Cocoa的工作不是那么容易。

如果框架不合理,就会束缚代码的更新啊!

ps:Eclipse用起来感觉还可以,折腾了半天总算把符号功能弄好了(一开始检索总是会CPU 100%然后崩溃),搜索速度也算是马马虎虎。但是和VC比起来,感觉还是有一定的差距的。

2010年6月13日星期日

无微不至的关怀

我在写《网络时代de变化 - 第三只眼睛》一文的时候,估计会被baidu消灭,因为当年我曾经写过一篇关于PX项目(谁还记得这个事情吗?)的文章,随后被删了,因为我没有留备份,很是懊悔。而那篇文章本身是站在中立角度,并非指责执政者的,也遭到此待遇,因此我总结了一下规则,简单来说:敏感事情一概不许议论。就连我这种阅读量寥寥无几的微型博客都能照顾到,我也就不抱侥幸心理了。所以那篇文章就没有转贴,以免麻烦。

没想到我这篇《69骚乱、新闻、这年头!》文章居然也被收拾了,其实我觉得这件事情近似闹剧,只是沾了点世博会的边而已。




今天转贴的时候无意发现这篇文章被设置成私有的了,从这个字面的意义上来说就是不允许其他人阅读,不知道为什么没有删除,是留作证据?还是温柔一些了,允许你没事自己看看?

当然,不排除另一种可能性,就是我按错了什么快捷键,不小心把文章设置成私有的了(当然不可能是我有意这么做,因为我不知道怎么操作才能设置为私有的)。

识时务者为俊杰,既然关怀无微不至,那就不说。

ps:从可靠性这个角度来看来,搬家到blogspot到获得了一个额外的便利 - 不便之处就是总是被墙。

ps:《网络时代de变化 - 第三只眼睛》一文中引用的tianya帖子已经被删除了,我估计baidu cache也被清除了。不过事情总是发生了,如果没有解决,只会让谣言更有市场,进一步的削弱了大家的信心罢了。

2010年6月12日星期六

必先利其器-开发工具

这几天用Mac下的P02,有几个问题不爽,于是想修改一下。

如果偶然改一些配置,调整一些简单的逻辑也就罢了,倘若修改的逻辑比较复杂,牵涉的不熟悉代码较多的时候,我就发现开发环境很不爽,工具严重匮乏,于是需要找一下合适的编辑器和其他辅助工具。

我先试验了一下Textmate,这个软件口碑很好,但是用了以后实在不习惯,放弃。试验了Eclipse,感觉不错,可以和我平时的习惯保持一致,但是一是启动慢,二是没法直接设置为双击打开文件(因为Eclipse不能打开C文件,必须打开工程文件),必须把文件拖到Eclipse里面,有点不爽。陈拓琳推荐了JEdit,感觉不错,编辑习惯也很一致,但是我用了一段时间发现它在搜索方面做得非常不好,有时候剪贴板里面的内容无法复制到搜索输入栏内,而且搜索的速度太慢。就搜索而言,Eclipse好一些,但是也成问题,不能在一瞬间找到相关的符号,搜索出的结果看上去不清楚,不够方便。

编辑工具本身虽然过关,但是符号工具还需要再找。想尝试用ctags,但是尚未研究透彻如何和编辑工具很好的集成,需要继续尝试。

除此之外,调试工具也很重要,虽说gdb已经足够我使用,但是如果要作比较复杂的逻辑调试,命令行的工具使用起来还是觉得有些罗嗦,需要再找找。

原本XCode集编辑、符号、调试功能于一体,但是我用起来总是不习惯,远不如VC来的顺手。而且,我并不打算使用XCode的集成式project,所以还是要自己build整个环境会爽一些。

ps:Path Finder用起来比Finder舒服多了,不过这个软件是收费的,另外,Search for content时好像有点问题。

2010年6月9日星期三

开源的好处

第一次体会到开源的好处。

昨天收到外包美术试做的人物动作,是一组图片,需要快速播放,但是Mac下的Preview似乎不能做到这一点(总之我不知道)。我找了一下,没发现Mac下有什么合适的工具,倒是找到一个开源的Mac下看图软件Xee。

试用了一下Xee,我发现有个问题:它可以以幻灯片方式连续播放图片,但是最短间隔时间却是1秒,用来看动作明显不合适。好在这个工程是开源的,我将代码下载下来,小小的修改一下就可以满足需求了。这一刻,我觉得开源真是一件好事!

最早,软件本不收钱;
然后,比尔盖茨让大家明白,软件是要收钱的;
现在,GNU组织告诉大家,软件要免费共享。

究竟软件该不该收费?这个问题我想过一段时间,很纠结。软件产品凝聚了开发人员的心血和劳动,免费的确说不过去,但是如果按照Copy收费,我认为又太夸张了,毕竟软件Copy是0成本,这使得软件产品的边际效应太明显。

现在看来,大部分软件就应该免费。因为随着时代的发展,合格并且有热情的程序员越来越多,而很多商业软件已经发展到了一个瓶颈,很难突破,这时开源的软件会渐渐的赶上来,品质和商业软件越来越接近,最终达到所有软件都免费的情况,只有一些很冷门的专业软件才会收费。

软件不收费,那么软件工程师如何实现价值呢?我想软件将作为硬件产品、服务产品的一部分存在。像显卡驱动,它实际上是和显卡一起出售的。又比如各类网站后台的程序,是和网站服务一起出售的。软件工程师,相当于装修工人,负责完善产品。而最终用户需要的,是某种物理意义的产品,而不仅仅是一个代码拼成的软件。

ps:Object-C我很是不习惯,改这么简单的一个功能我还得先扫语法盲。C的方言都有这么多,程序员还真是浪费精力。

69骚乱、新闻、这年头!

晚上上QQ,问MM做啥,MM发了一个天涯的链接给我,我点开一看,标题很纳闷:“『娱乐八卦』 [道听途说]69圣战实况转播”,我没看明白什么意思,就去搜索了一下。

事情的大概经过是这样子的:

韩国人在5月30组织了Super Junior(我第一次听说这玩意,原来是一个13男的组合)的演唱会,由于种种原因(各类消息众说纷纭,不评价),有一个帮粉丝没能进去,现场秩序一度有些混乱(程度不详),于是出动了武警维持持续。事后,有些中国网民去爆了SJ的官网(以某种形式DDOS了网站),然后SJ的粉跑到韩国官网上代表中国人道歉,引发了其他网民的极大不满意,召集各大论坛网民于6月9日冲击韩国网站。

相关联接很多,一查就知道。

我在Google搜索“69圣战”时,看到96200个结果,本来尚不以为意,后来一想,今天就是6月9日啊!这年头,新闻出来的真快,也就是半天的工夫,很多有模有样的稿件就发出来了。我看了一下Google trend,最近几个小时这个关键字的搜索量急剧上升,估计baidu只会更厉害。


我的看法:

  1. 不知道是谁的错。韩国说是咱们的,我们说是韩国人故意搞饥饿营销,号称发5000张票,但是实际发500张,事实我不知道,无法评价,但是组织者明显有错。
  2. 包括SJ的粉和搞什么圣战的,我看就是精力太旺盛没处发泄了,这些精力用在干活上多好,要么去睡个觉,散个步什么的多好。
  3. 为了和谐捂消息,又有什么用?也就捂了10天,徒然浪费公信力罢了。
  4. 现在新闻的速度真快。
  5. 当今的世博会,早已失去当初的本意,这个炫耀工业革命成果的盛会,已经沦落成为“文化交流”的大杂烩了。


2010年6月7日星期一

网络时代de变化 - 第三只眼睛

参见:http://www.tianya.cn/publicforum/content/funinfo/1/2049009.shtml

我必须先引用这个帖子,因为它的内容实在是令人震撼。

高考作为中国最为神圣的领域之一,坚守标准几乎不被污染。当然,其中肯定不乏暗流涌动,只是难为人所知。于是这片净土看上去挺美,但是在本文中却打破了这层玻璃。

网络时代终究和以往有些不同了,信息传播输入之快,挖掘之深远非当年可比。看到这个消息,我颇有一些失落。我当然知道一种可能,就是一中的老师参与出题,事先给学生押了题,但是,我很难接受这一点 - 因为在6月5日才上网求助,时间未免太迟了。而且,我更倾向于相信这个求助的学生不是第一个知道消息的人。

Anyway,以上只是猜想,不论是否发生,我都期望高考系统可以做得更好。

ps:因为引用的帖子可能会被删除,所以在这里解释一下引用的帖子,这不是杞人忧天,因为baidu已经删除了相关提问。


6月7日高考,湖南语文作文的考题是《早》,在6月5日baidu知道有人发帖:关于“早”的议论文,求助有人代写,baidu知道的问题如下:


急求关于“早”的高中议论文 800左右.......谢谢了 


虽然baidu删除了此问题,但是通过快照仍然可以查询到的确有此页面:


http://cache.baidu.com/c?m=9d78d513d9d431a44f9b9e697b17c0106a4380122ba1d60208d18448e2732b465017e5ac26520772d3d20b6c16ae394b9bf02104471451c08cb98e5e9afbcc2775ce6176671df55c0f9b43f49d1578d620e70abaf44fa0adf045c2f38dce9c13048b155e27dced885d0510c06cf21137f4a6ee1253004e&p=9c61c54ad5c700f70be2933e164a&user=baidu

参考baidu快照的图片:

关于发帖人mao17622845通过其他资料确认是长沙一中的,见下图:



预见未来(Next)

上blog的时候无意翻阅了一下自己的资料,发现自己喜欢的影片写了两个:《回到未来》,《黑客帝国》。想起之前看过的一个片子《预见未来》(尼古拉斯凯奇主演的那部)也很让我喜欢,于是就修改了一下资料,把这个片子也加上去了。

仔细想了想,能够让我非常喜欢的片子都是和虚拟(Virtual、时间(Time)有关的。相比之下,这三个片子我最喜欢的应该是《预见未来》,从艺术、票房成就上来说,这个影片不见得有多出色,但是对我而言,影片中对递归搜索的深刻诠释,的确是能引起我的共鸣。作为一个程序员,很值得去体会一下它的意味。

和这些影片对比,阿凡达这类效果极为出众的片子,固然可以给我带来视觉上的冲击,但是很难让我喜欢上它。

看病

前几天厦门下了一场雨,有点凉,结果我就开始咳嗽,一连三个星期没有好转,于是今天早上趁P02项目组放假去医院看了一下病。

早晨8:25就到了第一医院,从医院门口就是车水马龙,进去一看,真是人山人海。不知道是这年头得病的人越来越多,还是大家越来越关注健康问题。总之每次看病我都觉得是一场挑战,是人和人竞争资源的一场搏斗。

挂号、就诊、缴费、拍片、开药、付款、取药,这个流程我已经是异常熟悉了。正因为熟悉,才觉得恐怖,每个环节都意味着排队,时间多长无法估计,总之是一个消磨耐心的过程。

说实话,即使看病不贵,张悟本他也有市场,如果喝绿豆汤就能解决问题的话,我宁愿吃上三斤绿豆,免去排队。只是,我实在无法让自己相信这个骗子。让我怀着恶意揣摩一下,如果在他的号召下,大家都去吃绿豆而不去看病的话,也许我去医院就会省事很多?阿弥陀佛,罪过、罪过!

2010年6月3日星期四

名字和命运


中午听到一个八卦消息,据说危地马拉出现了一个大坑。
搜索了一下资料,果然如此,而且3年前也出现过一次类似事件,同样是地陷,造成一个大坑。
中文译名“危地马拉”果然有道理,这个国家的地面确很危险。
林子大了,什么鸟都有,足够多的事件,可以营造出无限离奇的巧合。

起名字真的很难


今天无意看到一篇帖子,列举了一些歌名,很有意思。
1. 王心凌《爱你》,S.H.E《我爱你》,Beyond《真的爱你》,李宗盛《我是真的爱你》,言承旭《我是真的真的很爱你》。
2.王菲《如果你是假的》,邓丽君《假如我是真的》,萧正楠《假如我是假的》,孟庭苇《真的还是假的》 。
3.成龙《我是谁》,蟑螂《忘了我是谁》,蔡依林《你是谁》,许志安《忘了你是谁》。
4.萧亚轩《一辈子做你的女孩》,龙梅子《下辈子做你的女人》。
5.朴树《我爱你 再见》,丁薇《再见 我爱你》
6.苏永康《男人不该让女人流泪》,陈小春《女人不该让男人太累》。
7.姜育恒《爱我你怕了吗》,孙燕姿《害怕》,王力宏《不要害怕》,潘玮柏《我不怕》,赵薇《不怕》,郭美美《不怕不怕啦》,郑伊健《怕什么,什么也不怕》。
8.董文华《春天的故事》,杨千桦《夏天的故事》,陈艾玲《秋天的故事》,马天宇《冬天的故事》。
9. 王心凌《honey》,孙燕姿《honeyhoney》,萧亚轩《honeyhoneyhoney》
这让我想起,P02(也就是之前的问鼎)起名的时候格外的痛苦,想到一些不错的名字,统统都有人使用了。我一直在想,会不会到了某一天,无名字可起了?现在看来,就歌曲而言,还真有这个趋势。