All Stories

受不了了

  真不知道他们怎么想的。都已经到了要自己画出节点,画出节点中的文字,画出节点连接线的地步了,为什么还死抱着用Excel画出然后copy图片不放呢!自己做个编辑器,跟研究一套还不知道能实现多少效果的东西,需要的时间差别应该不大吧。时间其实都是在这种犹豫不决、优柔寡断中浪费掉的。  总之,我很无语。

要好好设计一下皮肤机制

  换墙纸的东东本来主业是为了能自动换墙纸,结果现在重心却移到了日历和时间显示上去了。关于界面方面的技术问题基本已经都解决了,主要是学那些日历软件的换肤功能,可以把PNG文件直接作为皮肤来加载,接下来就是要好好设计一下皮肤的机制。  早在做输入法时,就已经能实现换肤和异形窗体,那时只能支持BMP格式的图片文件,但所有代码全是用纯GDI完成,所以实现起来很简单,用API就能直接画出来,在窗口上写字什么的也很方便。但现在为了能使用PNG格式,就不得不用了GDI+,用PNG的好处在于,从图片上就能直接应用某些区域部分不同程度的透明化,BMP是很难达到这样的效果的。于是,从实现角度看,区别还是挺大的,而且不知道是不是我用得有问题,有时候它占用CPU有点多。不过暂时不管这些,毕竟能用了,先考虑一下如何有效地加载皮肤,并能比较灵活地定制和扩充窗体。  最先开始动手做这个东东的时候,原始的想法是时间显示是一个窗体的实现,日历显示是另一个窗体的实现,这样可以预见到的是对于界面部分的代码必定很大程度上是可以共用的,还甚至想过怎么把这部分抽象提取出来呢。到今天突然觉得,其实这个完全可以用同一个实现,至于显示什么内容,可以通过设计一个具有良好弹性可扩充性的皮肤机制来实现。初步想法是,一个皮肤至少包括一个图片文件和一个配置文件,图片文件用来最终描绘窗体,而配置文件则描述剩下的其它内容,比如在什么位置,使用什么字体,显示什么内容,这内容部分也是由主程序定义的一堆描述性的转义命令,例如当前日,月,年,小时,分等等。现在的困难就是配置文件要被定义成什么样,这个皮肤机制才能有足够的灵活性和后续可扩展性。比如显示内容,我可以让它是定义字体后再通过程序来输出文字,也可以是直接将另一个图片文件中的内容贴上去,我应该怎么选择呢?另外,因为想用一套程序代码实现时间和日历的显示功能,所以定义的转义命令也要考虑得周全一点,除了当前年月日,时分秒外,还需要星期、月历,也需要任意指定的某年某月某日的日历或月历,除了要有公历外,还要有农历和二十四节气、节日等等。  而这些,则还完全只限于实现一个时间和日历的功能,像现在的雪狐日历精灵,已经可以以皮肤的形式还实现计算器,游鱼等更实用或更娱乐化的内容。如果考虑到这些,这个皮肤配置文件就需要设计得更灵活强大才行。顺带还有另外一个待决策问题,这个配置文件用XML描述好呢,还是用Lua之类的脚本语言描述好?从我个人的熟悉程度来讲,XML明显好过Lua,从表达能力上讲,也许Lua更强一些,但ANT不也用XML实现了一套比较强悍的语法了么!  总之,这皮肤的机制得专门花时间认真设计一下了。

感冒了

  昨天感冒就比较严重了,流鼻涕不说,连嗓音都变了。人也有点昏昏沉沉的,不想干活。  无所事事了快一天,下午的时候终于下决心用VBA在Excel中写个宏,可以在工具栏上添加个按钮,点击这个按钮,可以把当前sheet中的内容导出成xml格式。这是那工具的一部分,因为要维护一个人员组织结构关系数据,我当初为了实现方便简单起见,就用xml格式来表现,因为xml本来就是一个树型的结构,跟我需要的完全一致。可是后来马上就引发出另一个需求,这个xml文件需要有人维护,而如果从头开始完全手工维护则太麻烦,于是就需要有个工具,能够从另外的地方得到数据,最后生成目标xml文件。  这件事本来一直搁置在一边没管,最近因为工具已经给几位老大演示了,于是让我感觉似乎这个应该花点时间先弄一下了。我们公司特别喜欢用Excel来存储和传递数据,所以很理所当然的,这个原始数据也是放在Excel中的。于是我先是犹豫了一阵子,这个工作是用VBA写好呢,还是用VC写好呢。如果是以前,我肯定不加思索地直接硬着头皮地用VBA写了,因为不懂如何用VC操作Excel,现在不一样了,哈哈,于是再一次印证,没有选择也是一种幸福呢!  开始前天的时候用VBA写了一会儿,发现很不习惯,有点想放弃了,到时候用VC随手写一个算了。昨天下午还是决定继续用VBA写,简单定了些限制和规则,可以直接按组织层次结构生成xml格式的文件了。后来又通过Lotus Notes的COM接口,通过工号查询到该用户的域账号。  基本完成,哈哈!剩下的就是主程序在启动时,装入这个数据前,需要能自动从网上升级。另外还要做的是,要hook掉NtOpenProcess,这样一般通过Windows的任务管理器就不能杀掉我的进程了,而同时在托盘右键菜单中加入一个退出功能,退出前会要求输入验证码,现在我把这个验证码设计为当前登录域账号的SHA512值,但我想,这个算法应该能自动切换,不同的时间自动使用不同的算法,这样就用户就可能很难猜出用什么了。

这东东还有得做了

  本来老大说要跟大boss去说先放缓其中一个需求的实现,结果看样子好像他也说不过,于是来跟我说要再好好讨论一下之后怎么做。下午,晚上,老大断断续续地提到过几次,都是关于那个需求的实现问题。原来的设计方案是完全行不通了的,还说下午大boss打电话给他,大boss自己在那里想了一个下午,关于工具的好多想法。把我们老大有点吓到了,一个二级部门主管,亲自过问一个工具的设计、实现细节,由此可见其重视程度,反过来讲,他是不是工作量不饱满啊,哈哈。  老大后来说了句,看来要自己做一个流程文件编辑器了。这是我从这个项目开始,就已经预见到的结果,似乎还隐隐地有点儿兴奋。不过我的想法跟老大的不一样,组里有一个三人组,对这方面技术的喜好几乎一样,认知程度也似乎很相近和类似,也就是绕着ATL、COM转,偏执地认为COM几乎可解决一切问题,什么东西都要跟COM挂上钩。这次的事情要跟COM搭上边,就是老大认为MS Office里有个Graph组件,所有的Office中的画图功能都是用它来实现的,鉴于Office中COM接口暴露得一直比较多,于是老大觉得这个Graph肯定可以通过COM来调用,为我所用,一旦研究成功,以后其它地方也是大有用武之地的。  但是在我看来,与其花时间去研究那些COM接口,似乎根本就没有任何可参考的资料,还不如研究一下图形学呢。相比之下,最大的难点在于线条的绘制,线条可以是直线、曲线,还可以有方向和端点,可以根据两端的节点移动位置而自动伸缩和旋转。研究那些COM接口,可能需要的精力和时间都不比研究图形学少,而且后者是一种通用的技术,一次学会,到处可以用,换一种平台也可以用,比如从Windows切换到Unix-like的系统,或者要在以OpenGL、DirectX之类实现的地方用,Graph那套东西就废了。  再次抱怨一下,过度的偏好,影响了客观评价能力。

改了一天还没改完

  说什么没有层次感,所以我就决定把ListView换掉,换成Xtreme Toolkit Pro里的Report控件。这个控件主要功能还是类似ListView的,以多列显示多个记录的各个字段内容,它多出来的功能就是能自动按指定的列分组,并排序。  于是今天就动手改,结果改了一天还没改完,工作量真有点大,毕竟也确实写了不少代码的,呵呵。而且顺便发现了一个严重的bug,以前居然都没意识到。简单描述一下,首先我从数据库中查询出所有的数据来,存放到STL容器vector中,然后每次用户通过右键菜单选择,或双击时,都是针对当前选中的项进行操作,这时就有问题了,我只是单纯地获取选中项在ListView中的序号,再对应到vector中找到那条记录,如果ListView中的内容自添加完之后一直没修改过,那么这样操作是没有问题的,但是如果通过点击ListView的头来进行过按列排序,那么这样做应该是不对了吧,这个ListView中的序号跟vector中的偏移已经不能对应上了。真险啊,幸亏现在就发现这个问题了,而且刚好反正是要修改这块代码。  另外一个问题是,需要把每条记录的唯一标志,比如vector中的偏移量,记录下来,在需要的时候可以马上获取到,这也浪费我不少时间,到下班还没搞好。  还有就是shell扩展总是有问题,问题源自于通过ADO访问Access数据库。本来我让shell扩展和主程序同时访问同一个Access文件的,后来发现主程序总是不能正常退出,看现象感觉是因为ADO访问同一个Access文件导致COM接口可能不能正常释放,所以进程退不出,到时候其它资源全释放了,却还有个残留映象在那里。于是我后来改成每次shell扩展需要查数据库时,都复制一个备份的Access文件,shell扩展就访问备份的这个。用了一段时间后,发现这样每一次查询操作都要先进行一次文件复制操作,效率太低了。于是改成让主程序每次修改了数据库后,主动生成一个备份文件,这样shell扩展就不用作文件复制操作了。但今天又发现问题了,有时候并没有生成这个备份文件,而我在shell扩展中并没有防御性的代码,直接就explorer.exe崩溃了。看来还得改呀!

演示了一把

  上午去演示了一把这几个月来在弄的那东东,仔细看功能,似乎其实并没有什么特别重要的功能,而且有好几个在他们口中是很重要的需求并没有实现,这让我觉得很沮丧。从11点开始,一直到快12点半了才完,心情低落到了谷底。下午的时候,也没有心情做事,一直坐着发呆,先跟老大大概汇报了一下演示的过程和结果,然后讨论了一会儿之后要怎么做。接着就是出神,心也不知道飘到哪里去了。  主要还有2个大需求尚未实现,一个是流程变更后的自动更新问题,灵活绘制流程图的要求再次浮出水面,还是那个老问题,对于已经删除掉的节点,如果下面仍然挂有内容,则需要以虚线框表示出来。另一个是流程下需要能挂接子流程,这样就可以通过一个主流程一路找下去,找到任意角落里的东西。  第一个需求在我看来,似乎是可有可无的,而且从我程序实现的角度看,代价比较高了。第二个倒是感觉有点道理,似乎有点意思,虽然可以一次性在开始就把所有可见的流程都列出来,就像现在做的那样,但多加这么个功能,感觉更符合平常人思维习惯。  另外还有一些小需求,比如能支持其他来源的数据,像notes数据库中的内容等。  然后下午的时候,有人告诉我,这东东通过审计了,所有与会的人一致拍板同意通过这个project。我其实根本不知道这个的意义何在,审计是为了什么,这么小小一东西。  当然这就意味着至少在年前,我是无法从这里抽身出来的,那边什么编辑器,模拟器之类的东东,就暂时没法投入其中了。

元旦又过完了

  时间总是过得飞快,转眼间就三天过去了。今天放假政策跟往常不同,大概是顾及到为补放假其它加班的日子不能挤在一起吧。  三天只在昨天下午去华强北稍微逛了一会儿,还是觉得挺无聊的。今天就安分守己地又在屋里呆了一天,在整一个自动换墙纸的东东。  本来从网上已经找了一个很简单的,可以实现定时从列表中取出候选的文件作为墙纸。不过那东东真的是太简单了,除了可以换墙纸,其他什么都不能做。我的要求就多了点,光是换墙纸的要求就比较高。除了能定时换外,我还希望能分别指定每个文件作为墙纸的持续时间,过了这段时间再换,还要能分别指定每个文件作为墙纸的样式,是居中或是平铺还是拉伸。  另外,我还要它顺便能像那些日历软件一样,在桌面上显示月历,或日历,并能显示一个时钟。既然有了日历,我就希望它能进行日程管理,定时提醒了。所以日历功能要比较方便强大,最好能有中国农历,这样提醒设置可以按照农历来设,比如像爸妈的生日都只有农历的,老不记得。然后是能打印,支持年历、月历、日历3种形式,还要能自定义样式。再次是显示日历、时钟理所当然地要有skin功能,这是作为一款日历软件的必备需求。  再有,一些锦上添花的功能,比如支持用外部脚本扩展,定期执行一条命令啊,发送个Email啊,关机啊等等。不过我倒是觉得,如果这个东东想让其他普通用户接受的话,脚本扩展功能是多此一举了,因为我猜大部分的普通用户是不懂,反而会觉得这软件难用,晕!只是我最近是近乎疯狂地希望给所有程序都加上外部脚本扩展的能力,呵呵。  说实话,这里看起来似乎没多少内容,但实际做起来还真是颇费时间的呢,而且我总感觉在家里写代码,状态明显不行,很多时候大脑似乎是处理消极抵抗状态,不像在公司,在极其困顿疲倦的状态下,还能逛敲键盘,而且居然出错的地方并不多!

再见,2007;你好,2008

  又到了年终总结的时候了。感觉这一年过得飞快啊,刚刚翻了一下上个元旦放假时的blog,原来我和跟雨烟一起去打了个耳洞,现在雨烟和小于都已经在北京了好久了。上个元旦还跟一群同事一起去笔架山,然后去吃自助烤肉,这次只是一个人在屋里蹲着,今天白天去购书中心逛了一会儿,觉得挺无聊的。总之似乎生活越来越单调枯燥了。  首先回顾一下即将结束的2007年吧。在原来的测试组中度过了第1个季度后,便被释放到了现在的系统组,从纯粹的测试工作中解放出来,做工具开发,当时还心里隐隐有点兴奋,以为可以大展身手了,结果当然跟许多故事一样,现实总是不能跟理想完全一致的,相反反而过得很无趣很苦闷。有几次我都想起当年自己不知从哪里听来的一句话,把自己感兴趣的事当作职业,是男人最不成熟的表现了。当然不得不承认的是,我确实不成熟,已经被好几个mm说过好几次了。也许我真的是一种奇怪的存在,与现在社会流行的类型风格步调格格不入。再转回正题,转到系统组后,先无所事事地看了足足一个月的文档,真的是无所事事哦!  终于一个月后,一个工具项目因为进度紧张,把我召唤过去支援,支援了5个月,从5月一直到8月底,那时统计了一下,5个月共写了有效代码6000行,不计注释和空行。这样算来大概平均不到60行/天,呵呵,似乎挺少的。当时觉得有点沮丧,我的产能这么低,其实回想当时在大队培训教材上看到国外的人均日产代码量,似乎也是几十行吧,呵呵。  9月份开始,就把我从该项目中抽出来,单独回去再搞原来的一个文档共享系统,美其名曰,业务流程一体化平台,其实概括一下,就是一个可以自定义文档组织方式的可以点对点传输文件的共享系统。就为了这么简单一个东西,跟那帮人扯皮扯了近两个月,几乎天天是无所事事的状态,因为总是要讨论需求,因为怕到时候做不出来。而我则是每次讨论完花个30分钟回顾整理一下讨论的内容,然后继续无所事事等待下一次讨论。  终于到10月底的时候老大拍板说可以做了,我感觉顿时像一只出笼的鸟儿。不过一直到现在,才勉强算是有个东西了,毕竟2个月时间能做出个啥东西呢!一个人的项目,自由度还是比较大的,比如我用了Boost,这个东东据说在Impeller时期,被老大驳回的,真不知道出于什么原因。其它的,真的一点技术含量都没有,所以做得一点兴趣都没有,一点成就感都没有。整来整去就是写几句SQL,调一下界面控件。  回顾完工作,再来回顾点别的。小丫头被我稀里糊涂地弄到成都去了,这让我当时很咬牙切齿了好一阵,这变态的人生,这变态的命运。然后是一年来在感情上一无所获,屡屡受挫。  总之,2007,一无所有的一年,再见了。  接着是即将来临的2008了。仍然先从工作开始说吧,其实工作上的事自己能把握的太少,只是我现在还是满怀期望地把手头那个一体化平台项目甩手后,把投入到Impeller中去,把想做的东西做一下,就是前两天说的,先把查找替换功能重构了,再把编辑器支持脚本扩展部分先自己给它做了,他们总是想着用COM来做,我并不喜欢,所以不认同,我要用SWIG的方式来做。然后是一个simulator,可能还有图形部分的内容。我现在最想弄的就是socket、图形、脚本与C/C++混合编程这几方面的东东了,呵呵,当然这全是我自己一厢情愿的美好愿景而已。  我一直很清楚,要从公司那老实安分地干下去,靠那点儿钱是没指望的,我要买车买房,讨老婆生小孩,好多事要做,好多钱要赚。所以还得想办法怎么多赚点钱,也许小思宇和孙同学说的真的很有道理,只要有钱了,愁啥。  接着就是上半年学车,考完后,靠工资和年终奖,去买个车。  最后还是一年复一年的期待,希望新的一年里,能遇到命中的那个人,嗯!  你好,2008,我来了!

真是贱啊

  真tmd的太郁闷了,平常要上班的日子,早上总是醒不来,闹钟响了之后还想继续睡,起不来。每到周末节假日可以好好休息的时候,却又睡不着了,早早就醒了,郁闷死了!  在家里写代码总是不行,是不是没有压力的缘故啊,感觉在公司里就流畅得多啊。现在在整的一个用来自动换墙纸的东东,用MFC怎么都弄不好啊,晕,连界面都费好多时候来整!