All Stories

堕落了几天

  这些天为了看一部网络小说,很是堕落啊,还熬过一个通宵,之后就一直没恢复过来,整天昏昏沉沉的。  开源里好东西还真是不少,前些天在公司网上看到有人提到一个libEtPan的库,原来是一个mail库,提供了pop3、imap、smtp、nntp等协议的支持,简单看看觉得还是挺有用的一个东东,可以放在程序里,结合程序崩溃报告,提供一个比较友好的用户体验。

编译log4cxx

  突发奇想,想编译log4cxx来试试。在官方网站上只看得到0.9.7的源代码包,这个源代码包是有VC工程文件的,可以直接用VC.NET2003打开升级工程文件进行编译,最后生成.lib和.dll文件来用。不过这不是我的目标,我想编译的是直接从SVN里取出来的代码,其实是偶然间看到硬盘上好久以前写的一个从SVN里CO出log4cxx源代码的批处理文件,里面只有一行内容:svn co http://svn.apache.org/repos/asf/logging/log4cxx/trunk loggin-log4cxx,随手点了一下就把文件都取下来了。看了它的INSTALL说明,就很想把它编译出来。  编译需要用ANT,要是在不久之前,我肯定直接放弃,不过前些日子搞CruiseControl时,也看了几行ANT脚本,至少知道ANT是用来做像make那样的事的。刚好CruiseControl中带了一个1.7.0版本的ANT,满足它1.6.1的要求。还需要cpptasks.jar和ant-contrib.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=36177下载,解压到ANT的lib目录下即可。接下来需要apr和apr-util,不知道这是干什么的,但反正编译时会去找它们,把它们的源代码和编译好的二进制文件都下载来,因为我尝试用VC2003直接编译它们的源代码并不能正常通过,所以也懒得弄了,把源代码分别解压出来,命名为apr和apr-util,再到它们的include文件夹中,把几个后缀为.hw的文件复制一份后缀改为.h。  需要准备的东西差不多齐全了,在运行ANT进行编译前,先修改一下build.xml文件,里面有几处名为comment和dependency的节点,注释掉,不知道干什么的,反正我编译的时候这里会报错,注释掉后就能通过了,而且好像对生成的文件没什么影响。再看看该文件中为VC6编译写的一小段配置项说明:-Ddebug=[true|false]-Doptimize=[speed|size|none]-Dversion=n.n.n-Denable-shared=[yes|no] (default yes)-Denable-static=[yes|no] (default yes)-Denable-char=[0, 1] (expose char* API, default 1)-Denable-wchar_t=[0, 1] (expose wchar_t* API, default 1)-Denable-unichar=[0, 1] (expose UniChar API, default 0)-Denable-cfstring[0, 1] (expose CFString API,...

搜了一天简历

  简直想吐啊,太无聊了,又完不成任务,要求那么多,根本是浪费时间嘛。有空写个程序来自己搜简历得了。大概的想法就是调用IE的接口,几乎所有的IE页面上的元素都可以通过COM接口访问到,除了验证码不能自动识别外,其它部分应该都可以用程序完成。另外还有个问题是,输入email和手机号后,要点击一个按钮看是否重复,这时它会弹出一个MessageBox,这该如何处理,我猜IE也是有接口可以屏蔽掉这个alert的,或者说可以直接把整个javascript脚本都替换掉,不过也仅仅是猜想而已。最熟悉的做法是在后台开个线程,监视是否有MessageBox弹出,然后自动获取MessageBox上的内容,再自动点一下那个确定按钮,呵呵。  不过想法虽好,到时候极有可能就不了了之了,这写个程序还是挺花精力的,呵呵。

Logging被Boost拒绝了

  昨天晚上回来看news group上的消息,前不久提交review的Logging库被认定为unacceptable,所以暂时还是没有日志库用了。今天看到Logging的作者说,打算再根据这些review意见写一个新的,估计在七月中下旬提交review。  一直需要一个好用的日志库,但看来看去都没有觉得满意的。ACE太庞大了,日志功能只是一个辅助,log4cpp和log4cxx不知道哪里惹到我了,就是有很大的抵触情绪,不想用。于是一直在等待Boost::Logging的问世,谁知还得等待。  希望不会让我等太久。

看到一线光明一丝曙光了

  经过不短时间的调试,下午终于可以显示出一个虚线画出的矩形框来了。虽然还只是一个虚线框,不但大小改了,位置也没计算好,而且还把连接线都丢了,但是总算是出来了。这一小步,对这个东东的进程来说,其实也是一大步。接下来就是计算一下连接线的位置,就差不多了啊,吃晚饭时那种喜悦放松的心情真是很久没体会过了,呵呵。  调试过程还是比较让我觉得痛苦的,首先是我的机器上Office 2003装好后,居然在我的程序里通过COM接口运行Excel时说注册码不合法,晕死,这可是公司大企业客户版啊!同事丢给我一个算号器,发现有两个Office 2003,用了不同的序列号,晕,另外一个怎么也找不到在哪里,今天上午一气之下把所有的Office这个字眼沾上关系的全让我卸载了,然后装了个Office 2007,偶然发现不再提示注册码不合法了,呼呼,真是玄乎呀。  不过后来发现,有一个函数用来把Excel里的图形复制到系统剪切板中,然后再取出来存成GIF格式,当时一直在2003下处理,用了个魔鬼数字,直接取出指定编号的那种类型的剪切板数据,现在发现那个索引下的不是GIF格式数据了,呵呵,还意外发现了这么个bug呢!  另外还发现个有趣的问题,因为调试经常把Excel整死,若干次后,它居然弹出个对话框说Office似乎经常崩溃,什么深表歉意云云。  终于快要脱离这个苦海喽,回头是岸?

一年复一年,祝自己生日快乐

  自从离开了老家,就开始以公历计算自己的生日。又是一年生日到,早上小思宇发邮件给我,让我小小地感动了一把,真还有人记得哦,于是开始商量晚上去哪儿吃饭。下午的时候小妞也发邮件过来,不过上周五的时候小妞就说今天没空,于是就没喊她一起。然后叫上两个cm0同学一起去湘江老厨吃了一顿。下班时,老大说晚上的新员工预答辩人人都要参加,我马上说要请假,理由是晚上约了人吃饭,老大说了句哦,特殊情况,就放我走了,哈哈。也没吃多少,最后埋单时我都没看是多少钱。吃完饭,小思宇把小妞叫出来,一起到百草园游泳池边吃蛋糕,蛋糕其实大家都吃得很少,小妞是在减肥,真是计算着卡路里来吃东西的,而剩下我们几个是因为刚刚吃完饭,肚子还是比较撑的。  总之,祝自己生日快乐,在3个mm用她们的手护着那支小蜡烛不被风吹灭时,我飞快地许了3个愿望,我说我要多赚钱,多讨老婆,哈哈,还有一个我没说出来,希望大家都平平安安。

htmlemail by CruiseControl

  继续捣鼓CruiseControl,从头到尾看了一遍Config Reference————的目录,发现有几项东东还是挺有趣的,主要集中在所谓的“持续反馈”部分。CC能支持Email通知是早就知道了,在公司里都偷偷用公司的SMTP给notes发过,只是后来想想公司那么刻板的信息安全问题,立马取消了。今天看到有一项是htmlemail,说是可以支持发送htmlemail,以前虽然在书上或网上也看到过截图,它能把Buildresult以在Web浏览器中看到的形式发送邮箱中。但我却发现自己的都只能发送一条链接信息过来,很奇怪。  本来都快放弃了,隐约都开始怀疑别人说的真实性了,后来偶然发现控制台里的输出信息,说是找不到那些个XML格式的日志文件。再后来突然想起来,它怎么跑到CC所在目录下的logs目录中找那些日志呢,我明明把路径都设置到其它地方去了啊。不过这样也好,至少知道可能是因为这个问题引起的不能发送htmlemail了。于是马上把日志目录再次改回CC所在目录下的logs目录,再试一把,果然OK啦!  再看,CC还能支持把build result发送到blog上去呢,不过我试了一下这个在blogger.com上的blog,没成功,我估计是因为CC要求的XML RPC地址没写对,我找不到哪里有这个地址,先不管了,呵呵!

修改CruiseControl的配置

  在家无聊,看到CruiseControl里的东西就想整一下,一直以来只是抄袭了同事的脚本在这里跑,只能手动地去点击一下按钮才能激发,想着就不舒服。从网上搜了点资料看看,实在是找不到有用的,于是再回来看自带的帮助和自带的例子,偶然发现,虽然命令行中老是输出一堆一堆的内容,其实对于出错的情况还是解释得比较清楚的,尽管不详细。仔细调试配置脚本,终于可以定时轮循VSS中的文件并做出相应的响应了。其实非常简单,只是以前一直没有静下心来搞而已: <listeners>    <currentbuildstatuslistener file="${ccworkspace}/logs/${project.name}/status.txt"/></listeners><bootstrappers>    <vssbootstrapper vsspath="${vsspath}" ssdir="${ssdir}" login="${username},${password}" serverpath="${serverpath}" localdirectory="${ccworkspace}/projects/${project.name}"/></bootstrappers><modificationset quietperiod="30">    <vss ssdir="${ssdir}" login="${username},${password}" vsspath="${vsspath}" serverpath="${serverpath}" dateformat="yy-MM-dd" timeformat="HH:mm"/></modificationset><schedule interval="600">    <ant antscript="${antpath}" antworkingdir="${ccworkspace}" buildfile="build.xml" target="wallpaperhelper_All"/></schedule>各节属性的作用都可以查看CC帮助了解,只要把该填的都填好,就基本上没什么问题了。用VSS跟用SVN或CVS还是有一点区别的,网上很难找到用VSS的例子,好在也确实不复杂,呵呵。  解决了这个问题后,我就开始得寸进尺期望CC能在后台运行。CC自带的解决方案是用一个叫Jetty的应用程序服务器,然后通过JAVA来运行。从这里可以看出,应该是能用Tomcat之类的其它的应用程序服务器来运行CC的,而Tomcat又能跟Apache配接在一起用,所以我觉得大概这是最好的方案,不过就是对于几人几十人的小项目来说,似乎有点杀鸡用牛刀了。其实再看一下那个启动CC用的bat文件就能发现,只要预先设置好几个环境变量,然后就能在后台用JAVAW.EXE来启动CC了。这里还有一个问题是,CC启动时,会在当前目录下寻找config.xml文件,所以一定要把config.xml文件放在它找得到的地方,我的办法是给这个命令行建立一个快捷方式,然后把开始位置设到config.xml所在的目录下,把这个快捷方式放到开始菜单的启动文件夹中,就可以让CC随着系统而在后台一起启动了。但是,后台运行也有一个不好的地方,不能随时看到CC最新的运行状态,通过浏览器的信息总感觉有些许延迟。

使用Windbg定位程序崩溃

  今天突发奇想,看到Edraw的一个软件包里有个CrashReport程序,觉得这个功能真是很值得放到自己的工程中去。想想大概原理就是使用dbghelp.dll库中的Debug API来实现,不过具体细节我是一点都不懂。记起以前在公司网上看到有人提到过FileZilla就有这样的功能,可以在程序崩溃的那一刻记下程序堆栈,函数调用栈,寄存器等有用信息。于是我马上找来FileZilla代码,运气也好,刚好找到2.x版本的,因为3.0以上版本的源代码包中是不带这部分代码了。这部分代码模块独立性做得相当好,只要把那几个文件抠出来加入自己的工程,几乎不用怎么修改就可以工作了。要做试验的话,可以来个除0错误,或者向空指针写入值,然后运行,就会弹出消息框,并生成2个文件,一个是文本格式的简要信息,另一个是二进制格式的core dump。又在公司网上找到一篇用Windbg分析core dump文件的简要介绍,马上拿来试试,还真是好用,设置好symbol目录和source目录,它能自动从网上下载缺少的symbol文件,并能自动打开源代码文件跳转到引起崩溃的那行代码上,真是太爽啦。以后再定位程序莫名崩溃问题,要方便简单多啦。