博客

  • 让座

       有些年头没挤公交车,差不多已经忘记那种赶车挤车的滋味儿,某日去沟里接宝贝女儿借机找回了点感觉,其间有件事儿感触颇深,定要上来写写才好。

        那日天气极佳,很想跟萌萌多走几步路,沐浴一下冬日里难得的和煦阳光,如果不是乐购边上的卫生间维修,我们也不会那么着急赶车的,眼看着要关门,我横抱起萌萌就往车站跑,因为步调不协调导致上车前狠狠扭了一下脚脖子(感统的问题?!),不顾疼痛的我咧咧叭叭拎着小丫头好歹算是上去了。车上人真不少,司机见我如此狼狈,很仁义地拨下按钮广播道:车上有需要照顾的乘客,请您让个座位……立刻觉得心里暖呼呼的。

        刚刚站稳当就听见有人说:“姑娘,带孩子过来坐吧!”定睛一看,居然是位老大爷,于是很感激地解释说我们只有一站地就下车了,老人慈爱地看着萌萌说他的重孙子也这般大小。说话的当会儿,不经意瞥见近座位上年轻帅气的小伙儿,就那么稳稳当当地坐着,神情自然,丝毫不理会我们,因为不是上下班时间,车上老人特别多,站了一大片!他居然可以那么面不改色心不跳,我也实在是佩服了。

        快要下车的时候我搂着萌萌往车门处走了几步,又有一位老奶奶招呼小丫头去她那里坐,又谢过说马上就下车。

        回去后把让座的事儿跟大家讲,都觉得很无奈,这年月是怎么了,居然要老人给小孩子让座。哎,世风日下啊,现在的年轻人不懂得尊老爱幼,不知道文明礼让,雷锋是谁更不可能了解,真不知道再过几十年,等我们老了会是什么样的境况呢,担忧中!

  • Lua runtime code reading Lua运行期源代码分析阅读

    image 

    You could download the project for VC2008 in http://groups.google.com/group/lua5/web/lua_vc2008.rar

    The project will use parameter like "c:\test.lua", and the lua script like above image.

    The code starting point is pmain().

    (更多…)

  • Google的Go编程语言使用初探

    Go编程语言是Google中一些大牛(尤其是有着plan9前科的大牛们)如Rob Pike,Ken Thomason这两位赫赫有名的程序高手、技术作家。

    很多人认为Go编程语言有点像是C语言与Python的混血,在Golang主页上也清楚写着Go的祖先有C,有Pascal/Modula(也是C++的祖先)/Oberon,还有CSP这个语言,另外很多基础代码也来自Plan 9操作系统。

    我是在一个Ubuntu9.10的虚拟机上试用的Go,大家可以跟着我的脚步一探Go的究竟。

    1,准备

    安装Go之前需要安装mercurial,这是Go的版本控制工具,可以直接通过ubuntu的安装程序搜索添加。

    然后为当前用户定义下面几个bash变量。在ubuntu下敲入cd $HOME,一般是/home/username,然后敲vim .bashrc,修改.bashrc

    在这个文件中添加如下(我的cpu是intel,所以是GOARCH是386,具体可参考golang.org说明):

    GOROOT="$HOME/Go"

    export GOROOT

    GOOS=linux

    export GOOS

    GOARCH=386

    export GOARCH

    GOBIN="$HOME/bin"

    export GOBIN

    在帮助里写GOBIN是可选的,但我试了,必须有。

    在.bashrc最后还要加上这一行,保证能正确编译安装。

    PATH=$PATH:$GOBIN

    2,下载源代码编译

    在你的用户目录下运行这个命令

    hg clone -r release https://go.googlecode.com/hg/ $GOROOT

    这样在你的用户目录下应该有个Go目录了。

    确保你的ubuntu安装了gcc(可以在软件包管理中添加build-essential)

    进入Go\src

    然后敲./all.bash

    如果前面没有问题,编译应该可以正确完成。编译后可以进入$HOME/bin查看是不是有6g 6l 8g 8l这样的可执行文件。

    image

    3,试用Go

    一般x86机器是使用8开头的命令,如8g进行编译,8l进行链接,6开头的是给AMD cpu使用,如果编译安装没错,那么$HOME/username/bin这个目录应该已经在PATH中(可以通过echo $PATH确认)。

    这时候应该hello world了,编辑一个hello.go如下:

    package main
    import "fmt"

    func main() { 
        fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n");
    }

    运行8g hello.go编译,正常情况下什么都不提示就执行完了,但是ls可以发现多了个hello.8文件

    运行8l hello.8链接,会产生一个8.out.

    运行./8.out应该打出如下消息:

    image

    然后可以进入Go的目录中(因为我设置的有问题,下载Go的目录名是hg,但是不影响什么),有个test目录,进去test目录,运行./run命令。

    image

    image

    也可以单独编译某个代码运行,如果正确的话,不会有任何提示信息输出。

    OK,基本上Go编程语言的大致试用情况就是这样,真正要学Go编程语言的朋友,还是需要花时间来读文档,写写代码不断练习的。

  • 如果外星人来了

    刚看完《V星入侵》第一集,感觉还是非常有意思。

    故事的开始非常像《独立日》或者是《第九区》,外星人的飞船降临到了各个大城市上空。

    如果是中国编剧,会如何写一个和谐的故事呢?也许是这样:外星人来到中国土地上,被勤劳善良的中国人民所感动,哭着喊着要加入中国国籍,死活也要住在我们的帝都。弄不好外星帅哥美女还会爱上我们的美女帅哥,下一代混血可以有更多故事讲。最好他们也认毕老爷,上“星光大道”唱个爱国歌曲啥的。

    你把外星人改成外国人就知道了,这就是正在编着演着的故事。

    这里面无论是外星人还是外国人,都是那么的友好帅气可爱,个个都有阳光的笑容、金发碧眼。文化冲突、爱情火花是一定要有的,结局一定要是光明的。

    不过美剧的编剧基本上都是悲观主义者,实际上从威尔斯以后,大多数的科幻作家对于未来的想象都是悲观的(早期中国科幻的代表作《小灵通漫游未来》只能算是儒勒凡尔纳“乐观科幻”的滥觞)。

    在当代中国科幻作家中,我最喜欢刘慈欣,不仅仅是因为他的作品够“硬”,而且也足够理性。

    刘慈欣的代表作《三体》就讲述了一个外星人与地球人的故事,只是他笔下的外星人是为了侵占地球的资源,手里拿着的不是鲜花而是武器。

    其实看看历史就知道了,带有侵略性扩张性的高等级文明与相对原始的文明接触,故事往往都是悲剧性的。比如美洲的印第安人,比如南美的印加文明。当然也有相对落后的文明毁灭高等级文明的,比如蒙古人入侵中原,比如满清入侵中原(我不认为他们是中华民族的一份子,他们只能算是文明的毁灭者),这种特例只出现在高等级文明的扩张性极弱或者低等文明有着超水平的军事力量(而且往往也有超级军事领袖存在)的前提下。

    如果我们与外星人相遇,是应该握手还是举枪呢?有选择的前提是我们的科技水平军事水平可以与外星人匹敌。如果外星人真的来到地球,这基本上标明地球人已经可以认命,期待外星人不喜欢吃地球人的肉,期待他们真的只是为了传播文明(可能性小到没有)。我记得以前看到过一个说法,说外星人既然能来到地球,代表他们的文明要高于地球人,道德水平应该也高于地球人,所以会善待地球人,诸如此类。这个基本上属于一种幻想,假如外星人看地球人就好比地球人看神户肥牛,那么我们就等着被人吃吧。牛有没有智力?牛之间有没有交流?猴子有没有智力?猴子之间有没有交流?应该是有的,但是人一样吃它们,不是么?看看美国人如何对待印第安人,看看澳大利亚如何对待土著人,看看西班牙人、葡萄牙人如何对待土著人,看看英国人如何对待土著人,你应该就知道结局了。

    当然我们可以期待,如果有吃人的外星人,应该也有”地球生物保护“这样外星人的组织,呼吁不要吃这些长着四肢,表情丰富,繁殖力很强,非常破坏环境的生物,因为他们(或者是外星人眼中的“它们”)丰富了地球物种云云。

    OK,总而言之,如果外星人来了,我们到底应该怎么办呢?你们不管,我还是回火星吧。

  • 勿用屠龙来杀猪-论如何正确整合Lua与C++

    经常有人问到关于Lua的问题是“Lua如何能使用C++的成员变量?”“Lua如何调用C++类的成员函数?”“C++的复杂数据结构(如数组)如何传递进入Lua让Lua可以使用?”

    这些问题之频繁,几乎每天都可以看到。问题的起源也很简单,这些提问者大多是C++程序员,公司需要使用Lua,他们就想如何能够“完美无缝”整合C++和Lua。

    如果在谷歌中文(google.cn)搜索Lua关键字,第一页大概前五六个网址中会有云风的这篇文字《Lua 不是 C++》,里面的结论部分十分精彩:

    对于那些新接触 lua 的 C/C++ 程序员来说,我的第一条建议通常是:看看 lisp/scheme 吧,可能 lua 的血统里,scheme 的成分比 C 更多一些。要不玩一下 Haskell ,增进对函数式编程的了解。C++ 借助 template 是可以玩玩函数式编程,但很少有人真的去用。进入 lua 的领域后,你得正正经经的理解一下了。

    Lua与C++不是一种语言,Lua的产生也不是为了让C++这个大奶高兴,它的地位是独立的。

    我在twitter上发了这样一些感慨:

    感觉这里面有百分之五十的问题都是c++如何导出所有类型给lua,lua如何调用c++成员变量、类成员、内部函数。这些人太纠结了!思路不对,就跟把c++当做高级c来使用一样。展开一点说,这种用法的来源,首先是设计人员脑子不清楚了,lua与c++的边界完全混在一起,没有把接口最小化,以及适当简化,就是c++完全贴到lua上。清晰地api(通用意义上的),就是定义适当的操作,可以扩展,但是不过分耦合。lua和c++应该是哑铃状连接,而不是水桶。

    为什么Lua与C++无缝整合有问题,原因很简单:任何一个有经验的程序员都知道,如果两个系统之间是紧密相连到成员函数成员变量都可以随便调用,那么这两个系统的耦合度一定是相当高,容易出现的问题就是难扩展、难修改、难维护。这两个系统不如直接整成一个系统算了。

    如何正确使用Lua与C++?

    首先第一个问题是,你的系统谁是主导?Lua还是C++?首先搞清楚这个问题。因为主导的部分代码将作为框架出现,负责调用或者响应事件、逻辑。如果Lua与C++的代码都做同样的工作,那么这个系统的设计是有问题的。

    第二个问题是,你的系统里面,作为主导部分想开放那些接口?(我们姑且认为Lua与C++的中间连接部分为接口interface)。两个系统之间,不需要完全整合,只要开放必要的接口或者说是API即可。在著名的《Designing Qt-Style C++ APIs》中,作者Matt总结了下面6个优秀API的特点:

    总而言之,Lua本身有它自身的特点,如函数式编程,尾调用,变量无类型等等,这些特点与C++是截然不同的,如果你非要把C++与Lua弄得无缝整合,将来一定会因为这个高耦合产生各种各样的问题。

    就如我在twitter中说的那样:编程弄得这么纠结,何必呢?!