All Stories

实现外部工具菜单

  这个特性以前就实现过一遍,那是在MFC+Xtreme Toolkit Pro下做的,想起当时的情形,完全没有任何规划和设计,真正的quick & dirty。这回是用wxWidgets实现,总的说来要比上次方便一点,但也方便得有限。   此特性分为两部分,一部分是配置用户界面,用户可以实现添加,删除,修改等操作。另一部分便是菜单项以及响应。   配置用户界面是一个对话框,我这里用wxLua实现,代码量不大也不小,总之最近总是觉得用wxLua不是个好选择,一方面似乎不稳定,另一方面开发效率不高。用wxLua最大的好处在于字符串处理方面借势Lua,还算比较趁手。   菜单项和响应部分就比较低级了,基本上都是在宿主中用C++实现了接口,然后供Lua调用。其中比较重要的是创建进程部分,以前用MFC时,这种功能都是用Win32 API写的,现在用wxWidgets了,好在wx中有这样的封装,不过感觉并不方便,但也勉强能用吧。   这个特性原本还以为半天或一天就可以完成了,现在已经大约3天了都没完成,唉,明天争取把剩余部分搞定,然后实现编辑器scheme!

回家了

  昨天跟小师妹约好的一起回去,今天早上8点半到了她楼下等她,结果居然电话都关机了,幸亏知道她同屋的室友的电话!原来小师妹还睡着,囧,睡过头了。幸亏我买早点的时候也买了她的份,等她下楼下已经9点半了。   不知道是不是因为放假的第一天,在上海的第一个收费站那里就慢慢吞吞地堵了大半个小时,真是烦躁。我们是要去杭州市三医院的,不过很郁闷的是,在高速杭州北路口拐出去后,就找不到方向了,导航也太蠢了,老是指向不知道什么地方。问了收费站的工作人员市区怎么走,好不容易到了市区,但又不知道怎么往市三医院方向走。在高架上走了一阵子,太堵了,小师妹很生气,后果很严重。我毅然决定下了高架,问了一个的哥,结果的哥居然说走高架本来是可以到的,不过好在他又帮忙指了另一条路。后来又问了个的哥,终于找到了市三医院,没想像的那么大,还找不到停车的地方,更郁闷的是停车的时候又刮到了,唉!   从医院出来大概是一个小时后了,即使有导航,还是有点提心吊胆的,不过这次似乎没怎么乱指,上了高速就好说了,但又有了另外一个问题,油不够了!小师妹说,怎么跟我出来尽是遇到意外情况啊。终于熬到绍兴界的服务区,加了油,之后总算是熟门熟路了。送了小师妹回家,我再自己回家,到家的时候已经快7点了。一天开了8个多小时,还真是累啊!

寻找同类?

  看到小师妹在日志中说寻找同类好难、心头一阵酸楚,使得我也感觉很难受,还有心疼。   回头看一下自己有比较清晰记忆的过去的十几二十年,确实也一直在不知不觉地寻找同类,只不过小些时候追求很少,有一起玩的小伙伴就觉得很满足。稍微大点了,有了一些自己想要的东西时,烦恼就渐渐增加。   那是非常孤独的日子,却又是非常希望能找到依赖的日子,但是一却找寻不到。我也不知道是从什么时候起,开始对寻找同类不抱有信心,甚至于绝望。直到昨天看到小师妹的日志,我才发现,其实我不再试图寻找同类,是因为我已经自以为找到了。找到了,并不是说就能见到,或能接触交流。那是一种认可,成为我的同类的资格的认同。只要知道ta的存在,不管ta在世界的哪个角落,偶尔能知道ta又做了什么事,那已经足够了。其他的事,就只剩下自己努力了,那些一直以来自身需要的精神鼓舞和激励,都可以从ta的事迹中获取。所以,在这个事件中,我可以高声宣布,我不孤独!   希望小师妹不再不安,同类无处不在。

做个源代码浏览工具

  Source Insight有大半年没更新了,我觉得以前一个同事说的没错,Source Insight可算是最不思进取的软件了,最后的几次小版本更新,都不知道到底有什么变动,反正我们最关心的一些问题都在。包括缺少Tab,缺少代码折叠,中文支持极差。不过总的说来,Source Insight的完成度是很高了,除了这三个缺点外,其他确实很难找出明显的问题来了。   我想做一个类似的源代码浏览工具,有几点Source Insight做得不错的地方,很值得学习。比如快速打开文件,快速查找函数和符号,上下文敏感的代码浏览,以及调用关系图示。Source Insight内建支持C/C++、C#和JAVA代码分析,其他的语言是通过扩展定义的规则实现的,这种方式也值得学习。

基本实现ZenHTML

  ZenCoding由2部分组成,ZenCSS和ZenHTML。其中ZenCSS只要简单的查表替换就可以实现,而ZenHTML相对要复杂得多。为了比较完整地给CodingStudio添加ZenCoding支持,花费了我一周时间,当然这一周我也是堕落了,工作时间和效率都很不乐观。   本来我已经发现用LPeg实现ZenCoding将是非常合适的解决方案,但看了一两天LPeg的文档后,还是有点迷糊,再看看ZenHTML的规则很少,硬编码实现也不是太复杂。   首先扫描是否当前表中已经有对应的项,如果没有,则下一步。   匹配E+E,将表达式按+分隔成多个子表达式,然后针对每个子表达式进行处理。   对子表达式匹配E>E,将子表达式按>分隔成多个包含关系的表达式,对各个表达式分别进行处理。   对表达式匹配E#name和E.name,到这步之后,E就可以查表了,而name部分仍然需要继续处理。   对name匹配E*N$和E*N,到这步后,就可以获取到所有信息了,然后向前回溯,组合成最终的字符串。   我这里的实现跟官方ZenCoding还是有点区别,官方ZenHTML是先匹配E>E,再匹配E+E的,我想我还是得照官方的改一下的。

磨刀也费时

  俗话说,磨刀不误砍柴功。对于这句话,我一直都自认为是辩证地看待的,在某些工作前,先做些准备工作可以极大地提高之后的效率,好比Kunth老爹的TeX。不过很多时候,磨刀也是件很费时费力的事情,好比Kunth老爹的TeX。   这几天一直在考虑实现ZenHTML,这是一种极大提高hard coding效率的code snippet方法。其中有一种可以认为是一种“小语言”,呃,这是《UNIX程序设计艺术》中的说法,用GoF的《设计模式》中的说法应该算是interpreter模式。不管怎么说,反正就是有一项任务是要解释字符串,根据字符串的不同表达式来作出不同的响应。   刚开始的时候我是觉得这个解析工作似乎非常简单,没有必要把它提高到“语言”这种层面对待,只要识别出两三个操作符就可以了。不过后来马上发现,实现起来并不轻松。我意识到,用Lua实现的话,用LPeg将是最合适的解决方案。今天又翻出LPeg的manual来看,还是看得有点糊里糊涂。明天继续。   所以说,磨刀也费时啊!

故事已经开始

  我不知道该给这篇文章取个什么题目,半个小时前,是先想好题目,然后决定要写这篇文章的,可是当我开始写的时候,觉得那个题目不合适,不能完全表达出我的心情、我的感受。   昨天从家里出发的时候,我看了一眼时间,那是清晨的8:14,当时只是为了计一下时,看我全程需要多久。最后停在上海的小区楼下时,时间是11点半左右,我没记清,我当时发出两条短信,分别给我当前我以为应该是对我来说最重要的两个女人。一个是我妈,还有一个……是她,因为她,我才决定来上海。   这是一个还没有开始,就已经曲折的故事。   我和她认识有5年半了,那这5年多来,一直只是在重要的节假日时互相发个祝福短信。直到今年元旦,她又发来祝福短信。然后很偶然地开始在网上聊天,真的很奇怪,为什么在那5年中,我们就没这么聊过。在网上,我们聊得很开心,至少我是非常开心。于是渐渐地,我沦陷了。我已经不能忍受没有她一起聊天的时光了。   我鼓起自己所有的勇气,我决定向她表白。那是愚人节后的第3天,那天她从上海回家去。本来说好是我去接她的,结果被她姑妈接走了。在那天晚上10点多的时候,我终于忍不住了,我一直认为表白应该是当面才显得有诚意,但是我已经没有办法继续等待,我在电话中跟她说,我喜欢她,请她做我的女朋友。无论是表白的场景,还是表白后的各种情况,都被我在脑海中预演过很多次。但果然现实是没有在我的预料中的,她说太突然了,都没有过渡的,感觉我像在开玩笑。我有点小郁闷,觉得委屈。我都已经沦陷在其中了,为什么仍会被说成像开玩笑。最后我实在没办法了,就说你就考虑下吧。   那是一个奇怪的情景,双鱼的优柔寡断从此可见一斑,于是她说就考虑下吧。挂掉电话,我觉得我应该再做些什么,躺在床上,最后想到一个很老土很容易想到的事情——写情书。恨当年,没多读些诗词古文,挖空心思总算花了一上午时间凑出几百字的小文,通过email发了出去,并用短信叫她去检查一下邮箱。她一直没理我。直到那晚上,才用短信说了下她在干吗。   之后的两天都是在浑浑噩噩中度过的。直到她要回上海的那天下午,我直接告诉她我去接她了。在车站,我们还是像往常一样的聊着,我仍然不敢在聊天的时候看她的眼睛。我像一个羞涩的小男生,我鄙视自己。送她上车后,她发短信给我,说要真实地相处一下,才有真实的感觉,嗯,我华丽丽地在真实的感觉前露出了原形。   因为要真实的相处,要真实的感觉,所以我决定,我要尽快到上海去,这样才能更多地和她在一起。我跟她约好,周六我去上海找房子,她陪我去找。那一周时间里,我觉得像是煎熬,双鱼的多疑充分发挥,我觉得她开始与我保持距离。   好不容易周六了,我乘长途汽车到了上海,然后坐地铁,直到淞鸿路跟她会面。我觉得我熟悉的那个她还在,她仍然对我很热情。我们在永和豆浆吃过中饭,开始去中介租房子。这是悲剧的开始。因为又要价格实惠,又要装修不差,这要的房子不好找,我们跑来跑去近一个下午,最后总算是搞定了。后来回忆中间的一些细节,我发现我经常会有些得意忘形。这是一个很不好的习惯,男人需要沉着并内敛,但我经常忘记,所以我不够成熟。具体一点的事说来,她总是为了房子中的各种设备、条件跟房东、中介讨价还价,而我却不时地打断她,说些不合时宜的话。照一个推友的说法,我的情商够低的。   后来晚上又让她陪着去逛了一些地方,直到晚上10来点的时候,她说膝弯的地方痛得不行了,说下午找房子的时候就已经开始痛了。我说我没感觉呀!她回到屋,我躺在酒店的床上给她发短信,我说如果明天还痛,我们就不走了,找个地方喝喝茶聊聊天。她却说,相信睡一觉会恢复的。   第二天10点钟,我从她小区等她出来,一起去买导航。我只是单纯想要买个导航,却没做过任何前期的调查工作。她问我有没有事先看过要什么牌子的,我说没有。然后两个人像无头苍蝇一样到处乱转。最后看了两家后,导航是买好了,时间也不早了,雨下得很大,我们就在一旁的真功夫吃了,然后她送我到长途汽车站。   回到家,我发现她对我似乎更加冷淡。每一天,我都试图给自己找些事情,填充自己的大脑,转移注意力。一旦停下来,又会想她为什么会这样。我回忆着我在上海时跟她一起的每一件事情,尝试从中找出一些蛛丝马迹。但是成效不大,我很无奈,我不知道我哪里做错了。父母得知我周六就要搬到上海,浓浓的不舍之情从言语、表情和行动上不停流露。我狠下心对自己说,我要勇敢,我不可能一辈子生活在父母的羽翼下。每天早上,我都是在焦虑和不安中醒来,为事业,也为爱情。她说觉得我浮夸,夸夸其谈,不踏实。我很难过,但我想知道我哪里做得不对,我问afei和王同学,结果吃惊的是afei说我对人不真诚。afei告诉我,跟人说话的时候,眼睛不要乱飘。我知道了,我跟她聊天的时候不敢看她的眼睛,以后跟她说话,我一定会注视着她的双眼。其实我经常反省自己,却发现自己仍然经常高估自己的能力,低估现实的难度。   昨天,就是我来上海的日子。来上海,我不迷茫,却充满了不安。我想我太理性,做一件事情总是会试图量化其成本和收益,从而判断是否值得。但是双鱼的感性,让我实际上做事往往只凭着一时冲动。我到达后发给她短信,却一直没收到回复。我是有点生气的,虽说是我在追求你,但你回条短信应付一下也是可以的吧。把东西都拿到屋里后,一件一件发出来,才体会到“儿行千里母担忧”的心情。我忍不住有点痛恨自己,想想我这二十几年,过得实在太失败了,既不能呆在父母身边敬孝,又没能力让父母在物质上过上比较富足的生活,甚至连传宗接代这种事都要父母操心着急,我真太没用了。   晚饭是一起吃的,还有她的室友。我在阿玛尼店门口见到她,一个陌生的她。我的心有点凉。吃饭的时候,我竭尽所能地表现得风趣幽默,结果是个杯具,一个上面刻满了“自以为是”的杯具。   今天她在网上问我,昨天为什么要讲那些恐怖的事情。我说我的出发点,是为了让你们平时多注意安全。她说,谢谢,我们会注意的。很平静,很客套。我的心很凉。她说她不能接受一个麻木的人。我理解,很理解。但我不愿放弃。我求她给我机会,让我慢慢改好,给我表现的机会。她说她是个被宠惯了的人,上次找房子和买东西,让她很无语。她还说我是被女孩子们照顾惯了,不懂照顾人。我很委屈,我打电话告诉她,这些我都会改,但得给我机会,还得在适当的时候提醒我,哪些地方做得不对做得不好。   是的,我真的从没这么委屈过,但所谓一物降一物吧。既然我决定投入了,就要认真地走下去,也许那条路有坎坷,但我仍要继续走下去。也许我会被摔得鼻青脸肿,甚至遍体鳞伤,但等以后回头来看,至少会少些遗憾。   故事已经开始,期待结局的圆满。

LuaJIT2与Luabind打架了

  其实这个问题老早就有了,当时还在Lua的maillist上提过,不过当时我只是发现LuaJIT2在执行Lua脚本时,如果Lua脚本调用了不存在的C函数时会使宿主崩溃,Mike Pall同学(LuaJIT的作者)倒是很爽快地解决了这个问题。后来发现,Mike Pall解决的只是一部分,我这里因为用到了Luabind,通过Luabind来调用执行Lua函数,如果Lua脚本又调用到不存在的C++函数,进程就会无声无息地退出,而如果是官方Lua的话,则是会老老实实地打印那些出错信息出来。   昨天忍无可忍了,就又向Lua maillist发了封邮件,今天发现Mike Pall和Daniel Wallin(Luabind的作者)争起来了,呵呵。Mike Pall说问题在Linux上和Windows/x64上都没能重现,不知道Windows/x86出了什么问题,可能是Luabind重复抛出异常了,Daniel Wallin则说Luabind只是简单地调用了lua_error,他倒是能在虚拟机的Windows环境下重现问题,最后他又给出了一段简化后的代码,只要lua_error调用后面有C++对象的析构,LuaJIT就会出问题。   我倒是偶然看到今年1月份的Lua maillist上的邮件,Mike Pall曾经说过Windows/x86上MSVC实现try/catch是用SEH实现的,这个LuaJIT处理可能有点问题。但他后来的邮件中好像又说在新代码中已经解决这个问题了。我于是用MinGW试了试,GCC 4.4.0编译出来的,确实是没问题的呢!   不过最后,又看到Mike Pall好大一篇解释,最终结论是建议所有用户都升级使用x64,囧!

入沪通行证

  刚才有那么一刹那,突然很害怕,不知道今天做了什么,几秒钟后反应过来,今天出门了,去办入沪车辆通行证了,现在这记性,真让人无语。   总的说来是比较顺利的,昨天在网上看过大致的要求,今天先跑去东关派出所,这是离我们家最近的派出所了,顺便试了试前天买的导航,除了我们村认不出来外,其他的都不错。到了东关派出所,结果被告知,因为车主是我妈,而我妈的户口是在百官的,所以得去百官派出所办,而且因为授权给我开,所以我得有临时居住证。有点出乎我的意料的是,临时居住证的办理非常快捷,只要填一张表,交两张一寸照就可以了。而我没有一寸照,就跑到东关街上那家主人本来是棉纺厂里跟我们是邻居的照相馆里立马拍了照。话说现在的拍照也太方便了,拍完后直接拷到电脑上用Photoshop改了一把,再用打印机打出来就行了。然后再折回派出所,那里的姐姐动作麻利地把其他事情一会儿就搞好了,临时居住证也是从打印机里打出来的。接着就直奔百官派出所,这时导航就比较傻了,我估计是地图没有更新,一直指向另一个派出所了。到了百官派出所,人也不多,那里的mm拿出三张纸来让我填,然后去旁边的复印店里复印了一下相关证件,就被告知等3天后就可以取到入沪通行证了。还是很顺利的啊!   我真的投入进去了,不顾一切地投入进去了,不怕遍体鳞伤,不怕鲜血淋漓,为了爱,我要勇敢!