Fan 的个人资料missdeer 之编出来的幸福照片日志列表更多 工具 帮助

软件开发所需的工具

  今天断断续续写了几行代码,再次感叹,在这VS中配合VAX写代码给人那种酣畅淋漓的感觉,任何其他地方都是体会不到了。网上有不少人不少文章在说,使用IDE有很多坏处,让人不知道背后的机制原理云云,对于此种言论,我很不屑。不是说,懒惰是程序员的美德吗,既然有工具能帮人完成一部分工作,为什么不放手,而去追求那虚无缥缈的所谓“高手”的虚名。
  从csdn上看到新闻谈及VS的下个版本,这MS的动作也太快了点吧,VS 2008才出来不到一年呢,CodeGear真的彻底完蛋了!再没有哪家公司能像以前的Borland那样生产IDE,跟MS抗衡了。
  今天写代码时,发现需要记录一些想法,或者是计划,但我找不到合适好用的工具。之前也看到一个群组里有人开话题讨论用什么来记录想法,有人提到 evernote,这个工具我也看过,是个共享软件,而且对中文的支持不行,仅这两个问题让我就望而却步了。之后再也没有其他的类似的好工具了,平时如果只是为了记录下问题、需求这种跟软件开发强相关的信息,我倒是搭建了一个Redmine服务器,它也有一点项目管理的功能,但还是太弱。在公司里,流行的做法是用MS Project来做项目管理,用Excel来记录需求,用notes上的CMM库来记录问题,不过我因为所在部门的不规范性,所以更自由一点,或者说其实是没有机会使用那么高级的东西,只好还是在redmine中折腾。
  寻找好用的全流程软件生命周期管理工具!

爬梅林后山

  今天是我第一次出去参加这种社会性质的户外运动团活动,吃了没经验的亏,当时没有准确估计行程,只买了一瓶脉动便跟人上山了。当时也是不了解,单纯地以为只要走个十几二十分钟路就可以了,谁知是足足4个小时,从上午10点开始,一直到下午2点,可怜我连早饭都没吃,到12点多时,那瓶水就喝完了,然后就又饿又渴又累地翻山越岭,又不好意思开口向别人要水,毕竟是不熟悉的人啊,忍了近2个小时!
  到下午2点过一点点的时候,终于到了吃饭的地方,最急着解决的事便是解渴,跑到自来水笼头那里,估摸着那水是山水,确实没有那种自来水出来的消毒水味道,大口喝了好多,还是不解渴,又买了2罐百事,没办法,没有其他适合的饮料。
  那些菜的味道倒真是不错,那汤也好喝,就是量不多,也过钱也不多才一人给了25块钱。到下午4点的时候就出发返回,这次走的路就没有之前那么困难了,都是平缓的石板路,跟着几个人一边走一边聊,还没觉得不适,前面那段路上我都没怎么说话,连拍照都只是照了几张风景,返回的时候倒是拍了些人物的。
  我还是内向了点,不知道怎么能挑起话题,唉!

努力写好代码

  前几天偶然lint了一把我在做的项目的源代码,结果发现近千个error。这让我比较困惑,大致看了一下,有不少是我并不期望它进行检查的,但又不能简单地把这类检查项屏蔽掉,所有就不知道怎么办了,lint应该是有意义的,但具体要怎么做,做到什么程度,我就完全没有头绪了,如果仅仅是为了减少错误项的输出而屏蔽检查项,那就失去lint的意义了。
  我还是比较努力地希望自己能尽量写出一些优雅少错的代码的,也尝试在实际工作中使用一些方法和理念。今天在公司定位崩溃报告模块的问题,最后发现读取PE文件版本信息就有问题,但本来出于该模块的特殊性,很难直接在IDE里调试该模块,经过一些时间的折腾后,给取PE文件版本信息的类写了个单元测试,用CppUnit来跑,就算被测代码逻辑有问题,调试起来也方便多了!于是我又想到,这单元测试还真是个好东西,为什么我(们)就是不愿意做呢?我想主要原因还是在于,对TDD对项目进度的影响仍然没有足够的信心。另外再扯远点,我有点不想用 CppUnit了,总感觉有点麻烦,现在这类框架倒也不少,google、Boost都有单元测试框架,其他还有什么UnitTest++、 CppUnitLite等等,可选择的范围倒是不小,但我有一个顾虑是,这些框架输出的报告能不能像CppUnit那样跟CruiseControl日志合并呢!
  另外再说说重构。我现在倒也确实有这样的倾向了,不断地在重构和实现功能这两个角色之间来回切换,也很习惯这种工作方式。看这个项目的代码,虽然没有翻天覆地的变化,但确实也有不少的改变,而且代码量也比最高峰时期少了20000行左右,这个比例不小啊,1/4多。不过我还是很明显感觉自己在重构这方面有待提高,首先是缺少理论方面的学习,然后再来考虑怎么应用到实际的编码中去。真的要抽时间好好读一读书架上那几本书了!

Office2007的改进之处?

  今天突然想到,之前遇到的两个操作Excel的问题,该不会是在2007里对2003版本的修正吧!
  最早使用COM操作 Excel2003出现的问题是,在我的电脑上,打不开Excel文件,硬是说没有正确的序列号,我分特,公司花了那么大一笔钱买了license的!想了一些办法,仍然没有解决,为了不影响进度,忍痛在512MB内存的机器上装了个2007版的Office,但是奇怪的是,如果直接运行Excel 2003 SP2,编译文件什么的,都是好好的。
  第二个问题是,突然一夜之间,所有的使用Excel 2003的机器上,都不能对图形全选操作了,用鼠标是可以选择的,但如果通过代码来SelectAll则必定异常,无论是在VBA中,还是通过COM接口操作,屡试不爽!很无语的是,当时定位了好久,也因为只有我自己的开发机上是用的Excel 2007,根本暴不出这个问题,最后找到出错处后,仍然束手无策,一狠心,再也不copy图片了,而是提取出各个图形节点的位置信息,自己用GDI一个一个画出来,同时带来很严重的失真现象。自己画的线条没有抗锯齿,没能好好计划节点内的文字大小和位置,没能按照连接线的原始图样进行绘制,不过总算也勉强能蒙混过关。
  第三个问题是,发现解析所有图形节点时,发现多了一两条不可见的line,但是同样一个文件拿到我的机器上,通过Excel 2007的接口解析,却没有这两条line,瀑布汗!所以图形在我的机器上显示的好好的,到了别人的机器上就多出一个虚线矩形框和一个实线矩形框,只好额外写几句来特殊处理一下!
  我猜,第二个问题和第三个问题,会不会是由同一个原因引起的,会不会是由于2003和2007版本之间的一点不兼容性引起的,2003创建的文件被2007编辑过后,再拿到2003上去就会有点表现不正常?还是说本来就是2003就有问题了,只不过2007上有了改进?

抛异常实现多级信息传递

  从没用过C++的异常,都是看到别的代码抛出异常来,我自己的代码里try...catch(...),甚至从来不知道catch里到底是要什么类型的。
  这次有这样一个需求,在一个比较深的调用层次的地方,不但要返回成功过失败,如果失败了,还希望能得到原因。其实这个需求之前就有了,但当时没有放在心上,觉得不做也不要紧,而且当时的想法是像Windows API那个,设置一个全局的值,即Error Code,任何操作之后都设置一下这个值,其他地方就可以直接获取到失败原因。当时想到这个方案时,心中也有点不舒服,这也是导致一直拖着不实现的一个原因。
  昨天做过功能的,直接就想到用C++异常来实现。今天先看了一眼msdn,然后就决定,这么简单的需求,就不需要自己写个异常类了,直接抛个字符串出来算了。字符串内容是从资源里取的,所以最后就直接throw一个CString出来了。效果还是不错的,不过有一点是需要特别注意的是,本来都已经通过返回值知道操作不成功,就可以跳出这个流程了,但有了异常,就需要在任何可能调用到这个路径的某处上层,进行try和catch,不然程序就直接down掉了!

叫老大过去真是有效

  叫老大过去真是有效啊,哈哈,虽然加了一些额外的需求,却把另外一些需求的实现期限往后推了,这让我心里觉得无比舒坦,这才是正常的工作方式啊,哪有总是有突发的需求加进来冲击原本已经排得满满的进度。
  今天解决了两三个问题,花了几个小时总算实现把一个活动根据多个角色拆分成多个活动。结果下午4点的时候又被叫去讨论问题,这让我很头痛,那么多的讨论,纯粹是浪费时间,花在写代码上的时间就被不断缩减。而且一讨论就没完没了地纠缠一些毫无意义的问题和细节,自以为是地出些馊主意,还不能拒绝。

从VS2008降到VS2005

  本来想用VS2008来写WIND的,但是这两天遇到几个问题,不得不降到VS2005来用。
  首先是装了Refactor!Pro,在 VS2008编辑器变得迟缓无比,敲几下键盘,就会死半分钟,这是无论如何不能忍受的,于是在Refactor!Pro的配置项里改了一番,卡死的情况有所好转,但仍然处于不可用状态!而且在退出VS的时候,会写一个巨大的cache文件,工程中没有多少个文件,都会写入100多MB,估计随着代码量的增加,这个文件的体积也会不断飚升。
  其次是,我从PN中抠出来的Scintilla相关的代码,一添加到工程中后,VS2008就会 updating intellisense,而且只updating到半途,VS就崩溃了,屡试不爽,无论是从命令行打开该工程,或者是从界面上打开该工程,都会 updating直到崩溃!
  于是,我万般无奈下,尝试用VS2005。降级倒是很容易,直接用文本编辑器打开.sln和.vcproj文件,把里面最开头几行中的版本号改小就行了。再用VS2005打开工程,写几行代码,编译一把,似乎倒是没有在VS2008中的那些问题,只好先用 VS2005来写了,生在中国可真幸福。
  这倒都只是IDE的问题,我猜如果只是直接从命令行来编译整个解决方案的话,应该不会有问题吧,而且升级也方便,只是改几个版本号。只是是否有这个必要,一定要用VS2008来编译。以后再说吧,本来最主要的也只是为了体验一下Refactor!Pro重构的快感。

公司电脑也加内存了

  一个月前申购的1GB内存条今天终于领到了,还顶着大太阳跑到K4地库去领来的,又等了快2个小时才让人装好,顺便还去领了根音频延长线来,不过已经最近没有机会用自己的电脑,所谓“兵马未动,粮草先行”啊,哈哈!现在应该跑VS要顺畅一些了吧,跟家里一样,把虚拟内存也去掉了。
  今天没干什么事,上午不知道怎么就混过去了,下午就是去领了下内存条、等人安装,接着又开了2个小时会,于是一天也就过去了,现在我真的很讨厌开会。不过现在也明白一个道理,以后开会一定要拉着老大一起去,他说话的份量确实比我足多了,我就在想要是还是我一个人的话,今天肯定还是会有不少情况下要跟人起争执的,而老大去了,很多时候他出面说话,别人都不怎么争吵,我那个汗啊!

加了一天班

  今天去加班了,其实很不想去的,但是弱者是没有决定权的,连同自身的自由!
  终于搞定也几个催得最紧的问题,问题还在于逻辑跟界面绑定了,不能用CppUnit做单元测试,所以在这种纯逻辑的情况下进度慢了很多,因为测试验证相对比较麻烦。
  本来还想把开发环境从VS2003换成VS2005的,在冒烟服务器上也装好了VS2005,但最后还是没有继续下去,因为升级环境要做的事情还真是不少。首先,那些第三方库需要用VS2005重新编译,比如XTP、ACE、CppUnit;其次,VS2005之后引入的Side By Side,让我有点惧怕,谁知道会不会有什么不正常的;再次,担心有的第三方库在VS2005下直接使用会有问题,比如iconv,我是直接把 iconv.lib拿来用了的;最后,我的机器上装的VS2005运行得好像有点点不正常,设置了编辑器字体背景颜色有时不能立即生效,如果设置了是浅绿色,则只有空白处才是浅绿色,有文字的地方还是白色的,而且连语法着色都没有了,前景全变黑色了!另外还有一点是,毕竟还是疲于奔命在项目的功能实现上,实在没有多余的心情去做那样的事啊!倒主要也是为了使用一下那个重构工具,唉。不过看来公司内也许像我这样边编码边重构的人还是不多的吧,至少我周围那几个人是不这样的。
  其实我也只会用那么两三种重构手法,最常用的便是提取方法,重命名方法名或变量名,将方法其实从.h文件移到.cpp文件。偶尔可能也会用用提取类等等手法,但这样的机会很少。所以还需要继续学习和实践啊。

高兴得太早了

  又去受了一回气,要把google桌面搜索,google地图的功能都做进来了,真是痴人说梦话,还总是说没工作量,神经病!
  今天把格式化显示时乱码的问题解决了。其实不是MS SQL Server那里引起的,而是从Excel读取数据后转换成XML中间格式就出错了。如果是原始的干净数据,是没有问题的,只有当原来已经有同名的流程已经存在时,跟新的流程数据进行合并时,才会不正常,主要是没把连接线中记录的两端的图形节点uuid值改换回旧的,于是跟图形节点中的uuid值对应不上了,生成的dot文件中又是以uuid来作为节点标识的,当然出错了。
  另外又发现一个判断上下级关系的方法写得有问题,光是看代码就看出来了,果然他们实际试用的时候也是不正常的。但实际上这部分代码我都是纯粹凭想像写出来了,根本没经过什么测试。主要原因还在于这部分代码跟界面绑在一起了,都不好用CppUnit进行单元测试,所以逻辑正确性都不能保证了,看来抽时间还是得把这部分重构一遍,不要跟界面绑定了!
  今天又偶然看到一个可以Visual Studio 2005和2008下使用的重构Refactor!™ Pro for Visual Studio,在公司里找到一个似乎是免费版的,装了后在VS2005上看了看效果,从界面上看很酷啊,哈哈,不过公司里只用VS2003,真是遗憾啊,只能继续用VAX里带的那点重构功能了,尽管大部分情况下也勉强够用了!

快到头了

  今天狠了狠心,直接又加了一张表,把原来用XML表示的组织结构信息存储到数据库中去了,原先过高地估计了难度,其实是心里有抵制情绪,心理暗示这用二维的关系数据表来表示树型结构很不方便。其实不然,只要每一条记录里保存一个指向父节点的引用就可以了。
  于是最后的攻坚战接近尾声了。权限相关的问题基本上从编码角度讲,差不多完工了,就剩下及时刷新客户端的组织结构显示了。而另一个主要问题,格式化显示流程图的问题,就我现在的猜想,问题还是出在MS SQL Server的使用上,自我感觉其他各部分的实现还是经得起推敲的。
  自打从CodeProject上又重新找了一个自动更新版本号的插件后,工程的版本号终于又能跟着每次编译而自动增长了,到今天为止,都已经到1000多了,这样好过以前要手动修改资源,但似乎有点不太专业。就我理想中的应该是,每次CruiseControl进行自动构建时,帮忙自动增长版本号,而不是我一个本地构建时进行增长。现在只有我一个人修改代码还好说,如果多人协作,目前这种做法明显行不通。

觉得自己很可怜

  觉得自己很可怜,唉,状态很差,生活、工作都很糟糕。今天去汇报工作进度,被领导认为这两周来没做什么事,郁闷!遇到个变态的领导,让人如此无语,用小妞的话来说,有过这样的经历后,以后觉得什么人都是挺好的了。
  今天又因为忘了std::map的自动排序功能,而花了不少时间去修正那些bug。我把句柄作为key,该句柄上的标题文字作为value,本来想这样的结构用std::map挺好的,结果整了好久才发现插入容器时的顺序跟容器内的节点顺序不一样,才猛然想起来,这个std::map会自动根据key的值排序一把,而我恰恰不需要这个特性,于是想起去年,做编辑模块的语法提示功能时的情景,用了 std::vector<std::pair<HANDLE,CString> >的结构,有一点std::map的样子,但又保留进入容器的顺序。
  代码真的越写越乱了,现在连接口都是混乱的了。相似的方法名,容易产生歧义的参数列表,以及更多耦合的类划分。为了完成功能,我只好不管这些了。还有,我似乎也有点完美主义,上周讨论下来的结果,那个方案,我总觉得太土太不专业,总想用另外一种我自以为要好得多的方法来实现,但是脑海里另一个声音却是“先完成功能,不要管实现得好不好看”!
  在公司论坛里看到一个monaco字体,等宽的,发贴的人说是最好的编程字体。开始我还不以为然,看到另一个人解释说什么叫好的编程字体,一要等宽,二要容易辨别o和 0,1和l,剩下的则是见仁见智,觉得挺有道理的,虽然贴图上的样子看起来并不好看,我还是下载下来试用一把,把VC2003里用了一年的 FixedSys换掉了,感觉还是挺爽的,看来大概是用了太久了,审美疲劳了。

Opera确实比较快

  这两天还是照平常一样,在网上看小说,因为看的都是盗链,看到后面的章节一般都是截图的。昨天偶然开了一个Opera 9.51,猛然发现在它这里图片出来的速度比Firefox里快多了,很明显的现象。不得不承认,Opera在这方面的努力真的很有成效。而 Firefox对现在的我来说,最大的让人不满之处就是它速度实在慢了点。如果换作以为,我肯定还会再加一点内存占用过大,不过现在1.5GB物理内存使得我不再特别关注这个缺点了。不过速度慢这个缺点却是没有明显的可以弥补的办法。
  都说Chrome的V8引擎已经作了极速优化,但是总的看来 chrome还是个半成品,我已经太过习惯于添加了各种扩展的Firefox了,所以Opera也还是没能正式作为我的主用浏览器。而我就只能希望 Chrome的出现能刺激一下Firefox开发团队,好好优化一下代码,提高点效率。

开始使用WTL进行界面开发

  有点受不了MFC那比较累赘的几个在超大dll,同是Windows平台下做GUI开发,我只好选择了WTL。其实我已经比较习惯MFC那套东西,并没有发现多少网上说的种种使用MFC的不爽,相反我觉得还是挺安逸的,甚至对于使用了四五年VCL的我来说,MFC也没多少不方便的,虽然相对于VCL来说,MFC根本算不上可视化,但我也不清楚为什么自己仍然能这么乐于退回使用这种原始的framework呢!现在唯一让我觉得不爽的竟然是它要拖几个 dll文件,也好,刚好学习一下WTL。对于目前我的状态来说,最大的困难是可参考的资料过少,市面上还没发现哪本图书是讲怎么使用WTL的,唯一的一份教程则是CodeProject上那流传甚广多少年前的那几篇文章。
  之前也用过WTL写过一个对话框程序。还有一个输入法辅助程序,本来期望是用它来做皮肤生成器的,结果和众多其他我写的程序一样,只是开了个头,然后就丢下了。如今要写一个比较大的程序,我自己也估计不好规模会有多少,猜一下大概C++代码行会过万吧,另外我希望大部分逻辑都是使用外部脚本扩展来完成。
  虽然几乎一点经验都没有,但还好有现成的代码可以参考,特别巧的是,我那程序中也需要一个代码编辑功能,本来就想好是用Scintilla的,但是我不懂如果在WTL中使用这种自定义的窗口,刚好就可以抄袭那些代码了,哈哈!
  编辑器能正常显示出来了,接下来要把TabbingFramework和DockingFramework加进去,之后再考虑其他问题!

强大无敌的开源软件

  今天偶然看到一篇blog,讲述了chrome用到的各种开源代码库,至少有25种之多,让我不禁感叹,开源真是个好东西啊,真是软件界的共产主义啊。我内心是很认同这种做法的,觉得理所当然,而且自己平常也有这么做的倾向,只不过限于自己视野和认知,很多时候并不知道有合适的方案可供选择使用。
  以后要多多了解这方面的内容并在现实中加以应用啊!

格式化显示流程图完成

  经过最近几天的努力,终于基本实现了通过dot的帮助,格式化显示流程图的功能。还记得当天晚上因为发现dot的功能,兴奋地睡不着觉。前天完成了把 XML格式的数据转换成dot文件,再用dot生成PNG和SVG功能,昨天又换回GDI+,把PNG图片显示出来,今天则是把SVG自行解析了一把。 dot生成的SVG文件确实是用UTF-8保存的,但是一开始发现用MSXML死活加载不上,后来慢慢定位发现是最开头位置有一句DOCTYPE,把这句删了就能好好地加载了。我估计是我没用好MSXML,不然也太扯了吧。不过这里我也懒得去追究了,直接处理了一把文本,把那句删掉了。然后装入,果然所有需要的信息都解析出来了。中途还遇到个小麻烦,发现识别鼠标位置总是有时行有时不行,还单步跟踪了好久,后来一狠心先把所有节点的坐标打印出来,再对应点击的坐标来看,到底是实现逻辑还是哪里有问题。发现原来就是一个单位转换的错误,一时疏忽了,SVG里都是用磅表示的,而这里我要的是像素,乘上这个比值就可以了。
  离最后期限发布还剩下的一个大问题是权限。权限系统当时考虑地太过简单了,不过也归结于当时的需求或者设计都没有想到现在会变得这么复杂。当时确实只想到了某个组织下属某些组织或个人,而根本没考虑某个人会需要作些特别的操作。现在的一大问题是,某个人可能同时分属于几个不同的组织,另一大问题是某个人需要有一种角色,管理员角色,这样可以拥有一些特殊操作的能力,还有一大问题是,在客户端对组织结构及角色进行修改后,该修改要让所有客户端知道。现在的做法很明显很难适应这些需求了,因为我把组织结构保存在一个配置文件中,而该配置文件是放在各个客户端中的,所以修改只在本地进行,不影响其他客户端。没头绪啊!
  下午的时候,算是阶段成果汇报,中途我溜了出来透透气。老大说我做这个程序,很有些想法。让我不禁有点得意,同时也特别悲哀,原来我这么容易满足,只是别人这么一句普普通通都算不上夸奖的话,就让我觉得高兴了。

exchndl.dll提取出来了

  昨天好不容易咬咬牙,把捕获未处理异常的功能提取出来封装成一个dll了。这是一个很简单的功能,所有的代码都是现成的,我只不过是把它从源代码复用的方式改成了二进制复用。当时公司里的同事说我这源代码复用的方式太落后,想叫我改成一个COM组件。而我又恰恰对COM很反感,所以一直都没动手。这次在一体化平台中涉及到2个exe程序,而只在一个主程序中用到了这个功能,有一天收到一个报告,另一个exe程序也会崩溃了,所以就有了要分离出来的想法。
  提取成dll我当然不会用COM来封装,而是学MinGW中的exchndl.dll的方式,移植的主要工作是把MFC中的CString类都替换掉。这花了不多的时间,然后放在WallpaperHelper中进行测试。
  除了记录了系统简要信息和调用栈信息,我还另外加了几项也许有点用的内容,包括当前系统中所有的进程、环境变量、当前进程所有的模块、所有线程信息。本来还想加些其他内容的,比如当前系统的服务信息、系统设备驱动程序信息、当前进程的所有句柄、所有文件映射、所有窗口等等,不过想到暂时这些信息也不是很重要,而且这样会让生成崩溃报告的时间更长,先还是放一边吧。
  最近我想我真的是工作压力大了点,昨天下午睡午觉,梦到了很多乱七八糟的事情。最让我觉得气愤的是,居然梦到有个老女人,对我的工作指手划脚的,然后旁边两个同事也不知道在干吗,跟现实中的很相似。真是日有所思,夜有所梦,愤慨啊,竟然我的梦都被人这样强加干涉了!

使用iconv转换字符编码

  昨天从网上查到,要让dot支持中文,必须得把dot文件保存成UTF-8编码,可是我用C Runtime、MFC CFile、C++ iostream都只会保存成ASCII的,于是不可避免地要再多一道工序把字符编码转换一下。
  从一开始我就想到了iconv。先拿来它的可执行文件,在控制台上尝试了几次,原来是要把中文的设置为gbk才行,如果是ascii或者 gb_2312-80都是不行的。知道iconv确实是可以将编码转换后,就放心大胆地在程序中使用iconv库了。从公司归档库中找得到的只有1.9版的,但好在.h文件和.lib文件都有,看了一下头文件中的声明,猜猜也就是先iconv_open,然后iconv、最后iconv_close共三步操作而已。于是先把文件都读出来,然后iconv。可是死活不能把转换后的内容存放到目的缓冲区中,而源缓冲区,以及返回值,还是源数据长度和目的数据长度却都是对的,实在不得要领。这样郁闷了好久,还是不得其法,于是准备直接用iconv.exe来转换算了。
  iconv.exe转换时会把转换后的结果直接在控制台输出,可以通过管道重定向到文件中,可是在程序中要得到这个结果就遇到了些挫折。首先想到的当然是CreateProcess,然后通过管道捕获输出,可是发现这新生成的进程一直不结束,我估计是哪个参数没设对,这个API的参数也太多了点,昏厥!放弃,试了试C runtime函数system,倒是可以直接像在控制台上写一个有重定向的命令行,可是在执行时,会出来两个黑的控制台窗口,这用户体验也太差了!再放弃,看了看ShellExecute这个API,但好像不能重定向。
  还是转回来用iconv库吧!最后还是从网上找了一段代码,先要iconv传入几个空指针的调用,再一行一行地从源文件中读出内容,再一行一行地调用iconv,最后一行一行地写入目的文件,这样居然就行了,大汗淋漓!

终于借到《Lex与Yacc》了

  几个月前,就想从公司图书馆去借本《Lex与Yacc》了,可是从在线服务中可以查到确实有一本没有借出去,但到了图书馆就是找不到那本书放在什么地方了,图书馆的人说他们也没有办法找到,因为书要么就是照着编号放在书架上的,如果在指定的书架上没有,那就没办法了。我还为此去了几次图书馆,希望碰碰运气万一某一天他们整理的时候能发现那本没有找到的书,但是一次一次都失望而归。也想过自己买一本,但逛过深圳的几处大型书城,都没有找到过,从网上倒是能看到介绍,可是都是断货了,太郁闷了!
  昨天觉得该去还那本《Windows技术内幕》了,虽然借了三个月,但没看几页。到图书馆一看,惊喜地发现有一本《Lex与Yacc》静静地躺在柜台面上,看来是刚刚有人还回来的,连忙抢到手中。
  实在觉得这词法分析和语法分析在处理模式化文本时太有用了。说起来虽然现在在做那个劳什子一体化平台,可是我心里却一直想回去完善编辑器,简直有种生不逢时,壮志未酬的感觉。本来同事是有一种语法解析组件的,大概浏览过那代码,其实是从ruby源代码里抠出来,在某一阶段直接把语法分析树dump出来。不过不知道为什么在源代码超过8000行时,分析出来的行号总是过绕接,从头开始。我也没仔细定位过这个问题到底是哪里出了错,主要是那代码全是别人写的,而且用了一些我个人极不喜欢的处理方式,我就懒得再去查错和修正了。我宁可自己再写一个解析器,因为我知道用lex和yacc可以做到。当时简单地看过ruby的源代码,发现它的词法分析器并不是用lex生成的,并且里里有一段代码是用gperf生成的,于是以为gperf也是一种词法分析器生成器,后来自己用了gperf才明白过来,原来ruby的词法分析器是手写的,其中gperf生成的那段代码只是为了识别出其中的保留字而已。而语法分析器确实像是用yacc生成的,不过由于ruby的语法太过于魔幻,所以语法分析器似乎复杂得超出我的想像。如果我回头再去做编辑器,这个语法解析器势在必行,不关是为了解析出语法树显示出来,另外还有些用途。其中之一是,其中有一个另外的需求是将表格化的描述与脚本来回转换,如果没有可靠的语法解析器支持,这个需求要实现就实在太过困难了点。另外还有个需求,是前两天才提出来的,说是要能跳转到方法定义处,于是当然要知道方法定义的位置,而这位置当然需要事先准备好。本来还以为rdoc从源代码中提取文件时可以顺便提取出来,后来同事一说,yaml中并没有保留文件名和行号,所以还得想办法提出来。我一想这个就太不可靠了点,万一某些方法就是没有注释文档呢。所以一定要另外有个模块来提取方法定义,我当时想到了ctags。今天试了试,发现用ctags还是有些缺憾,它只能提取出方法名称,以及匹配该名称的正则表达式,而并没有行号。另外,看了看ctags的源代码,发现另外更严重的问题,ruby并没有说定义方法时def关键字和方法名一定要在同一行中,如果是不同行中,ctags就不行了,所以还是得实实在在的语法解析器出马啊!
  当然,像ruby这种比较复杂的语法解析,我不需求全部自己从头开始写起,可以抄袭一部分它的代码,至少词法分析器大部分可以直接使用,而那语法解析里把BNF留下,把动作换掉, 这样虽然还是要读懂那部分代码,但总比全部自己来轻松多了,而且也可靠得多。
  得稍微系统点地学习一下lex与yacc了。

迁户口,迁档案之二

  今天去关内给小丫头迁档案和户口,早上睡到8点多,很不情愿地起床,不过也比平时上班时晚了一个多小时了,昨晚睡得也不晚啊,怎么会那么困呢。洗漱完毕出门,已经过了8点半了,等328路,结果一直等到9点才勉强挤上一辆。
  到了那公司,还不到10点,这出乎我原来的预料,心里顿时放松了一点。那么一个小公司,里面有个女人招呼我过去,我拿出迁户申请和商调函。被告知那些个人资料是要填好的,于是又打电话问小丫头那些东西怎么填。接着又被告知要交档案保管费,每月20元,从2007年2月交到2008年9月,还好不是很多,但我还是忘了拿钱上去,跑到楼下的招行ATM机上取了钱上去,结果那儿的财务部说他们不收现金的,但是大概看在我已经拿了几张红纸片的份上,乱糟糟地不知道从哪里找出一本开收据的本。最先招呼我的女人把档案都装入一个档案袋,贴上纸,盖了十几下章,然后找出小丫头的户口卡交给我,第一站的任务就基本完成了。
  随后是要去高新派出所办迁入户口,因为不知道坐什么车,所以一下楼就打了个的。也不知道是不是绕路了,比我想像的要久。而且想不到那派出所在那么一个偏僻的地方,不过好在一进门就看到办理的地方,取号排队,开始还取错号了,大概一直排了半个小时的样子吧,才轮到我,那办理的大姐一看就说出我们公司的名字,看来我们公司在那儿的业务很多啊。没几分钟就办完了,时间都耗在坐车和排队上了。
  出了派出所,看到路对面就是一个公交车始发站,看来只有转车了。这车也是绕路的,绕了好久,到了市民中心,本来想坐个391回公司的,结果等了10几分钟也没等到,失去了耐心,决定再次转车,先坐到梅林关,再爬上一个小巴,1点半差3分的时候终于赶回公司刷卡,这样就只需要报上午半天的假了。
  坐下吃了块巧克力,因为早饭和中饭都没吃,饿啊!然后给小妞打电话,问她有没有吃的,她说有小面包。于是我先跑到人事服务中心,把户口卡和档案交回去,结果那管档案的mm说还缺转正定级表,我郁闷,这党员还真麻烦啊!指不准还得跑一趟关内,累啊,要是自己有车就好了!