All Stories

好大一块巧克力

  大牛上周从俄罗斯出差回来,今天给了我好大一块巧克力,哈哈!  单从包装外来观察,这块巧克力厚就不止1cm吧,宽不止10cm,长不止20cm。包装上全是俄文,我也找不出哪里写了具体的体积规格参数,手头也没有尺子可以量一下,反正就是很大一块。中午猫猫还说,大牛把最大的一块给我了,给她的就没有我的大,哈哈,想起这个就觉得开心!  我们公司的人去国外出差,习俗就是带当地的巧克力回来给同事朋友们尝尝。以前吃过那位cm0同学不知道谁给她的德国巧克力,薄薄的一盒,里面是一小条一小条,味道比小卖部的德芙好多了。只可惜我是没什么机会出国出差了,除非赚了钱自己去旅游去。  其实我很喜欢吃巧克力的,只是太容易长胖了,哈哈!

解决构建时间超长的问题

  今天终于搞明白为什么昨天构建我的项目要2个小时了,原来是内存耗完了!  本来一直没这种问题的,也就昨天突然发现,我的项目集成构建一次,最多的时候要206分钟,瀑布汗!当时还以为是中间的哪个环节出问题了被阻塞在那里了,看了下进程状态都是好的,主要的时间都花在doxygen生成文档上了。但看看doxygen也是正常的,有条不紊地dot。  其实昨天就已经搞好了,因为当时发现本来2GB的物理内存,又设了2GB的虚拟内存,可是看看整个系统的内存使用量居然也是3GB多。关了一票的没用的进程,包括普通应用程序和系统服务,发现又变快了。  今天重启了系统,同样关掉那些没用的服务和应用程序,再看CruiseControl,终于恢复正常了,15分钟就能完整地执行完一次构建!  唉,服务器资源还是有限啊!

先把框架搭起来再说

  一直沉迷于网络小说,完全属于玩物丧志的类型!今天无聊完,郁闷完,打开VS来,决定先把框架搭起来再说。  总的说来,这是一个需要用外部脚本和配置文件协同扩展才能让业务逻辑正常运行的系统,而C++部分纯粹是为了实现用脚本比较困难的核心功能。虽然想了很久很久了,但一直迟迟没动手,玩物丧志是主因。  另一个不太重要的借口是,没找到好用的开发工具。微软的一个很好的实践是dogfood,很早以前看《微软的秘密》一书时就知道这个了,前些天听那微软的专家交流时,又看到这个,觉得很有趣。像Code::Blocks和CodeLite都是典型的dogfood,使用自己来做为开发工具。而我目前还处于一片空白的阶段,被Visual Assist X惯坏了的我又受不了其他工具的弱智,于是一直停在那里。今天想通了,就用VS来作开发环境好了,先用VC编译一个debug的wxWidgets,要retail版本时,就写好makefile,用gcc来编译。  这次恢复系统后,只装了个VS2008,这一方面可以让我不至于为众多的选择而分心,同时也减少多版本并存而可能出现的各种奇怪问题。前两天把原本只能用VS2005打开的WIND工程尝试着用VS2008打开,居然没崩溃,高兴之余把用WTL封装了的Scintilla代码也精简了一把,删掉了几千行代码,这下应该更不会崩溃了吧!

用wiki记录开发文档

  前天,公司请MS的人来做交流,我也去听了一下,虽然只听懂了20%~30%,还有有翻译,尽管翻译的水平不咋的,连蒙带猜的大致上也能搞明白他在讲什么。其中让我印象最深感触最深的一个实践,是用wiki记录开发文档,其他人也可以修改文档,有新人加入时,就可以通过wiki进行学习,我深以为然。  昨天,老大提出,我们项目组也要组建公共知识库,也包括开发文档。有个同事提出,他倾向于使用Word文档来进行记录这些内容。这不禁让我开始思考,用wiki和用Word来记录开发文档,各有什么优缺点。  大体说来,我是倾向于用wiki的,因为我觉得wiki的形式更能鼓励人们不断跟着代码变化而自发地更新文档,并且wiki一般自带版本管理功能,使用更方便,另外一方面,开发文档并不需要多丰富多样的格式,有简单的文本和插图一般够用了,而Word文档拥有的其他功能,可算是累赘了,比如要比较两个版本的差异,就相对要麻烦一点点。  说到底,我其实最看重的是wiki形式的约束下,人们会更多地完善文档,我们项目组目前的一大问题是,并没有多少文档,代码中偶尔有几行注释就算是全部的文档了。假如我们也像产品开发人员那样有非常详细的从SRS到HLD,再到LLD,那用wiki和用Word文档,或者其他什么记录形式,根本没有区别。

template method果然安逸

  今天去把那几个函数重构了,第一印象中用template method pattern是可以解决的,于是翻了下GoF,里面对template method的描述基本没出我的意料之外,还是可以理解的,不过可能是受限于当年的C++技术水平,也可能是其他未道明的原因,GoF中说是在派生类中用覆盖方法实现的。  我却认定了要用callback,因为我想用boost.function和boost.bind,于是三两下就搞好了,果然很简单,而且仔细想想,似乎相比用继承的方法实现,我现在的方案有一个优点是,可以把可变逻辑控制在更小的粒度上。比如本来我是一个算法的几个步骤,其中一个步骤是调用STL中的算法,而该算法需要一个谓词,这个谓词是可变的量,该谓词要被提取出来,这可以通过boost.function和boost.bind实现得像一个closure一样,在template method的领域内不需要知道谓词的具体实现形式,它只知道它接受一个boost.function,该function接受一个参数,之后返回一个值,至于到底是用functor实现,还是C global function实现,或是C++ class static function实现等等,它不需要关注,因为boost.function会打理好一切。而如果是用继承的方法实现,可能我就需要把那整个调用STL算法的步骤提取出来了,这样粒度就大了,就削弱了原本使用template method的意图和优势了。另外还有一种方案,还是用继承,只把谓词逻辑提取出来,STL算法调用时,用boost.bind来封装,但我想这是行不通的,因为编译期并不知道要调用哪个派生类的方法。  用boost.function和boost.bind实现template method果然安逸,design pattern果然只是一种思想,而不受限于实现,哈哈!

加多4个tab页

  今天整了一天,把原来的一个列表,整成了5个tab页分成的5个列表,每个列表显示不同的内容。  这次是深切体会到当初设计的草率,把许多应该放在文档类中的数据成员和方法都放到视图类去了,结果现在本来还是同一份数据,要给多个视图共享使用时,就需要大量的修改。  不过这样的修改从长远看来,说不定是塞翁失马。不光结构上有调整,在某些接口实现上,也有修改。总的说来,比又前更合理,更简单。  当然一天下来,功能匆匆忙忙实现了,代码实现细节上却没有多加考虑,还是需要后续重构的。比如有一份代码,在4个视图类里各写了一遍,应该是用模板方法可以重构掉的,还有份代码,在2个视图类里各写了一遍。以前遇到这种情况可能会头痛一下,现在有了之前的使用boost.funciton和boost.bind的经验,应该很自然地能解决了。  本来这个需求并不是最紧急的,但是一方面我自己比较想做,另一方面,它涉及到的面比较广,早弄好,其他部分也方便点。

初玩PSP和NDS

  周日头脑发热,去买了一台PSP2000和一台NDSL,总共花掉2700大洋,我哭丧着脸跟同事说,半个月工资就这么没了。同事则也说还好呢,才半个月工资。我说难道是要想想那些花掉2个月工资的。  买回来,其实没玩多少,因为对我来说,还是有很多方法打发时间的,消磨时间并不是我买它们的主要原因。为了省钱,我没买那些数据线,所以也不能自己下载游戏来玩了,都是铺子里给我装的几个。  简单玩了一下,发现NDS这个机型的机能不足了,确实只能从游戏性上下功夫了。有一个Mario篮球游戏,通过触笔来控制人物进行各种篮球运动中的动作,比如运球、传球、射篮、抢断等等;有一个养宠物狗的游戏,可以通过触笔来做手上的动作,比如挠痒、抚摸等等,还可以通过语音来实现命令的下发,比如呼唤宠物,让宠物做动作。总之,因为有了麦和触摸屏,游戏的方式就改变了,虽然它的色彩不如PSP丰富,运算性能没有PSP强大,但它的游戏趣味性和多样性可以做得比PSP好很多。  PSP的屏幕分辨率高,上面的游戏画面效果真是令人震撼,当然这也跟它的处理能力强悍有密不可分的关系。当然有点让我觉得无趣的是,PSP除了可以玩游戏,还加了太多其他功能上去了,看视频什么的,我觉得完全没必要嘛!

轻车熟路的需求实现

  今天去整编辑器了,加上了函数定义的跳转功能,总共大概花了4个小时左右吧,因为没有功能良好的语法解析器支持,所以基本没什么技术含量可言了,就是判断一下当前光标所在位置的单词,假设该单词是一个类的方法名,去数据库中查询一下该方法所在的文件路径和行号,如果有多条记录,则弹出个对话框,列出所有的位置,让用户自己选一个。  下午的时候跟老大说,老大竟然说我做那么快,看来以后得多分点任务。我郁闷!不过做这部分的时候,倒确实有点轻车熟路的感觉。添加对话框,给对话框添加必要的控件,给控制添加必要的消息响应,等等。以及添加新的类,在类中实现该它实现的功能。  不过又想到语法解析器,没有它,做什么都是残废的,唉,什么时候一定要抽时间实现一个。

恢复系统的心得

  从学校出来后,重装系统的次数大大减少,自从买了个本本,只是恢复过一次,今天是第二次,当然不算帮别人装的。  为了减少工作量,有些小小的算不上技巧的伎俩。记得第一次恢复是用的光盘,今天拿出光盘,发现读不出来了,大概是光驱的问题,于是直接选择恢复到出厂设置,反正我的恢复光盘中的内容跟出厂设置差不了多少。  选好后,可以去干点别的事,比如我就出去边吃饭边看电视去了,这样不知道总共花了多少时间,最后一直到设置机器名和用户名密码的地方,这时才需要人工介入。首先需要安装中文支持的MUI包,装完跑到控制面板里设置一下语言,使得界面上可以正常显示那些能完善支持中文的软件。  然后是安装那些必备的软件。  对于那些绿色版、免安装版、安装后更改文件夹后仍然可用的软件,则应该放在非系统分区中。这样下次恢复系统了,使用可以直接使用。比较典型的是Foxmail、QQ、Firefox(它要通过命令行参数实现)等等。  对于必须要运行安装程序才能使用的软件,则根据一般建议安装在系统分区,这样在恢复系统时,也能自动清理掉。这样软件包括Visual Studio、Office(虽然现在实际上不装这个了)等等。  接着是安装系统补丁。有个比较省事的办法,是装个360安全卫士,用它一扫描,发现所有的hotfix,自动下载自动安装,又可以去做些其他事情了。我就打了一会儿游戏,还去洗碗,整理床被等等,哈哈。  做完这些,基本上可算是恢复系统了,但实际上要花很多时间,对于我来说,似乎需要6、7个小时才能搞定!