All Stories

图形程序设计续之子图

  这次的需求中提到,能为一个图形关联一个子图,用该子图来描述该图形的内部结构信息。展现给用户的语意是,当双击一个图形时,则展示该图形关联的子图。  今天投入去实现该特性,基本没有遇到什么阻碍,因为原来的架构设计可以满足这个需要。当初把用户界面视图绘画层,图形管理器,图形对象三部分独立开来实现,所有用户操作都从视图绘画层接受,将操作信息传递给图形管理器,再由图形管理器转发给各个图形对象进行响应。在那之后,我曾经考虑过,这么做是不是有点儿过度设计,这个图形管理器的操作响应转发功能是不是多余的。现在却发现,这样的实现才刚刚好,一个子图,对应一个图形管理器,视图绘画层要始终跟踪当前起作用的图形管理器对象,任何时刻都只跟一个图形管理器进行交互。这样,没花费多少力气,只是增加了创建图形管理器,维护图形对象与图形管理器的对应关系以及销毁图形对象和图形管理器的功能,就可以实现子图功能了。  在实现这个功能时,有一个小心得,及早加入dump文件捕获功能很有用的,因为即使是开发阶段,也不是每次都在调试器中运行,所以当在自测试时偶然出现的崩溃现象,可以及早通过dump文件进行定位,而且因为是Debug版本,所以通过dump文件分析出的结果往往比较精准和明确。  除此之外,还发现一个以前没想到的现象,原来MFC中,CDocument类的OnCloseDocument方法,居然会销毁自己,及其派生类对象,如果要做些扫尾功能,放在派生类的OnCloseDocument方法中时,一定要把调用CDocument的OnCloseDocument方法放在最后。

std::copy_if?

  几天没有正儿八经写代码了,今天又咬牙写了一会儿。在完成一个新功能后,开始重构原来的代码,把其中用于BOOST_FOREACH的地方都检查了一遍,看能不能重构掉。在刚有BOOST_FOREACH的时候,我还是觉得它很简单很方便很易用的,也许是当时觉得写for循环来迭代遍历容器步骤繁琐了一点儿。自从用上了boost::bind和boost::lambda以后,渐渐习惯了作用STL中的算法来操作容器,到现在,看BOOST_FOREACH都觉得很不舒服。  今天看到的几个BOOST_FOREACH,最后被我改得只剩下一处。其中有一处,需要用copy_if算法,而STL中明显是没有这个东东的,看《C++标准程序库》一书说的,如果要这样的功能,得用remove_copy_if,它是copy和remove_if的结合体。结果我开始用的时候没有仔细看它的使用说明,拿来便用,运行结果总是和我预期的刚好相反。我一开始总以为remove_copy_if,是先像remove_if那样,把满足op为true的元素都移动到容器的最后,然后把这些元素都copy到另一个容器中。实际上是我想差了,应该是它会把源区间内的所有元素都尝试copy到另一个容器中,在copy过程中会把满足op为true的元素剔除掉。我大汗,这个算法的设计实在不好,我就觉得很纳闷,当年那帮大佬们怎么硬是不提供copy_if呢?  回到家看了看boost sandbox中的algorithm库,里面已经实现了copy_if,以及其他几个很实用的算法,看注释似乎是作为TR2存在的,可能会加到C++0x中,但那实在是遥遥无期啊!

几根白头发

  中午去吃午饭,楼梯上遇到王同学,依然是一脸茫然困顿的样子,问我去不去吃KFC,我大汗,这个时候选择去吃KFC还真是意外,问她为什么,说是要去洗头,只好去那旁边的KFC店里解决午饭了。而我原本是去食堂的,根本没带钱出来,两手空空,王同学只带了30元,外加几张KFC的优惠券,两个人就这么冲过去了。  花光那30元钱,外加一些她车上的几元零钱,基本心满意足地吃完KFC,又让王同学带我去洗头。洗完头,吹干,看起来舒服多了,这几天台风来,气温降,早上都懒得洗头洗澡,确实脏了点。猛然发现自己头顶好几根白头发,恐慌,恐惧,恐怖!

热替换不成功的bug

  升级程序中有一个热替换功能,呃,这个热替换,其实是我自己发明的词,意思是如果EXE、DLL之类的文件正在执行,文件是不能删除的,那么升级时也要能被替换成新版本的文件,而不需要相应的进程退出,这就是所谓的热替换。  之前也一直陆陆续续有bug报上来,说热替换不成功,但有时候又是成功的,于是也一直没放在心上,把它归结于Windows这个API可能有问题,当然更可能是自己用得不对。直到昨天自己再一次调试时,发现一个诡异的现象。升级程序的可执行文件叫updater.exe,其中加载了dbghelp.dll,当我升级这两个文件时,必然需要热替换了,结果发现,在文件下载完后,替换确实成功了,dbghelp.dll确实已经是新版本的了,可是当升级程序在弹出提示框,提示用户升级完成后,用户点击确定,提示框消失,那个dbghelp.dll文件又诡异地变回旧版本了!一连试了几次,都是如此,简直就是灵异事件了。  当然,不可能真是灵异,这种单线程的逻辑调试起来还是比较简单的,单步跟踪了一会儿,就发现,原来在在提示框消失后,会调用一个结束处理过程,这个过程中首先会判断当前是否正在升级,如果是,则中断升级过程,并把已经替换掉的文件还原回去。而刚好这段代码写得有问题,把是否正在升级的标志置位,放在调用这个结束处理过程后了,于是总是会发生回滚还原的操作。问题的解决很容易,只是调整一下两个过程的调用顺序就可以了。

修改升级程序

  今天花了点时间在修改升级程序。这个程序完成后,一直没有进行过有效的测试,而是直接给别人用了,呃,这里的别人指的是部门内的其他有项目升级需求的同事。实际上,至少有3个其他项目中使用了这个升级程序,但我自己却没有真实地体验过。总的说来,这个程序在功能上,基本能满足当前的绝大部分需求,从当初的质量部的地个项目中独立出来后,一次大规模重构,代码结构作了不小的调整,当然这调整的原因是原来的架构已经不能适应后面增加新特性的需求了。  曾经倒也是规划过一个比较长远的版本计划,呃,也许不能称之为版本计划,称为需求实现计划更合适一些。不过后来还是剩下几条没有实在,因为没有工作量分配过来了。今天的投入则是现在发现,在某些情况下,它会崩溃,这是最不能容忍的致使问题。不过很无奈的是,原来没有使用google breakpad来生成dump文件,现在加入了这功能后,暂时也没能把它弄崩溃,于是也压根不知道问题出在哪里。只能听天由命了!

呃,csdn blog expert?

  今天,也是无所事事地点开在csdn的blog来看,并不特意是为了看什么,只是一种下意识的行为。惊讶地发现,居然成了博客专家,我狂晕!就凭我那一年有数的几次心血来潮,偶尔想到了,才会用Windows Live Writer顺便把文章发到那上面去,到目前为止,也总共才8w多的访问量,其中不少还是自己点的,排名居然也有1500。自从确定在blogger上放置blog以来,对那的关注度实在很少很少。  由此可见,csdn真是没落了啊!想当年,大一上学期,几乎天天跑去网吧,混迹于汇编和C/C++板,下学期买了个电脑后,开始学习C++Builder,就在C++Builder板混,当时的技术氛围多浓厚啊!可是现在,那些已经消失N久的id,也早已从记忆中淡出!  呃,csdn blog expert,还真是让我觉得有点尴尬的称号呢!

想去北京

  不知怎的,昨天我突然想起北京这个一直只在书报、电视、网络上才能得到些许印象的城市来。  想到是不是该挑个什么时候去北京玩一下。想想在北京,认识的人还真不少,有中学同学,有大学同学,有以前一起灌水的网友,有以前的同事,甚至还有关系比较奇怪的,当年帮人家做毕业设计的,呃,勉强可以算是朋友吧。  想到这些人,就更想去那里旅游一下,顺便想去爬下长城,逛逛故宫。想做的事情还真多啊!

证明自己在这个世界存在过

  昨天上午跟大领导谈了后,基本确定下来辞职的事实。这2周多来,几次同领导们沟通,都被问及到底是什么原因要离职,我都一直以身体抱病需要休息,家人意见要我返回老家以及失恋之后精神不济,工作状态极差等等这些事情做为理由。嗯,其实我说的都是事实,当然也许还有一些没说出口的原因,毕竟作出一个决定,尤其是对自己来说是个关系比较重大,影响比较重大的事情,肯定是有很多原因掺杂在一起,只不过有的比重大些,有的小些而已。  昨天中午跟王同学在食堂吃饭,我兴高采烈地跟她讲我怎么和领导沟通,我要怎么处理剩下的事情,以后我有什么理想等等,荣荣就说我好兴奋啊,还真是脱离苦海了。兴奋只是暂时的,之后便是接踵而来的麻烦事情需要处理。  星期天在江江家打牌时,看到一个电视剧,里面一个坐在轮椅上的青年男人歇斯底里地大喊“我受够了,我什么都没有,我没有钱,没有健康,没有爱情……”,沉重地拨动了我的心弦。那不正是现在的我的真实写照吗?记得前些日子跟王同学在QQ上聊天,她还说“可怜的胖胖,出来几年,带着一身病回去了”,我当时可真是郁闷坏了,我可不希望这样被人同情,被人怜悯!但那却是事实。当在电视上听到那几句嚎叫时,我的心情很压抑,不过好在我马上想清楚了,我跟电视上的人是有区别的,最大的区别就是我没有绝望。我仍然对自己的未来充满了希望,尽量到目前为止,情况并不乐观,但我的选择是挣扎,而不是放弃。我不过分乐观,保持着一点应有的悲观和警惕,却不失强大的自信。我有的是远大的而自认为还算高尚的理想,并且坚信自己一定能通过努力在这条路上走下去,直到收获成果。  这些日子的所见所闻,加上和人讨论得到的启发和自己的思考。我略有点惊讶地发现,原来自己还是有点儿事业心的,只不过跟旁边的大多数人都没取得过一致意见而已。就说那天去江江家打牌,事后回想起来,真觉得有点后怕,人多了还可以一些打个牌,聊个天,要是两个人这么静悄悄的下午呆在家里,可以做些什么?还有上次,小思宇来深圳,把我叫去一起去小妞家里,那第二天下午,4个人打牌打累了,就一个一个倒在客厅的沙发上睡过去了,我也觉得后怕。那不是我想要的生活,至少不是现在的我想要的生活,那太缺少激情和活力,懒洋洋而无所事事是我很害怕面对的状态。我希望在自己有精力有能力的时候,做些事。难得活一次,做一回人,总得做点事情,留下点痕迹,证明自己在这个世界存在过……

今天面了几个人

  也算是体验了一把面试官的感觉,好好玩哦,看着有些人紧张的样子,想想当年自己在学校时那紧张的情形,只能感叹时间的匆匆流逝!