All Stories

春节过完啦

春节过完啦

  1月21日下午3点半就从公司走人了,到柯桥、绍兴路段堵了一会儿。   除夕,小丫头给我发短信说最近遭遇了很多很多不幸,跟做梦似的。她爸爸过世了,给人家干活时从屋顶摔下来。她自己流产了。我不知道自己可以做些什么。橙子在Facebook上说,还是放不下吗。我说,我想关心她,却没了以前的那种男女之情,倒有点像亲情。   春节的行程比较充实,初一中午在家接待干妈一家,晚上去干妈家。初二去大姨家。初三在家休整。初四接待大姨小姨,下午还去上坟。初五晚上去小姨家。初六,就是今天,到上海。   木有宽带的日子,真不习惯啦!

嵌入的CLR引用销毁的C++对象的问题

嵌入的CLR引用销毁的C++对象的问题

  今天彻底打酱油了,我们shared dev team也只剩下我,老大和Jason三个人了。因为晚上2点才睡,才睡了不到6个小时,于是下午就坐在办公椅上睡了近1个半小时,最后是被他们讨论一个bug的声音吵醒的,啊哈哈,老大还说让我看一下,现在只有我在这方面有经验了,我囧,我完全没经验的说,后来还是Sherman厉害啊!   再后来,就跟老大讨论了一会儿C++ singleton的实现,以及跨DLL数据引用等等。问题是有个Watson的bug,我从一次crash的call stack中发现,程序在调用_exit后,该程序中的static object应该是已经瞬间被无声息地干掉了,所谓无声息的,就是说,连它的析构函数都没被调用的。但这时嵌入的CLR还需要做一部分扫尾的工作,而恰恰是这扫尾工作又反过来调用了那个貌似已经被干掉的static object,于是程序crash了。当然这只是我的猜测,我猜测嵌入的CLR就是要生存周期长一点,于是一直在代码中试图找一下它是怎么从C++端嵌入CLR的,然后怎么用CLR的。我发现的情况貌似是这样的,先用Managed C++写了一个dll,这个dll可以在DllMain,还可以导出函数,而据我前些天才知道的知识,.NET编写的普通的DLL形式的assembly跟原本的DLL不一样,没有DllMain的。而这个DLL通过导出函数返回一个对象的指针,这个exe程序通过GetProcAddress获取导出函数,再调用这导出函数获取对象指针。这个返回的对象呢,是个CLR Bridge,也就是说,通过这个对象,可以从C++端创建CLR中的对象,调用CLR对象中的方法等等。也就是说,从代码中,我没看到Jeffray Richter在《CLR via C#》中说的那种CLR host的方法。现在我仍然在怀疑,是不是我代码没看全,但我确实之前也在整个代码目录下搜索文本,没有那几个用于host CLR的API调用。似乎有点跑题了。然后我就跟老大说了一下我发现的这些情况,略微讨论了一会儿,老大表示自己也不知道,唔,其实我也不指望他知道,只是有这么一种想跟人分享自己的发现的欲望而已。基本上,我就觉得这很可能是此bug的root cause了,但老大说可能只是个cause,而不是root cause,好吧,其实就是缺少验证而已。一个比较有说服力的验证方法是自己用C++写个小程序,然后用相同的方法调用CLR中的代码,最后能制造出同样的crash,只是我最近木有动力去做这些事而已。另外就是,即使确定了这是个root cause,简单地说来,这个root cause应该就是对象销毁的顺序不对,这是可以肯定的,但之后也不好fix,因为这个程序实在太庞大了,有很多对象,然后引用关系也很复杂,以我目前对它的了解程度,根本没能力对理顺这个关系,于是也就fix不了了。而且还有个另外的问题是,那个static object是该程序中用于实现singleton的一种方式,我觉得比较奇怪,老大说,这是为了应付多线程的情况。还有种应用多线程的singleton实现方式是在create instance时加锁,唔。关于这个话题,在前段时间看到TopLanguage group中有个讨论,提到boost中某个库中的singleton实现,貌似很干净的实现,不用锁,也不是static object,能适应多线程,囧,具体的不记得了,貌似boost中有好几个子库中都有自己的singleton的实现,得再去看看代码才行,另外好像《Modern C++ Design》里也有对多线程singleton实现的讨论,春节放假看看去。   话说,今天还看到Mono,发现除了有Mono Touch外还有Mono for Android,不过免费试用版都只能在emulator上跑,最便宜的个人版license也要399刀。不禁大骂Qt的不给力,为毛只能为Symbian和MeeGo用,Android port至今还在alpha...

木马机,电子书

木马机,电子书

  有个同事,平时看我在公司里用手机连公司的WIFI,很是眼热,一直问我怎么用。我就告诉他,要装个ProxyDroid,而且手机得root先。这样持续了将近1个月,今天他突然跑过来对我说,都怪你都怪你,现在我的手机刷得只剩下闹钟了。原来他的HTC G12昨天被他用什么一键root软件强行root,结果不能启动WIFI了。于是今天中午和另一个同事一直在OF外面折腾这手机,希望能恢复WIFI。结果还是没有什么进展,而且最后从网上看到,似乎他的G12是所谓的木马机,笑死了。   今天看到,豆瓣推出阅读器了,除了Web版和iPad版,毫不意外地有Kindle递送服务。说起Kindle,之前有一段时间我非常想买一个电子书,当时只考虑了1000出头的Kindle3和500左右的Bambook,不过好在每当一有这种强烈的购买欲望时,都有一股理性的声音说,你不是个爱看书的人!然后就拖到现在也没有买。自从上次去上海图书馆,亲自把玩了一会儿Bambook,非常庆幸自己没有一时冲动买了这么个设备,这页面切换的速度太慢了,效果太难看了,版式也很丑,啧啧!不知道Kindle到底怎么样,得找个地方也亲身去体验一下,才能决定到底能不能符合我的要求啊。

打印设置bug几乎搞定

打印设置bug几乎搞定

  把Charles Petzold的关于打印的那章代码拿来都试了一遍,发现PopPad工程里的过程就是我想要看的。对比了一下代码,沮丧地发现貌似两者只有获取到DC的方法不同,PopPad里是PrintDlg返回的,而bug里的代码是通过CreateDC创建的。但之后也发现了,这个代码很奇怪啊,不但有CreateDC,还有CreateIC,经过调试发现,大部分时候都是在调用CreateIC的,这让我纠结了好一会儿,想不明白为什么要调用CreateIC,MSDN上明明说的CreateIC返回的DC是不能用来画东西上去的,只能用来查询信息的。又经过几次调试,发现CreateDC是在打印前在调用了n次CreateIC后最终会被调用一次的,这时候才发现,传给CreateDC的DEVMODE*居然里面的dmCopies值一直是1,而我明明需要的是2啊!于是我就猜,是不是application层把明明是2个copies合并成1个了,然后相当于只打印1个copy,于是打印机的设置只对第1份copy起作用。因为这个猜想,又小小地郁闷了一把,该不会要去调试application层的X++代码吧。不过马上,在kernel层的call stack乱翻,翻到其中一个地方,硬是把所有dmCopies值都改成1了!把这行代码注释掉试了下,果然如愿可以把设置应用到第2份copy上了。我猜,当时这代码的作者大概是考虑到不是所有的打印机都支持multi copies的,所以干脆把这个字段都改成1了。然后就是写邮件啦啦啦啦啦!   这事一了,人突然就松懈下来了。

继续bug fixing

继续bug fixing

  又回到以前那种每次写blog都是写工作内容的流水帐的状态了么,这是不是意味着离我辞职又不远了。   好吧,上午还是在继续折腾SQL Server版本兼容性的bug。主要的代码昨天就修改完了,今天要提交code review,就再仔细检查了一遍,然后发现,因为多加了一个.cs文件,于是在enlistment的根目录下build所有工程的时候,某一个工程会出错。之前加了这文件,是直接在某个目录的sources文件,嗯,类似于makefile的一种文件里,添加了新增加的那个.cs文件路径就好了。于是在整个enlistment里搜遍了所有sources文件里的内容,愣是没在其他sources文件里找到有引用这些文件的。后来看了一下error log,发现它是在进入某个目录build时报的错,到该目录下又不死心地看了下sources文件,没找到要添加文件路径的地方。后来看到一个.csproj文件,打开看了一下,死马当活马医,把新文件路径加进去再build,居然通过了。艹,这个build system太贱了吧,不同的工程用不同的描述方式。   下午继续折腾打印设置不生效的问题。好吧,一点头绪都没有,一点进展都没有,跟几个同事讨论了下,几乎也没有有价值的提示。现在还剩下两件事可以做,一是试试其他report的打印有没有这个问题,这可以基本上确定root cause是在application层还是kernel层,大体上我现在是比较倾向于认为是kernel层的问题,大概就是打印API使用的问题。二是自己写个打印demo,仔细观察一下打印API的工作方式,也就是通过这个demo来模拟bug的运行流程。   好吧,我又无聊了,又写工作上的事了。

bug fixing, team building

bug fixing, team building

  今天可是过得很纠结,两个bug开始全都一愁莫展。一个是打印设置的bug,搜索了一下以前的相关bug,看现象跟我现在的这个很类似,结果人家只是改了一下DOCINFO中的datatype字段的取值就搞定了,到我这里就不知道该怎么进行下去了。下午就在折腾另一个bug,安装程序在安装extension时只检测了SQL Server 2005和SQL Server 2008,于是在只有SQL Server 2012的机器上进行不下去了。需要修改的代码还是有好几处地方,照样画葫芦地改了一下,结果拿给人家测试时因为强命名的问题折腾了近一个下午。这里顺带提一下,如果把assembly拿到64位的Windows上去测试,用sn添加验证入口时不光要用32位的sn添加一遍,还要用64位的sn添加一遍。而且要注意的是,这个sn运行是在测试机器上运行的,不是开发机上。后来才知道,原来tester们有一个job跑一下,一台测试机就可以彻底屏蔽掉强命名的验证的,叹气。不过还好后来在在下班前终于编译了个private build让tester去测试一下,晚上回住处后看了一下公司的邮件,tester说在32位和64位机器上都测试通过了,稍稍心安了一点。   晚上team building,在蜀香村吃饭,算是农历年年前的散伙饭。Fiona也来了,她在元旦前辞职后就没见过了,估计这次也是最后一次见她了吧。她比我稍微晚一些日子进的team,实际上她是build team的,接触并不多,只有过两三次因为build上的问题打过点交道,但感觉是个很nice的人。很瘦,说话轻声轻气的。

去了趟上海图书馆

去了趟上海图书馆

  自从两年多前从老东家辞职以来,这是第一次进图书馆吧。   交了100元押金,办了张普通的借书证。用RFID技术的整个图书馆流程上基本可以做到无人值守也能很方便地运作。   去一楼的中文图书外借馆里看了看,书并不很多,甚至感觉跟以前我读的那大学,以及以前那那东家的图书馆里的藏书差不多多。可能这里的特色是古籍,珍本,孤本什么的收藏多吧。另外,几个阅览室里的座位也并不多,而且无一例外的是没有空位的。   总之,比较失望。

迟了一周的总结和计划

迟了一周的总结和计划

  好久没来更新了,本来照往年的习惯,跨年时总会写点过去一年的回顾和对新一年的展望的,不过这次12月31日晚上就回浙江去了,然后没有宽带,于是也就没写。后来每天都有每天要做的事,于是一直拖到现在。   2011年是很折腾的一年,7月底又跑到上海来了,然后生活上,发生了一些很狗血的事件。本来到上海,主要是为追寻爱情而来的,可是仍然没有收获。至于事业,也是毫无进展。意外的收入是靠着Ninayan这个小程序,上半年Nokia送了一个C7,下半年CSDN主办的Qt应用开发大赛匆匆提交后,得了个二等奖,奖品是N8。从4月份开始找工作以来,就没怎么写过代码了,看到之前自己写的那些代码竟感到特别陌生。   2012年,可能会是有很多事发生的一年。想去旅行,说了好多年的北京,以及突然这两个月突然冒出来的新加坡。要努力写程序,赚钱。现在计划中有三个项目。一个是烂摊子,要改。另两个还没开始。   然后,可能是消失。

组装了个台式机

组装了个台式机

  已经有好长一段时间了,在自己组装个台式机还是买个MBP之间难以抉择。昨天突然想,我就去徐家汇看看行情,我不买。果然还是没忍住,只是问了第一家,就决定买了。我对机器的需求非常简单,CPU要4核的,主频低一点没关系,内存要大,至少4G,最好8G,硬盘也要大,最好1T。其他的就比较随意了,能用就行。   只是没想到的是,现在组装机,还是比我想象的要贵一点。不过最后调整了各部分的预算,总算在3880块拿下来了。硬盘是500G的,现在就是贵了。内存倒是2*4G的,结果拿回来发现只能认出4G来,在网上找了一堆的解决方案,有硬件问题的,有软件设置问题的,最后我的情况发现是有一根是坏掉的。于是今天下午又跑了一趟徐家汇换了。那个上游卖家态度真他妈的想揍他,说什么他是专业换这个的,我懂么不懂云云。   昨天让我特别想要买个电脑,是因为这两天跑Eclipse把我伤到了。在那双核CPU,2G内存的Mac mini上卡得要死,笔记本上也很悲剧。唉,即使买来了,就认真写程序吧。