All Stories
本来以为今天可以把所有的功能都串起来了,之前是一个一个零件,今天就到了把零件组装成完整产品的时候了,结果还是比自己预计的慢了点,最重要的点对点的文档下载部分没有调试。 我最担心的就是服务器的负荷能力,以及客户端间点对点通信的可靠性上。 唉,下周一上午好好把点对点间的调试一下,就可以完整地开始让人试用了。虽然还很不完整,但至少是可用了,花点时间可以稍微修改一下,把shell扩展部分做好了,就看起来易用性要好不少,至少是能在资源管理器中直接看到某个文件是否跟某个流程中的某个活动关联。 突然想起来,老大要求的图标也要有个overlay的扩展,这个一直没顾上做,晕!! 有一点很让我觉得自豪的是,在CruiseControl中配置好了,人家可以直接在上面点个按钮等个多少分钟,最后生成一个客户端的安装包,这太安逸了。 我要快点在家里把那个SocketHelper弄出来,至少功能部分要弄出来。昨天经过仔细排查,最后还是看了看附带的一个例子,一下就解决了,在MDI界面拆分窗口的Tab页中,如果是焦点落在CView,就会没有标题,花了两个晚上的时间去找办法,最后发现只是2行代码就能解决,晕死!
今天本来打算把几个功能串起来调试一番的,谁知道只是为了找出最开始的一个bug都花了近一天的时间,SQL Server的字段类型太多了,同样是为了存放一段文本,就有好几种看似都可以的选择,结果在用ADO操作的时候,死活就是抛异常。同样的代码,跑在Access上就好好的,到SQL Server下就不正常,真让我郁闷死了。花了好多好多的时候,排除了各种可能的因素,最后发现有两个字段只要select了就会异常。后来终于想到,会不会是字段类型的问题,尝试着改了几种不同的字段类型,终于有一种就顺利pass了,唉! 另外还遇到一个很恶心的问题,当时根本没想到。Excel在打开文件后,什么都不动直接关闭,文件也会被修改!这就让我的基于hash的机制几乎彻底瘫痪,郁闷。老大给我想了个办法,每次在程序中打开之前,先把文件设成只读的,关闭后再改回去。嗯,这样在我的程序里至少是暂时没什么问题了,不过我心里还是觉得很不爽,这个基于Excel的方案从一开始我就觉得很反感,可是时间不够啊,不然我肯定更乐意自己定一种格式,做一个编辑器。
下午的时候小思宇突然发个邮件说好想吃孔亮火锅,然后小妞就叫上俊英下班载我们去。说实话,孔亮火锅的味道确实比其它地方的稍微要好一点点,那油碟的味道就能比较出来。一边吃,小思宇和小妞就一边怀念学校的生活,倒是我却没什么怀念的,我的心一直是漂泊的。小思宇真的要离职了。
其实我根本不懂什么叫持续集成,为什么要每日构建,但是我还是很喜欢用CruiseControl,我喜欢让它能为我写的每一个程序都构建一个项目。其实我也根本没怎么利用CruiseControl的多少功能,我只是让它在我点击按钮时从VSS中下载源代码编译最后打包而已。 今天下午花了大概2、3个小时的时间,把我在做的那个项目放到组内服务器上的CruiseControl上去了,因为是我在自己本地建了一个VSS库,所以先要把VSS库的目录共享给服务器,然后慢慢配置ANT脚本,而且相比我自己的机器,服务器上少了很多东西,比如没有Xtreme Toolkit Pro,没有Boost,没有Inno Setup,没有doxygen,没有upx。一一复制过去,经过10来次的试验,总算大致可以了,但还是少了用doxygen生成文档的步骤,后来想想暂时也不需要让人家看到这个源代码的文档,所以也先搁下了。 回到家,也暂时不想写代码了,就整一下自己机器上的那份CruiseControl,上次系统还原后,移动硬盘再接上去后,盘符全都变了,我也不想再冒险去改。改过脚本里的一些东西,但原来的那个编辑器的项目还是没能全部一次pass。今天仔细改了改,不光可能是CruiseControl脚本有问题,连VC的环境配置也有问题,当时没把一些必要的路径设好,比如Scintilla的头文件路径,Xtreme Toolkit Pro的路径等等。顺便把SocketHelper也加上去了,心里那个舒服呀!其实我对ANT脚本没了解,里面很多写死的路径,每次如果有变动,要改很多地方,这是很让人郁闷的。
自从大致了解了Scintilla后,就喜欢上了这个控件,一般的用法照它文档和代码中写的,只要LoadLibrary那个dll,就可以直接使用"Scintilla"为类名创建窗口了。这两天发现XML Spy也用了Scintilla,并且没有看到那个dll文件,猜想应该是静态链接进去了,所以我也想试试。 首先,当然是下载源代码,现在最新的是1.7.5版了。然后有个VC的工程文件,其实是编译出dll来的,用makefile也只能编译出dll来。要用VC自己新建一个lib静态库工程,把include、src、win32三个文件夹下的所有.h、.cxx、.rc、.cur文件都添加进来。再到项目属性里设置一下,使用多线程库。这样就能编译出一个.lib文件来了,Debug版有4MB多,Release版是3MB多。 试用一下这个新建出来的lib文件,正常创建一个工程,用的时候不用LoadLibrary了,要调用Scintilla_RegisterClasses函数,看ScintillaWin.cxx文件最后的DllMain就知道了,当然这个函数并没有在公司的头文件里声明,所以调用前自己声明一下。然后强制链接前面生成的那个lib文件,假设Release版的名为SciLexerS.lib,对应Debug版的名为SciLexerSD.lib,这时就可以编译了,在链接的时候可能会报一堆Imm打头的函数没法链接,很easy了,强制链接imm32.lib文件就可以了。 其实相比动态链接,静态链接除了发布的文件少了一个之外,没有任何优势,反正dll倒是可以由用户任意更换,有了新版本,只要替换一下dll文件就可以了,即使如果是个通用的代码编辑器,假如新版中增加了对新的语言的支持,除了替换dll文件,再更新一下配置文件就可以了。
Boost中的Regex需要编译后才能使用,这让人觉得有点难过,而且相比Greta,Boost::Regex居然默认是不能直接支持宽字符的,而且有个同事在那里抱着快是10年前的性能比较结果,说Greta比Boost::Regex好,真是让我觉得很不爽啊。 不过不爽归不爽,有些固有的缺陷我们还是要面对的,就说对宽字符的支持吧。看Boost::Regex的文档,只要有ICU的支持,它也是可以的。今天我就下定决心,要用VC7.1编译一个出来。 首先从ICU的主页下载,有源代码包和几个主流平台的2进制文件包,目前最新的稳定版是3.8,不过3.8版的VC解决方案文件是for VC8的,而且连可以下载的2进制文件都是用VC8的,真郁闷,IBM那帮家伙真是不会做UCD啊!退而求其次,用3.6版的好了,它的解决方案文件就是for VC7.1的,其实我猜直接拿它的编译好的也可以用,不过自己编译的心里舒服。编译ICU很简单,什么错误都不会有,直接通过生成一堆的DLL、EXE和LIB文件分别放在bin和lib目录下。然后可以开始编译Boost::Regex。 一般说来,编译Boost用Bjam,如果没有Bjam可以直接上网下一个,或者自己拿它的源代码编译一个。然后在命令行下,转到有Jamfile.v2文件的目录下,输入bjam回车就可以了,如果要编译所有的Boost库,则可以出去逛一圈,或者睡个午觉。我这里只编译Regex,不过很遗憾的是,用Bjam直接编译我并没有居功。偶然发现相同目录下还有个vc71.mak文件,打开看看,里面有个ICU_PATH预定义选项,后面写上icu所在的路径即可,它会自动找到下面的bin、lib、include目录,不用担心。然后先运行一下vcvars32.bat,再输入nmake -f vc71.mak回车,它就会生成一堆的dll和lib文件,而且最后还会自作主张地复制到VC的bin和lib目录下去。 搞定!
昨天是月末的最后一个周六,所以还是要上班,这是很让人不爽的。白天出神发呆无所事事了一天,其实事情还是挺多的,只不过状态不好,就是不想干活。下午下班的时候,一个人慢慢吞吞地走去食堂。快到食堂的时候,疯丫头从后面叫我,问我去哪里,我说去食堂,她说去梅林吧,于是我犹豫了一下就跟着她去了。 这些天,中午在食堂都吃素,晚上就跑出去吃肉,照大牛的说话,生活真happy啊!周四跟小妞去万科城的一家韩国烧烤吃的,周五跟小妞小思宇去吃的小肥羊。昨天那顿开始没想好要吃什么,疯丫头说去吃韩国烧烤,我说我周四才吃过,后来我就随口说了个漓江又一轩。 到了店里,看到有特价的大闸蟹,10元/只,我们要了4只,又点了一个酸菜鲈鱼和一个田螺鸡锅。这几个菜的味道都还不错,不过有点奇怪,她好像真不知道吃螃蟹哪些是不能吃的,我看她是除了外面的硬壳,其它的全吃下去了,晕,而且照我们那边的吃法,这样的清蒸做法在吃的时候一般都会蘸醋,为了防止吃坏肚子,而她也什么都不蘸就吃了,昏!她说,今天点的都是你喜欢吃的。我说你不喜欢吗。说实话,我除了知道她喜欢啃猪脚,喝雪碧,吃冰激凌之外,还真不知道她喜欢吃什么其它的菜。像我的特征就很明显,尤其是小思宇她们,当年刚来公司,还在大队培训的时候,吃食堂饭时,她们就总结出来,说我喜欢吃各种水里游的东西,而当时我们也是到了公司才开始接触,一起吃饭。上次在宣宣家吃饭时,小思宇还在那里跟人讲我喜欢吃鱼啊,虾啊,田鸡啊,呵呵。 大闸蟹确实好吃,以至于疯丫头说我们再要几只吧,这个丫头,还真疯,不过我说下次再吃吧,毕竟眼前还有另外两个菜,而且份量都比较大。 吃完后,慢慢晃出来,逛路边的小服装店,也有趣呢。
今天偶然看到XML Spy的代码编辑器是用Scintilla做的,这么说来,Scintilla的品质已经达到很高的级别了,以前也知道Adobe的Flash ActionScript for Mac的编辑器是用Scintilla的,而且Adobe还贡献了一点代码的。在Windows平台上两大开源可用的代码编辑控件除了Scintilla外就是TSynEdit,不过TSynEdit只适用于Delphi或C++Builder,而Scintilla是用C++写成,通过消息机制来进行各种操作,如此看来,适用于各种编程语言,而且它从本身设计上就能支持Windows和Mac以及支持Gtk+的环境。不过这些对我来说,现在看来都不重要,反而那个候选列表框不如TSynEdit的好,因为TSynEdit可以在关键字的前面和后面都加上描述性的修饰,而Scintilla加上的都会做为内容。 另外,我从一本几年前出版的翻译书上看到XMLSpy以前v2.5版的界面,好土啊,就是一个标准的MFC MDI界面,现在后来看到的2005,实际上是v7.0,就用了BCG ControlBar,2006、2007版的都是差不多界面。 从XMLSpy中,可以看到XML这是一种很强大的工具,当然XMLSpy也做得很好,很多针对XML的功能,或者从XML衍生出来的功能都做出来了。比如Boost里广泛使用的DocBook,就是用XML来描述的,我觉得是种不错的东东,值得学习使用一下。
今天发现有些内容(比如针对某文档的评论内容)显示,是一条一条的,用表格是种不错的选择。如果在MFC写的程序里,比较方便的做法是用ListView来显示,不过随后到实际要动手的时候发现,用ListView并不能够满足需求,因为一般的ListView只能显示一行内容,而我需要的是在固定列宽的限制下显示一条内有多行的内容。这时如果霸道点的做法是,自己扩展写一个新的控件,可以显示多行内容在一条记录内,大概这算是一个VC程序员的风格。不过我并不懂怎么做,或许网上有例子或代码,但我暂时也懒得去找了。后来一想,就想到HTML中的表格不就可以嘛!而刚好我要显示的数据从来源处得到的就是以XML格式组织的形式,说干就干,只要在前面加个头,指定一个XSL,保存成文件,再用内嵌的IE控件显示这个XML文件就可以了。 从图书馆找了两本XML大全之类的书,翻出里面XSL的章节照猫画虎整了一下,就整出大概的样子出来了。不禁再次感叹,XML这真是个好东东!以后即使显示的界面要改,也不用改程序,只要改外面的XSL文件即可,还可以带CSS,想要表现成什么样子,就表现成什么样子! 幸亏前些天刚刚看过我以前写的一个程序里有导出成XML文件,并用XSL转换显示的功能,不然说不定这次还不会想到这个上面去,说不定真会绞尽脑汁去写个控件,也说不定会去手动写个HTML格式的文件再来显示,哈哈! XML,很好,很强大!