All Stories

马不停蹄

  今天写代码可用马不停蹄来形容,一天下来,不停地敲键盘,不停地commit,不停地收到CruiseControl的构建报告。一直到下班,回顾一下,觉得好像也没做很多事情,可能是太零碎了,写日志的时候,看了看SVN里的commit记录,确实可以写好多条。  明天就要发版本了,不知道有哪些地方落下没考虑到的!  倒是在用hhc.exe编译doxygen生成的文档时,老是崩溃,搞得我有点郁闷。本来嘛,一个工程有一个chm文档就够了,现在好了,只能用zip把众多html文件打包,要看的时候还得解压,而且解压速度不快!

在家烫火锅

  约了几个同事(F、S、W)来家里烫火锅,早上还是跟平时上班时一样准时自动醒来,已经麻木地不知道郁闷,在床上赖了一会儿,起来开电脑,看了一下更新的小说,然后无所事事,整那些代码,一直到9点多,出去剪头发。剪头发这件事已经酝酿了很久了,但一直没有兑现,今天终于狠了狠心,看了一下记录,上一次剪头发是3个多月前,汗!  剪完头发,离约定的时候还早,便又回到家中玩电脑,一直到W给我打电话,匆匆赶出去,一起去超市买菜,买了不少,我也没有估计我们食量的能力,所以就尽量多买点。  吃了两顿,挺好玩的!

bug,死循环

  昨天就发现了,程序结束时,会退不出,看样子是死循环。今天单步跟了一下,发现特别恶搞的原因,在一个while后直接一个分号,单步时还没看清楚,只是奇怪怎么一直在这一行跳,还以为VC调试器出问题了呢,汗!  中午时,突然想起来,这几天一直被之前的思路占据着,还是沿用老的那一套,结果搞得我午觉都没睡安逸,心里惦记着一件事情,真不爽啊,差点还以为之前写的都要推倒重来,下午调了调,发现还是可以保留一部分代码的。CppUnit用得还是安逸的,昨天从网上找来了CppUnitLite、CppUnitLite2、GoogleTest、UnitTest++几个测试框架,打算稍微看一下,最后选择其中一种来用。先看了CppUnitLite,没有文档,有一个简单的demo,对我来说,上手太不容易了。我估摸着,最终还是会继续使用CppUnit的。  又有人提到加强编辑器的联想功能了!VAX确实可算是所有代码编辑器自动提示功能的典范,我们一直在说,我们做不到像VAX这种程度,是因为Ruby动态语言的特征,不能通过静态分析得到某个对象的类型。我有时在想,假如我们用的是C++,我们能做到像VAX那种程度吗?针对这个问题,我回了一封邮件给老大,分析了VAX的自动提示功能分成三部分来做,我们有什么对应的策略。这三部分分别是,分析源代码,得到各种变量、对象的类型进行提示;编辑代码片段,设置快捷键进行提示;加入拼写检查,可在一定程度拼写错误的情况下,进行提示。第一点,需要一个完善的语法分析器,目前我们没有;第二点,技术要求不高,原来我也想过要做,结果被其他事缠着,就搁浅了;第三点,从来没有研究过,没有技术积累,根本不知从何下手。邮件发出去,估计老大也是眼睁睁地看着没有办法,所以什么回应都没有。

搞定弹出Windows域账户对话框

  今天上午下决心问了一下同事,又用proxy登出外网,搜了几下,终于搞定通过弹出Windows域账户对话框来输入新的用户名。代码在codeproject上有完整的,效果很好。弄得我心情很愉快,自我感觉良好,极大的改善了易用性啊!  完成了这个后,却没有做多少其他事情。其实我也没有多少懈怠,只是偶尔停下来休息一下,但进展确实很缓慢。我现在丝毫不怀疑单元测试的作用和必要性,尽管它似乎花我了不少时间,但我总觉得是值得的,无论是对我心情的调节,还是对代码质量的保障,都有很大作用。  后来主要集中精力在做组织结构管理模块。该模块将数据保存在远程数据库中和本地配置文件中,而两个地方保存的数据的格式差别比较大,读出来的还需要再互相转换一下。这不但需要多写不少代码,而且可以预见到的是,也会占用不少执行时间。我都开始怀疑当时把两边的格式差异弄得这么大,是否很不明智。结果到下班,还是没有完全搞定格式转换部分,只好明天继续了。另外想起来,应该提供一种途径,可以执行一些特权操作,比如明确从某配置文件加载数据,明确将数据写入数据库等等。总的说来,机制部分基本做得差不多了,后面实现用户交互部分应该没有多少工作量了吧!

又被培训了一下ruby

  今天又培训了一把ruby,再次让我感受了一遍ruby的强大,真是一个无所不包的魔幻型语言啊!  开始,老大先演示了一个分布式ruby包的应用,几行代码,就能实现一个服务器端组件,再几行代码,又实现了一个客户端,调用了服务器端的对象,其简便程度太让人吃惊了。这种应用很能吸引人,特别是可以做一些加密功能。但我想我还是不放心就这么去用它的,我很担心它的性能。反正WEBrick开的Gem server有内存泄漏问题,就一直让我对ruby做实际应用持有怀疑心理。在我看来,也许脚本语言的真的主要战场在字符串处理上,写个小程序也许可以应付,开发成本比起C++来确实低得多,但做稍微有点规模的应用,就还是让C++来吧。  而Lua这种,在我看来真的还是用来做为C++应用的扩展机制,描述一下插件逻辑,我想不出还有哪里能更适合它的,和还有哪个脚本语言比它更适合来做这个的了。  Ruby让我最不爽的是,对嵌入支持不好,《Programming Ruby》一书就提到,ruby不是设计成用来嵌入的。不过我在想,以我目前的需求,即使要嵌入,一个进程用一个解释器应该能满足需要了。看公司那个项目里,为了让嵌入的ruby解释器多做点事,就创建了一个又一个新的工程来嵌入,也是一种解决办法啊,哈哈。

进展缓慢

  再一次出乎自己的预料,太慢了!  不过通过单元测试,来保障代码的正确性,实在是一个非常不错的办法。我用的是CppUnit,写测试用例还是比较麻烦的,要在.h和.cpp两头写,每次都是复制其他的代码结构,据说CppUnitLite等等新生代的单元测试框架用起来要省事一些,不过我没用过,并且我现在很看重CppUnit能使用MFC的界面,也能输出XML格式的报告,而且还提供一个xslt文件,可以把报告格式转换成和JUnit类似的格式,这样CruiseControl就能直接合并到它的日志里。就是这些原因,使得我迟迟不愿意再花时间和精力去了解其他的框架,继续忍着那些小麻烦。  现在用起boost.bind和boost.lambda来,比以前熟练了不少,但还是只用到一点它的皮毛。前几天看到一篇blog,讲boost.function和boost.bind结合使用的威力,让我大吃一惊,原来boost可以这样用!就这么投入中去了,再好好学习巩固一下STL,学习一下算法,学习一下boost的应用。

彻底累了

  估计真的是体力透支了,影响到正常的工作了,提不起精神。  说起工作,一个小小的需求实现,也原来要涉及到这么多模块,真是郁闷,我的架构设计能力还是不行啊,继续努力学习啊!明天开始着手另外一个大需求的实现吧,三天,能做成什么样子呢?我早已没有之前估计工作量时的那么乐观了,过高地估计自己的能力,过低地估计了实现难度,唉!

自定义保存文件对话框

  早就想在保存文件时,能让用户顺便多输入点信息了,于是自定义保存文件对话框的需求就提上来了。在网上搜了一遍,各种方法倒是不少,不过都跟我想像中的有点区别,我想在MFC中做,就希望能尽量的简单方便。于是就搁下了,直到前天,在公司里想起这件事,问了问同事,同事给我一个例子,VC6写的工程,看了觉得很简单,但是回家自己弄还是不行。昨天又跟同事交流了一下,再加上晚上在网上找资料,结合着弄,终于成功了。  首先,添加一个对话框资源,加上需要的各种控件,最重要的是要加一个ID为stc32的控件,可以是Static,至于大小、位置,可以之后慢慢调整,以及对话框的风格要加上WS_CHILD。  然后,给该对话框添加类,基类就选CDialog好了,生成代码后,把基类从CDialog改为CFileDialog,尤其要注意,CFileDialog的构造函数需要更多的参数。  再之后,要给m_ofn成员初始化一下,先是dwFlags要有OFN_ENABLETEMPLATE,再lpTempate要指定到刚才活到的对话框资源。  最后,就是看情况,重载几个虚函数,比如OnFileNameOk,OnFileNameChange等等。  搞定!

搞定phpBB的NT域账号认证登录

  当时看到phpBB后台有选项可以选择认证方式,有三种,分别是DB、Apache和LDAP,我就觉得要糟,老大知道后肯定会要求用NT域账号方式认证登录。  果然昨天下班后,老大就发了邮件,说最晚下周要搞定这个问题。我郁闷啊,其实我早就开始想办法去寻找解决办法了,当时直接切换到LDAP认证时,提示说LDAP扩展没有安装,而用Apache认证方式时,说什么账号名要一致云云。  到网上找了很久,也没有发现有价值的内容,倒是sf.net上有个for phpBB 2.x版本的mod,可以使得支持LDAP认证,不过我装的是3.0.2,而且下载下来那个mod,我都根本不知道即使我装的是2.x版本的,怎么应用上去,所以此路不通。  不过看到Apache认证方式,再结合项目组用VisualSVN Server搭建的SVN服务器,给我一点思路。我是可以通过Apache来实现NT域账号认证的,再让phpBB来使用Apache的认证结果。虽然思路是有了,但实际上,我根本不懂Apache的配置文件要怎么写,看了半天它的手册,也不知所云,只知道它是有mod可以支持ldap认证的。最后实在没办法,抱着试试看的心情在公司网上发了个帖子询问,终于有个人回复了,问他要了点例子参考,果然OK了!  基本搞定phpBB的NT域账号认证登录问题!