All Stories

Chrome不是只快一点点

  今天在公司网上看到有人在发Chrome的绿色可执行包,于是又好奇心起,下载下来玩了一下。以前也装来玩过,不过当时的版本还没有足够的稳定,时不时崩溃或挂起,于是摆弄了三两下就不玩了。这次下载下来的似乎则要稳定得多,毕竟是经过好久的beta测试了。   这次给我最大的震憾是chrome的速度真的很快,比IE和Firefox不是快一点两点,而是快很多!也许在外网环境还没有这种体会,因为等待的时间全耗在网络延时上了,在局域网环境下,网络延时极小,浏览器的渲染速度差异就很明显了。   本来在公司里,我也只是用3.0版的Firefox,因为用它来浏览redmine比用IE快多了,其他的应用场合主要是写wiki,用的mediawiki程序,以及看CruiseControl的报告,还有一些静态页面,比如用doxygen生成的html文档。换用chrome后,只能用震惊来形容,除开网络延时不说,真的是一点链接即出来整张页面!   不过总的说来,以chrome目前的状态,我也只能在公司里用用,写写wiki,看看报告,换到外网复杂的网络环境,chrome还不能胜任。首先,firefox有Adblock plus扩展,对广告的拦截效果非常好,用过它的人已经离不开它,chrome就没有类似的东东。其次,firefox下的鼠标手势,增强标签浏览,内嵌IE等,都是日常需要的功能,chrome也不行。再还有,似乎chrome的稳定性还是有待提高,偶尔还是会出现阻死在那儿的现象。   要是哪天firefox能弄得这么快就好咯!

用xmind画思维导图

  最近几次在网上看到有人提到xmind这个东东,今天偶然看到有安装包,也不用上网下载了,就装来试了试,是一个基于Eclipse RCP开发的,简单看了下,快捷键的使用习惯上跟MindManager是一样的,其他的常用功能也基本都有,而且还有官方的中文版本,又是免费的,实在是最佳的思维导图绘制工具。  之前试过FreeMind、MindMapper和MindManager,最终觉得MindManager最好用,但这三个只有FreeMind是免费的,用盗版的MindManager心里总有点疙瘩。现在好了,换xmind了,哈哈!

ACE还可以try...catch

  今天稀里糊涂地试了一下,把线程里的run_reactor_loop给try了一下,居然有用,欣喜若狂。现在想想真是糊涂啊,这也太扯了吧!  不过话说回来,那块的代码在上次写完后,一直心有余悸,不敢再去动它,也不愿意再看它,有点反胃的感觉。今天下决定看了看,还真发现几处bug,有没关闭句柄的,有没有添加消息映射的而处理代码却是写好了的。今天这么一整,至少崩溃问题又要少一些吧!  虽然现在用ACE已经勉强能够运行了,可我还是有点想再换回用boost::asio去。当年用boost::asio也不知道是哪里出错了,死活不能好好地连接上再互相发点数据,现在有了这点儿用ACE的基础,而且比起当初boost::asio也是正式release的版本很久了,也许一方面是我用得不对,也有可能另一方面是因为我用的从svn里直接check out出来的代码确实有点儿问题呢!

有点儿疯

  星期天去参加1783的石头河溯溪,结果被小路晃点了。溯溪回来跑去南山找阿布拿手机,然后去他家吃晚饭,见到了他老婆,真没想到啊,他儿子居然2岁多了,真以为是90后的呢!吃完饭,坐了一会儿,一群人决定去唱K,结果不知道喝了多少酒,反正第二天是谁把我送到的士上的我也不记得,迷迷糊糊回到家,倒头就睡,于是,一天没上班!  今天去上班,不知怎么的,情绪很低落。整了个版本给人测试,发现根本没法用,几个严重问题,崩溃、崩溃、还是崩溃!以前的设计有问题,或者说压根没考虑到后来会需求会变化那么大,这实在是可以原谅的。这次还有一个重大的变化是,模板文件中加入了宏,于是用COM操作后再关闭会问你要不要保存修改,尝试了半天,发现只要先关闭workbook,再关闭workbooks,再退出就可以了。因为关闭workbook时有个参数可以指定是否要保存修改,而且关闭workbooks时则没有,会自行弹出个消息框来确认。

浮云

  昨天晚上是网络产品线的新年晚会,下班后从公司坐车去宝安体育馆。今年的待遇好很多,每个座位上都有一包小东西,里面有几个小面包,一盒牛奶,还有造势用的东东。  晚会内容倒是没什么新意,年复一年,于我无关。  一切皆是浮云。

继续Lua

  又看了一会儿PIL,以及云风blog上的一些文字,以及Lua Manual等等,终于有点眉目了。  完全可以下放权力给Lua,让它来创建wxScintilla对象,然后通过某些方法,把这个对象返回给C++,在C++看来,就是一个lua_touserdata吧。  至于如何保存和索引这个userdata,从PIL中看到,可以保存到registry中,也可以在registry中再多加一层索引,放个weak table。而索引方式,可以用一个C++指针,在Lua看来是lightuserdata,作为索引的最好方式之一,不过我还没想明白,到底怎么转化为实际生产力。倒是看清楚了些registry的操作方式,就是一个表,只不过该表在Lua栈中的索引是固定的值。还看清楚了些weak table的工作方式,weak table,也许叫weak hash或weak map更能让习惯用C++的人明白些,里面的每一条记录,都是一对key和value,而这个weak table可以将它的key,或者value,或者两个都是设置成weak的。weak的意思是说,假设我这个值(key,或value,到底是哪个,要看这table的属性,把metatable中的__mode域设成\"k\"或\"v\")已经没人用了,就把这条记录在垃圾回收时都删掉。原来就是这么一回事,PIL中说,应用lightuserdata时,要结合weak table来用才好,并一笔带过举了个窗口消息处理的例子,我没看明白,晕!其实,我想我是知道作者的意图,我在Lua中创建了userdata,一方面要能方便地供C++和Lua两边都能使用,另一方面,要防止Lua自作主张地把userdata回收掉。用weak table大概就是为了能让程序员来控制userdata销毁的时机吧。

看PIL一脸茫然

  今天没干什么事,看PIL去了,结果一脸茫然。昨天兴奋地以为用luabind就能把那些问题都解决了,实际上高兴得早了点,而且我也想偷懒到极致,用SWIG生成胶水代码后,再在C++和Lua中进行无差别地使用对象。我现在的应用场景是,在C++中创建了对象,如何在需要的时候,调用Lua脚本的某个函数时,在那函数中能方便地访问到那个对象进行操作。看LuaTinker是可以把C++对象直接映射到Lua脚本的某个全局变量中去,不过我感觉使用全局变量不太好,而且是C++在主动做事。我希望的是这样一种形式,C++在调用Lua函数时,把该对象的指针作为参数传递过去,Lua函数能根据这个参数取得实际的对象,进行操作。在网上又看了些文章,感觉这应该是一种很常用的用法才对,也不知道别人是怎么用的。  初步的想法是C++创建对象时,用lua的newuserdata来分配空间,在这空间内进行创建。然后有了个地址,即指针,把这对指针和数据保存起来,可能用得到设施有registry和weak table,还有lightuserdata这种东西,但具体怎么用,还没搞明白。看PIL云里雾里,还是得写些代码实验一下。

新版luabind

  今天偶然看了一下luabind的官方网站,发现1月4日时有0.8版出来了,让我有点惊喜,想想上个版本0.7,是2006年1月时放出的,沉寂了20个月,2008年10月才有0.7.1。中间这漫长的近两年时间,让我都以为这个项目太监了呢。  兴匆匆地把代码下载下来。印象中,网上有人说过luabind不需要事先编译,直接把源代码加入到工程中一起编译就能用。不过我这次还是想试试把它编译成单独一个库。看到0.8只有一个Jamroot,设置好LUA_PATH和BOOST_ROOT,把bjam.exe复制过来试了几次,说找不到什么文件或者目标,晕,对bjam可是一点都不了解,也不知道从何下手。从网上看到有人说luabind只能用VC7编译,我诧异了,还是想试试MinGW的编译。直接自己输命令行g++来编译,只要设置好lua和boost的包含路径,是可以编译的,每一个.cpp文件都能编译通过。最后从0.7里提取出makefile来,这个makefile也有点问题,编译命令行参数要改一下,主要是包含路径,然后就可以用MinGW编译生成一个libluabind.a了。  这下好了,苦恼了很久的怎么让Lua脚本使用C++对象的问题应该很容易解决了。至于MDI中多个视图的问题,简单点,就每次都把当前激活窗口的视图指针传给脚本,稍微麻烦一点的,用C++写个方法来获取想要的视图指针,返回给脚本使用。昨天研究了wxScintilla.h文件,直接用SWIG就可以生成一堆胶水代码,不过还没有试过能不能正常使用,想来应该没什么问题,对SWIG的好感不是一天两天了,哈哈。

编译Xerces-C++和wxLua

  因为考虑到要跨平台,所以不能用MSXML了,而且对于MinGW能不能直接使用MSXML我都不抱希望,于是在几个开源的可跨平台的XML解析器中进行选择,并且只能是用于C/C++的。候选项包括expat、TinyXML、libxml/libxml++、Xerces-C++。我不喜欢expat的实现方式,也不习惯TinyXML的只有DOM的解析方式,而libxml/libxml++则是因为捣腾了一阵子还是没能用MinGW正确编译,最后的选择只剩下Xerces-C++。而实际上编译Xerces-C++也花了我一些时间。网站上最新的是3.0.0,倒是有VC7、VC8、VC9的编译好的包,不过我要MinGW的,所以下载下来源代码,看了一下网站上的说明,先装好msys,选好参数运行./configrue,就会生成makefile。而这生成的makefile似乎并不能直接用MinGW的make过,需要稍微修改下,也就是把其中所有的什么dirstamp目录的创建和依赖都删掉,方能编译。  编译wxLua稍微好过一点,不过一开始绕了点远路。从CVS下下来的源代码,到build/msw下找makefile.gcc文件,这个文件少了写了两个编译选项,以致于在生成库时在链接时总是去找WinMain,开始不明所以,硬是把LDFLAGS设为-shared,在编译库时是没问题了,但编译出来的.exe文件就不行了。后来发现只要添加LINK_DLL_FLAGS := -shared和LINK_MODULE_FLAGS := -shared就可以一切正常了。当然wxLua依赖于wxWidgets,所以事先要设置好WXWIN和WXCFG环境变量,而且最后面不能有反斜杠。只要设好了这两个环境变量,用VC9倒是可以很顺利地编译过。  有些时候不免要抱怨一下,开源的东西,易用性可能确实差了点。