Category imported from CSDN
尽管是后半夜2点才睡的,早上7点20又自己醒过来,真郁闷,于是开始打点,洗澡、洗头、刮脸、洗脸等等,然后上了一会儿网,到8点40的时候,开始收拾要带的东西,就是换的衣服、泳裤、太阳帽、拖鞋这些,就在要出门的时候,同事打电话来催了。这次忒方便,就在小区门口的公车站上车。老大的帽子和太阳镜好 fashion!
先骂两句,这个csdn的blog太太太太太不稳定了,其稳定性只能用一个字来形容,“烂”,如果可以用两个字的话,就是“很烂”,再长一点三个字,“非常烂”,四个字的版本是“咋那么烂”,假如一定要用五个字的话,我想说“烂得不得了”!
用鱼鱼桌面秀装扮了一下桌面,视觉效果不错,不过最大的一个毛病,就是总要把程序焦点抢过去,所以导致有时候为了做点事情,不得不先把它关了。这样一来,它就真的只是个中看不中用的东东了。另外就是,它居然用Object Pascal作为它的脚本语言扩展,好像InnoSetup也是用OP,网上有个RamObjects的project,不知道有没有什么联系。鱼鱼提供了一大堆的函数,不过看了一下论坛上的扩展,似乎绝大部分第三方的插件都仅限于在官方插件的基础上换个皮肤,没有其它更有创意的东西了。以前用鱼鱼日历秀的时候,在Windows的进程管理器中看到它占用的内存很小,很惊奇,昨天才用LLYF ProcessHelper看了一下,其实它占用的内存峰值还是超过30MB的,估计是不停地调用EmptyWorkingSet造成占用物理内存低的假象吧。
今天下午去跟一个同事买电脑,先是跟xcc走来走去,逛了2个小时,然后找到同事,一起去逛电脑市场,同事看了几个本本后,毅然决定买一个,而且在那样的价格底线下,同时又要追求一定的外观和性能,只有那么几款了,就只追着HP的DV1600系列看,最后,想要的DV1617也没有了,无奈之际,只好转向 Compaq,看中一款2626AU,似乎外观稍微次一点,但其它的都还可以,基本能满足同事平常娱乐消遣的需求了。装的软件全是D版的,晕!不过怎么说,也算是可定制程度高啊,像IBM的,就那么弄死了。
这句话是从一个同事那里听来的,那时还蛮不在意的,觉得只是随心之语。
在VCKBASE 上看到一段代码,觉得好玩,打开VC2005 试了试,得出一大堆数据来,高兴死了。于是想增强一下ProcessHelper,把代码从VSS 里Check out,打开BDS2006来,整了一会,发现有一部分代码总是工作不正常,而同样的代码在VC2005 里面却工作得好好的,这是怎么回事!不禁又要抱怨一番,总感觉除了VCL,Borland 的C++ 编译器套件不如Microsoft 的好用(其实是我自己的问题啦)!稍微仔细地观察一下问题现象,发现似乎是结构体里面引用成员变量时错位了。我马上想到,是不是字节对齐的缘故。然后加上调试语句,看这个结构体的大小,果然在BDS2006里是 56bytes,而VC2005里是64bytes,差了整整8个字节,还以为是编译选项没选好,就在这个结构体声明的地方加了强制8字节对齐。试了试,还是老问题。于是索性在使用这个结构体的地方,把各个成员的起始地址都打印出来看,好像两边都一样。后来,想想用sizeof看看里面各个成员变量占用多少空间,发现BDS2006里最后两个成员,都只占用1byte,而VC2005里都占用4bytes!看到这两个变量的类型,都是枚举类型,突然想起C++ Builder里有个编译选项可以设置是否把枚举类型当作整型来处理,找了一会,勾上这个再编译,运行,果然好了!
我不知道应该怎么把宿主程序提供功能并开放接口给插件。不知道用COM 行不行?
以前写什么程序,都是随着自己的兴趣来的。那个LLYFSpy,完全是看着MySpy 和Spy4Win,觉得可以把它们两个的功能整合一下,再加一点其它的功能,于是就成了现在这个样子,而且前段时间有一次为了研究一个别人的程序,发现有些时间只有用Spy++才行,于是责问自己,为什么LLYFSpy 不行,不是早就得意洋洋地认为全面超越了Spy++的功能了吗?再早一点的ProcessHelper,也是因为看到优化大师里的那个进程管理器,觉得可以撇开Windows 的进程管理器的功能,再实现一个自己想要的功能的程序。还有那个阿菲连连看,动机更简单,就是为了享受阿达连连看那样的视觉和听觉上的效果,又苦于网上找不到好用的破解,就自己写一个,写完不久,就全丢了。还有其它的一些小程序,比如IPKeeper,为了在学校的时候被人冲IP 掉线的时候能自动修复网络连接等等等等。上次硬盘出问题,结果弄丢的计划书,看来也许是反而有点好处的,可以让我再重视仔细审视一下写程序的目的,为什么要写这样的程序。以前计划了好些,模仿QQ 游戏的程序,现在想来,没多少意义,对于现在的想法来说,确实没有多少意义,现在我只关注的是,能不能用程序来做点有用的事情。看到按键精灵,觉得它很赚钱,于是也想弄一个类似的,但还要强的东西。看到鱼鱼的日记本,我突然很沮丧地觉得,我一直想做的,被他做了。我现在要做的,应该是经过调查后确认有意义,才做的。那个YuyuNES 是绝对有意义的,因为一方面,可以对虚拟机的实现有所研究和实践,另外还可以对 Windows平台上用DX进行图像和音效处理有相关的经验,这正是Windows上进行游戏编程的两大基本技能。LLYF VirtualTyper 呢,一来想尝试一下新的软件架构的想法,二来为了去分一杯羹,呵呵。
今天,是我旁边这个同事最后一天来这里上班了,明天开始她就请假不来了,下周就去北京报到了。她是个很厉害的人,所以公司也不舍得失去这样的人才啊!愿她在新的工作岗位有新的发展,呵呵!
今天在公司,感觉没什么事可以做的,其实零零散散还是有些事,但就是没提起劲来。突然觉得在这里混不下去了,有点需要重新正视自己,我是不是有些什么问题,怎么没人会喜欢我呢,连工作的时候跟领导关系都搞不好,领导都不喜欢我,当然混不出啥名堂了。一旁的同事在那边收拾东西,她终于可以如愿去北京了。另外一个最近经常一起吃午饭的同事,说已经跟领导说了,要辞职了。我问他去哪里,他说还没找,就在这里找一下,想找个自己感兴趣的岗位。还说,上次问过我想不想干些自己有兴趣的事,而我似乎没怎么积极地响应他。我是又发现了自己一个缺点:胆小。我是肯定没有这么洒脱,敢这样不找好后路就辞职。但是,我今天也确实觉得很不爽,觉得自己混不下去了,一定要换个环境才行了。也许我真的是太心高气傲了。我要辞职,脑海中就只有这么个念头,连和我一起大队培训,一起到部门报到的那个同事都辞职了。只有我,死守着这块没有生机的土壤,不敢有任何异动。给afei发了条短信,她也没多说什么。突然很想知道,小玉玉现在怎么样了,那个一直吵着要离职要回家的小女孩,有没有哪个人可以让她安心留下来呢,就像小妞那样。
不知道是不是因为周日晚上的关系,网速特别慢!因为人们都在这个时候回到家,然后觉得有必要上一下网。L.L.叫我去看她的blog,想留言,却硬是有点问题,不知道是MSN 的blog 和FF 的搭配使用本来就有点问题,还是MSN 的blog 的自己的问题,或者是FF自己的问题,再或者是因为网速慢的缘故。自从搬过来这边能上网以来,一直都是使用FF的,装了几个插件,但今天才发现,原来FF占用的内存非常大,最小化的时候系统还不回收一下,它占用的CPU 也经常很多,说实话,我个人很菜地认为,这方面,FF 确实比不上IE!而我现在用它的理由是,一来它开源,它免费,二来,很多流氓软件,流氓代码都只对IE有效,FF的免疫力暂时还不错,三来,FF 有一个比较方便的标签浏览功能,IE 好像还没做到这么好,有个假的糊弄人的!冲着这些,我用坚持用FF 已经1个多月了,几乎不用IE来看网页了,即使是些IE Only的网页,也用IE Tab 扩展搞定了。
早上还在睡觉的时候,Softtrain就发来一条短信,说在搬家了,要11点到,然后我就迷迷糊糊临时修改行程计划,等他过来了,在这边一起吃个饭,再过去。等过去了,就被说成我放人家鸽子了,郁闷,有点不好意思,确实似乎是放人家鸽子了。在空调下面吹了一会儿,Softtrain就说要走了,要去华强北,我又临时改变主意,我不想动了,然后就落在那里不走了。过了一会儿,去红树林,打了几个小时牌,斗地主。然后去吹了吹海风,天气可真够热的。还去下面捉了两只只有我大拇指指甲那么大小的蟹,好乖哟,结果给了一个小孩子,还被他的大人说,快点谢谢叔叔,郁闷!那大人还是反应比较快的,马上改口说,快点谢谢哥哥。想起那次和小玉玉在百草园超市的时候,一个小女孩先是叫我叔叔,被小玉玉趁机嘲笑了一番,小女孩又叫小玉玉阿姨,我就趁机嘲笑回来。看来我的长相确实比较老。
整了几个小时Scintilla ,不知道我嵌入后,那个WM_NOTIFY 被VCL 从哪里截走了,就是找不到了。我还指望它来实现代码折叠的呢,这种时候RAD 的就是要费更多时间来找其中的机理了,在公司的内部网络上,也看到过几个帖子涉及到VCL 的消息传递机制的,当时还充当过大牛的样子呢。郁闷,不过显示行号的功能倒是搞出来了,看到几个网上的文档,加上SciTE 和Notepad++ 的源代码,勉强可以凑合,但是代码折叠的不是Scintilla 的问题了,现在的瓶颈是VCL 把我的WM_NOTIFY 藏起来了。
晚上让Softtrain在下面等了大半个小时后,终于解脱了,然后带他去毛氏吃饭。其实是想不出其它我喜欢的地方,所以就去了,好久没去了,居然遇到小妞和小思宇,然后就和她们俩一起吃。真是好久没吃了,就是想不起能点些什么菜,看了菜单也没啥想法~
整了下Scintilla,把它弄进去了,初步了解了怎么让它支持某种语言的关键字高亮,还是非常非常方便简单的!以后还要加入代码折叠,行号显示以及自动完成功能。如果是要专心地完成一个编辑器,要做的事情还是比较多的,看一下SciTE 和Notepad++ 就知道,不过我可能不需要做那么完整,只要有个看起来比RichEdit 强一点的编辑框就够啦,哈哈!这部分代码以后重用的机会肯定还是有的,比如MspEmu 中。另外就是,对关键字高亮的支持,应该写一个通用的接口,然后把语言相关的信息全都写到外部的配置文件中,这样才是比较经济又灵活的方案,呵呵,然后要动态判断是属于哪个语言的代码,再动态地修改Lexer 属性。这样以后可以在不修改主程序的情况下,动态地添加对新的语言的支持。
按键精灵,模拟精灵,按键游侠,都提供了不同程度的对Windows 平台下鼠标键盘的输入的程序模拟,可以实现无人值守的自动化某些机械重复的操作。其中模拟精灵的功能整体上远远强于另外两款,它似乎是真心致力于成为一个通用的自动化工具,而不像按键精灵,打着合法的旗帜,提供了一系列的功能方便用户写出挂机脚本,大规模地流行于网游玩家之间,但是反复地强调自己的合法性,却死守着不愿意增加某些特性,并以此为自己辩解;按键游侠则似乎还没有多少明显的论调或态度,从它提供的功能来看,它是直接宣告自己的辅助网游工具的角色了。三款工具,模拟精灵的功能最为复杂,能做的事情整体来说,应该也是最强大的,但是正是这些强大的功能导致的使用比较复杂,吓走了大量的低中级网游玩家,而投入按键精灵的门下,按键精灵经过几年的发展,功能上也大致够用,技术上的积累基本已经走到尽头,现在已经疲于干些网游外挂才干的事,一心想的就是如何能防封杀,从现在最新的发布版本5.92来看,按键精灵的VBS 支持以及DLL 插件的架构,几乎已经可以实现所有需要的对于按键模拟的功能,而不用修改主程序,主程序确实只要把精力放在如果提供更好的反反挂能力上,但因为大量的按键精灵用户都是只会一点点VBS 的初中级用户,稍微需要点Win32 API 知识的问题,VBS 直接解决不了的问题,用户都会等着官方版本的升级来解决,而按键游侠,也没有多少新的创意,几乎是按键精灵的翻版加上一些用户迫切需要而按键精灵出于某些原因暂时没有加入的功能,从用户积累,品牌效应以及技术等方面看,按键游侠要在短期内超过按键精灵是不太可能的。
前一天晚上,afei 在MSN 叫我今天去她那里,我还说,下班太晚了,不去了。结果今天中午去食堂吃饭的时候,被z3 诱惑了一下,就说要一起去了。
坐我旁边的同事,终于辞职了。今天看她在那里一项一项地给其他同事交接工作,不禁感叹,这个世界变化也真算快的。去年7月我来到公司,在导师旁边坐了两个月后,从9月开始就一直坐她旁边,在工作上,她真的给我莫大的帮助。每次有什么问题,我总喜欢问她,而她也一般都会知道这些事情。一方面她确实是个很认真很能干的人,另外一方面我有时候觉得,读过研的人,在某些方面,考虑问题的全面性深刻性就是比只上过本科的人要强。现在她终于决定走喽!少了一个幽默又爱搞笑的人喽!
中午去食堂,排队打完饭,走到平常一直去的位子附近,扫视了一遍,却没想到什么东西,大脑一片空白,甚至只看到一个个的人坐在那里,却看不到这些人的脸长什么样,似乎连其它声音都听不到了。
上午刚起床不久,在上网的时候,一个陌生的号码拨进我的手机,听到的是一个软绵绵的语速缓慢的女声,还在那里问我知道是谁不,我说知道啊,她说怎么会知道,知道就怪了,我就说不说是某某吗,然后她就觉得有点吃惊说,听得出来啊。呵呵,当然听得出来了,这么有特色的语气语调,认识我或我认识的人中,也就这么一个人了。然后她说,今天到我家来玩吧,坐几路几路车在哪个站哪个站下看到哪栋哪栋建筑往哪条哪条小弄堂里走就能看到那个叫啥子啥子的小区了。我就接着说,是那栋那单元那套房吧?她就在那里叫,啊,你跟踪我。我才不会这么费劲呢,只是刚好前一天看到旁边那个人的邮件上写着这个地址,看过一眼,刚好到现在还记得罢了。
用Borland 的编译器直接编译了一个lua5.1的源代码,生成了一个lib文件,链接进我的工程里,就是不能用,工程的编译链接都可以通过,但是到运行可执行文件的时候,就直接弹出个访问违例。倒是那个我用VC7.1编译的dll 文件,从中导出一个lib 文件一直用得好好的,晕!
我终于放弃了嵌入Python 解释器的努力,反正经过Lua 和Tcl 两种语言的嵌入工作,看到Python 的简直想吐,为什么要弄得这么复杂?先把这部分屏蔽掉吧!
界面稍微改了一下,把协议模拟的按钮和菜单项隐藏起来了,因为肯定没时间做了,另外在工具栏上添加了个按钮,可以拉出菜单,选择运行插件。
原来在getglobal 函数名前,loadfile 后,要先pcall 一次,0参数的,然后就可以正常地调用脚本中的函数了。这点白天就想到了,晚上回到家,看到mail list 上也有人说了。
在脚本里写了个很简单的函数,然后在宿主程序里调用它,死活调用不成功,看一下错误信息,说是试图调用一个nil 值,可是我明明在脚本里定义了这个函数的呀。其它部分倒还好说,在宿主程序中可以取得全局的脚本中的变量值,脚本也可以比较顺利地调用宿主程序定义了并注册给解释器的函数,现在就是这个搞不定,郁闷,只好操上蹩脚的english,上mail list 里问一下了。如果不行,还有一条路可以走,想办法能不通过函数调用就取得宿主程序中的变量值。开源的,文档就是少啊!
白天跟旁边一个同事说,我最讨厌跟人打交道了,同事说,你性格有缺陷,然后又不失时机地说,加油!我只好硬着头皮给那些人打电话,发邮件,爱理不理我也不管了,自己心里想开点想通了就好了,都是给人打工的,没什么差别的,有什么好怕的,有什么好拽的。
回来的时候刚好遇到雨最大的时候,只是保护了上身没被打湿,hoho~~~
今天看到小妞了,中午在食堂底楼靠边的地方,还是那个样子,圆圆的脸,披着一头长发,慢条斯理地吃着菜,估计是在等人。我当时有点意外,因为没想过会遇到,都快忘了她在每周最后一天经常可能会来“贩卖人口”。我只是说了句“又来……”后面的没说出口,一时语塞。
想起那次在茂业被说成是兄妹,呵呵。
突然觉得我这些天一直在做着一件毫无意义的事情。也不管那么多了,现在只能咬着牙,硬着头皮把它整完了,这季度考评中有5分还全指望这个了。
增加了浏览脚本源代码和用外部程序打开脚本文件的功能。读文件部分直接用Win32 API 来做,感觉有点怪怪的,还是习惯用C 库,连C++ 标准库都没啥了解,也许过些天心血来潮会把它改掉用iostream 来实现吧。现在插件管理功能基本已经达到预期目标了。
意外地发现,只要对hhctrl.ocx 执行implib 导出的lib 文件就可以直接用在BDS2006 的工程里了,再也不用LoadLibrary 和GetProcAddress 了,再也不用为什么时候FreeLibrary 而发愁了,一切都变得那么美好,意外地发现,sf.net 上还有个叫bccSDK 的项目,专门把MS 新发布的一切库移植到可以用Borland 的C 编译器下使用,其实就是一堆的lib 文件,当然还有那个htmlhelp.lib,不过我没有用,因为我已经自己暂时解决了,只是奇怪的是,以前明明我也这样做过,为什么不行呢?
看起来对应用程序与Tcl/Lua/Python 脚本语言之间的链接没多少问题了。至少到现在为止,给MspEmu 加上了最简单的链接嵌入,运行时从进程的模块列表中可以看到,三个dll 都赫然入目。每一种交互都需要一个初始化和清理扫尾工作,这个似乎都是约定俗成的。稍微抱怨一下,这方面的资料还真是少,google 了一番也没找到多少有用的信息,还是因为我的信息收集能力太弱了。
昨天突然发现,外接硬盘中有个分区打不开了,连卷标都丢失了,很郁闷的是,这个分区里放了些对自己很有纪念意义的照片,以及一些才收集来的文档和资料,所以很不甘心,文档资料可以再去网上找,但丢失的照片是只有这个“孤本”的,所以晚上就睡得有点不舒服。早上起来,还想能不能放到别人的电脑上去看看,能不能读出来,后来想想算了,估计也是没希望的,于是就在Windows 自带的磁盘管理功能里把这个分区删除了再添加上,盘符还是改成和原来的一样。然后尝试打开它,当然打不开了,它提示没有格式化,死马当活马医,就快速格式化了,文件系统也用和以前一样的NTFS,然后很怀旧地建了个一个和以前一样名字的文件夹。突然想起那些数据恢复工具不知道有没有用,于是上网搜了一下,down 下一个EasyRecovery 的专业版来,试图用Unformat 来恢复,搞了半个小时,没找出东西来,用Undelete 也没用。正当要放弃的时候,看到还有个RawRecovery 功能,就试了试,还真能找到一些文件,只是文件名全改乱了。太开心了,下午就出去了,让它自己在那里恢复吧。等晚上回来,重要的那些东西恢复了多数,主要是那些照片,还有些文档也恢复出很多,只是很多都损坏了,不能再打开了。整理了一部分,发现一个现象,ZIP 的包损坏率比RAR 的高出很多,可能是RAR 包的自我修复能力比较强吧。还有些doc 和pdf 文件,打不开了,不过不是很重要,也就随它去了,反正大概估计了一下,那些近期想要的文档都还知道网上从哪里能找到。
afei 她们事业部开“本部之星”的K歌比赛,xcc几天前开始约我有没有时间一起去,我当然欣然同意了。我们可真是翻山越岭啊,跋山涉水啊,历尽千辛万苦啊,转了几次车啊,先从我家门口坐328 到梅林,然后再坐334 到南山海雅,再坐226 到目的地新桃园酒店。结果我们迟到了1个小时,还好,只是前面唱过几个人,afei 还没上台。过了一小会,就是afei 上台了,离上次见到她又是有几个星期了吧,xcc 虽然是跟她一个公司的,但工作地不在一起,所以也应该很久没见过了,路上的时候我还向他介绍说afei 现在变瘦了,变漂亮了。现场的气氛很好,下面的观众都很配合台上的表演者,afei 那首《听海》也是唱得很有水准,有点像张靓颖的风格,嘿嘿,xcc 说不知道什么时候变得这样了,跟平时说话的时候完全不一样了,肯定是练了很久了。前面4个选手没听到,反正后面的6个我都觉得很明显唱得不如afei 好。台下的观众真的很热情,想想我们当时整个光网络产品线搞节目,产品线总裁在台上嘶声力竭地喊“大家一起来”,结果台下的人还是反应平平,木然地摇着手中的道具,傻傻地坐在座位上。
这周考了三场,周一到周五隔一天就一场,每门都是要求85分才算通过,这才是最让人郁闷的。不知道从何时开始,我就对考试怀着一种畏惧的心情,总是给自己心理暗示,说自己不擅长考试。还在大学的时候,60是最后的底线,但往往只要能找到足够数量的比自己还要堕落的人,还要低的分数,就算再低的分数也是能死里逃生的。现在就不行了,反正85分是硬指标,当然同时也是最终结果,至于过程如何,就看各人各显神通了。想起《Naruto》中的中忍考试笔试部分,就被称为是为了考验考生的情报收集能力,隐藏能力云云。结果看来我的情报收集能力似乎还算过得去的,只是自我保护意识薄弱了点,隐藏能力欠缺了点,呵呵。
看了一下把Lua嵌入到MspEmu中去,虽然从官方网站上down 到了据说是兼容BC 的编译器的二进制lib 文件,但实际用的时候似乎还是有点问题,说_errno 的引用找不到之类的。顺便在google 上找了一下Tcl 和Python 的内容,本来这些动态语言在与应用程序交互嵌入的时候都是优先考虑 VC的,有的几乎就根本不考虑其它编译器的情况,包括Borland 的。看了一下,有两种方案,一种是,如果已经有lib文件了,但是用VC编译器生成的,就用Borland 的一个随它的C++ 编译套装一起发布的小工具coff2omf 转一下格式,因为MS的二进制映像是coff格式的,而 Borland的则是omf格式的,这样转一下就可以链接到Borland 的C++ 工具生成的项目里去了,具体我也没实践过,不知道是否能用,总之看起来似乎没什么错,有道理的。另外一种是,找到那个dll 文件,用Borland 的一个小工具impdef 导出DLL 中的函数名,然后有个tcl 写的脚本,把别名处理一下,生成一个新的函数名列表文件,用这个新文件作为参数运行Borland 的另外一个工具implib ,就可以得到一个lib 文件了,直接用implib 也可以从dll 文件导出lib 文件,但也许VC生成的dll 中导出函数名与BCC 有区别,不一定能用。
用BDS2006发现好像编译速度变快了,快了不止一点点,尤其在make 一个project 的时候,如果有好些源代码文件,而其中只有一个文件是改动过了需要编译的话,感觉特别明显,比起用BCB6 时加上pch 插件还快。
昨天,哦不,应该是今天凌晨,熬夜装好的BDS2006,晚上回来就试用一下。把那个写了一半的数据分析程序从BCB6.0 移植过来,很顺利,因为我都没有使用其它任何第三方的控件。传说中改进了内存管理器,但这一点我是没什么切身的感触。有时候我在想,我为什么要升级,从BCB5.0升到6.0的时候,只是看到IDE中编辑器的代码提示功能相对好用了稳定了些,其它的都还没来得及比较,因为对于我来说,根本用不上那么多特性。这次升级到2006,看起来也只是IDE 变得更漂亮了,带来的副作用就是需要更大的内存,更快的CPU……另外的好处就是前面提到的,Borland帮我在后面默默地把内存管理做得比以前更好了,还有就是也许VCL之类的有些小改动,再看一下编译器,从5.6.4升级到5.82了,不知道有多少实质性的进展,更好的标准符合度?更强的代码优化?还有呢,对于我来说,大概就这些是有影响的吧,其它的实在也看不出来多少必要。
才说要考试的,说要85分才通过的,结果因为动用了一些不正规手段,虽然得了86.5,结果被逮出来了,老大说,有没有觉得冤枉之类的其它想法,我说没想法,既然被逮到了,就没话好说了,谁叫只有我们三个人过了85呢,而且对的错的又全都一样。
历尽千辛万苦,在eMule 上下了一个多星期,当然不是每天24小时开着,总算把前面3个CD 的镜像拖下来了,开始还以为不能用,因为看了网上n多的帖子文章,说前2个CD 的要repack 的才行,果然在Alcohol120% 里加载那几个cue 文件时,都说不能访问文件,用UE打开一看,里面的文件名似乎有点问题,改成对应的bin 文件的名字,再来加载,就可以了,如果只是要装一下C++Builder 和Delphi 的for Win32部分,很快的,不用第4个CD 的,我都没down 完,反正可以装了,装完之后,C++Builder 部分显示的是Preview 的,但是可以正常启动使用,也可以编译程序用,简单拖了个窗体,放个Button 和TMainMenu,都可以用。然后去Borland 的网站上down个Update2 的包下来,我的是Arch 版的,Update2 包也要对应的Arch 版的,装上后,从原来不要求注册的,变成要注册了的。在google 搜索的话,可以找到很多patch 的下载,其实有个更简单的方法,用UE 打开BDS\4.0\bin目录下的sanctuarylib.dll 文件,十六进制显示,搜索8D742444B90400000033D2F3A75F7504,把最后的04改为00,保存一下,再启动BDS,就可以发现不用注册了,而且C++Builder 也不再是Preview 了,哈哈,happy!
昨天,终于让我见识到晚点7小时20分钟的火车,本来说好是15:33就可以到站的,结果一直拖到22:50以后,在从火车站回家的公车上,xcc 发短信来说,刚刚从新闻上看到,这趟车昨天晚点9个小时,我不禁苦笑,看来今天运气还是不错的,只晚点这么点。从下午就开始计划的,xcc 无聊了跑到我这边住的地方,两个人也还是很没事做,他在那里上会儿网,我则在床了眯了一会儿,大半个小时吧,好满足啊!然后实在不行了,挨到快6点的时候,就说还是出去逛一圈吧,于是说去梅林吧,吃个饭,顺便逛一下家乐福,然后消磨点时间,再去火车站。于是跟z3一起去了,去了一家湘菜馆,味道还是不错的,价格也公道。吃了三碗饭,快一个小时吧,接着去了家乐福,xcc 特别喜欢在这方面的事情上鼓动我,他和他女朋友都特别关心我这事。我这次是完全没有这个心思,全是当作朋友之便。于是去买席子,居然买到那种一年四季都可以用的。然后xcc 和z3 在那里帮我想,要买些什么东西回去,什么牙刷啊,毛巾啊,牛奶啊,饼干啊,还有卫生纸-_-b等等等等。现在的我,变得特别心疼花钱,在拿出卡来刷的时候都还是觉得有点舍不得,但是为了面子上过得去,我在这时花钱往往还是很大方的。从家乐福出来,z3 就先回去了,帮我提了点东西,我和xcc 为了去买一张手机卡,为了买得不花多的冤枉钱,走啊走,雨也是下一会停一会,郁闷,终于在一家店里买到一张含51元话费卖55的动感地带的卡,号码也感觉不差。这时都已经9点了,那边的某师兄打电话来了,我匆匆忙忙爬上公车赶去火车站。车开得比我想象中快多了,9点半的时候就到了,顺便去熟悉了一下火车站的环境,看了一下出站口,候车厅这些地方,才去找那某师兄,两人等了一个小时,这某师兄也是很热情一个人,我都没想过,他说要买站台票进去,于是和他一起进去了。又换站台,这火车还真能折腾人,终于等到它进站了。还好,我很快就在窗外认出来了,虽然一年不见了,只在电话里听说过又染发又烫发,还变得又黑又胖又长了好多痘,看样子也只是脸真的比以前更胖了。前一天在QQ 上,我还吓唬说,我现在的发型很怪,不要认不出来,然后她说,你认得出我来就行了,结果还是被我耍嘴皮子戏谑了一番。折腾到0点半才到家,小思宇的那双因为夹脚处很硬而被主人遗弃的拖鞋也派上用场了,席子,毛巾也都有用了,胡乱洗了个澡就睡下了,累。
那天说到日历软件的界面实现,鱼鱼的桌面日历能把窗口一直停在最下面,无论怎么拖动,窗口还是停在其它进程的窗口下面。上google 搜了一下,发现其实要实现这个很简单,只要截获WM_WINDOWPOSCHANGING,把LParam 参数指向的结构体中把hwndInsertAfter 的值改成 HWND_BOTTOM就可以了。现在几乎所有的日历软件需要的界面技术都可以实现了,相比之下,我个人更喜欢鱼鱼的方案胜过于ADC的方案,呵呵。
看了一会儿NES的 相关资料,都是硬件相关的,一般也就是硬件资料是需要了解的,包括经典的Marat Fayzullin 的NES.doc,看得头昏脑胀。果然,发现自己不是个能静下心来搞研究的人,哈哈,afei 还说过如果我想成为技术高手,就应该如何如何的,嘿嘿,我怎么会试图希望自己成为一下技术高手呢,我只是单纯地期望能解决眼前那堆琐碎的事情而已,呵呵。直到最近,才领悟了自己学习编程的真谛,写程序是一种手段,一种能提供自己偷懒机会的手段。
来这以后,开始大半年是因为没有电脑,所以没写过代码,在公司里即使没有说忙得昏天黑地,但也已经懒得再去动额外的脑筋了。说起动脑筋,想起有个笑话说,爸爸教育儿子,你以后要学会动嘴皮了,就可以去作市场管理了,如果只会像我这样动脑筋,就只能做这可怜的程序员了。扯远了。
随着今天下午搬走了最后一批东西,包括一张床垫一个皮箱一包衣服和一箱书,我可以说已经正式告别了这个住了一年的地方,这个自我走出学校进入社会后第一处自己花钱住的地方,留下了很多回忆的地方。
今天和小思宇去那边把餐具收了一下,就是几只碗,不锈钢的汤盆,还有个美的的电饭煲。女人的想法就是有点怪,叫她把所有的碗和盆都拿走,开始死活不要,说只要有个碗就行了,因为碗好看,而且只是用来一个人泡泡面吃。后来好说歹说,才把所有的东西都装在塑料袋里都拿走了,还一边走一边说,说了好几次哦,真的好几次哦,说自己像个收破烂的,把她们不要的东西都收回去了。到了她自己住的地方,和她再出来的时候,她还在嘀咕,你说她们知道我把这些东西都拿来了会不会吃惊啊!真是个有趣的女人,还说要省钱,这不就是省钱之道吗?然后我就直接坐车到这些天一直睡的地方去了,因为有网可以上,所以都不回那边去了,导致昨天偶然回去一看,那天走的时候居然没关空调,让它白白在那耗了48小时!郁闷,也许,等后天,我真的把东西全都搬走的时候,我会舍不得那里吧,毕竟在那住了一年了,所以才会跟同学借了相机在那小小一块地方都拍了150张照片。
今天看了一下两个日历软件的界面实现,一个是老外的ADC,还有个是国产的鱼鱼桌面日历秀,它们都有一个特点是,能把日历显示在桌面最底层,就算你用鼠标在上面点,划,都是相当于直接点在桌面上,但是视觉效果上,它们又是确实存在的。
昨天下午和小思宇一起跑去华强北买东西,结果用小思宇的话说,我们两个人四只眼睛还是没看清楚,买的转接头还是有问题,是反的,不能用,小思宇估计是要郁闷死了,为了个硬盘转接头耗费的精力不知道有多少了。晚上回来,就在各自的屋里用各自的电脑打着各自刚刚买来的摄像头在那里玩视频,用玩QQ 还用MSN ,还真是会闹,自己回想起来就觉得有点好笑。
我什么都不知道,只是在这心情极其糟糕之际随便发了一通毫无作用毫无意义的牢骚,float 突然给我发短信问我咋了,我只是简单地告诉她,我伤害了一个我很喜欢的小女孩,float 简单而直接地问,喜欢她为什么还要伤害她?我如果知道原因的话,就不会这么郁闷了!好了,看看他们的点名游戏,第一次玩,不过我似乎找不到这么多的二次转发人……
从未有过的懊悔,从未有过的心碎。\
难道人就是一定要在犯错误的过程中才能成熟,可是这个代价也太惨重了。为什么要伤害一个这么柔弱的,一直想着要以自己的力量自己的方式来保护的人!
这两天把这个MD5 计算工具修改了一下,主要是为了自己的需要,比如我想用它来计算光盘中所有图片文件夹下的图片文件的MD5 校验值,所以就添加了搜索文件夹或包含子文件夹下所有文件并进行计算的功能,果然是手生了,反正慢慢吞吞的,还犯一些很低级的错误。顺便也能把文件夹进行拖拽了,不过现在看来对大文件,或是被其它进程占用的文件会出错,那些个错误提示框还真是难看,需要改一下。
经过昨天晚上和今天晚上的消磨,把几个LLYFSpy 原本就集成的功能用插件方式写了一遍,插件都是用SDK 的方式写的,用VC.NET 2003 编译的,所以又小又紧凑,还是花了一些时间,我一边移植,一边还在想,这样做的意义有多少-_-b
打算做一个电子相册程序,是为了那些毕业时照的照片刻成光盘后便于整理和管理的。本来是希望能做成多媒体光盘的,无奈我实在是没有艺术细胞,没有美工做个屁的多媒体光盘啊,所以就做个简单点的程序算了,大概想了一下功能需求,有个图片浏览功能,外加评论编辑显示功能就基本成形了,不过如果只是这样的话,就太寒酸了,就多添加一点附加功能呗。比如相框功能,大头贴功能,这两个功能很相似,我的想法是相框功能比较简单,只是给图片外边框加上一圈其它的图案就行,大头贴功能就复杂点,需要能自由选取图片中的任意一块图形,并能缩放大小。还有一个功能是日历月历制作了,所以要加一个日历节气计算功能,似乎这部分是整个程序里唯一有点麻烦的地方,节气日历的计算有点复杂。要加个背景音乐播放功能,用BASS 就能解决,因为时间比较短,就一切从简。
这是一个对原有项目的改装工程,目标是实现一个可自动装卸的系统,使日渐庞大的原有项目能以另一种轻巧的形式存在。
这是一个比较庞大的计划,甚至可以说是一个好高骛远的计划,不过权当作一种业余时间的消遣活动和提高自身附加价值的手段吧。
现在来写我的2005年终总结,似乎有点不合时宜,但似乎也找不出其它更合适的时候了,因为我是有一大串真正的苦衷的。
大四真的轻松。暑假的时候,xcc从重庆跑到杭州去玩,然后叫了我一起去湖州ShuoNiMa家,然后又去我家。那次暑假真的出奇的热,而且最郁闷的是,我们那里隔一天就要停电,因为电力供应不足!xcc在浙江呆不住了,就鼓动我早点回学校,其实是他想回家了!
最开始灌水,应该算是在People 版,尽管更早地去Software 和Windows,但那时都不在那里灌,只是纯粹地为了帮助别人,回答问题。 People版的那段日子,是我在BBS上玩得最开心的日子。而后转移阵地到chat版,因为那里有float。其他没有写到的,却和我一起灌水的各位,或是因为和我只在网上接触,而生活中接触太少了,所以没有多少可以让我扯的,或是因为和我在生活中接触太多太多了,以至于不能归到BBS水友一类了。
没有像holyzzd,youshow他们那样的文采,但我也要记录一下我这四年来的经历。
大二完的那个月,我报名了2003年10月的软考高程。暑假在家,无事可做,就看一下高程的教程,做点辅导书上的题,其他的都还好说,都只是记忆性的,就是发现编译原理最难懂了,根本无从下手。开学回到学校,开始上自习准备应考,也就是做了往年的几套真题。大概认真准备的就是回到学校后的考前1个月了,不过,也是因为暑假看过教材的基础,所以做题也不觉得多少困难,虽然很多不会,但估计勉强能通过考试了吧。于是也不再去顾忌学习上的事,有空就到汇鑫打浩方,还有个主要原因是很多隔壁班上的堕落男都在汇鑫。打浩方,有一半时间是在打3C,还有一半时间是打LT,以2V2居多,胜率还有点高的样子,大概是因为浩方上的人比较水。那段时间是最堕落的,还去通宵打,大一大二都从没去网吧通宵过。大概就是为了发泄,放纵自己被想做好孩子的想法压抑已久的精神吧。通宵的时候,都是和RuQ、lano他们一起才去,也就是打大半个晚上的War3,然后看看xx网站。
大一没多少好写的,就是来报到啦,然后军训啦,什么事情都是一个人啦,独来独往,因为不喜欢几个人一起的时候会出现的意见分歧的情况,所以一直都是没什么特别亲密关系的朋友啦。
说是忙,也不算忙,因为一般都只是上午才会写一点程序,但是进度却还是要赶的。唉,其它时间就无所事事了,偶尔看一点书。程序还是有个瓶颈没用突破,是否要绕过去呢?
修改了插件配置对话框的界面,用嵌入IE 浏览器控件来实现,不过很多特性都没法实现,应该是因为我没找到实现的方法吧,因为感觉看CyberArticle 就好像实现了那样的效果。不过现在马马虎虎可以运作了,哈哈,真是一种有趣的技术。
大熊猫输入法是不断地在更新啊,现在候选框界面做得模拟成五笔加加(极点)的样子了,不过使用习惯上面还是不如用五笔加加,因为用惯了五笔加加Plus 中五笔、拼音、英文混合输入的方案啊。而且似乎程序的稳定性还是不如五笔加加,呵呵,我是加加系列的忠实fans,不过现在的拼音加加似乎不行了,不如微软拼音了。
这次版聚我盼了好久了,因为一有人提出来,我就开始等啊等~~~ 想去参加版聚是有一点点小小的企图的,结果比较可惜的是,图谋了那么久,最后还是落空啦,呜呜
我其实并不是为了学习COM 而才去学习COM 的,而是因为想给LLYF Spy 加上插件功能,插件已经可以支持一点了,但只限于普通DLL。听说现在用COM 实现插件的软件很多,所以我也想试试。图书馆找不到什么书看,一开始借了本潘爱民译的《深入解析ATL》,是讲如何用ATL写COM组件的,也不怎么看得懂,看到书中提到一本《Inside COM》的,但在图书馆外借室没找到。于是只好借来讲MFC的2本书上点点关于COM 开发的内容看看,还是不太容易,因为太多用MFC 实现COM 组件的细节了,还有《COM本质论》也是抽象,太高阶了点,不合适我。前天偶然发现2楼阅览室中有一本《COM 技术内幕》,应该就是所谓的《Inside COM 》了吧,于是马上站着翻看了一遍,讲得比较通俗易懂。今天中饭吃完,又去借了一下看看,真不错。于是又去1楼外借室借了本《COM精髓》,要学习一下COM了,只要够用就行,不用很精通。
昨天在装了个VSS,好像是VS6.0里带的那个,反正是从E383(这是我们学校校园网上一个很有人气的软件下载站点,由几个爱好者主持各种事务,机器放在信科某机房内)上down 来的,装了就开始用,把LLYF Spy,还有ProcessHelper、IconHelper、DebugCapture 以及毕业设计在做的那部分都Check in 了,试了一下,还不错,因为它只是保存修改的部分,这样就不用自己用WinRAR来压缩整个文件夹来备份了,而且可以看到任意一个状态的内容。
虽然以前也装过VSS,但都没有好好用上,因为自己写代码不到一定规模,觉得用VSS 嫌麻烦,而当有了一点数量的代码之后,用WinRAR 这样备份的方法弊端就太多了,VSS 的优势突显。
列个基本的计划,只是为了和导师打声招呼,可以开始做了吧。
到了学校,就明显感觉没有在家里那样的充实了,好像每次都这样,在学校一直都无所事事的样子,以前电脑在学校,家里没事做,就看书,基本上每次假期在家都要看好些东西。这次寒假在家有电脑玩,就总是看些奇怪的编程技巧之类的,然后自己写程序玩,最主要是写了个LLYF Spy,在写这个程序的过程中,尝试了一些以前都没用过的东西,比如远程线程、消息钩子等等,还是比较有意思的。
昨天中午回到了学校,稍微整理了一下,去剪了头发,然后去找学院的领导,想要申请提前去单位报到,可是院长是很不赞成,于是我只好说,等我先去和导师商量了再说。然后遇到了辅导员,他把我叫去说了一下关于毕业设计的事情,我顿时更加沮丧,我们班被分到电路实验中心,这是我最不擅长的,要是网络,软件之类的才是我最熟悉的部分,可偏偏是电路。从大二开始,电路分析,电子线路,高频都没有学好,就像多米诺骨牌一样的连锁反应。后来索性叫了chuanking 和king 他们一起去吃火锅,有点好笑,自己心里默默地为自己庆祝生日,他们都是不知道的,也许还真以为我是心血来潮。等吃完火锅回到寝室,寝室里只剩下一个室友了,另外一个搬走了,人少了,东西却不见怎么少,寝室里还是那么乱,呵呵。
稍微整理了一下代码,把几个只用到Win32 API 的全局函数移到一个DLL 中去了,本想这样可以减小点主执行文件的尺寸,其实也小不了多少KB。网上看到一篇文章,提到VC 程序员和BCB 程序员的代码风格问题,说一般经常看到VC程序员的代码风格要好一些,我也有些感触。用BCB 这么久,还是习惯于C语言的过程式编码风格,从来也设计一个类。
照着bingle的代码,改了一下自己用,用来搭配LLYF ProcessHelper,现在ph.exe 可以以SYSTEM 身份运行了,至少在Administrator 组用户下可以以SYSTEM 身份运行了,其实也就是能多看到其它两三个进程的命令行和模块列表,至于kavsvc.exe和kav.exe 还是不行的,也真是厉害,能保得这么严,当然IceSword 的进程也打不开。
昨天在给LLYF ProcessHelper添加TrayIcon功能,代码是从LLYF Spy 那部分完全Paste 过来的,结果编译的时候说NIF_INFO没有定义,还有szInfo、uTimeout这些凡是说要IE Version5.0 以上支持部分都说没有定义,可是我在LLYF Spy 里好好的呀,还以为是XP 的问题,马上退到2000 下,结果一样。于是我打开ShellApi.h看,在那个函数和结果定义前加上#define _WIN32_IE 0x0600,编译是勉强通过了,但是功能没有实现,并没有Balloon ToolTip 出现。后来在看Project Options,发现有个NO_WIN32_LEAN_AND_MEAN定义,是因为有一个函数里调用了SHBrowseForFolder,要加shlobj.h 这个头文件,于是意识到可能和这个有关。搜索了一下,我的程序里并没有调用到这个函数(我晕),于是把这个函数体全部注释掉,把这个头文件和宏也删了,编译和运行都正常了。
从这篇文章中可以知道,通过简单的几步设置,便可模拟OutputDebugString,可以用下面的代码描述:
学编程是从DOS下开始的,用了一定时间的TC2.0,使得养成了用printf 输出变量值进行调试的坏习惯。到了写窗口程序时,就遇到了些麻烦。
窗口程序没有方便的进行控制台输出的方法(其实是我不知道),于是,用了几年的用MessageBox 进行输出的调试手段,太麻烦了,因为MessageBox 会打断程序流程,还要人为手动让它继续运行,这是最让人恼火的。
今天看了一下Shotgun 那个端口进程关联的代码,那是在Win2000 下可以运行的,虽然得不到(System)8#进程的信息,但可以在普通账号下运行。到XP 下有点小问题,只是因为2000 和XP 对句柄类型表示的枚举值不同,2000下是0x1A,而XP是经0x1C,改了就可以像2000下运行了。
这是一个用于拦截WinSock API 的程序,主要的目的并不是为了截获数据包,而是为了能从第三方角度方便地观察二进制程序调用WinSock API 的情况,最直接最原始一点的想法,是为了能比较方便地调试自己写的Windows 网络应用程序。
完成多系统共享BCB6之后,我开始尝试多系统共享Delphi 7 Studio Enterprise (简称D7)和Delphi 2005 Studio (简称D7)。
同一个硬盘上装了多系统,原来一直用Win2000 来写程序,在Win2000 下装了Borland C++ Builder 6,还有一些其它的编程工具,每次写完一个完整点的程序,在Win2000下运行正常后,还要跑到WinXP 下试试,于是想要有时候能在WinXP下也运行BCB6。不想再装一次BCB了,主要是因为光驱坏了,硬盘上也没有BCB6 的光盘镜像,所以就试试能否共享原来安装在Win2000 下的那份BCB6。经试验成功:
今天给LLYFSpy加了进程信息查看功能,可以查看当前进程所有模块信息,内存信息,文件映射,所有进程列表,服务列表,以及设备驱动程序列表,其实就是把原来LLYF ProcessHelper 里的代码搬了过来。虽说没有写新的代码,但我想这样可以给我组织程序结构有些启发。
前天花了一天时间用BCB 做了个MDI界面的抓图程序,当然功能非常简单,连DX的图都不能抓,但不知道怎么的,注册热键的时候有问题,郁闷。还有就是MDI 的我用TabControl 来切换页面,想方便一点,还会发现,在切换时,桌面会刷新。晕得很。
昨天在看雪论坛精华中看到一段代码,看一了下,在VC2003 下可以正常编译,并dump 出PE 文件的节信息,导入导出函数表,嘿嘿,正好加到LLYF Spy 和LLYF ProcessHelper 中,只不过那个快速排序的算法好像有点问题,有时候程序会死掉。我还没看出来为什么一定要加这个排序过程。好在程序基本上用的都是C 标准库函数,可以没任何障碍地从VC 移植到BCB 下用。
今天发现,在XP 下,WH_CALLWNDPROC和WH_CALLWNDPROCRET这2个钩子函数,如果是空的,只是直接返回CallNextHookEx,也会出错,看来不是我的程序问题了!万般无奈之下,仍旧换回BCB6来编译这个DLL,却意外地发现,竟然不出错了,只是似乎被探测程序运行更慢了:(也许只是先入为主的思想,心理感觉而已吧。
刚刚给它做了个简单的CHM 格式帮助文档,都是用的以前给阿菲连连看的帮助文档模板,呵呵。是中文的,尽管程序界面是英文的,可是我的英文还是差啊,郁闷,只是因为写程序时觉得中英文切换太麻烦才不用中文的
```cpp void __fastcall TMainForm::GetTreeViewContent() { //TODO: Add your source code here int nItemCount; int i; char chBuffer[256]; DWORD dwProcessID; HANDLE hProcess; void * Pointer; SIZE_T nNumberOfBytesRead; TTVItem Item; HTREEITEM hTreeItem;...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30...
```cpp
void __fastcall TMainForm::GetTabControlContent()
{
//TODO: Add your source code here
int nItemCount;
int i;
char chBuffer[256];
DWORD dwProcessID;
HANDLE hProcess;
void * Pointer;
SIZE_T nNumberOfBytesRead;
TTCItem Item;
```cpp void __fastcall TMainForm::GetHeaderContent() { //TODO: Add your source code here int nItemCount; int i; char chBuffer[256]; DWORD dwProcessID; HANDLE hProcess; void * Pointer; SIZE_T nNumberOfBytesRead; HD_ITEM Item; 1 2...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30...
```cpp void __fastcall TMainForm::GetListViewContent() { //TODO: Add your source code here //* int nColumnCount; int nItemCount; int i,j; char chBuffer[1024]; DWORD dwProcessID; HANDLE hProcess; void * Pointer; SIZE_T nNumberOfBytesRead; AnsiString...
在CSDN的论坛上看到一些老较经典的帖子,就把代码用在自己的程序里了,给LLYF ProcessHelper 添加了一个特性,就是显示进程的完整命令行,真是个有意思的功能。不过,之后,发现VCLSkin 太不稳定了,要出错,也许是用的crack 的原因吧,索性就不用VCLSkin 了,这样程序的体积还可以小一些,速度快一些
装的IDE是Dev-C++ 4.9.9.1 和MinGWStudio 2.05,它们自带的MinGW 里GCC 的版本都是3.3.1的,自己把GCC 升级到3.4.2 后,用来写些小的SDK 程序真是不错,哈哈。不过现在 VS.NET2003 的IDE 也做的真是太好了,再加上我装了Viusal Assist X,就更好用了,尤其是它的代码提示和自动完成功能,太方便了,还有在粘贴时的代码自动格式化功能,也很实用!
今天猛然发现那个DialogBox 上有一个DateTimePicker 和两个Updown,于是把它们删了后,发现可以显示出来了!
好好的,在用VC7.1 和SDK 写着程序,主窗口几天前就画好了,不用VCL、MFC 之些,画个简单的窗口都这么烦!!结果今天想给它添加一个新特性,于是,在菜单上加了个新项,让它点击后能弹出个Modal DialogBox来,结果,死活弹不出来,我可是安步就班地按照Charles Petzolds 的经典书《Windows 程序设计》上面来的,查看一个DialogBox的结果是-1,就是说,要用GetLastError 来看,弄来一看,说是“找不到窗口类别”,晕得很啊,于是我尝试把DialogBox templete 从id 换到string,当然我心里也很清楚地明白,事情不会这么简单。看了很久的MSDN 和《Windows 程序设计》,也没看出什么名堂来,无聊了,就重启系统,进入XP+SP2 里转转,结果发现这个DialogBox 在这里可是好好的啊!很正常的啊!
今天拿到协议书了,原来真的不用再寄回去了。昨天下午还特地跑到辅导员那里去找,结果说上午就都给那同学了。单位又发来Email,说下学期,如果毕业设计任务不重的话(我是这么理解的),可以提前去单位报到,而且待遇和正式报到一样,有点诱人啊。可是不知道我们学院能不能搞快点,连毕设的题目都不知道,其它像计算机、自动化这些学院都已经连题目都确定了。晕
突然发现,最好把一些常用的功能封装成类。今天在用MySQL 的C API 的时候,才觉得,用类来封装对MySQL的操作,是件理所当然的事,不然,程序太难写了,寸步难行的感觉。然后,进而想到了对XML文档的操作,因为用到的是MSXML DOM,每次这样弄长长一段初始化什么的代码,看起来都不爽。用类来封装,以后扩充都要方便点(这只是我现在的看法)。所以说,面向对象这种方法的意义,对于我这样的人来说,不应该是一种谈资,而应该是能切实改进生产效率的一种手段或途径!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 相信 在寒冷的 冬天 没有 我的 祝福 您也一 样 的快乐 有 了我 的问候 您 会 更 加...
最后的最后,我终于发现了关于完成端口第一次WSARecv 投递失败的原因!
为了写WinSock程序,找了几个抓包的程序,CommView 4.1 和IRIS 4.07,发现它们两个界面都差不多,好像IRIS 的功能稍微多一点点。但是不知道为什么,在设置Filte r的时候,IRIS总是有问题,IP栏里不能输入3位数的十进制数,也不像是能输入16进制值的。在Address Book里,只能输入最前几一个IP值,就是aaa.bbb.ccc.ddd,无论如何输入,最后只会留下aaa,而后面的全都变成了0。晕死,难道是因为用的破解的缘故?CommView 还好至今没发现什么大问题。不过似乎它们两个都是抓的链路层的帧的,而本机调试的时候,发送到/接收自本机的TCP 数据包难道是不通过链路层的?反正我用它们两个是抓不到这些包。
大学里最后一次Christmas Eve 了,说实在的,这个只是西方人的节日,照理我应该不是很在乎的才对。但是看着外面日渐热闹的节日气氛,自己心里不免有些触动。
开始用完成端口写Server,郁闷,照着书上的例子来,还是有错,总是到bind,WSAAccept 后的第一个WSARecv 的时候,说10045 错误。
最近懒得很,代码也很少写,就在灌水,其实自己都觉得灌水是件很无聊的事情,但还是百无聊赖地在灌水,没人陪起一道灌的时候就到外面看看网页,网页只是看看论坛,论坛上没什么内容的时候,就看Blog,Blog 没什么内容的时候,就看自己的Blog,无聊死啦。
昨天上五笔爱好者论坛的时候,发现有了个大熊猫输入法,可以拼音五笔互换,还是个GNU 的,从FreePY 改过来的,下了它的源代码,编译了再安装上试了一下,感觉还是比不上五笔加加,至少比不上五笔加加PLUS。现在五笔加加PLUS 都出了2.5版了,真是佩服EasyCode,通过逆向工程能坚持补完五笔加加到现在这种程度。
今天早早地就被那个傻乎乎的电话吵醒了,尽管在做梦,还是做的美梦,呵呵。电话打了2个多小时,准确地说是2个小时16分钟(依据手机上的通话记录),一直打到手机没电,自动关机为止,相应的赔上的是给中国移动的巨大贡献。手机停了之后,傻乎乎的又打到座机上,不知道过了多久才说完。室友在那里说什么关系不正常呀云云,还以他自己和他女朋友为例来阐述自己的观点。嗯,昨天都答应人家了,这样就算是出生以来第一次脱离单身了,只不过,是建立在电话线上的恋情。
打折下来,一套加上送货费,也得花掉128元大洋呀~~~ 本来也不是这么坚决的,前几天在网上书店看了又看,各种介绍,书评,还是犹豫了很久最后没买,今天在BBS 上看到holyzzd说在看这三卷本,于是猛然狠心上网马上订了一套要缩衣节食了哇,呜呜~~~
好多的人啊,来的单位倒没几个,都是深圳的,都没多少兴趣,于是挤来挤去,弄得满头大汗。后来看到有家单位,据说那人是我们学校的,于是就过去看热闹,看了20来个人来递自荐书,看出他的习惯,一般问你会什么语言,说C和C++的多点,然后会进一点问用C多点还是C++多,再问做过什么东西,一般只要能说出真的自己做过程序,规模大小无所谓,什么俄罗斯方块,五子棋之类的,说得出来就得,那男的就会把这自荐书拿去给旁边一女的看,说一会,那女的就会把自荐书单独抽出来塞进抽屉。其中有一个过了6级和高程的人来,看起来是最有资本的一个人了,可是我看着觉得好水啊。唉,中国教育的失败啊。
Category Film & ACG
周日去电影院看了《沉睡魔咒》。本来打算周六去的,结果相当不愉快的一次网上订票,先去大众点评网上买了两张团购券,还以为每张可以便宜7元钱,结果到嗨电影网上订票还要再付12元,也就是说每张票才便宜了1元钱,还花了一些时间折腾微信支付什么的,我只能说这两家网站的用户体验做得很烂。而且当时没订票成功,我又看手机上收到了两条短信以为已经订票成功了,其实是大众点评网发来的,于是兴冲冲跑去电影院,然后妹子发脾气了,关在卧室里整整一个下午。叹气。
周六之后,一直在看小说和动画片。越来越觉得没有好看的小说了,于是试图把自己的注意力转移回动画片上去。看完了13集的《Working!!》和12集的《江户盗贼团五叶》,还看了没有完结的36集《妖精的尾巴》。最合我口味的是《妖精的尾巴》,差不多一直是高潮,没什么铺垫和伏笔之类的,所以很轻松,没用费脑子。画面也是最合我口味的那类传统大眼睛好身材的人物造型,还算细致的物品和景观。《Working!!》的结局不是很喜欢,感觉不像结局,中间的情节倒是还行。《江户盗贼团五叶》有很浓重的日风,但人物造型实在不习惯,那个面部轮廓、五官都不习惯,我好像是第一次看到这种类型的,但其他方面都画得很精细,音乐也好,情节么,还行吧,总共12集我直到第10集才大致明白整个的来龙去脉,但我仍然觉得这没什么特别的,好像这种讲述方法的动画片也不少。不过我觉得吧,这三部里最赞的还是《江户盗贼团五叶》,从另一个角度讲,如果中国动画片在遥远的未来能有所发展的话,可能《江户盗贼团五叶》这样的是最后被模仿达到的。
周六周日花了两天时间看完了《结界师》。一开始是在PPS看到的,看了一集,后来就不停地卡,于是去tudou网上看,看了5、6集,受不了那个糟糕的画质了,最后发现youku上的画质还不错。一共52集,不算短,但比起《海贼王》、《火影忍者》、《死神》这些来说已经是很短了。
总的说来,这个画风勉强在我可接受的范围内,但男主角的成长实在让我有点不能忍受,至少前30集都没看到无论是从技能还是性格上有所进步。我不喜欢只会大喊大叫的那种男主角。情节上么也没什么突出的地方,但结局还比较喜庆。
其中有个叫神户百合奈的小姑娘,感觉挺像@ainesmile在推特上表现出来的形象,哈哈。
小师妹有一天晚上跟我说一个人看《倒霉爱神》傻笑了一晚上,推荐我也去看看。也确实很久没有看碟了,这些年来这方面的兴趣渐缺,在深圳时还偶尔跟人一起去下电影院,现在连这种机会都没了。今天闲来无事,到PPS上找来看了看。总的说来,主线情节是比较老套的,虽然看时间也是2006年的作品了,不过放在4年前来看,估计还是有这种感觉吧。
男主角是个生来倒霉的家伙,会一脚踩到水坑里,会弯腰撕开裤带,会抓到沾了狗屎的钞票,会出门被鸟屎砸中肩膀……这些是纯粹的晦气,让我觉得更在意的是,在事业上的寻求机会而不得果,甚至差点要被自己的队友们抛弃。
女主角就运气好得跟童话似的,出门不带伞而瞬间天气放晴,在电梯里能遇到搭讪的钻石王老五,代上司谈生意能意想不到的成功,随便买张彩票也能中奖,更过分的是能让别人送错裙子等等等等。不过这些事情,在我看来是不可靠的,人不能指望每时每刻都有这些光环加身。
之后的发展以及各种转折,基本是在我的预料之中,不过我仍然看完了,有一点小感动,特别是到最后女主角决定放弃新工作的机会而去找男主角,毅然吻住了男主角。看到这一段,我突然觉得,世界上尽管有很多邪恶,丑陋的人和事,但那些都于我无关,我只要处理好我的那份责任,那就够了,实在没必要去计较那么多。要相信这个世界上仍然有一些角落,还是有一点点美好的,只不过需要自己去发现,去创造。
好些天前,估计至少有半个月前吧,跟小妞一起吃饭,她便使劲儿推荐我看一下《奋斗》,当时还满不在乎的,听小思宇也说过,她还买了书的,一次偶然看到VeryCD上有下载的,便全下了下来。电视连续剧看着就是比较费劲儿,而且我感觉挺浪费时间的,不过我终于看了1个多星期,把它全部看完喽。 片子一共32集,在我看来算是比较长的了。里面讲的故事真如小妞小思宇说的,很贴近生活,贴近我们这类人的生活的。主角大学毕业,然后经历事业、爱情上的各种风风雨雨,有的时候不禁就会拿自己的经历来比较。 总的说来,陆涛我挺喜欢的,但挺讨厌夏琳的,挺同情可怜米莱的。我觉得陆涛做的百分之八九十我都是很赞同的,但夏琳在陆涛搞房地产那段时间对他的冷冷的,让我讨厌死她了,呵呵。最同情的还是米莱,外表乐观坚强,其实内心一直脆弱得很。 这片子看着看着就会引起点儿共鸣,真能鼓舞点儿人的。
本来只是下了一部剧场版的来看,觉得还可以,于是上VeryCD找来TV版看,一共24集,昨天熬到后半夜2点,困得不行了,才看到14集,今天再接再厉,把剩下的10集都看了。其实,从情节上讲,也不是特别有新意,从人设上讲,也有点落俗套,有一个温柔得甚至有点懦弱的男主角,但男主角就是有能力吸引住女主角。 看到后半部几集时,给我一个特别深的印象,或者说教育,就是“动什么千万别动感情”,本来女主角夏娜作为一个Flamehaze应该和一个人类,确切地说是一个Torch,带着零时迷子宝具的Myste是不应该有什么牵连的,但偏偏就是喜欢上了,然后中间一段弄得很被动,甚至对于完成自己的使命都变成了障碍。 片中的男主角是很多日本动画片中都会有的那种类型,很温柔,但剧情发展到一定阶段就会变得很自我为中心,完全不顾旁边最亲近的人的立场和想法,我行我素地去做些从客观上讲应该算是不正确的,但可能以他的立场是一定要做的事情。我个人是很讨厌这样的情节的,不过剧本如果不这样写,就没什么可写的了。说到底,我也没什么资格可以对别人这样说三道四,换作我自己遇到这样的事情,可能处理得更不当呢!
看完了《零之使魔:双月骑士》,心中有点点回味。这部动画片宣扬的反战、和平的观念,很对我的口味,难得日本人也有这样的想法哦。中间夹杂的一点爱情,就很老套了,很多动画片、漫画里都是这样的情节,或节奏。不过虽说老套,我却也总不免有点向往,或是羡慕,呵呵。这部片子一直都是很轻松的情节发展,也不长,才12集,半个晚上就看完了。总算自己还略微有点喜欢看,一直希望自己能培养点业余兴趣爱好出来,也不至于平时太过无聊,其实这看动画片也勉强算是一项吧,只不过看起来似乎太过平淡,没什么让人激动,或者说对其它方面没什么帮助,呵呵。
昨晚回来后,连夜从VeryCD上下了《爱情呼叫转移》,并看完。虽然xcc说很搞笑,但我看的时候,却不怎么觉得,也许是因为从去年那段时间以来一直遗留下来的忧郁干扰的吧。忧郁于我来说,是太过容易的事情了。 片子让人感觉有点拼凑的嫌疑,其实像是讲述一个个的小故事,可硬要串在一起作为一部完整连续的影片。不过整体教育意义上的表现还是有点可取的,爱一个人就要爱她的全部,没有深入了解,就不要武断地判决一个人。
开始一段,那个逃命的黑人兄弟身手真够矫健的哈,007是全凭点小聪明才能弥补身体技能上的差距哈。邦德女郎的长相不是我喜欢的类型,不过最后他们在床上时她露出来的美腿还是多诱人的,哈哈。 我觉得这里最酷的台词是邦德说你不是我喜欢的类型,女郎说因为我聪明,邦德说因为你单身。哈哈!
完全不知道在讲什么,反正就是噼里啪啦打了一阵,有乱伦,有恶搞,最后是屠杀。一点不好看,连色彩、声音都让人觉得没什么值得说的,怎么说《夜宴》至少这点上还是继承近几年来国内大片的特色的。 不过,小马哥还是又帅又酷的,巩俐阿姨的演技确实也是一流的,可惜的是剧本太烂了。刘烨也还成,好像后来看到他演的角色都是不太好的,不像那部那部叫什么来着,和孙俪一起演的,多好的一角色,《茉莉花开》里也是个讨打的角色,呵呵。周杰伦就真的太丑了,Jay啊,不要出来演戏了,就好好写你的曲,唱你的歌吧,影视圈不适合你! 到最后,就又跟看《夜宴》时的感觉一样,突然听到怎么好熟悉的音乐啊,才想起来最近不就一直在听《菊花台》吗,当时感触还多大的,感慨Jay是个才子,什么样风格的歌都能唱,所以所以,我在再次大声呼喊,Jay,不要演戏了,好好写你的曲,唱你的歌吧!
在线观看了《云水谣》 ,感人肺腑。两位配角之痛,不亚于两位主角,任何刻骨铭心爱过的人,都会被感动。当第一女配角在结婚的时候说:“姐姐,他一直在等你,是我不让他等了,对不起……”我真的被着实感动得热泪盈眶了。片子最开始一段,特别唯美,从光线、声效、音乐到节奏,让我有当时看《不可不信缘》时的感觉。 不过,陈坤跑步的姿势也太难看了,尤其是和徐若萱分别那一段,黑的夜里,大雨,追着车跑,好丑!
从网上down来的《灌篮高手》剧场版,直接用MPC打开居然没有字幕,看了论坛里的帖子说的文件是没问题的,内嵌了天香字幕的。偶然间发现下面有个跟贴说,要Haali Media Splitter这个东东。主要是MPC能直接打开播放mkv格式的文件,所以我一直没在意。把这插件down下来,安装的时候可以选择把MPC内嵌的splitter禁掉。再用WMP打开,都能播放了,而且字幕也有了,用MPC播放也有字幕了。 好怀念啊,尤其是那主题曲。初中的时候,天天守着电视上播放的来看。高中的时候,学校里也播过一段时间。到大学时,同学在寝室里看的时候,我不再去看了。现在来看这剧场版,听到这音乐,仿佛又回到那十三四岁的时候。高中的时候,每天早上要全校晨跑,每当跑得觉得累了要停下来的时候,就想想这激动人心的主题曲,支撑我跑完全程。 有Internet的感觉真好!曾经一个网友说,老外们上网,为了工作,中国人上网,为了娱乐。看来我还真是一个彻底而典型的中国人呢,呵呵。订阅了Boost和Lua的maillist,还有comp.lang.c++和comp.lang.c++.moderated的newsgroup,上面真的鲜有中国人。也许有不少像我这样订阅了,但不发言的。但我却是连内容都很少看的,还是对英文的,静不下心来看啊!
还在学校的时候,RuQ就跟我讲过《死亡日记》是如何好看如何精彩,那时他是守着在网上看的漫画,但是只凭他的讲述,丝毫吊不起我的胃口。最近在verycd上看到都开始有动画片出来了,更新了四五集了,偶然间还看到有真人版的电影,于是把电影拖下来看了下。果然是很好看的一部片子,而且大概也比较忠实地反映了原著,因为RuQ跟我讲过的几个他觉得精彩的情节,电影里面基本上都有了。主角夜神月,从开始的一个惩治罪恶的正义“救世主”,在和神秘侦探的斗智过程中,渐渐变成一个为达目的不择手段的恶魔。最后,死神流愚说的那句“你比死神还要死神”,让人唏嘘不已。但同时仍然让人不得不佩服月缜密的心思,布下的周密的计划完美的达到自己的目的,而作为配角出现的L也是很成功的一个角色。日本的漫画业真是让其它国家,难以望其项背啊! 困死了。 小丫头,居然只是在客厅的一个角落里摆了张床,就当起了她的小窝,她的栖身之地。遗憾的是,我没能力,也没理由能帮她这些事情。 昨天傍晚跟爸妈打电话,我说我跟一个女同学去逛公园了,他们似乎比我还高兴,晕倒!
终于把《魔界战记》看完了,总的说来这是一部很有趣的动画片,短短12集的短剧,风格很像给10来岁的小孩子看的,但里面表达出来的世界观人生观却同样值得细细体会。片中宣扬的爱与温柔这样的主题很合我的胃口。再一次,从中窥视到日本人对于生存的强烈渴望,斗争本能就是这样强烈。放弃自己的生命,是一种极大的罪孽!另外就是其中有句话,“两个人悲伤的爱,是让人多么难以忘记啊”, 不禁又想起那个家伙,不过这次倒没怎么酸,似乎已经有点麻木了。虽然结局我不太喜欢,那个比较蛮横,但还是显得多可爱的小魔王,最后竟然变成了一只普里尼,不过这也是没办法的,因为前面的这样的条件限制,他放弃自己的生命来让那个小天使复活,所以他只能变成普里尼来赎罪。还好,本来差点以为结局会像《封神传说》里那样,对所谓的最高统治(秩序守护)者进行反抗,总算不是那样,不然肯定会失望被猜中结局。另外一点是,这部动画应该是小成本制作了,片制就不长,才12集,中间的情结也不复杂,而且人物也不多,不过编剧很有意思,中间好多次插入搞笑的台词,诸如“说不定是哪个字幕工作组”,“又让他抢了10秒钟动画真不爽”,“这次好像是他是主角”,“当了这么多回跑龙套的这回也该让他出出风头了”等等,很有趣的风格。 突然发现,对于提高键盘敲击速度,还是有必要的。以前,自从有了键盘加速器后,我就一直以为键盘敲击速度不够快已经不成为限制我提高速度的障碍了。现在才明白,像我这样一般都是先旋转,再左右移动,再下落的打法,键盘敲击速度是其中很重要的一项因素。旋转就需要敲击速度快,才能减少时间,然后左右移动是大大利用了快键盘的优势,但我一般不能一次移对格数,肯定是需要再敲击几次来调整,所以也是需要有快速的键盘敲击,下落一般只按一个按键,所以单就这一项来说,不是很受影响,但三项活动之间的时间差,也是需要通过提高键盘敲击速度来提高的。我一般下块速度是1.1x,敲击速度是3.x,自从有意识地去加快敲击速度后,下块速度便成了1.2x到1.3x了,效果还是很明显的哈,不过不稳定,呵呵,想前段时间为了能稳定在1.1x也是花了好长时间的,直到和江江悍超大牛他们打了几盘后才变得稳定起来。
看完了《大雄的结婚前夜》,也许就像某位网友说的,看到大雄和静香结婚,心里最高兴的,应该是从小看电视台上每天播出的机器猫长大的男性朋友了,反正我心里就觉得很过瘾,很痛快。 一直喜欢着一个小女孩,一个笨笨的好吃懒做的小男孩,尽管他缺点太多,但是却能引起我们的强烈共鸣。多年以后,再回头来看,当年孩童时代看过的动画片,带来的无尽的快乐和无穷的遐想,是一生都值得珍藏的宝贵财富。
Category Water
连续几天早上起来开机出现Fan error,我都是通过拍、摇等手段试图让风扇转动起来。虽然确实都能转动起来,但发现的声音却是很大。今天早上起来,终于再怎么摇怎么拍都不行了,问了一下小区门口的维修店,大概要200多,还要明天才能修,关键一点是还要我今天就把机器放店里。于是我想还是自己跑一趟徐家汇吧!
问了一下雯雯怎么坐地铁,然后大约1个小时后终于到了徐家汇,随便找了家柜台,说是只修不换,180,无又不了解市场行情,也不想怎么折腾,就修吧。
中间大半个小时出去逛了一下,徐家汇也没什么地方可以逛的,再联想起上次去不夜城,还领了张罚单回来。感觉还是比较喜欢华强北那种人挤人的状况,唉。
最近总是想念起在深圳的各种安逸和自由。上次跟阿菲打电话,她还说让我去深圳也行,我说回不去了,至少现在不会去,得在这边做出点样子出来,唉。
今天遇到了骗子,只差一点点,有惊无险,记之以作警示。
全程经过是这样的。今天刚好去市区,到了目的地,就接到一个电话,号码是13201792864(疑点一),接听后是一个说普通话的女人,自称车管所的,我大惊,以为哪次闯红灯被逮到了?结果是问我是否xx(我妈的名字,因为后面提到的买车时登记的车主是她),是否在两个多月前买了车。都确认后,她就问我,难道没有接收到车管所发去的通知,根据xxx号文件的指示,小车购置税可以退3%(疑点二)。我说没收到啊,她就问,不是浙江省xx市xx地方吗(确实跟登记的地址一模一样,我已经开始相信是真的),我很抱歉地告诉她,我们搬家了,不住在那里了。她就说,这个通知被退回来了,现在把这部分钱转移到国税局去处理了,你赶紧联系一下国税局,今天是最后一天了,然后告诉我一个电话号码,是4006811987,还有个6位数的退税编码。我看到是400,觉得好像是正规的哈(完全相信),于是打过去,又是一个说普通话的女人(后来回忆了下,似乎跟前面的那个人的声音一样?),我说了一下事情,她就说,把退税编码报过来,我就说了,然后她就说,是不是名叫xx,xx车啊,我说是的,她就问我车身价多少(疑点三),我说10w零多少吧,我不在家,没有发票,说不出具体数字。她也没追究,直接说你可以退三千几百几十几元(后面的我忘了),我很开心啊,这钱相当于白来的嘛,就问她要走什么手续,她说中行建行农行邮政的都可以。我问了一下我身旁的我阿姨,她有个农行的卡(我还真没有这些银行的卡),那女人说,你找到就近的自动柜员机,我们会指导你进行相关操作,把钱转给你(疑点四),我问一定只能转账吗,她说是的(疑点五),此时的我正沉浸在天上掉馅饼的巨大喜悦之中,就硬是让我阿姨放下生意,带我去找农行。找到农行的柜员机后,我让阿姨跟那个女人通话,因为银行卡是她的嘛,要她输密码什么的总不好我来。结果就出很大的漏子了,阿姨跟那女人说上话后,插卡,然后就报了下自己的卡里的余额,我就迷惑了,是你要给我钱,我告诉你这个干吗。这时我阿姨也反应过来了,问我该不会是骗子吧,我心有点慌,支吾了。阿姨就问她,你是哪里的。她说,国税局的。阿姨说,国税局就在这里xx路上啊,我们直接去办理行不行。那女人说,不是你们那里的国税局,是绍兴的。阿姨就说,你绍兴的,就说绍兴话好了,那种话我听不懂,然后那边就没声音了,也没挂断……这时基本可以确认是骗子了,我又打了个电话到买车的4S店里问了一下,店里人马上就说,这是骗人的,我们这里已经有人被骗2w多块了。我说那他们怎么会有我这些资料的,店里的人说,可能是从车管所买来的吧。我郁闷,我现在还在猜是你们店里卖出去的呢!我草,我说你们也有责任通知一下你们每个客户,提醒一下他们注意啊,我今天就差点栽了!
马后炮分析:其实事后回忆整个过程疑点非常多,但我一直被他们说出的完全正确的个人信息和购车资料给迷惑了。后来我又反查了一下最开始那个手机号码,所在地竟然是陕西西安!郁闷,如果当时我的手机上的来电通是正常工作的,我估计不会跟着她这么去折腾吧!现在想起来还是有点心有余悸,羞愧难当啊!
打击诈骗,人人有责!
我是突然发现,原来我患的是这个病:成功恐惧症!在《反模式》中看到,原来我这样的病症并不唯一,很多人都会有,以至于他们都把它写到书中去了!
说到底,还是出于不够自信,以及毅力缺乏。古时候有句话,叫“行百里者半九十”,其中有一层含义就是最后那10%的工作是最难完成的,不光是因为可能工作内容的难度增加,还有执行者心理上的障碍,就像我这样。
一直以来,我都是一个缺乏毅力的人,很少会从头到尾认认真真地完成一件事情。不论是工作,还是其他生活中的琐碎的小事,比如看书,总是会把最后一部分丢掉。以前有领导说我,做事情总是喜欢只做到90分,而不去追求那完美的100,我不以为然,我是有点小骄傲的,有点自以为是的,这种关键部分有技术难度的部分完成了么,剩下的修修补补让别人去做好了!
现在不行了,所有的事情都得亲历亲为了,这个毛病带来的隐患就爆发了,将将引起严重后果了。记得类似的严重情况在公司时有过一次,那是我第一次独立负责一个特性,不但要完成自己的功能,还得提供接口给其他人使用,到了最后那段时间,心里非常焦虑,极度没信心,到后来都是只敢埋头写代码,不敢调试运行,生怕调试不过,把自己打击得再无法拾起从头来过的勇气了。最后运气很不错,因为本来也只是简单地调用别人的接口,我自己的特性完成后,提供给别人的接口基本功能也是能保障的。
眼下我那个调试器部分,已经持续2个月了吧,一直没有正常的进展,实在是挑战我的心理承受能力。我只能强行扭转自己的心理喜好习惯,自我灌输些心理暗示,希望能顺利度过这一关吧!
我有经常看一下Google Analytic的习惯,差不多每天上网的话都会去瞧一下。发现有好些访问,从从搜索引擎(Google)那里通过关键字“星座”、“双鱼座”等等过来的,今天还发现有个“双鱼座今年会和喜欢的人在一起吗 ”,让我觉得比较好笑。
我是个有点迷信星座的人,但只迷信它的大概的说法,对于每日/每月/每年的运程,我就不太信了。已经不记得在什么时候了,看过一段有点“伪”科学的解释,星座按出生月份划分,正好当时母亲在怀胎十月以及分娩时分受天气变化的影响,由此可能影响了胎儿的大脑等,就会影响到人的性格,而性格决定命运,所以我觉得似乎是有些道理的。
跟小师妹聊天时,偶尔会提及到我的缺点短处,我常会说“双鱼座就这样的啊”,小师妹就说我太宿命化了。以前确实没想到这层面上去,但被小师妹这么一说,我虽然表面上还说什么扬长避短之类的来狡辩一下,实际上心里有点惊悚的。照理说,我一直以为自己是一个不甘于受命运摆布的人,怎么这事上,就这么懦弱了呢?我一直认为人的出身已经注定,但通过后天努力是可以在一定程度上修改自己的命运的,可是现在想想,对于那些已有的缺点,我或无视之或逃避之,对于它们可能造成的不良影响完全无动于衷,这不是掩耳盗铃儿响叮当嘛!是该好好反省下了。
话说,昨晚居然梦见跟小妞一起看一本围棋书,醒来后真是心有余悸而力不足,不过好像在周公解梦中,男人梦见读书好像是好事呢!
澳洲甜美歌声,我听了Lenka的12首歌,最后的结论是,只要听这一首就够了!歌词如下: trouble will find you no matter where you go oh oh 麻烦会找到你 不管你往哪里走 哦哦…… no matter if you're fast no matter if you're slow oh oh 不管你是赶路 不管你想停留 哦哦……...
因为前些天小师妹在网上跟我说,喝豆浆养肠胃。嗯,我肠胃不好已经很久了,我爸妈的肠胃也不好,所以我觉得买个豆浆机很有必要。
今天去4S店拿行驶证和发票什么的,昨晚聊天太晚了,今天老是走神,真危险呀。看来开车是个很耗体能和精力的事情,以后在前夜一定要保证精、气、神的良好状态!
吃过中饭去一百,先看到美的,看了一会儿,抬头看到九阳的柜台,于是直奔过去,买了个很便宜的,不能打冷饮的,呃,反正现在只是想喝豆浆而已!
大清早的,被老妈叫起,驱车去4公里外的集市吃早餐。要了一客小笼包子,一碗馄饨,说起来从上大学开始这八九年来,还真很少吃得到这样的早餐。上学的时候嫌贵了,工作了之后就一般只在公司食堂里吃,周末虽然在家,但都睡过去了。偶尔为之,真是享受啊!
昨天突然想起,我的编辑器只能打开ANSI格式的文件,如果是Unicode,UTF-8之类的文件,打开是一片空白的,于是想改一下吧,打开时检测一下文件头部的BOM,用iconv转换一下再显示到编辑器。本来以为这将是很顺便的一件事情,从网上下载了Windows下可用的iconv库和头文件,最后却无奈地发现一个诡异的事情。原本至少ANSI格式的文件中的中文是可以正常显示出来的,如果用了iconv库,无论有没有进行编码转换,中文就全部变乱码了,而且显示乱码后,Scintilla就会报断言失败,然后整个程序就崩溃了。最后我不得不相信,这应该是iconv与wxWidgets或Scintilla配合有问题,至于到底是什么问题,我就不深究了。
没了iconv,于是我只好转投ICU门下了。还有点比较头痛,却又让我觉得解脱的一点是,我C++程序将是用MinGW编译的,而ICU当前的4.2.0.1版本曾经尝试了很久,都只能让VC编译通过,MinGW无奈地败下阵来。这就说明,我这编码转换的功能不能通过C++实现了,也省得我再费心思去琢磨到底把这个功能放在哪里实现了。Luaforge上有个叫ICU4Lua的项目,可以在Lua中使用ICU,这个库我以前也编译过,拿出来试了试,非常简单易用,只好把读取和保存文件的功能也用Lua实现成插件了。
以前蹲公司时,最开始是需要每天在notes上填工作日志的,几点几分到几点几分做了些什么事,涉及到哪些人。当然,没人教过我具体应该怎么填,我只是按照自己的喜好,也许是每天下班前花些时间填一下,而且还常常忘记。而恰恰这个工作日志又是需要每周让主管审核的,我就被逮到过,主管发来邮件让我补齐落下的日志,觉得很丢脸。
后来,除了要每天填notes上的工作日志外,又多了项不定期地向主管反馈工作完成进度,是用Microsoft Project管理的。主管会发来预先已经安排过的工作项目,我们则根据实际情况填入各个项目花费的时间,再通过邮件发回给主管,主管以此来跟踪下属们的工作进展。事实是,我常常不记得每项工作到底花了多少时间,所以上报的数据估计有3成到5成是不准确的。
再后来,另外有个主管自己用Excel的VBA编写了一套宏,然后放在公共服务器上,让我们每天往里面填写内容。工作内容主管已经事先在其中已经安排好了,我们需要的只是简单地写上ok或受阻等几种简单的情况。这种日子一直持续到我换部门,后来如何我就不得而知了。
到了新的部门,首先让我觉得很奇怪的是,他们居然不用填工作日志,他们认为要求填工作日志实在是件很过分的事。一开始我还有点儿不习惯,尽管不需要再向主管反馈了,自己仍然为了证明上班时间没有偷懒而继续自得其乐地填了几个月。后来实在是因为觉得没什么实际的作用也放弃了。
后来很长一段时间处于混乱的无组织状态。直到我被派去给别的部门做一个工具时,因为各方领导对该项目的重视,要求我每天反馈进度,于是在RedMine上通过一个自研的插件,只要我每天往RedMine上填写新闻,那么RedMine就会在每天午夜时分自动将该新闻作为邮件内容发送给各个关心该项目的领导们。我在新闻上写的内容可谓五花八门,每天遇到什么问题,如何定位bug,如何作出技术抉择,发布日期又要跳票了等等,觉得很开心很安逸,这才是比较适合我的方式。这个项目我一直做了一年半,然后又交给其他同事,我则被调回做其他项目。
调回后,项目组中又开始尝试敏捷和迭代开发,主管倒是做过一些努力,结果仍然是无序的。这样的无序状态我一直经历了半年多点,直到辞职。其间最常用的办法是,把最近一天或几天内要做的事一条一条写在笔记本上,然后完成一条就在上面划掉一条。事后回顾,也是很有成就感的事情。
这里牵扯到一个问题,说大了,是项目管理,说小了到个人,则是时间管理。以前看到过有人说,某老外的时间管理可以精确到一刻钟。当时是没有多少想法的,只是觉得这样细化的计划或回顾可能价值不大。
这几月来在家写代码,一直以为自己一天十几个小时都扑在电脑前了,应该产量很高吧。直到昨天偶然在网上找到一个叫Manic Time的免费小软件,可以记录下每天使用各个软件的时长。今天看了一下,才猛然发现,我这一天,花在编码上的时间竟然不到2个小时!真是触目惊心的数据啊,我实在是太堕落啦!
我需要好好反思!
今天在hugege.com上买了个空间和域名,从此咱也走上了独立blog的道路。
让GFW见鬼去吧!!
好运的部份:2010年终於开始有苦尽甘来的感觉了,木星将从1月中进入双鱼座的命宫。你会觉得自己是属於你个人的,可以摆脱身不由己的感觉,而且生命是全新的。有许多的新资源会在今年奇迹式的展现,帮助你实现你的梦想,让你的才能得到发挥,感情也会遇到你生命中非常重要的那个人,请好好把握,因为今年是你「对」的一年,不要在今年闹情绪或任性,把这些幸运都丢掉了,要记住,2010年只要是你愿意丢掉不幸的心情,迎接幸福,都可以心想事成,除非是你自己愿意不幸。
厄运的部份:经过土星行经下降位置的锻链,双鱼座的人历经亲密关系的离开,因此,当土星进入第8宫,双鱼座的人对於自己的欲望,会变得有不敢奢望任何好事的情况存在,有可能因此面对喜欢的人,自身的行动都是悲观和消极的。以及由於土星与海王星都在双鱼座的健康宫位(8宫与12宫),双鱼座会有3年身体上相当虚弱的问题存在,体力会显得比较差,会常有一些疾病让你苦恼,皮肤、骨头、牙齿会常常有一些疼痛,睡眠依然会有常常做梦、无法熟睡的情况发生。以及千万注意不要帮人作保、不要欠债与贷款,这3年都容易背负庞大的债务,以及有可能家中会有需要你长期照顾的长者。这都会让双鱼座的健康运势下滑,可以的话,双鱼座应该开始锻链你的身体了,储存多一些的体力,预防健康上会发生的问题。这些问题你现在(2009年11月)应该已经有所感觉了。这种情况会持续3年,请一定要好好注意养身,可以从事一些修养身心灵的运动。
工作运:双鱼座的人今年会开始有机会实现自己的梦想,只要是你想做的工作,想发展的志愿,都可以奇迹式的获得机会发展,甚至是无心插柳的一个想法,都会获得很大的回响。上半年的工作十分忙碌,可能还蛮多麻烦事的,不过双鱼一定要把握今年的好运势,把你过去想做却被束缚的想法全部付诸实现,你将会在6、7月的时候发现,你对工作上的努力会化成大量的金钱回馈给你。 是相当幸运的一年。
感情运:2009年鱼的感情运历经了相当严苛的考验,如果还能继续延续的感情,真的是得来不易的一段感情,请好好珍惜。2010年双鱼座的桃花旺盛的狂开,尤其是2、3月过生日的时候,还有金星加持,并且没有不良的相位影响,感情可以说是心想事成,比较伤脑筋的部份是,今年双鱼座的人心情上会比较悲观,反而会让很多好机会溜走了,4、5、6月的时候,土星会逆行回处女座,是让双鱼决定一段感情的关键期。到了下半年,一切都会变得稳定与明朗了,如果是有喜欢的对象,双鱼座的人要大方一些,不要搞暧昧,今年会遇到对你生命中非常重要的那个人,千万不要错过了。
健康运:双鱼座唯一比较糟糕的部份是健康运势不太好,如果可以的话,请现在赶紧找出治疗你身心灵的活动,因为你即将有3年体能不佳的情况存在。大小病痛都会不断,就算是身体底子好的双鱼,也会有睡眠障碍、精神不济的情况存在,请好好注意身体健康、稳定心灵,不要情绪化,保持心灵平静,对你的健康有益。
整体运:(5颗星) 今年是双鱼座非常重要的一年,梦想与感情都会心想事成,幸福决定权全在你自己手上,你必须要清楚明白自己要什麽,不要什麽,那些幸福才可以掌握,如果你迷迷糊糊,对於自身的感情与梦想无法确定的话,就会浪费2010年这麽好的能量了,可以的话,现在就开始计画吧!迎接属於你的2010年。
昨天脑袋发热,去买了个新凯越,心里很难过,死要面子活受罪。 今天早上醒来,心情更加的压抑和沉重,深深的孤独感和失落感以及挫败感。晚上做了个梦,梦见那个小姑娘,叫我帮她的同学(?)远程协助考试,考试的范围是一篇叫《西梅北》的文章。我无比清晰地记着这个题目,想起那个小姑娘,那个让我很后悔的小姑娘。 看到《间客》中的一句话:“如果将来这个联邦要收拾你……我很想在联邦之外给你留条后路。”不禁热泪盈眶。
昨天拉肚子,拉了一天,上了5次,拉得四肢乏力,全身脱水,口干舌燥,真是太惨了。好在晚上去二伯家拿了一些药,效果还是挺明显的,早上本来的时候,肚子没怎么乱叫了,经过一晚上的休息,总算也恢复了一点体力!
今天去市区买电脑桌,我需要的是是圆角的那种,上面还连着书柜的,去找了几个地方,很贵,嗯,至少是超出了我的预计,不过最后还是买了一个那里看起来最便宜的一款。 既然去了市里,就趁此机会去见一下老同学,自从高中毕业以后,至今已经八年多没见,missdeer这个id的由来的那个家伙。昨天在msn上跟她联系过,今天我先打电话到她家,是她妈妈接的电话,我却以为是她在逗我玩,娘俩的嗓音是比较接近,让我差点儿摆了乌龙,还没有多说话而说错话。 倒是想过不少再次见面时的场景,不过现实是让我有点儿意外,她居然叫我去她爷爷家,我比较汗!路上买了点儿水果,呃,确实没这种上人家家里的经验,也没人告诉过我,不过我想有长辈么,带点儿水果应该不算失礼,也不算唐突吧。 实际上,我比我自己想象的要不拘谨得多,这让我自我感觉良好,哈哈。不过毕竟分开得太久了,而且两人的经历差异也太大,让我觉得实在很难找到话题。 这丫头现在瘦得不成样子,164的个子才92斤,真是皮包骨了,还说现在上海就是流行这种骨感的。看那小腿,大概真只有我上臂的粗细了,还是喜欢她以前稍稍有点肉嘟嘟的可爱模样啊!
嗯,今天是国庆节,是的,我得祝贺,说实话我的心底还是热爱这个国家的,热爱这个国家中的人民的,当然这种热爱并不表示我会同样热爱这个国家的执政党。 上午还是看了国庆阅兵的一部分直播内容,呃,我不是个军事迷,对那些部队装备和武器是一窍不通,不过这不影响我对阅兵式的观赏心情。总的说来,作为一个仅仅60年历史的政府来说,能做到目前这样的程度,真的很不错了,人渣和败类是很难免的,这需要经过长时间的修正才能慢慢做得更好! 祝贺伟大祖国60华诞!
中午去吃午饭,楼梯上遇到王同学,依然是一脸茫然困顿的样子,问我去不去吃KFC,我大汗,这个时候选择去吃KFC还真是意外,问她为什么,说是要去洗头,只好去那旁边的KFC店里解决午饭了。而我原本是去食堂的,根本没带钱出来,两手空空,王同学只带了30元,外加几张KFC的优惠券,两个人就这么冲过去了。 花光那30元钱,外加一些她车上的几元零钱,基本心满意足地吃完KFC,又让王同学带我去洗头。洗完头,吹干,看起来舒服多了,这几天台风来,气温降,早上都懒得洗头洗澡,确实脏了点。猛然发现自己头顶好几根白头发,恐慌,恐惧,恐怖!
今天,也是无所事事地点开在csdn的blog来看,并不特意是为了看什么,只是一种下意识的行为。惊讶地发现,居然成了博客专家,我狂晕!就凭我那一年有数的几次心血来潮,偶尔想到了,才会用Windows Live Writer顺便把文章发到那上面去,到目前为止,也总共才8w多的访问量,其中不少还是自己点的,排名居然也有1500。自从确定在blogger上放置blog以来,对那的关注度实在很少很少。 由此可见,csdn真是没落了啊!想当年,大一上学期,几乎天天跑去网吧,混迹于汇编和C/C++板,下学期买了个电脑后,开始学习C++Builder,就在C++Builder板混,当时的技术氛围多浓厚啊!可是现在,那些已经消失N久的id,也早已从记忆中淡出! 呃,csdn blog expert,还真是让我觉得有点尴尬的称号呢!
不知怎的,昨天我突然想起北京这个一直只在书报、电视、网络上才能得到些许印象的城市来。 想到是不是该挑个什么时候去北京玩一下。想想在北京,认识的人还真不少,有中学同学,有大学同学,有以前一起灌水的网友,有以前的同事,甚至还有关系比较奇怪的,当年帮人家做毕业设计的,呃,勉强可以算是朋友吧。 想到这些人,就更想去那里旅游一下,顺便想去爬下长城,逛逛故宫。想做的事情还真多啊!
昨天上午跟大领导谈了后,基本确定下来辞职的事实。这2周多来,几次同领导们沟通,都被问及到底是什么原因要离职,我都一直以身体抱病需要休息,家人意见要我返回老家以及失恋之后精神不济,工作状态极差等等这些事情做为理由。嗯,其实我说的都是事实,当然也许还有一些没说出口的原因,毕竟作出一个决定,尤其是对自己来说是个关系比较重大,影响比较重大的事情,肯定是有很多原因掺杂在一起,只不过有的比重大些,有的小些而已。 昨天中午跟王同学在食堂吃饭,我兴高采烈地跟她讲我怎么和领导沟通,我要怎么处理剩下的事情,以后我有什么理想等等,荣荣就说我好兴奋啊,还真是脱离苦海了。兴奋只是暂时的,之后便是接踵而来的麻烦事情需要处理。 星期天在江江家打牌时,看到一个电视剧,里面一个坐在轮椅上的青年男人歇斯底里地大喊“我受够了,我什么都没有,我没有钱,没有健康,没有爱情……”,沉重地拨动了我的心弦。那不正是现在的我的真实写照吗?记得前些日子跟王同学在QQ上聊天,她还说“可怜的胖胖,出来几年,带着一身病回去了”,我当时可真是郁闷坏了,我可不希望这样被人同情,被人怜悯!但那却是事实。当在电视上听到那几句嚎叫时,我的心情很压抑,不过好在我马上想清楚了,我跟电视上的人是有区别的,最大的区别就是我没有绝望。我仍然对自己的未来充满了希望,尽量到目前为止,情况并不乐观,但我的选择是挣扎,而不是放弃。我不过分乐观,保持着一点应有的悲观和警惕,却不失强大的自信。我有的是远大的而自认为还算高尚的理想,并且坚信自己一定能通过努力在这条路上走下去,直到收获成果。 这些日子的所见所闻,加上和人讨论得到的启发和自己的思考。我略有点惊讶地发现,原来自己还是有点儿事业心的,只不过跟旁边的大多数人都没取得过一致意见而已。就说那天去江江家打牌,事后回想起来,真觉得有点后怕,人多了还可以一些打个牌,聊个天,要是两个人这么静悄悄的下午呆在家里,可以做些什么?还有上次,小思宇来深圳,把我叫去一起去小妞家里,那第二天下午,4个人打牌打累了,就一个一个倒在客厅的沙发上睡过去了,我也觉得后怕。那不是我想要的生活,至少不是现在的我想要的生活,那太缺少激情和活力,懒洋洋而无所事事是我很害怕面对的状态。我希望在自己有精力有能力的时候,做些事。难得活一次,做一回人,总得做点事情,留下点痕迹,证明自己在这个世界存在过……
昨天在公司里说到,以后要多作培训,多作交流,这种事情我倒是有点儿兴趣的。培训、交流,那么幻灯片是必不可少的,于是回来后就开始捣鼓Beamer。 因为就我了解的用LaTeX做幻灯片就只有PDFScreen和Beamer两种方式,而看过实际效果后,更喜欢Beamer生成的那种。以前也用Beamer做过一个非常简单的,这次我想好好研究一下,可以做出一些比较好看的效果来。 经过昨晚和今天上午的折腾,基本掌握了一些常用的用法。总的说来,还是比较满意的,虽然速度上比较起PowerPoint这种工具慢了不少,但心中还是比较满足的,主要还是熟练程度上的不足,以及缺少良好的工具支持(呃,就是直接拿UltraEdit编辑的)。所以更坚定了我要做一个TeX代码编辑器的想法。 因为这半年来使用MediaWiki的粗浅经验,让我对TeX的用法有了更多的理解。这所谓的“所想即所得”实在只是为了就对Word之流“所见即所得”才勉强杜撰出来的词汇。在我看来,这个TeX的设计思想,就是典型的西方人的思维方式:懒散、直接、天马行空。对于几千年来接受着严谨、务实、勤勉思想熏陶的中国人来说,一时间还真有点转不过弯来。在TeX中用这样的描述方式:我把这些文字作为标题,把那些文字作为章节名,还有些其他的就是正文,而至于标题、章节名和正文应该用什么字体,什么大小,什么颜色,什么对齐方式则不是当前我应该关心的事;而我们往往已经习惯了这样的做法:我把这些文字设置成黑体四号,居中对齐当作标题,那些字是楷体小四,左侧对齐,当作章节名,还有剩下的就宋体五号了,首行缩进两个字符,就是正文该有的格式。 就这么对比着来看,所见即所得容易催长用户做出花哨的排版,用户放了较多的精力在如何定制排版格式上;而TeX的所想即所得则比较适合于循规蹈矩的排版任务,在排版过程中可以少费脑筋。这也就是我说西方人的懒散、直接、天马行空的原因。由此也更好理解,为什么Nokia的手机里没有树型结构的文件系统,全靠文件名来索引;为什么wiki也是这样只靠文章标题进行检索;为什么国外品牌的PC机硬盘只有一个分区了……
在食堂跟江江、bobo一起吃过晚饭,晃晃悠悠走向F3,没想到在楼下遇到疯丫头,最近见到她有点多啊,前不久教授来深圳,一起吃饭时就见过一次,再之前是马姐姐召集大家吃饭,也见过。她在这边刚开完会,于是就和她聊起来,我告诉她我要辞职回家了,她倒是表现出一点惊讶的样子,比较有趣的是她也跟我说一个“绝密”的事,她老大同意把她调到北京去了。 这让我越来越觉得用“铁打的营盘流水的兵”这句话来形容我司实在太合适了,真是半军事化的管理,连里面的人这方面的行为都很半军事化啊!想想我进公司这4年来,陆陆续续离开(不一定是离职)的人中,有多少是跟我比较熟的。雨烟离职去了北京,跟老公一起走的;教授是最近才离职的,不过中间也是几经波折,现在是去tsinghua读博了;骨狗是个比较有趣的家伙,离职前的告别邮件还是中英文双语版;小思宇是去巴基斯坦陪彭彭的;孙同学没离职,却想方设法调到武汉去嫁人了,瀑布汗;还有一些不是很熟的同事、同学离职的;剩下几个准备行动的,这中就包括疯丫头,猫猫也许算一个吧,一直嚷嚷着要去南京;小丫头说是年底会去上海,也算是一个吧,也是一直吵着要离职的家伙……总之,大的趋势看,都是往着离自己老家近的地方挪,嗯!
早上醒来,习惯性地找床头的iPhone看时间,居然没找到,很奇怪地起床,找挎包,心想昨天记得把手机拿出来了的啊,结果连挎包也不见了,越发奇怪,等到发现卧室门打开着,才开始有点焦虑,走到客厅一看,挎包被丢在靠近门口鞋架的旁边,里面的东西已经被翻过了,钱包里面大约有1千的现金已经不翼而飞了。这时我才确认,昨天晚上有贼入室了,这才稍微有点后怕,晚上有人进来我居然什么都不知道,万幸的是,只是丢了点钱和一个iPhone,至少连T43都没丢,T200也在,PSP,NDSL都在,连一起放在挎包里的Nano都还在,除了这些,人身也是没损失。 情绪理所当然地比较差,但也不知道到底是什么心情,没有恐惧,没有愤怒,没有后悔,没有惋惜,只想躺床上睡一觉。大约的损失总共是5000RMB,却没有一点心疼的感觉,对金钱的态度自己都觉得有点不可理喻。想要钱,却不在乎钱。 这该死的国家,该死的社会,我诅咒这个世界,却对那个小偷什么想法都没有,连骂几句,憎恨一下的念头一丁点儿都没有。 还是得靠自己,拥有了强大的力量,才能保护好自己和对自己来说重要的人或东西。
今天疯丫头发邮件来,随便聊起各自的近况。这个性格柔弱却有点儿自己的小固执的姑娘,看着就是那种让人忍不住想欺负一下,却又忍不住要好好疼惜的人。想起以前一起玩耍的日子,还有她对我的各种大决定的意见,有时候让我觉得有点儿困惑。 也许我在她眼中真的就是一个小弟弟,偶尔在她的面前会表现出一些小孩子脾气来,也许有时候我在她眼中又是一个男人,站在女人对面的男人,希望能做些理应不该由女人担当的事情。 原本被我深深压抑在内心底层的那些亘古遥远的回忆和情绪,又都活络起来。也许唯有时间可以化解这一切。
早上听同事说起,那个杰克逊死了。当时还没什么特别的想法,心想也就一个出名的歌手吧,死就死吧。 下午小妞发来一个mp3,名字是《Heal the World》,很好听。突然想起初中时班上一个转学生,一个身材纤细,特长舞蹈的女生,据说她的偶像就是杰克逊。那是我第一次知道有杰克逊这么个人,看到那CD封面上的照片,心中一点都不感冒,尤其不能接受他那种打扮。心中还纳闷为什么这么一个清纯的小姑娘会把这样的人当成偶像。那个女生后来在初三最后一个学期又转学了,大概因为户口之类的原因需要回原籍去中考,再后来就一直没见过了。记得在我在高一的时候,那段混乱而手足无措的日子,还偶尔听到过一两个男生在那里对她的yy,那时我只觉得这太假了,虚伪得太明显了。 春去秋来,不知道那些曾经从身边经过的人,现在都在哪里,过着怎样的生活……
历经约2年的安逸生活,blogger终于又不能访问了,这次的决绝,让我惊异和始料不及,这次似乎不是伟大的GFW动的手,而是人家服务器端直接自己被我屏蔽了,悲叹啊! 命运不能掌握在自己手中的感觉,实在太不好了!
托小妞在淘宝上买了块手工皂,照片很好看,那种那糕点,用小妞的话说,就是黄豆糕内嵌紫色布丁。昨天中午跟小妞他们两口子去万科城的夜郎国吃田鸡,把手工皂拿了来。包装也比较可爱,最外边是一个绿色的硬纸壳,纸壳夹起手工皂,两边没封起,可以看到里面,用一个塑料袋装着手工皂,塑料袋和纸壳在最上边还用一根绿色的小绳串起来打了个活结,很是吸引那些小女生的样子。 手工皂很小一块,小妞说大概每天用一下,能用两三个月吧。嗯,我明明记得以前是小妞跟我说的,男人过了25就应该保养了,可是上次她硬是说自己说的是女人,我大汗,不过看着自己脸上日渐粗大的毛孔,我就只认我记得的了,哈哈。
google上有个讨论组,一直标榜自己高质量,可是为什么我订阅了这么些日子后,越来越感觉到这些个主题不知所云了,难道所谓的高质量在我看来就是装B的意思? 我狂烈地晕啊!
我的自负掩盖不了内心深处的自卑,灿烂的阳光抵挡不住浑身的寒冷。 难道我真的错了?我不知道,我更不愿意承认。 我要继续坚持自己的信念,即使满身伤痕,也要蹒跚着勇往直前!
今天用Foxmail收邮件的时候,才稍微留意了一下出错信息,原来我在学校bbs上的id已经没了,消失了,生命值减到0了! 上去试了一下小丫头的id,也没有了,离开学校的日子,终于超过1年没有记得要登录bbs。 用guest登录上去看了看,以前经常驻留的几个版面也找不到了,像People,留下回忆都没有! 翻出Foxmail中保存的一些bbs上的聊天记录,还有邮件,想起在学校或开心或悲伤或迷茫或骄傲的时光。 一站的终结,逼近着新的开始。
今天一个同事发来告别邮件,没多少意外,因为上个月就已经听其他同事提到过。这同事是个比较有趣的人,告别还要写个中英文对照的双语版,而且内容严肃,很像领导讲话。除此之外,他爱好摄影,关注电子产品,这是我比较钦佩和羡慕的一点,我一直希望自己也能拥有一项比较健康的业余爱好,不过直到现在,尝试了不少活动,最终还是没找到。 同事邮件中说到一句话,我很是有点感触:“事业上所有的成功都弥补不了家庭的失败。”他说这是一句台词,我觉得在我的内心深处也许我是很赞同这种观点的,但这些年来,我却时常认为,男人在30岁之前应该能作出一番事业来,至少能让事业走上正规,而这之前,感情的事应该让路。但是我有时候对感情的渴望也是强烈得一塌糊涂。 同事还说,在这个月要去四川进行一场心灵之旅。真是一个煽情而风骚的男人啊!曾经我有一段时间也是对自己对生活失去了信心,小思宇问我想干活,我说想去旅游,小思宇说总不可能旅游一辈子吧,于是让我打消了这个念头。现在回想起来,小思宇真是个感觉敏锐的人,还是说很多女人真的有这种被人称之为“女人的第六感”的能力。 同事要走了,引发我一些思考,最近甚至想到我这半年或一年中要做哪些事,可是我往往最终只留下一个美好臆想。 祝同事以后的工作生活都一帆风顺吧!
在Kugoo上随便按排行榜搜索的歌曲列表,几乎是重装一次才会更新一次的列表。这次偶然发现列表中一首很抒情的歌曲《白狐》。虽然听了也好些日子,而且都是一个人在静谧的夜里听,但直到今天,我才实在忍不住心中的好奇,上网搜索了一把。 搜索了才知道,原来还有一个合唱版本的,于是马上开Kugoo来听,男声稍微有点让我失望,也许是从小看电视《聊斋》而被先入为主的思想主导,我特别希望男声是像电视中的那种书生腔调。不过总的说来词、曲,以及女声,都很打动人,在百度百科中,也有不少相关的信息,原来蒲松龄不是第一个写书生和狐独的故事的,只不过是他把如此凄美而又有新意的情爱带到了大众面前。 不知怎的,尽管让人觉得悲伤,我却有点神往。
昨天晚上6点半的飞机,回到深圳住处已经10点了。在西安过了6晚,有4晚出去转了转,给我印象比较深刻的是那里的吃的和人文景观。 22号傍晚到的西安,结果最郁闷的是被人忽悠了,居然有两个名字一样的酒店,而且我明明说得很清楚是哪条路上的,结果司机还是把我带到了另一个酒店那里,太扯了,比国产007还要傻冒。马上出来打车走,结果说明了是东仪路,那个司机硬是开到了东一路,我大汗!好不容易啊,才到了最终目的地。一个小小的窄窄的地方。放下东西,去酒店附近一个砂锅店吃了些东西。第一天,给我最大的感受是,西安美女挺多的!在的士上时,就看着路上的行人中,很多漂漂的mm,后来去砂锅店,就又看到一个很漂漂的mm一个人在那里很优雅地吃着粉丝。 23号晚上,听从王同学的建议,去大雁塔喷泉广场转了转。到了那里才郁闷地发现,这明显是个情侣才来的地方啊。可怜我一个人,天又冷,好凄凉!随便走到路边的一个店里,买了点东西,回去哄一下家里的大小美女。其中一条街上,一家一家的小店,叫百工坊,都是当地特有的手工艺作品,主要特色是可以让游客DIY,但是我看到基本没有什么人进去,不知道是不是因为已经是晚上的缘故,或者是天气冷,游客不多的缘故。正当我无所事事准备回酒店的时候,广场广播突然说有什么水舞表演,于是好奇地停下来等。水池旁边站满了人,中间也有很多人,我挤进一个地方,原来就是喷泉配合音乐,喷出不同的水柱,所谓水舞。不过也是第一次看到这种东西,还是有点新鲜感的。 24号晚上,我本想去买些玉的,因为蓝田就在西安附近,所以西安就有很多卖玉的,问了下王同学,她说去书院门买。结果等我打车到了书院门,那里的店铺都已经关门的了。没办法,于是只好走到对面去看城墙,反正王同学也说,这好歹也是西安一景啊,哈哈。门票40,我不清楚这种行情,直接进了里面。刚好有什么大唐灯会,于是在城墙上走了一两个小时,天还是很冷,回! 25号晚上开始下雪了,而且从公司出来打车,居然打不到,走来走去,过了一个小时才打到,汗!直奔回民街,跟司机聊起,他居然是上海人,一下就猜出我老家是哪儿的,哈哈。到钟鼓楼下了车,绕了一圈才发现那条回民街,真是条小巷子,而且人不是很多,我不知道是因为天气不好人少了,还是因为已经有点晚了人少了。走到另外一边,时代盛典那里,也有一条回民街,人更少,店都关门吗。没办法,打电话找王同学确认一下,王同学也跟我说不清楚,不知道她哪里找来另外一个mm来跟我说,我才明白,第一次进去的那条小巷子是对的。于是对跑过去,吃了笼贾三灌汤包就很饱了,晃悠晃悠晃到另一边,随便找了个泡馍店,进去点了个牛肉泡馍,不得不说,这味道真的比公司食堂的好太多了,肉嫩味美。 26号,下大雪了,早上起来发现屋顶上,车顶上都积了几厘米厚的雪,白天也是飘着鹅毛大雪。只好不出去了,老老实实呆在酒店里看小说看电视。 27号,想着第二天就要回深圳了,下了班立马又跑到回民店买些吃的带回去。顺便去吃了下之前那个mm推荐的红红炒米,感觉跟蛋炒饭差不多,不过是里面有些肉丝和酸菜。又叫了几个羊肉串,还有不知道是什么肉串,味道都不错,至少这羊肉串我是比较得出来的,比起其他地方吃过的,这里的特别嫩,而且膻味不大。吃完后,晃悠了两圈 ,进到一个大一点的店铺里,买果脯,就挑那种平常在深圳不太有得买的,我也不知道价格上有没有问题,不过想来再亏,数量也不大,也就不去计较了。 偶尔去下这种从没去过的地方,还是挺有意思的,不过一个人毕竟乐趣就少了些了。
一周前就被告知要去西安出差,心里还是有点忐忑的,说起来有点丢人,还是第一次一个人去一个陌生的地方,真正的人生地不熟啊,哈哈。以前去重庆,有同学一起,来深圳,也有校友一起,去贵阳,有表哥和小妞接待,这次可是真的一个人咯。
8点钟才从公司出来,坐上B666回住处,也不算太晚。快到小区门口的公车站时,我已经站起来走到门边,一辆SUV却超上前拦住了公车。从SUV下来五六个30来岁的男人,都是圆寸头,拍开驾驶室的窗很嚣张地对司机说,叫他以后不准再开,要是明天再被他们看到要怎么怎么的。这样捣鼓了几分钟,终于走掉了,我还一直担心他们会不会上车来抢劫。 记得从上中学开始,每当说起以后娶妻生子的事,我就有点烦躁和恐惧,我总是担心自己的小孩没教好,变成流氓。我妈知道我的想法后,曾也和我说过,只要好好管教,是会好的。今天看到这些人,我又想起这些来,不禁又想,这些人的家人都是做什么的,他们有没有父母,有没有妻儿。 这个世界,真让人憎恶。
今天突然说起情人节来,小妞问我有没有约mm,我说我一到关键时刻就哑火了,小妞就说约一下又不会死人,我说没有想约的人,是不是我要求太高了。小妞就说觉得我是麻木了,什么样的人都觉得一般。我无语。也许吧。
今天是元宵节,据说今天晚上10点多将是近50多年来月亮最圆的一次。下班后跟F还有孙同学一起去超市买了点汤圆,然后回家自己煮。三个人吃两包汤圆明显是过量了,最后实践证明,我们顶多只能吃掉一半。当然我们也煮了一点米饭,一人不到一小碗,不过也刚好用来调味,汤圆毕竟太甜了。 吃完后,孙同学又一次把我的厨房大清洗了一遍,灶台上厚厚的油渍也被擦干净了。我开玩笑说,你是不是现在故意来刺激我的啊,以前怎么没发现你有这么贤惠啊!她就说,可惜了吧,后悔了吧。呵呵! 真的很有点心灰意冷了,要撤退了!
去超市买了点儿肉和菜,回来哧哧喳喳弄了大半个小时,整出3个小菜来,跟同屋的那个江西老表一人倒了大半小饭碗的女儿红,打开电视,看着国内国际时势政治,摆下龙门阵,点评下天下时局,人生真是惬意啊!
真是捉弄人的命运啊!有句话说,命运负责洗牌,而我们才是玩牌的,牌太差,无论技术如何,都是于事无补的。 今天在公司里用错了_tcsncpy和_tcsncat,因此引发的bug找了半天才明白原因,汗颜。 另外,Launch里好严重的内存泄漏,确实,都是些很低级的失误,review很重要。
感兴趣的事情太多,精力太有限,克制自己的求知欲真的很重要!
可是怎么我一点都不激动,不兴奋呢,反而有种失落的感觉!
上午在公司开了两个小时总结会,总的说来,对自己在这一个季度的表现还是比较满意的,虽然中间过程有些不爽,但总体上结果还是勉强能够自我安慰的。
下午在公司,又开了两个小时的会,这倒没什么内容了,我本来这一年来就没有参与这些项目活动,冷然一个旁观者的身份。
下了班,跟F还有两位cm0大大一起去华强北吃海鲜,虽然那家叫明香的馆子屡次路过,也听人提起过很多次,但来深圳3年半了,还没去过一次。吃得很安逸,也正是这一刻安逸的短暂,才让人觉得眷恋。
吃完晚餐,4个人一起去逛街,真是不得不感叹作为一个男人,F居然那么喜欢逛街,我本来一直以为自己逛街的能力也够强的了,被小妞她们培养了近一年的,结果我发现差距了,我完全是被动型的那种耐力好,而F是主动型的精力充沛,兴趣盎然!倒是把两位cm0折腾惨了,还穿着高跟鞋,最后是见到凳子就想坐了,哈哈!
回家了,明天的现在,我应该是在家里的床上了,哈哈,这世上没有过不去的坎!
星期天去参加1783的石头河溯溪,结果被小路晃点了。溯溪回来跑去南山找阿布拿手机,然后去他家吃晚饭,见到了他老婆,真没想到啊,他儿子居然2岁多了,真以为是90后的呢!吃完饭,坐了一会儿,一群人决定去唱K,结果不知道喝了多少酒,反正第二天是谁把我送到的士上的我也不记得,迷迷糊糊回到家,倒头就睡,于是,一天没上班! 今天去上班,不知怎么的,情绪很低落。整了个版本给人测试,发现根本没法用,几个严重问题,崩溃、崩溃、还是崩溃!以前的设计有问题,或者说压根没考虑到后来会需求会变化那么大,这实在是可以原谅的。这次还有一个重大的变化是,模板文件中加入了宏,于是用COM操作后再关闭会问你要不要保存修改,尝试了半天,发现只要先关闭workbook,再关闭workbooks,再退出就可以了。因为关闭workbook时有个参数可以指定是否要保存修改,而且关闭workbooks时则没有,会自行弹出个消息框来确认。
昨天晚上是网络产品线的新年晚会,下班后从公司坐车去宝安体育馆。今年的待遇好很多,每个座位上都有一包小东西,里面有几个小面包,一盒牛奶,还有造势用的东东。 晚会内容倒是没什么新意,年复一年,于我无关。 一切皆是浮云。
昨天晚上跑去KTV唱歌,后来唱歌腻了他们就放起的士高来,我是不会蹦迪的,可是看着那些人在那跳得那么起劲,我也有点蠢蠢欲动了,于是去胡乱蹦了几个。结果,今天就显效了,虚脱了,背痛,下午一下就睡着了,好久没在家里睡过午觉了,醒来的时候发现天灰蒙蒙的,还有雨声,还以为睡到天亮了,心里不禁大喊,天呐,我居然从前一天下午睡到第二天早上,还没吃晚饭!后来挣扎着要不要起床,看了一下时间,才18点,心里顿时安定了不少,原来还没到第二天啊,刚刚还郁闷着这周末就不知不觉地让我睡过去了呢! 再说点正儿八经的事。话说我一直想要设计一个基于C++ GUI框架的脚本扩展架构,不过到目前,还没有一个完整的清晰的思路,我只有一个大致的目标。一直想着,这样的架构实现后,只要C++部分实现一些基本的底层支撑,剩下的脚本就可以直接拿出复用,实现所有业务逻辑。为了证明这个架构的通用性,我觉得自己似乎有点儿贪心了。我希望在MFC+XTP的基础上、WTL+TabbingFramework的基础上,以及wxWidgets的基本上都实现一遍。MFC的是因为工作上的需要,WTL则是因为想写一个WIND,而wxWidgets的则是想写一个通用的跨平台IDE。今天只想到一点,所有的逻辑处理都应该交由脚本实现,C++部分只提供最基本的底层(原子)操作。
老大叫我整理一份项目组内成员的C++相关内容的培训计划。我还是兴冲冲地去弄的,不过基本上是参考我自身的情况制订的,内容方面不是我比较熟悉的,就是我比较欠缺但又在工作中比较需要的。 主要分了8大类,分别是C++对象模型、C++模板、STL、Boost、面向对象程序设计、Windows API、MFC、COM。每一类,都又划出好几个培训课程,我还根据自己所了解的,分别给每一类都备注了参考资料,每一类的的参考资料大多只是两三本经典书籍,比如COM类的,我就写了《COM本质论》和《深入解析ATL》,而Windows API类我就写了《Windows程序设计》和《Windows核心编程》,等等。 等我把这份列表发给老大,老大又转给更大的老大,更大的老大则回复说,内容太多了,要分轻重缓急。我觉得很有道理,这样的培训是很耗费资源的,当然应该拣最有用的来。不过他列出的前3位是Windows API、MFC和COM,对于我来说,就有点兴味索然了。虽然这些方面我也远远说不上精通,甚至连熟悉都不够,但我自以为,应付工作上的要求是够了。比COM举例来说,我虽然排斥COM,但必须用地方还是会用的,我会调用COM服务器,同时我也写过COM组件,我觉得自己够了。 既然不能把这份列表作为组内的培训计划,我看了看,觉得依照这些列出的参考资料,也可作为我自己的增强计划。这8类我都有所了解,在实际工作中也都或多或少地有所运用,但我不禁要考虑,学到什么程度算是够? 我个人倾向于学习和使用一些比较通用的技术,比如STL、Boost之类平台无关的知识我就很有兴趣,而COM则是有点深恶痛绝的感觉,MFC稍微好过一点,不过也不是很喜欢。这不是我研究了这些东西后主动有了喜恶观念,而是不知不觉在一个比较长时间内养成的兴趣倾向,直到后来自己总结的时候才发现这个规律。 其实我根本没多少想法,要尝到什么程度,目前而言,我只好给自己暂订个目标,STL、Boost、C++模板和对象模型,以及面向对象程序开发,是能学多少算多少,而其他的,则是够用就行。
本来计划是明天的,因为冬至要吃饺子,结果F说明天要加班,于是只要提前到了今天。 那几个家伙也够懒的,能睡那么久,不过也让我有点羡慕,因为我到了早上7、8点的时候,就开始睡不着了。 结果等cm0同学过来的时候,已经1点了,然后跑去超市买菜。安排的是中饭吃炒菜,晚饭吃饺子。买了130多的东西,当然不全是吃的,还有cm0买的什么卫生纸之类的东西。F去超市旁的KFC买了鸡米花、圣代、薯条、蛋塔,因为实在不知道我们什么时候才能吃上中饭。 中饭的菜基本上是我弄的,也跟平时我自己弄的一样,一个肉丝、蒲瓜、金针茹、香干丝混炒,一个白灼基围虾。味道自我感觉还是满意的。吃完就已经4点半了。 吃过中饭,就打了一会儿升级,我的手气不是一般的差,不知道那个跟我搭档的cm0有什么感想,哈哈,反正我们一直都是打2,没升过级,而对方已经打到7了。 7点时,开始准备晚饭,即饺子。我没有动手,因为我实在没有经验,就看着他们三个包,份量挺大的,满满一大盆的馅,厚厚的两叠皮。最后吃剩下15个左右,没办法了,只好浪费了,唉,可惜! 另外还剩下鸡汤和鸡肉没动呢!
大牛上周从俄罗斯出差回来,今天给了我好大一块巧克力,哈哈! 单从包装外来观察,这块巧克力厚就不止1cm吧,宽不止10cm,长不止20cm。包装上全是俄文,我也找不出哪里写了具体的体积规格参数,手头也没有尺子可以量一下,反正就是很大一块。中午猫猫还说,大牛把最大的一块给我了,给她的就没有我的大,哈哈,想起这个就觉得开心! 我们公司的人去国外出差,习俗就是带当地的巧克力回来给同事朋友们尝尝。以前吃过那位cm0同学不知道谁给她的德国巧克力,薄薄的一盒,里面是一小条一小条,味道比小卖部的德芙好多了。只可惜我是没什么机会出国出差了,除非赚了钱自己去旅游去。 其实我很喜欢吃巧克力的,只是太容易长胖了,哈哈!
部门组织去杨梅坑游玩,之前只看别人去玩过,自己却没去过,所以在出游前,一直有点儿兴奋。 早上等车等错了地方,有点囧,有点恼。坐了一个多小时车,终于到了目的地。每人都去挑了自行车,好久不骑了,有点感怀。租好了车,却一直不出发,等几个自驾车过来的人,有点不耐烦。估计等了有十几二十分钟吧。 一路逆风,而且风很大,路上看到不少前面的人被风吹掉的旅游帽。大概骑了半个小时,到了目的地,一个别墅,再过去就是悬崖了,悬崖不高,下面是海!在这么偏僻的地方看到悬崖,不禁想起很多肥皂剧里的那些跳崖的剧情,有点无语,当时的人们想像力还真是不够丰富啊。 悬崖上也风很大,拍了几张合影,也没什么玩的,就回去了。回去是理所当然的顺风,大概15分钟就当了,然后就是吃中饭。中饭比较合我口胃,是海鲜,但称不上大餐。价格不便宜,但也算不上贵。海鲜也是最常见的虾、蟹、鱼、花甲、扇贝,其他的就没什么值得说了,不过我还是吃了3碗饭,哈哈。 吃过中饭,就去桔钓沙。上一次去桔钓沙应该是2006年9月9日吧,记得当时小丫头不在深圳,说得她很遗憾的样子,小丫头应该很喜欢去海边玩吧。这次时节不适合下水了,风也很大,于是我只是躺在席子上用手机上网看小说,就这么过了一下午,直到4点半,打道回府。
约了几个同事(F、S、W)来家里烫火锅,早上还是跟平时上班时一样准时自动醒来,已经麻木地不知道郁闷,在床上赖了一会儿,起来开电脑,看了一下更新的小说,然后无所事事,整那些代码,一直到9点多,出去剪头发。剪头发这件事已经酝酿了很久了,但一直没有兑现,今天终于狠了狠心,看了一下记录,上一次剪头发是3个多月前,汗! 剪完头发,离约定的时候还早,便又回到家中玩电脑,一直到W给我打电话,匆匆赶出去,一起去超市买菜,买了不少,我也没有估计我们食量的能力,所以就尽量多买点。 吃了两顿,挺好玩的!
今天中午偶然得知在会展中心有房展,于是临时决定去参观一下,虽然买房对于现在的我来说还是比较遥远的事,但是感受一下那种气氛,了解一点市场行情还是可以的。 本来以为会展中心可以坐391直达的,结果后来才发现,391早已经不知什么时候改线路了,而且改了线路之后我曾经坐过,只是当时没有留意而已。于是下了车,一直走路过去,大概也就是十几分钟的样子吧,不过也出了一身汗。 展厅里外都有很多人,果然比较热闹啊!对于房展,需要关注些什么,我是一点经验也没有,所以像无头的苍蝇到处乱走乱看,看到很多地方都排起了长队等待领取纪念品,觉得还真是无聊。另外就是看到几处文艺表演,有个还算pp的mm在拉节奏轻快的小提琴,看她嘴角弯弯的样子,让我觉得像马姐姐,于是拍了两张照片下来,不过马姐姐的身材可比这mm的好得多!后来看到一处有六七个像幼儿园的小女孩在跳舞,也是很轻快活泼的节奏和旋律,很可爱,但似乎脸上又带有一种跟她们年龄不相符的成熟的神情,看了一会儿,想拍照,总是有人挡在前面,找不到好的角度,不禁又佩服起这些小女孩的体力还真不错!再后来,看到有两个mm在跳比较热辣的舞了,穿得也少,同样是有n多人挡在前面,还有不少人总是在她们前面1米左右的距离横穿而过,甚至有个中年妇女抱着个婴儿,直接坐在那个舞台边上拍照,唉! 对于房子,倒真的没怎么关心,偶尔留心了一两处,总觉得价格上太划不来,比如有一处复式的空中别墅,167个平方,在盐田,总价大概三四百万,心里就很不屑,觉得太不值了。 出来后,又走了很多路,累死了,还是得自己有车啊。
中午睡过午觉走下楼,在拐角的地方看到一个男的,直觉得好眼熟,想了一会儿终于想起来,不就是这些天在食堂吃早饭时经常看到的那个男的吗,当时还心想这男的长相也实在不咋的了点。可是这次匆匆路过的一瞥,却让我自惭形秽了起来,我缺少成熟的气质,而且缺乏自信。所以我一直都有意无意地走着邋遢路线,装着吊儿郎当的样子,抱守着那残存的点点自尊心,却是没来由的自负。 为什么没有自信,说到底还不是跟自身拥有的客观条件有关系。真正拥有强大自信的人,实际上要么确实是自身拥有超乎常人的才能,或者是有其他强势的物质依靠,而这些也正是我缺少的。
记得曾经有一段时间,我把自己的昵称或ID说明栏上改成“从今天开始魔王”,这是一部日本动画片的名字,当时觉得这个标题很适合自己的处境或心境或志向的,也不是说魔王要干坏事,而是要像入魔一样地写程序。当时确实有那么一小段时间,读书的时候也好,工作了以后也好,有点空闲的时间就去写代码,或者上网看编程相关的内容,或者买书看,或者就泡那些编程论坛BBS。结果后来还是不了了之,尘世的诱惑实在太大,哈哈! 今天心血来潮打开久违的VS2008,打开最近创建的一个工程,看了一下SVN里的提交记录,最近一次是22天前,而想想22天前的那次提交,其实也不是自己写的代码,只不过是把别的地方的一些代码复制过来而已。 这些代码在那样的需求下,工作得很好,可是我需要它能再更进一步。昨天重装了VS2003、VS2005和VS2008,但发现2008那个RC1107错误依然存在,于是外事不决问google,发现一篇文章,果然不止我一个人有这问题,很快解决了,看了看我的配置项,最后一个include的目录尾部的字符赫然是个反斜杠,换个末尾字符不是反斜杠的放在最后,试了试OK了,哈哈,仰天长啸! 另外又看了看CppNPv2,里面关于ACE_Message_Queue的说明,原来这个消息队列有一种功能,可以限制存放在里面的最大的数据量,默认为16K,回想白天在公司里,因为我给每条记录是1024个字节,每次16条记录不就刚好是16K嘛,我汗颜! 用VS2008写代码特别安逸啊,本身就已经做得挺不错的了,而且加上VAX的辅助,现在我已经真的再也离不开它的自动完成和重构功能了!也不知道是VC2008的编译器确实改进了,还是我的机器的内存足够大(1.5GB,用XP一般情况下根本用不完),反正觉得它编译速度好快啊!想想在公司里那个P4 2.6G,因为搭配了512MB的内存,用VC2003编译个东西,那个老牛拖破车啊,不过我已经申请加1GB内存了。 还有,就是前段时间买的那个键盘打字果然很舒服啊,仿笔记本的超薄型,现在天气热,再放在本本上要烫死了,打着打着就会不自觉地加重手势,感觉超爽,哈哈! 从今天开始重新魔王!
时间过得真快,我们国家为了承办奥运会,准备了那么多年,从第一次申办失败,到后来申办成功,再到各项准备承办,两三年前就开始倒计时,还有几百天开幕。而8月8日开幕式,感觉就是昨天一样,当时还忿忿不平地说开幕式不好看。今天就是闭幕式了,还是老样子,除了排场足够大以外,其他的我确实找不出好的来了,从色彩,到音效,或者意境,反正没有一项是我喜欢的,也不知道花费了多少人力物力,当年各种专家预测的,奥运会期间给中国经济带来的巨大好处,不知道是否都应验了? 作为东道主,中国确实历史性得获得了金牌榜第一的骄人战绩,但又一想,金牌多带来的又是多少好处呢?看到一些报道说,有些国家,比如美国、加拿大,那里的很多运动员都是业余的,平时都是有各自的工作,政府并不给运动员们发放多少金钱上的补助,相比之下我们国家的运动员呢?出了成绩,还说得过去一点,但成绩很差的那些呢,比如男足,那些钱都是从哪里来的,最后又花到哪里去了,是不是浪费了?我们国家作为发展中国家,却在这些方面作为远不如那些发达国家英明和有远见。 算了,也是一家之抱怨,没意思啊!
一周一次的例会,没有什么新奇的内容,我猛然发现自己连原本仅存的那点激情和盼望都没有了,残念! 下午帮一个同事定位内存泄漏的问题,倒是没有完全解决,只是指出了几处可能造成泄漏的代码,让他自己有空去调去吧。 那天cm0说自己很迷茫,我想了想自己,我是有目标的,知道自己想要什么,却没有动力,完全颓废了,唉!
昨天下了班,跟两个cm0同学去喝粥,然后慢慢晃悠到百草园门口等车。到家的时候,奥运会开幕式已经开始了一小会儿了。 排场是很大,很有张艺谋的风格,中间还让我想起过去阳朔玩时,隔岸观看的印象刘三姐的场面。但是我其实一点儿都不喜欢这样的节目,太古朴了,气氛太沉闷压抑了,我还是喜欢充满青春活动,满是激情和阳光的那种。不过我们做为四大文明古国之一,当然是一个好机会好好炫耀一下自己的古代文件,什么四大发明啦,四书五经啦,乐曲戏剧啦等等等等,倒是近代之后,却真的没什么值得称道的东西拿出来说,真是遗憾啊! 文艺表演持续了没多久,不到两个小时,其中还有刘欢和“月光女神”莎拉布莱曼的合唱,也是让我好生失望,对于刘欢唱的歌,我并不熟,有印象的只有蓝色妖姬、新笑傲江湖和新水浒中的主题曲,水浒中的还感觉不错,到笑傲里就觉得恶心了。这次听来,也觉得不爽,而把人家“月光女神”请来,却来唱几句不伦不类的汉语,实在寒心到了极点。 接着是200多个代表团入场,太多了,我就忍不住了,一直等到点火炬的时候才回去看,原来的体操王子长成这个样子了,瀑布汗! 最后再没心没肺地重复一遍,这开幕式也忒难看了点,好生失望!
想起一句老话,天下乌鸦一般黑。回头想想其实现在也挺好的,写写代码,拿点小钱,混个日子。于是突然又想起自以为很真理的一句话“最好的软件是自己写的”,客户为导向的策略告诉我们,最好的产品就是客户想要什么样的我们就做成什么样的,于是需求收集分析就是非常重要的环节,如何正确理解客户需求,满足客户无休止的要求,是我们制造业工人的头等大事。再回过来看,自己想用什么样的软件,当然自己最明白,所以省略了信息传递过程中信息损耗、变形的过程,最后可以得出前面提到的结论“最好的软件是自己写的”。
平常经常抱怨,怎么也不见买什么东西了,怎么工作几年了还是没攒下钱来,真是太奇怪了。其实仔细算算,每笔钱的去向都是有据可查的,只不过我没有记账的习惯,更谈不上理财了,因此就有了所谓“你不理财,财不理你”的可悲下场。 今天又跑去华强北一趟,已经计划很久了要去买些平常穿的衣服和鞋子。照例没吃早饭,结果看小说看到连中饭的时间也过了,后来实在心里记挂得厉害,就随便收拾了一下便坐车到了华强北。 先跑去KFC里,吃掉¥36.5。 然后去红利多看键盘,家里那套微软的无线套装,键盘用得很不舒服,现在天热了,手放在本本上也觉得烫,所以也筹划了几个星期了想换个好点的外接键盘。红利多也没有多少可选择的余地,当初我曾还想过去万商那些小铺子里买个二三十的就行了,结果同事说还是得买个好点的像微软、罗技的,说实话,有了之前的经验教训,短期内我是不会再买微软的了,感觉性价比太低,而罗技的,从大学起,就一直没多少好感,尽管这牌子的键盘鼠标确实做得挺火的。最后选了个LaVIEW,以前没用过,因为我其实只买过3次键盘,第一次是装第一台电脑时一起配的,大概就是30块钱的,不记得什么牌子了一直用得挺好的,直到大四时电脑搬回家,因为想减轻点分量,就把键盘丢下了,到了老家又买了个新的USB接口的,现在也不记得什么牌子了,因为本来就很少回家,所以用得少,印象极其不深刻,也不记得多少钱了,应该也不会超过100块吧,再后来就是在这里给本本买的微软无线套装了,除了无线这个看起来牛B哄哄的特性外,实在找不出它其他的优点了。今天买键盘,主要看手感和外观两方面,最后以129块的价格买了一个超薄的,手感跟本本键盘类似。 买了键盘就去茂业买衣服。先到adidas买鞋,我也算是龙浩的比较忠实的客户了,每次买鞋首先想到的就是ad、puma之类的。随便挑了双很轻看起来很透气的运动鞋,打了8折还要576块。接着去买衣服,去杰克琼斯看看,好多人,因为在打5折,于是买了件T恤,也要124.5元。 采购完毕,回家,看看也很不起眼的几样东西,除掉路费不算,今天下午就是860多花出去了。钱就是这样花掉的!
今天突然发现,我在公司里有使用权的机器有好几台了,除了本来一直在用的,从进部门开始就配备的那台联想台式机外,还有一台2001年的老爷机,一台双核2G内存的工作站,一台双核双至强1G内存的IBM服务器,还有一台双核2G内存的服务器。这么多可用资源,现在却发挥不出作用,对工作没有什么帮助,实在让人觉得可惜。 但是如何利用这些机器资源呢?我确实也想不出好的点子来。可以建些版本控制、数据库、HTTP之类的服务,但还是大材小用。隐隐约约脑中一个概念闪现——分布式计算!可是现在分布式计算能大众化实用化的也没怎么看到了解到,曾经用过一个号称可以加快编译速度的利用VC的分布式编译工具,但当时试用的效果并不好,四五个机器一些联合编译,最后不但编译出来的文件有问题,耗时也比单机编译的多,真让人失望。 继续想、继续想,如何利用这些机器资源呢?
唉,回到家照往常一样打开电脑,发现explorer.exe是起来了,但界面没出来,倒是弹出个出错消息框,说是哪个进程不正常,看这名字就感觉不是正常的。等了老半天,没耐心了,重启系统,倒是能像平常一样进来了。偶然发现system32目录下有好几个奇怪的文件名诸如oooooo.dll、ffffff.dll之类的文件,而且会自动注入到其他进程中去。windows目录下也有几个文件名很怪的.exe文件,还都放到了系统启动项中了! 似乎中毒了!真烦人啊,编译个wxWidgets也是没完没了了,以前可要快得多啊!唉,得下下决心,整台好点的台式机来,装Linux来,就用来平常看网页和写程序吧。
嗯,这个活动在上个月的时候就筹划过了,不过我并没怎么投入,呵呵,都是bobo在那里捣鼓说五一3天假期里可以抽一天出来,然而,bobo组织不力,3号那天上午我迷迷糊糊发了个短信给bobo,最后结果是cancel掉了。 这次好像是猫猫牵头联系了其他人的,在公司里是一点风声都没有,只是有一天晚上在QQ群里猫猫跟我提了一下,要到我家里来烫火锅,其他时候则是只字不提,联系都没有。 直到今天上午10点多了,我发了个短信喊猫猫起床,她才给我打电话,说11点在我们小区对面的超市门口见,叫了某某和某某。等我11点10分跑去,也才看到舒蕊一个人在那里等着,这个猫猫越来越不像话了,都没有时间观念啦。又过了一会儿,才见大部队浩浩荡荡从天桥那边走过来,猫猫、江江、bobo、大牛和他媳妇。一共7个人,到超市里买菜,这种感觉还不错。买了盒装的肥牛和羊肉,贡丸、虾丸,还有很多素菜。又买了些碗筷,本来家里是有一些的,不过这次人多了,不够用,所以要再添点。 买了回家,我就没怎么动手了,只是找出椅子等必需用品,收拾一下东西。这次买得多了一点,后来刘献文也来了,9个人把肉类都吃掉了,素菜却剩下不少。总的说来,我对火锅的味道要求很低,我几乎感觉不出什么好差来,呵呵,所以这次也吃得比较满足,关键是一群同事一起玩,有一份惬意。 可惜,相机没电了,不然也可以留下点什么留念,一大遗憾啊~
去东门逛了一下午,买了件比较板的衬衣,一条黑色的休闲裤,薄薄的,适合夏天穿,为了搭配这身衣裤,还特地买了条皮带,这样800大洋就花出去了。然后是一双休闲类的皮鞋,又是400多大洋。好久没有这样添置自己的行头了,也许真应该好好地改变一下自己的外观形象,明天穿着人模人样地去公司晃悠一下。 不过逛得好累哦!
同学去巴基斯坦前留给我一瓶李施德林漱口水,放了好些天一直没开封,这种东西还没用过,感觉有点新鲜。今天好奇心起,拆开来倒了一点,说明上说20ml即可,我没有这样量化的概念,就倒在它的瓶盖上,然后含嘴里,照说明上说的30s后吐出,可我好像不到30s就辣得不行了,忙不迭跑到卫生间吐出来,连忙倒了几杯自来水漱了几次才缓过来。晕倒,学不像啊!
又是一个节日,又是一个人过,又是一次难过。什么时候才是个尽头啊!今天,我突然顿悟到一种奇怪的念头。付出是不一定会有回报的,而且是有很大几率没有回报的。而有时候,什么都不做,却什么事情都往头上摊。无可奈何啊,茫然而麻木地做着这些事,只是为了企望以后能少点遗憾和后悔。
定价¥680,用卡打88折后¥598.40元。今天可谓是速战速决,吃完中饭回来休息了一下,立马决定去买东西,刚出小区大门口,就看到辆满载着人的335缓缓驶来,挤上去,男的在这方面就是有优势,不怕被人趁机骚扰的同时,内心邪恶点的可以趁机骚扰一下车上的ppmm,不过我的胆子还不够大,革命尚未成功,同志仍需努力!好不容易晃悠到华强北,直奔茂业大楼,到阿迪专柜看了看,马上看到一款保暖鞋,第一印象这就是我想要的款式,底是胶底的,面是牛皮的,颜色是黑的,价格对我来说是高的,但我还是二话不说,只试一下大小就开单了。
在看《奋斗》时,很讨厌夏琳那个角色,只觉得她把陆涛弄得这么痛苦,为什么陆涛还是不死心,对米莱和灵珊两个富家女视而不见。其实在看片的时候,我就很强烈地意识到,某种角度讲,我不就跟陆涛很相似吗。可是最后陆涛还是跟夏琳在一起了,在他再次一无所有的时候夏琳又回来了,这似乎从深层意义上看,也许是陆涛内心深处的仇富心理,以及夏琳的心高气傲所带来的局限性。从现实角度看,我注定不会有陆涛那样的命运了,我的各方面条件都不行,陆涛在剧中是作为一帅哥角色的,而要以我的样子来出卖色相,实在太困难了,陆涛自身是个很有能力的人,温柔而且聪明,这些方面我也是望尘莫及,最后,他有个很富有的亲生父亲,这个出身是不能选择的。 所以我只能好好地走自己的路,工作,想办法多赚点钱,最好能找一个自己喜欢的女孩当女朋友,然后尽自己努力让家人过得好一点。 事到如今,我真的应该放开点,以前的事慢慢淡忘。我只是一个非常非常普通的人,做什么都不会太出色,只能走着平凡人该走的道路。有的事情不能强求,我应该另找出路,也许真的是错过的,但也已经过去了,再懊悔也无济于事,总是回头看,独自一人在黑的夜里舔舐着鲜血淋漓的伤口,除了自己没人再会看到这惨痛的一切,与其如此,不如向前看,或许更美好的在前面等待着。
昨天测试部年终聚餐,疯丫头又当主持,又跳印度舞,跳得挺好看的,只是我的相机啊,郁闷死我了,想要连拍,结果拍下一些很模糊的下来。还有另外一个mm跳劲舞,也还好看,遗憾的是拍下的是更模糊的。说是聚餐,但好像菜上得并不多,味道不差,不过我全找人喝酒去了,一个测数据的小mm经过我们桌,硬是被我拉住喝酒,哈哈。找各种理由和人喝了一些,结果喝了个烂醉,去洗手间抠了一下,吐空了,摇摇晃晃地坐班车回来,那室友还说要在路上看住我,自己在车上就吐得起劲。回到家胃难受死了,躺在床上实在不舒服,就翻出手机,又想不出打给谁好。打了一会儿电话,还是难受,冲到卫生间里,趴在马桶上想吐,但要真的没什么东西可以吐了,抠也抠不出东西来,这么不爽还是第一次。后来不知不觉,总算睡着了,一直到凌晨4点多才睡来一下,接着就睡到上午10点多,安逸啊! 我用了双缓冲,居然不起作用,估计是没用对,气愤加郁闷。还得改呀,不过有参与的例子代码,应该没啥问题吧。现在对于这个简单的编辑器,还有4个大问题:1、需要能拖动线条的一端;2、移动节点时,线条要能跟着动;3、线条要有箭头;4、线条与节点的交点处要截断。
又到了年终总结的时候了。感觉这一年过得飞快啊,刚刚翻了一下上个元旦放假时的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怎么都弄不好啊,晕,连界面都费好多时候来整!
昨天晚上,跟小思宇在电话里,又跟孙同学在QQ语音上聊了很久,最后她们竟不约而同地叫我好好工作,多赚点钱,之后就好了。都说现在的人现实得很,我也没有其他办法了。 早上醒来,突然想到一个两年计划,就是之后两年里,要实现的几个大目标,当然这些要在这里实现,才更有意义。首先,过完农历年回来,开始去学车,一边学车,一边攒钱,等车学完,买个十来万的车来用用。然后,再攒钱,看在两年之期内能攒下多少钱,对于买房这个目标,能有多少完成度。两年,就到2009年12月31日为止。反正我还小,到那时也才26,接近27而已。我还有时间。
实在觉得奇怪,为什么,我到底哪里错了?很是怀疑背后有一只手在操控这一切,可是这只手在哪里,谁的手,为什么什么要这样?
我都厌倦那一直失败的感觉了,说磨难也算是经历够了吧。明天,希望一切都顺利啊!给我一个寄托,给我一个精神依靠和支撑!
今天项目组组织活动爬笔架山,然后去华强北毛家饭店吃中饭,吃完中饭就地解散,我去地铁站办了张深圳通,顺便去问了一下内存条。一问现在930可以买一根1G的原装,750就有TPOP的,立马就心动了,跑回家,背了电脑出去加了一根TPOP的。现在就有1.5G内存了,心里感觉就是爽啊,哈哈!
最近感觉是又累又困,每天早上起床都很是困难啊!今天在公司里几乎没做什么事,这几天心里焦虑感很重,唉,不知不觉的压力就这样袭上来。 好像脾气也变得比较急躁了,或者说神经也更脆弱了,很是在意别人的话,也许根本不是针对我的。 昨天弄到快凌晨2点才睡觉,asio还是有点难用,主要是参考资料太少,自带的文档看得不明不白,例子程序也是不明不白。 我有病,真的。
今天小妞把项链给了我。这是我前些天托小妞去香港的时候带的,周大福的,在我的要求下,据小妞说这链子是加长18寸的,应该能够我妈带了,呵呵。原价是一千一,可以打九折,就是九百九了。其实最开始的时候,我还以为只要三四五百就够了,后来跟小妞说的时候就随口提高了上限,说一千以下就可以了。看光泽还是不错的,嘿嘿。 小丫头给我传了些她的照片,脸好圆呀,呵呵,越看越觉得可爱。
周四的时候我开始计划张罗组织原来的3500测试组还留在深圳的人一起出来玩一下。至于我为什么要来组织,这目的我自己都觉得有点不可思议,也许说出来也没什么人会相信,但确实除了这个理由,我找不出其它的借口。仅仅是因为有一天中午睡午觉前江江随口说了一句哪天一起去爬山吧。本来说好大概有十来个人,一起去爬莲花山,放风筝打牌,晚上去泡吧。晚上的时候,宣宣发短信说可以周六去她家玩,提供晚饭和水果。 结果周五的时候,疯丫头发了个茂业打折活动的邮件,有几个人就闹着要去逛街,我再次发邮件问还有没有人活动时,就没人回了。晕倒,而江江和bobo那天刚好请假了不来,我只好遗憾地宣布活动cancel。中午吃饭时,疯丫头就在那里撒娇说要去宣宣家。我则已经兴味索然了。快睡午觉时,宣宣和疯丫头就来鼓动人一起去玩,结果还真说动了剩下的一些人。唉,美女跟男人的号召力就是不同啊,悲哀一下。 昨天早上8点便起了床,8点半出门坐车去梅林找疯丫头,果然说好是8:45的,一直等到9:20多才出来,我就有点生气,一边走一边也不说话,疯丫头说,你要是再不理我,我就回去了。我就开玩笑说,拜拜。她还真的调头就回去了,呵呵。这丫头,我只好折回去把她拉过来。跟宣宣约好要10点去买菜的,只好又打的,花了55块钱。花了点时间找到宣宣,4个人一起去买菜。买了好多东西,购菜车都装满了,我还两只手全提满了,买菜就花了250左右。 意外的是,本来说好买菜的4个人中午只是随便吃点泡面之类的东西就算了,下午1点半后去爬山。而那些家伙居然都不吃中午直接跑过来了,于是就开始做中饭。而小思宇给我打电话,说要一起爬山。时间刚好差不多,快3点的时候小思宇才跋山涉水地赶到,而那边则刚刚做完中饭开吃。吃完饭,那群人就一个两个地想罢工躲在家里,没几个人想爬山。小思宇说她是专门赶过去爬山的,于是我就义无反顾地背上包要出门。后来也不知道怎么一说,那群人最后全都出来了。一共11个人,分3辆车打到海关登山口,都是4点多了。下山后都是6点半了,天都很黑了。小思宇还想过去逛街抢购,最后看着天太黑了,放弃了。回到宣宣家,大牛又当了一回大厨,做了整整一桌的菜。比中午的在丰盛多了,两条清蒸的鱼,多合我口味的,哈哈。
今天偶然说起我大学时写的几个小程序,什么窗口类观察器,进程管理等等,然后一个同事就在那里说牛x啊什么的,说得我都不好意思了。不过说实话,我倒真的不觉得周围哪个人牛的,呵呵,当然我自以为也不牛,不是谦虚,是实话。见不到牛人,也就自己也难以提高,真是一大遗憾啊!
最多只能集中精力半个小时,就坐不住了,就觉得头昏了。 良好的可扩展性,以及交由用户放任的自由,在有些类型的软件上,是一种很有吸引力的策略。这类软件一般说来面向的是比较熟练的电脑用户,比如你怎么也不能假设隔壁的阿姨会用Total Commander来管理自己的文件。 今天突发奇想又玩了一会儿doxygen,不知道哪里出错了,我试图document我的代码,但总是不照我想要的效果出来。不过我想还是要用用,这东东特别适合给代码作文档了。
星期五晚上在网上看小说,一直看到凌晨5点多,第二天星期六是要部门活动的,于是7点多就起来了,只睡了2个小时,当时刚睡下的时候还担心会睡得太死睡过头,结果还好,手机设的闹钟还是把我叫醒了。星期六跑去东部华侨城去了,其实没什么好玩的,只不过看看自然风景,看看表演,以及一些人造景观。中饭还是在KFC里站着解决的,我一想,反正是集体的钱,就多吃点,吃了一个汉堡和一个鸡肉卷,这是比较多的了,因为一直到吃晚饭的时间都没觉得饿。晚上是开回到万科城吃湘江老厨的,13个人加2个婴儿,在包间里居然只吃了383块钱,想那次我们8个人就吃了630多,晕! 这次用T200和N73拍了300多张照片,当然两个都到没电为止。也让我知道了大概的极限,T200如果在条件允许时,不开闪光灯,应该可以拍250张没问题,如果默认的自动闪光,估计200张还是可以的,如果是全闪光的话,可能不到150张了。N73不开闪光灯大概可以拍90张,开闪光灯就不好说了。另外就是T200的效果还是不错的,只是变焦的话,都有点白茫茫雾蒙蒙的样子。N73拍近景也还可以,但稍微远点的就模糊了。 突然想试一下ACE这个东东,嗯!
被小思宇知道我借给小妞相机,却不借给她,然后就演变成“思思很生气,后果很严重”,于是我只好打电话很谄媚的样子求饶,最后就很自然地被敲诈了一顿湘江老厨,两个人吃了点了一个干锅田鸡,一个串烧虾,一个老南瓜,一份莲藕百合龙骨汤,吃撑死掉。 得知阿菲家里被盗了,连忙打电话去了解一下情况顺便安慰几句,阿菲情绪很低落的样子,那是肯定的,谁遇上这种事心里都会郁闷,而且很长一段时间内都会有严重的心理阴影,照她的话说,现在回家走楼梯里总觉得背后有双眼睛在看着她,好恐怖好吓人,跟电视上一样。 七天长假能安然度过,还有一件事情,那就是我在网上发现一个论坛,该论坛是个还在上大学的小女孩办的,里面都是些基础的算法题。虽说基础,但我能独立做出来的却没几个,真是惭愧,不过好在现在做软件开发的对算法的要求降低了,说夸张点,会四则混合运算和初中英语的人就可以写代码了。那论坛里有些题看似简单,其实会用一些很变态,或者是平常很难想得到的数据去测试,所以往往都不知道错在哪儿,这小女孩很有做一个优秀测试人员的天份啊,哈哈。不过话说回来,我对算法真的很无知啊,这是很大一个弱点,很可能会影响以后的发展。 听说重庆又发现车祸了,一辆从万盛到重庆的公车在路上爆炸了,给float打了个电话问了下,那天她差点就可能上了那辆车,真险啊! 人的生命就是这样脆弱,该享受的时候就该好好享受啊!但是还是得好好想想办法,怎么多赚点钱呢!
和上半年的五一一样,无聊地呆在屋里,就这样七天也过去了,每天睡到不想睡的时候起来,然后开电脑,上网,无所事事,可能会看点碟,到时间了就打电话叫外卖,吃外卖的时候会打开客厅里的电视机,就趁这几分钟看一会儿电视。也许还会实在不想呆在家里了,就出去逛一下街,其实我个人并不是特别喜欢逛街的类型,只是工作后,跟着她们几个逛了大半年,就渐渐有点习惯逛街这项活动。以前我最喜欢的是逛书店,可是后来我意识到我买书纯粹是一种浪费,我总是会在买到书之前觉得我会买来书以后好好读的,但总是在买到书之后就潜意识里认为我已经拥有了该书中所讲述的所有知识,所以就会一次又一次地把买来的书立马束之高阁。不过这次我还是去买了几本书,我自己后来也对自己的一时冲动感到可笑。今天又心血来潮跑到深南路上的深圳购书中心去逛了逛,这个中心规模比图书馆边上的书城好像要大点,书也要多点。看着几本有点意思的书,就用手机拍下封面来,看看网上买不买得到打折的。最后,买了个MAME 0.105的ROM全集,实在懒得自己去网上收集了,呵呵。而其实,我买这种东东回来,也是直接丢进抽屉,不知道什么时候再次心血来潮才会翻出来呢。 明天又要去上班了,说起来现在觉得公司也是个挺可怕的地方,不但可怕而且可恶啊!我一定要放松,再放松,不要给自己太大压力。慢慢来,我不要给自己压力,把所有压力都转嫁给他们吧,哼哼! 今天我在想,要是能衣食无忧,又不会太忙,这样的生活会不会很好啊,哈哈,然后被人说我好可爱的想法。试试喽,没试过咋知道!
今天,少了那些家伙,中午在食堂老地方吃饭,明显感觉人就少了很多,冷清了很多,心中很是感慨啊,比毕业离校那段时间的不舍有过之而无不及啊。 中午吃过饭,走到睡午觉的地方,人也很少很少了,江江也是一脸孤寂的样子。算算他们应该下飞机了,于是先给教授打了个电话,然后给猫猫打了个电话。猫猫说,现在知道为什么粉红色的要是限量版了,因为好看啊。让我心里不免有点得意。 下午好不容易熬过去了,晚饭在食堂真的没人了,于是打了两个玉米饼匆匆回来了。 一个室友搬走了,新的还没搬进来,另一个室友回老家了。这里好冷清。给小丫头又打了大半个小时电话,总是觉得小丫头很可爱啊! 无聊的国庆假期开始了,能干些什么呢!
日子真的过得挺快的,真的到了SDH部分搬迁成都的时候了。明天,他们就直飞成都了,就见不到那几个总是一起在食堂一楼吃饭的家伙了,竟有点不舍,也许是因为心中有更多的惆怅。一起玩得最好的,教授、悍超、猫猫、晓妮都要走了。 这周好多晚上的吃饭活动,让人感觉像是回到了大学毕业前的时光。昨天晚上,另外叫了大牛和疯丫头一起,去湘江老厨吃了一顿。我的酒量是越来越差了,可能也是跟心情有关系,记得以前在学校喝个五六瓶也大不了像现在这样。饭后,我坚持要送疯丫头回家。334颠簸得厉害,很想吐,问售票员要了两个塑料袋,难过了大半程,把坐在一旁的疯丫头吓坏了。334绕很远的路,真是难受啊,疯丫头好几次要我早点下车,她可以自己回去。入了关后,总算吐出来了,胃空了,人也舒服了。在酒精的刺激下,我的胆子也更大了。只是最后把疯丫头弄哭了,在梅林阁下了车,她朝一个方向走,我朝另一个方向走。打了个车,很郁闷,打电话给小丫头,找个人倾诉一下。一直打到家里,挂了。又打给小妞,小妞也很温柔地像安慰小孩子一下安慰了我好一阵,一直到我手机没电为止。还是觉得很不痛快,于是给教授打,打了一个小时,倾诉过后,心里就稍微好过一点了。 唉,今天还被老大训了,当然老大说的是有道理的。旁边两个同事见我郁闷,也偷偷安慰了我两句。 晚上跟小妞去吃了顿小肥羊,便宜量又足,还送可乐。吃完后,两人慢慢走到万科城,再慢慢走回百草园,到小妞屋里看照片。小妞过得很幸福啊,她说明年就要结婚了。跟小妞她们在一起,能让一个男的懂得如何变得体贴温柔。可是,光有体贴温柔,有什么用呢? 看看周围的人,有过得好的,当然也有过得郁闷的。套用某人的话,希望喜欢我的人和我喜欢的人都幸福!各位奔赴成都的同学,我们有缘再见!
又是一年中秋节。公司里的活动还是跟往年一样,两年了,发一两个月饼,然后开个茶话会,一群人聚在一起聊聊天,吃吃东西,而杀人游戏好像是在公司里的人唯一热衷而且老少咸宜的活动。这次的杀人游戏规则我不习惯,而且时间也不多,才玩了3轮。茶话会后,告诉我有两个东西要我接手,都是人家弄好了的,那同事要离职了。有点无聊的东东。 下班后,跟以前测试组的同事们跑去肥牛府吃了一顿。因为人太多了,服务员们都忙不过来,所以无论叫什么,都响应很不及时,有点气人哦!不过吃得还是挺开心的,今天教授还一反往常的矜持形态,一个一个敬过来,大概他真的有点不舍这边的这些同事吧。吃完后,只有江江一人是住百草园的,其他人都在对面的公车站坐车走。我反正已经习惯了跟小妞,小思宇她们一起吃饭后送她们回百草园的行为,于是自告奋勇地陪江江走回到她楼下。 回到家依然是懒洋洋的,给小丫头打了个电话祝福一下。小丫头说正一边洗头一边接电话呢,我说你当时就可以不接的呀。小丫头真的很温柔啊,太可爱了。 正无所事事的时候,小思宇突然打电话来,说都已经睡了,但有些问题想不通啊。然后我就只好假装很在行很专业的样子安慰她,开导她。其实我什么经验都没有,哪有资格说那样深明大义的话哦,呵呵!
不经意间来到Tencent的网站看了看,发现现在它真的是战线全面铺开了,中国互联网霸主地位非它莫属了! 即时通信工具和游戏不说。看看其它的现在中国网民最常可能用到的工具,邮件客户端、汉字输入法、下载、视频直播、桌面Widget、浏览器、IE工具栏,它全都有。 感觉它是越来越像微软了,靠其中的一两样东西发家,然后看人家做什么火,它就也跟着做什么,虽然是后发制人,但即很可能把人家拖挎。
今天下班后,坐同事的顺路车回家,结果大概是因为周末的缘故,在高速公路上就开始堵车,真是太神奇了,于是有了时间聊天和上网。在网上看到新闻,说中国目前已经有很大一批富有的阶层了,现在亿万富翁有1万多人,千万富翁有30多万人,而百万富翁则占了总人口数的1.5%。这样的数字还是很让我吃惊的,原来中国富人这么多啊,尤其是百万富翁,这么多! 8点半才到小区门口,然后我去对面一个快餐店吃饭,偶然间听到里面的服务生在谈论他们的工资,一个女孩在说她有1200一个月,每月吃什么的花100多,还要买衣服什么的大概300多,差不多每月可以存下800块。听到这些,我心里有些感触,为什么人和人的差别可以这么大。
今天先是小妞突然发邮件来问我定了几级,我说还没定呢,过了一会儿,疯丫头发邮件来问我定级了么,我说没定呢,后来是JR来问我定了什么级,然后我就火了,今天已经是3个人来问我了,到底咋了,难道我绩效差就没级了!JR说人家都定了啊,我说我绩效差啊,JR说绩效差还能进系统组啊,我说偷偷告诉你,别人我都不说的,到系统组的都是在测试组混不下去的,如果在系统组干得好的,就能转测试组。 下午5点多快6点时,领导打电话来叫我去,我预料到应该是这事儿了。跟什么年终奖沟通之类的是类似的过程,就是先说一通公司的形势政策,再说一通个人的表现好坏,然后说一下结果,最后问有没有什么意见建议或者疑问,如果没有就签个字走人。虽说钱是加了一点,但我一点高兴的劲儿都没有,就像以前一个同事跟我说过的,感觉就是应该的,而且像我这样的应该是最少的了。再说了,我都打算要走了,加不加,能加多少,似乎不是很关心了,而现在唯一关心的是,下一份工作,能给多少薪水。 沟通完后,给小妞小思宇发邮件约吃饭。去关东风吃了一顿,三个人越来越吃得少了。谈起这个事来,最后一比,我还是最少的,呵呵,真是没用啊。 一心想着一件事,很沉重。
喉咙好痛,尤其是早上刚醒来的时候,咽一下口水都痛得受不了,郁闷!~
其实是因为人太懒,要做的事情很多,我却宁可无聊地消磨时间! 明天打算去看一下相机,要是价钱合适就买个。
仍然没什么食欲,中午故意拿了一碗少点的米饭,吃是吃完了,不过真的是硬塞下去的,没啥胃口啊,倒是快下班的时候确实感觉到饿了,可是到了食堂打了一盘面后,还是不怎么想吃。 今天又解决了一些比较紧急的问题,明天下午就是1.1.0版本的发布会了,搞得还很隆重的样子呢,呵呵。这个版本里我悄悄藏入了一句话,一句我最近很想说,却又不好意思直接说出来的话。说明显也很明显的一个地方,不过大部分人应该都不会关注那里的吧,就算发现了,也应该是无意间在看其它东西时偶然发现的吧,呵呵。 项目组要组织出去游玩了,去阳朔。去年五一的时候跟小妞和小玉玉一起去过,倒也还算开心。还是那句老话,关键不是去哪里玩,而在于跟什么人一起去玩啊!
难道真的是因为工作太累了!怎么办呢,最近心情一直很压抑啊,呜呜!
前两天回到家,都不开电脑,只顾着看玄幻小说去了,还真着迷,有一天看到后半夜3点多,第二天虚了一天,直到今天还是精神萎靡。不过有比较舒服的一点是,那东东快要完了,虽然下面等着我的是似乎更让人头痛,不过一个人开始一个新的项目,还是比较感兴趣的。只是目前手头上那点任务,还是有点难过,bug太多了,真是有点于心不忍啊。 今天负责人整理了一下遗留问题和新需求,我看了一下,又加了几个新需求,真是永无止境啊!不过那些新需求不会是由我来做了,我其实还是有点兴趣的,不过还是得放手了啊!下周把手头最紧迫的问题解决掉,看看如果还有时间多,就做点新需求相关的工作吧!下周一过,就是9月了,新的挑战啊! 这周其它过得很压抑,不是因为工作上的事。突然很想找个人,然后安定下来,然后一起努力,平平稳稳地过完这一生。
今天不知道为什么,心情比较糟糕。一整天都无精打彩的,真是郁闷啊。而且好像昨天去吃火锅有点吃伤了,今天舌头有点木,吃什么都没什么味道。 然后到下午5点多的时候,实在不怎么想干活了。 看到小丫头漂流去的时候拍的一张泳装照,脸还是那么圆哦!小丫头的腿真的很漂亮啊!
真是郁闷啊,睡不好觉!早上好不容易挨到9点多,实在睡不着了。于是起来玩了一会儿电脑,然后在那里看小说,看得眼花缭乱。一直到下午,收拾了一下去华强北逛,问了一下原装的内存条1G的卖2200啊,真贵了,比起半年前要便宜一些了,但还是很贵了,只好继续忍下去了,因为收入有限啊!去石头记看了看,好多人,只好退出来了。 没逛多久xcc打电话来,叫我可以过去了。于是去找车,等了好久哦,差不多20分钟吧,还等错地方了,这地儿是不停的,晕。好不容易上了车,好多人,还是个没空调的,好热,幸亏我站到天窗对下的地方,开的时候有风灌进来。后来有位儿了,因为好像还有比较长的时间,于是打了个盹儿。到了老石火锅,doggy已经在了,xcc在门口接我。1年多没见doggy了,真是怀念啊!过了一会儿,afei也来了,终于也见到了她们家的帽子,开始看着觉得有点面熟,还以为是这长相比较大众化吧,后来xcc提起来,原来是去年去看afei唱歌时,跟她一起合唱的,怪不得眼熟哦!心里还是觉得挺开心的,不知道这样的机会还有多少! 吃完回来,随便找个了车,结果,又因为睡着而坐过了站,然后多花了19块钱打的回家,晕!
好久没去华强北啦,记得上次去,好像是那次看完《变形金刚》然后去K歌,再去吃华神,都是上个月的事了。今天下班就跟大牛高导一起跑去了,先是逛了哈街,再去吃滋味堂,好多菜都没有,难道是因为去晚了,晕! 高导明天就回北京啦,不知道什么时候还能再见哦!
几个月前1.34发布前,就已经开始说要迁移,先是把sandbox迁过去了,但主库一直还在sf.net上去。现在1.34.1发布了,终于有公告发出来说要迁到印第安那大学的OSL服务器上去。总的说来,SVN相比CVS从很多方面都有改进,虽然CVS仍是相当流行。居然老大说CVS不安全,比较无语的说。 在网上看到别人的blog,想想自己真是叶公好龙啊。现在公司里的任务老大似乎是很想玩B/S的东西,想完成目前这个项目后全都迁移到ASP.NET上去,要学C#了,我真的不是很感兴趣,昨天的考评沟通又把我小小地打击了一把,唉。想想自己也真是没用,要是有正式工作之外的比较稳定经济收入来源,怕他个鸟啊,直接fire老板。可惜啊,一直有贼心没贼胆啊。雨烟也辞职了,下一个会是谁呢?
今天跟彭彭、小思宇、小妞一起吃饭去了。我发现我现在渐渐地放不开了,不如单独跟小妞一起吃饭时那么放得开了。 一无所有的人将永远一无所有,这是我今天吃饭得到的教训。所以我不能一无所有,我要努力。
今天拿到体检报告,说我超重了,要多做锻炼,多吃蔬菜水果,少吃肉类。其实体检出来的体重数值已经比我预期的轻了,人越来越懒了是没错。人是怎样变懒的呢? 现在每天回到家,都有点感觉累,不想动,于是就这样一天一天颓废堕落了。
今天在网上闲逛看别人的blog,在csdn上看到一个blog,博主写了篇《过去这两年》的文字,博主82年人,应该是和我同届的,文中他画了张图,总结了自己的工作学习的情况。 再回头看看我的情况。我2005年7月1日直接从重庆学校飞到这边,算是7月4日入职的,到现在也十足两年了。两年中,做SDH设备的软件测试不计节假日共约21个月(2005年7月中~2007年3月底)。当时得知自己去做测试,心中也不免诸多怨忿和失望,完全全新的领域,加上并不感兴趣,而且劳动态度不端正,以及自身先天(?)的素质影响下,成绩如何可想而知。不过到后来便有点麻木了,觉得干什么都一样,而且男人选择自己感兴趣的行业作为职业似乎是种很不成熟的表现,呵呵。 两年来,几乎什么都没学到,什么荣誉都没得到,什么好处都没捞到。真是失败啊,对比那位博主,只能感叹人与人之间的差异很多时候是没法填补的。 只能说,在以后的日子里,在自己力所能及的范围内,尽量努力,不为什么,只为能赚更多的钱,这是最直接最首要的目的。
两天没写blog了,这两天主要是想加个在线造词功能进去,可是没成功,让人比较泄气。所以说,五笔加加真的是设计得很好的一款软件,各方面都比较完善,各种细节点闪现着作者的缕缕灵气。 公司里的事就太多了,这两天打过来一堆的问题,估计总共有50多个吧,解决了一些,到现在还剩下近40个,而且很多很多是暂时解决不了了,架构方面就有问题。有些则是技术方面的问题暂时得不到解决,唉! 得快点把输入法搞定,其实也就剩下两个问题了,造词和状态栏窗口刷新。之后就赶紧做辅助工具,Boost又丢下好久了,要趁写其它程序里好好跟进学习啊!
在回家的路上又被堵了很久,让我再一次觉得很气愤,深圳的开车的人是全国素质最差的,明明已经堵车了,明明走不 通了,明明再挤进去会变得更糟,可是他们还是会乱闯乱挤,除了道德上的因素,我都要怀疑他们智力上是否也有问题。 人又懒下来了,回到家,只是看了看如何加入造词功能,其实这些代码原来的人已经都写好了的,我拿到后觉得没什么用,删掉的,注释掉的,确实精简掉了很多至少我自己用不上的功能。现在只是到了放开的时候,在输入上屏后,要记录下来历史记录。以后按到快捷键,就进入半自动造词模式,就可以从历史记录中取出内容来。顺便还把添加历史记录的部分代码优化了一下,应该能增加些速度吧。 公司里还是像往常一样,搜简历,然后看代码,增加新代码,修改老代码。暂时接手维护了另外两个模块,还好功能都是基本上已经完成了,只要再加一点点就行了。突然老大说,上面的头儿说要做成C/S模式的,主要是为了信息安全,真晕!本来还暗暗高兴了一下,可以趁此机会好好学习一下网络编程了,结果他们好像决定用DCOM、WebService这样的东东来实现,唉,不感冒啊!~
把输入法改成可以支持多用户配置了,把一部分的配置信息移到配置文件中来了,但有点没弄好的是,安装的时候需要问当前默认的输入模式是拼音还是五笔,本来是写入到注册表中去的,所以比较简单,不知道写ini文件用InnoSetup是不是也支持得比较好呢! 状态栏也可以支持换肤了,呵呵,有一点不同的是,状态栏是有默认自带的皮肤的,但我自己实在做不出什么好看的来啊。 用Intel编译器编译出来的Release版本,居然超过10个字符不会崩溃,晕。总是不放心啊,感觉像是哪里我的代码是写得有问题的。
早上搜完这周的任务分配的简历,开始了无所事事的一天。其实还是有事情的,比如那个sharepoint的,但我懒得动了,反正我只是个执行者,前期的所有事务最后的敲定还是得看老大们,我不想再很认真很投入很负责地去费这个神了。他们说怎么样就怎么样吧,我无所谓了,反正就是按部就班地实现呗。 看完了《Rootkits》一书,感觉收获不大,因为没有这方面的底子,书中讲得又泛泛。想学点编译原理吧,很头痛,静不下心来啊。于是东翻翻西看看,这样昏昏沉沉过完了一天。 输入法引起屏幕闪烁的问题昨天果然改好了,只要把有些不必要的通知中的刷新界面的代码去掉就行了。目前最大的问题是,release模式下,五笔在输入分号转英文或首字母大写转英文时,如果长度达到10个字符以上时,下一次再敲任务一个键,都会引起主程序崩溃,但是debug模式下的却没有这样的问题,所以都不好调试了,郁闷!
鉴于昨天我的8310已经为国捐躯,隐隐地感到有点高兴,终于可以换新手机了,哈哈。今天跑去华强北,在乱哄哄的电子市场,随便找了一家,看着价格在我的心理底线以内,又看着这个售货员长得比较漂漂的说,后来一聊,居然也算是老乡,呼呼。买了个N73回来,然后打电话给小丫头,炫耀了一番,呵呵。
自己可以弄到试用版的C++Builder2007来,花了好多时间,重装卸载了好几次,终于还是放弃了,怎么样都不行,总是在启动的时候报个错就退出了。真是失望啊!这样一来,也促成了我不写代码的借口,呼呼。 上午去百草园的社康中心看了看,好多人在体检,看个病还得预约啊!不过,医生说我只是咽液性囊肿,不要紧,总算放心了。 又改了两个输入法的bug,现在在msn messager里也能正常显示内容了,真是奇怪,有的程序就是不发消息过来,晕!想想五笔加加真是牛啊,这么多年前的东西,做出这么稳定、兼容性这么好来,不得不佩服啊! 总是嫌钱少,可是又没什么行动。我得打三份工才行啊!
话说当时,自以为5月底能全部做完的事情,其实直到今天都没有完全完成。不过总算总的框架搭出来了,绝大部分应该有的功能也都有了,剩下的就是修修补补了。但再想想,更多的时候,是很没自信,那些功能的代码也写完了好多天了,但一直都没信心,连运行一下都不敢,生怕有什么问题。这是一种病态的心理,而且这样对于事情的发展没有丝毫的好处,显而易见的是各种坏处,躲得过初一躲不过十五,总归要做的。昨天把一个重要部分重构了,真是爽快啊,以后有些东西的修改,只要改一下外部的配置文件就行了,不用改代码重新编译了。今天确认完成了另外一个重要部分的功能,也基本能用了,易用性方面还有待改善。 再来说说这个输入法。说到那个某些程序下候选窗口出不来的问题找到原因后,异常兴奋,至少这个输入法已经从不可用,变为偶尔可用一下的地步了。到今天,又找到了另外一个严重问题的原因。有时候词库会乱,是因为词频调整部分没仔细,很容易遇到写乱的情况。另一大进步是,总算搞清楚了几种词库格式,可以写个词库维护工具了,呵呵。
下午打开了久违的BDS2006来写了几行代码,觉得非常不习惯!可能我已经更习惯于用VC了,VC加上VAX,还有VC的宏定义功能,简直是无敌的。因为不习惯了,所以没写几行,就不想继续下去了(这个借口比较好,呵呵),于是又开始无所事事。 真郁闷,我已经用不回VCL了,因为从心里开始抵触了。以后只能用用WTL(或者MFC)了,不然直接用SDK画界面实在是浪费时间,不明智之举。Delphi 2007装好后,从来没用过。现在C++ Builder2007也已经有试用版可以下载了,不过我最多是装上看看,估计不会怎么去用了吧,因为现在在我看来,无论是Framework还是IDE,亦或是Compiler,都已经比不上VC系统了。 我真没用!
不知道是不是心理作用,总觉得这几天我的霉运来了。今天早上在楼上还看是没下雨的,艳阳天来着,走到楼下突然下起雨来,我也懒得再回楼上拿伞了,就直接走了。晚上下班的时候,吃饭前还是阴沉的天,吃完饭就是倾盆大雨了,还没带伞,刚好看到jr和他lp一人一把伞在那里晃悠,就向他借了把。坐车出了公司区域,猛然发现这边地都是干的,我想把车砸了! 坐在车上,想着其他的事情,联想起小丫头的生日也快到了,然后又联想起其他的事情。回到家,翻出久久未动过的输入法,一边看一边改,想用UNICODE来编译,一直是编译后不能正常运行。但是依稀记得曾经似乎好像是正常过的呀,现在这样纠缠也没用了,仔细看看代码,很多地方确实没有处理好编码问题,都是照着多字节字符集编码方式来写的代码,要改的地方还有点多,有些地方都不知道怎么改得好。现在至少得解决以下几个问题,才能算得上一个可以拿出来用:1、五笔状态能分号转英文,首字母大写转英文;2、拼音可以连打;3、状态窗应该能稳定地显示出来;4、候选窗在FF/Opera等环境下能显示出来;5、一个直观方便的途径可以进行设置。
当年在学校看《君が望む永远》,男主角好温柔,我也被整个故事好好感动了一把,当时我还想,我也要像这个男主角一样做一个很温柔的男人。 昨天在MSN跟阿菲聊天,阿菲说我性格好好,让我的虚荣心狠狠地满足了一把。 可是,就像动画片中那样,温柔只是我一厢情愿地以为好而已,就像剧中的台词所说的,有时候太过温柔也是一种残忍啊! I put it down on my lifeThat I love you from the bottom of my heartCause you the sweetest thing ever in my lifeI cry So many timesSo many...
爬的南山,很热啊!也有点累,然后下山,吃了个湘菜馆,回到家4点了。 唉,打了两个电话,讲到后来都不爽啊,唉,我怎么这么郁闷啊!
儿童节哟,我的童心似乎还残存着一点点,因为比起很多身边的人来,我还不时地看些动画片,呵呵。早上还有同事发了个什么测试题,就是一些我们这代人小时候接触到的流行的东西,还是比较让人怀念的。 今天总算是有突破性进展啊,虽然最后还是没有完成自己给自己定下的目标,但是至少思路是有了啊,而且经过简单的测试,VSS的接口封装也是可用的,哈哈,之后的大部分是简单的代码堆砌工作了。估计下周内,绝对是可以做完了,嗯! 下午下班了才看到小妞的邮件,于是给小妞打电话,然后一起去吃饭,走到百草园门口居然遇到小思宇和另一个男同事,后来俊英也来了,五个人吃了一顿,还是那位男同事买的单。然后去小妞屋里喝咖啡,小妞有人送了她一套煮咖啡的用具,然后小妞就弄得兴高采烈,呵呵,一直坐到10点半才回来。
从电骡上拖了个VS2005Pro下来,之前装的那个Team Suit居然没有MFC和ATL,我也不记得是不是我当时自己就没装上,感觉这种可能性不大,还是弄个Pro版来用用,公司里装的也是Pro版,虽然公司里现在是用2003来工作的。我心里想着是慢慢摆脱BCB,从VCL中解脱出来,转用MFC或WTL。其实说实话,我还是多佩服VCL的易用性的,只是它跟Boost的兼容性实在不如VC啊,为了一个类库而放弃使用了5年多的东西,还是有点点犹豫的,毕竟很多时候,遇到一个问题,用VCL的话,是很快就能想到怎么做,用WTL或MFC就不行了。 现在反而开始来学10年前流行的东西,真是讽刺啊!很茫然啊,小丫头说我连自己养都不够钱花,我也很心虚啊,一个人过惯了大手大脚不计后果花钱的生活,要是突然真的两个人了,还真的很难适应呢,说不定还会引出一大堆的问题来。说到底,就是得想办法多赚钱啊。
挺无聊的,在公司里,在家里,都无聊。这些天突然觉得很迷茫了。
今天收邮件,发现有封主题是“我是Afeilink的忠实用户”的,里面提到他最近在玩1.0beta版,问我里面一首背景音乐的事。真是让我意外啊,竟然还有重邮以外的人玩这个,呵呵。想当年,一方面为了逗阿菲,另一方面为了能让自己玩过瘾连连看,才整的这个小游戏,当初整出最早的版本后,就只在学校的E383上发了一下,在BBS上稍微宣传了一下,一段时间内还把BBS上自己的昵称改为“阿菲连连看xxxx...”,真是令人怀念的时光啊!当时BBS上Software版的人开了个群,xiaotnt在《电脑迷》工作,NAOH就把这个东西传给她,她就压到某一期的光盘里去了,还说有20块钱的稿费!有那么段时间,我还多想见见xiaotnt本人的,其实也是chuanking的原因吧,可惜的是,直到我毕业离校,也没有见到xiaotnt,而曾经一起在Software灌水的人,也没剩下几个还有联系的,当然那20块钱的稿费,也被xiaotnt拿去买零食吃掉了吧,呵呵。 有的事总要过去,有的人总要忘记……
这两天在公司里,真是忙得有点昏啊,连邮件都经常是过好久才看一下回一下。其实静下来想想,也不是很忙吧,只不过是我自己偷懒闲惯了,这样有点事情做就不爽了。今天下午的时候还在想,今晚要加班了,不加班完成不了了,结果到下班时间,又决定不加了,还是回家算了。分给我的任务其实真的很少,代码量和难度都应该算是最低的。就是以前没这样被逼着干过,所以突然有点适应不了,甚至差点儿睡觉的时候都在想那里应该怎么写,真是郁闷啊,被逼到这份儿上。不过现在已经完成得差不多了,核心功能基本实现了,明天去把那些扫尾工作处理了,18号应该能顺利交付吧!完成了这个,应该就要投入到那个单板软件开发,和SharePoint架设上去了。都是没经验的,正好学一下,这两样东西也是两个截然不同的方面的东西。现在做的是Windows桌面应用开发,用MFC,说起来MFC并不是以前想像中那么不好用,呵呵,也许是因为前段时间直接用API写Demo写得快吐血了吧,又画TreeView又画分隔条,还要实现TreeView之间的拖拽,唉,当时没问清楚,做了很多无用功啊,早知道就应该把精力重点放在核心接口设计上。之后的单板软件开发让我既兴奋又紧张,这样的嵌入式软件开发参与一下,才不枉来公司一次啊!SharePoint倒不是很期待,好像目前的需求要实现的话,基本只是填几个框,鼠标点几下就好了。 今天看了别人的blog,才明白过来,不要用代码量来衡量一个人的水平。代码量过少,固然很可能实践经验不够,但当达到一定量后,之后就是瓶颈期了,很可能3w代码量经验的人,水平跟30w代码量经验的人差不多呢!代码写得精炼、优美才是作为一个编码人员应该追求的。
看到云风blog上关于C和C++的争论,有点反感。本来对云风的印象也不深,只知道当时网上有个关于游戏编程的个人主页,上面有些有趣好玩的东西,一个学生写出一个游戏开发包,也有点让人佩服的。自从他出了本书,看过那本书后,印象就不怎么好,总觉得书上全是吹嘘自夸的,没有多少实际有用的东西。现在再看这blog上的一些他的做法、观点,实在有点恶心。 他居然说用C写的模块比用C++写的好维护!真不知道怎么妄自得出这样的结论来的,难道那些研究出OO,发明改善C++的先辈们真的全是做的无用功。只是写过个游戏开发包,做过一两个网游,就敢这样大放厥词,实在让人不爽啊!而且看过他在书上列出的那点代码,也实在没什么水平可言,总让我感觉是自己不行然后去批判别个不好用。再怎么样,说说我们公司那些产品,应该也是几百万行代码规模吧,也是嵌入式,又是对性能要求比较高的场合,现在不也是用C++了么,不也是用STL了么,还是本领域内市场占有率世界第二呢!有点想骂人,唉……
下班回家坐328,结果渐渐闻到一股什么东西烧焦的味道,结果车停下来了,坐后排的人往后面看了看,还说这车子烧着了,突然一车的人都开始往外跑,几个女的还被弄倒在地,还有丢掉鞋子的,呼呼。
正式版就要发布啦! 好困好累哦!都不想动了!开心就好!
雨绵绵,let's move! 在网上找到一个叫Firebug的Firefox扩展,Mozilla的插件扩展机制也真tmd牛x啊!
七天长假哦,哈哈,不过也没怎么觉得兴奋,只是想着可以懒洋洋发躺在床上发呆了就感觉安逸。再想想还有一天一千的两天旅行,呵呵,对我来说很奢侈啊! 最近写blog的频率似乎降下来了,因为回到家都不怎么想动了,就看几集动画片,被小丫头知道后还要被嘲笑就这么点追求。工作忙也可以算是这么一个借口啊,怪不得我发邮件问一个人为什么不继续更新他的blog时,他会说最近很忙这样的理由出来啊。现在自己也算是稍微体会了一把。 好穷啊好穷啊好穷啊,只能怪自己太颓废堕落了,呜呜。
鄢哥这是第三次来我们公司培训了,每年一次啊!记得上次是差不多一年前来的吧,那时候小思宇刚刚搬出去了,鄢哥过来了,公鸡也跟着过来耍一下,我当时还有点懒得走,结果被小妞小玉玉鄙视了。于是约好在万科城的肥牛府吃一顿,一张长条桌,三男三女坐在那里。今年就只有鄢哥一个人了,小思宇她们也都各自有着各自的事情。真是去年今日此门中,人面桃花相映红啊! 鄢哥其实来了已经一星期了,我早就通知了阿菲,喊她抽空出来吃饭。昨天早上照例8点半醒来,给阿菲发了个短信,这短信还被她后来抱怨了一通,说我太早了。约好傍晚五点半去华强北茂业见面,然后吃饭。我早已睡不下去了,就起来玩电脑,但又没什么特别的兴致。打开Foxmail,翻看起以前从学校BBS上收下来的邮件,里面记录了我在大学四年里的BBS经历。真是令人怀念啊,想当年也算是小有名气的吧。想想当时在学校,是多么的呼风唤雨、叱咤风云啊,看着别人都是菜鸟,可是从学校出来两年,自己成为菜鸟,白白浪费了两年时间不说,之后的路怎么走,可谓是越来越迷茫了!邮件中还保存了很大一部分的聊天记录,依稀可以看到我的感情经历,从afei到ilikeyou,再到最后的lookfor,前两次的小心翼翼,胆怯不前到最后一次的无赖泼皮,死缠烂打。现在看来,我都隐约觉得奇怪我当时居然能说出这么肉麻的话来。也算是我的青春无悔的见证了,哈哈。对于那个家伙,或许我的内心深处真的是怀有感激之情吧,因为她,才使得我后来变得不像以前那样自卑,所以后来虽然几次三番觉得很受伤,但我还是愿意真心诚意地好好待她,而无论结果如何。如果我不说,或许她是永远都不会明白为什么了! 看邮件看得百感交集,下午看到男妹妹在QQ上,于是顺便叫了一下她。虽然大家都在深圳两年了,但居然从毕业后都一直没见过她人!几个人从不同的起点,到相同的目的地,果然五点半的时候,找到了阿菲和鄢哥,看样子男妹妹得过一会才能到了,就下去麦当劳一人点了杯喝的聊天。一直等到男妹妹过来,居然华强北的路都认不到,呼呼。四个人去吃了顿民间瓦罐煨汤,然后送男妹妹上车。鄢哥跑来我屋里睡,跟同住的同学一起聊天到快3点。睡觉,一直到12点,出去吃了顿中饭,鄢哥就回旅馆去了。
呆在家里实在有点不甘心,总是想出去,不留在屋里就好。于是跑到华强北去买衣服,夏天快来了,需要准备一下了,从上衣到裤子,还了鞋子,都要买。2点到的华强北,因为没吃早饭和中饭,所以就先去麦当劳吃了4个鸡翅和1包薯条,喝了杯可乐。然后逛到茂业,运动品牌的T恤实在是贵啊,只好去买JSW的,51块钱还能买2件。再去买鞋子,Puma有几个款式的我倒是喜欢,但没有大码的,没办法,最后只好去买了双Nike的比较休闲的。 买鞋子的时候,xcc和他女朋友也来了,买完鞋子就三个人一起去电脑市场。又去买硬盘了,呵呵,比阿菲买的时候又便宜了一些。然后又去买U盘,一直逛到5点多。我和xcc去梅林吃饭,他女朋友则回去了。说起来,从我生日过后,都没跟xcc一起吃饭了。吃完后,又去他家里坐了一会儿。
用missdeer.blogspot.com这个域名访问不了这里好多天了,然后改成用pkblogs.com,这样坚持了一段时间,终于也不行了,换用inblogs.net,最后也不行了。呵呵,算了,反正本来就没什么人看,就当是写日记的地方好了,自己写了自己看,呵呵。 小妞要在Excel里计算一个东西,我不知道有没有方便的方法,反正用VBA写个宏是可以的,不过还是花了我一点时间。 唉,不能太堕落啊。
转了项目部,还以为今天要去爬梧桐山的,结果提前决定不去了,因为觉得天气不好,所以很快就决定去参加原来的测试组活动。活动内容还是很简单,就是吃饭和K歌。这次活动的地点在南山,中午吃了顿海鲜,下午去海上明珠K歌,这是第二次去那里,第一次是前年十一的时候,跟她们三个,还有另外三个男的,其中一个现在成了小妞的男朋友了。回想当时还真是幼稚,甚至想以后再也不跟她们一起玩了,呵呵。这次从1点半一直K到5点半,乱吼了一气。疯丫头没来,这个家伙不知道昨晚去哪里鬼混了,居然到今天下午1点半的时候还在睡。 唉,也许以后就不会这样跟他们这样出来活动了吧,最多可能私下里还会跟其中几个人一起玩一下。
大吃两顿。本来是只想吃一顿就够了的,结果中午吃完是2点半了,我跟雨烟去修手机,一直弄到快5点,打电话问他们在干吗,说是在KBox里,还大概有1个小时,于是就过去了,后来又加了一个小时。出来就已经是7点了,8个人磨叽了一阵,最后我和雨烟、疯丫头、教授一起去吃了顿肠粉和粥,味道还真不错,价格也不是很贵,4个人才吃了50块钱。出来后,走到石头记,刚好雨烟说要买银针,就进去看了。疯丫头看到一块绿色的石头很喜欢的样子,可惜她这个家伙没钱了(居然穷到这份上,也不容易啊),就狠不下心来买,我就随口说说买了买了,结果营业员当真了,晕,于是就假戏真作了,疯丫头和雨烟当然不肯让我买单。后来雨烟硬是塞给我200块钱。呼呼! 下周就我生日啦!我来请了。 疯丫头说她要下下周请大家,说是生日,其实是加上她转到其它组去的告别会吧,呵呵。
xcc叫我一起去吃饭,下了班就过去梅林,说去吃豆豆鸡煲吧。那里的生意还真的旺的,很多人,差点要等一会儿才有座儿的。三个人点了个鸡煲,10+2串羊肉串,12+1个生蠔,4瓶啤酒,还是多开心的。突然觉得要是能一直这样生活下去也挺不错的,赚点钱然后自己花。可是爸妈终归是要老的,人终归是要结婚的。说起来,我们原来那个老大,跟一个才认识18个月的女孩结婚了,动作真是快呀,不过他也是快30的人了,是差不多时候了,而那女的,跟我差不多大。现在总是认为谈恋爱不能谈太久,太久了就很可能结不成婚了,像他们这种才是最稳当的做法,认识了,然后谈一小阵子,然后结婚。不过像他们这样的,生活基本上也就是固定下来了,不出什么大的意外的话,大概一辈子都像现在这个样子了。而我的漂泊感还是很重,归宿感还没有找到。爱情这种东西,也许是只有在年轻的时候体会一下就够了,以后的,照中国人的常规做法是,在责任心的基础上,建立起也许在欧美人看来质量并不高的婚姻。爱情不能当饭吃,以后是为了生活,而不是像电视上那样死去活来,普通人是经不起那样的折腾的。
这几天真的堕落了。一直没有动手,就在看漫画,消磨时间,浪费青春啊!
唉,突然想起一些很无聊很无趣的事,却为这样的事情烦恼啊!怎么会这样失败呢! 昨天是元宵节,去雨烟家吃饭了,还有教授和猫猫,上午就去了,11点开始出去买菜,一直到下午2点才买回来,呵呵。下午打了一会儿牌,5点的时候雨烟开始弄,我只是帮忙把虾皮剥掉,其它的什么都没做。因为比较困。五个人吃了很多,吃撑死了。说起来略微有点伤感,都说以后可能很少有这样的机会了,因为各个都嚷嚷着要跳槽,雨烟也说了很久了,我也酝酿了很久了,只是一直没做好准备工作。连猫猫都说要走,这个倒是有点没想到,不过她也可能只是凑热闹吵吵的吧。 烦啊!这样的日子什么时候才是个尽头啊! 我真的是个很小心眼的人啊!
一下就跟人叉起来了。可能也是因为最近心情糟糕的缘故吧,反正就是很不爽。再后来想想,其实也不是什么大不了的事,他爱怎么就怎么着呗,跟我又真没什么实质上的利益冲突。 想想以前的事,我确实是个自私而无趣的人。希望以后能有些许改善吧。
这个春节不快乐!愧对列祖列宗啊!今天去参加了一个初中的同学会,班上60来个人,到了20来个,男生们个个意气风发,女生们婀娜多姿!这样的形容词真贴切。再一次认识到自己有车的重要性了。 唉,郁闷,老天啊,什么时候让我摆脱这个郁闷的境地呢!
今年过年回家,受一大刺激,有车真方便啊。先进一点的亲戚都陆续买了车了,现在发现车的好处真是多啊,活动范围和活动时间都大大地扩展啊!应该努力啊,想办法怎么能多赚点钱啊!
表哥过年把女朋友带到老家来了,我倒是去年国庆去贵阳时就已经见过啦,呵呵。他女朋友家里应该算是有钱有势的那种吧,呵呵。仔细思量一下自己,如果我遇到了这样的情况,我会不会妥协呢,嘿嘿。虽然现在心里还是想着要自己好好干,努力赚钱讨个老婆做家庭主妇,或者让她出去找个轻松的工作也得。但是如果真的遇到了这种情况呢?估计照我现在的挑剔程度,还是不会要长成那样的女孩子吧,嘻嘻。
神啊,请赐我一个温柔似水的圆脸mm吧!Thank you!祝所有我认识的,认识我的,我不认识的,不认识我的人2007年情人节快乐!愿天下光棍早日找到另一半,呼呼~~~
翻起blog,点开那些链接,想起以前在一起的人,现在呢,在那样的日子里,水一样摇摆的日子里,现在呢,人一个一个从我身边走过,什么都没有留下。
真不知道,QQ这么个小破聊天软件,为什么能做得这么大,80多MB的东西可不是随便能写出来的,实在是佩服啊,也看不出它都实现了哪些炫目的特色功能,除了聊天还能干吗。 今天下午睡了午觉起来,头竟然是昏的,眩晕!TSE坐在我旁边跟我说话,我强打着精神,努力不让自己说错话或者漏过他说的话,吃力啊!不知道是怎么了,晕了好久,去喝水,冷水冲脸,都没好转。后来时间慢慢过去了,稍微好一点了,但还是不正常,就是晕!从来没有过这样的情形啊!
今年的测试部聚餐改到了南山的毛家饭店。说实话,除了那盘虾,其它的菜我觉得做得实在不行。而且最为让人奇怪的是,为什么不同的人,运气好坏的差别就会那么大呢。对于抽奖这种全凭运气的好事,从来都轮不上我,倒是一些倒霉事情也许可能偏偏会找到我头上来。虽然,《火影忍者》里的阿凯说,运气也是实力的一部分。但这样抽奖的事,实在是跟自己一点点都打不到边的,划拳打牌什么的也许还可以算是自己有一部分人为因素,比如临场反应力,观察力等等,唉! 只休息一天,有点不爽。明天去买机票吧,然后是请假,早点回去。
沉重地叹息,孤独地忧伤,无奈地哀愁,心慌意乱地继续找寻……
2007年到喽,第一天,发短信问候祝福,爸爸妈妈应该都早就睡了吧,同事朋友们该干啥干啥呢,大家新年快乐呀!。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。餮饕餮。。。。。。。。饕餮饕。。餮饕餮饕。。餮饕餮饕餮。。。。。。。。。餮饕。饕餮饕餮饕餮饕餮饕。。餮饕。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。。餮饕餮。。饕餮饕餮。餮饕餮。。。。。。。。。。。。饕餮饕。饕餮饕。。餮饕餮。。。。。。。。。。。。饕餮饕。饕餮。。。餮饕餮。。。。。。。。。。。。。餮饕餮饕餮。餮饕餮饕餮。。。。饕餮饕。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。饕餮饕。。。。餮饕餮。。饕餮。。。。。。。。。。饕餮饕。。。。餮饕餮。。饕餮。。。。。。。。。。饕餮饕。饕餮饕餮饕餮。。饕餮。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。饕餮。。。。。。。。饕餮饕餮饕。。。。餮饕餮。。饕餮。。。。。。。餮饕餮饕餮饕餮饕餮。餮饕餮。。饕餮。。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮。。。。。。饕餮饕。饕餮饕。饕餮饕餮饕。。。饕餮。。。。。。饕餮。。饕餮饕。。。饕餮饕。。。饕餮。。。。。餮饕。。。饕餮饕。。餮饕餮。。。。饕餮。。。。。餮饕餮饕餮饕餮饕。饕餮饕。。。。。饕餮。。。。。。。。。。饕餮。餮饕餮。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。餮饕餮。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。。饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。饕餮饕。。。。。。餮饕餮。。。。。。。。。。。餮饕餮。。。。。。。餮饕餮。。。。饕餮。。。。饕餮饕。饕餮饕。。。。餮饕餮。。。餮饕餮饕。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。饕餮饕。。。。餮饕餮。。。。。。。。。。。。。。饕餮饕。。。。餮饕餮。。。。。。。。。。。。。。饕餮饕。。。。餮饕餮。。。。。。。。。。。。。。饕餮饕。。。。餮饕餮。。。。。餮饕餮饕。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕。。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。。饕餮饕。。。。。。。。。。。。。饕餮饕。。。。。饕餮饕。。。。。。。。。。。。。饕餮饕。。。。。饕餮饕。。。饕餮。。。。。。。。饕餮饕。饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。。。。饕餮饕餮。。。。饕餮饕。。。饕餮。。。。。。饕餮饕餮饕餮饕餮。。饕餮饕。。。饕餮。。。。。。饕餮饕餮饕餮饕餮。。饕餮饕。。。饕餮。。。。。餮饕餮饕餮饕餮饕。。。饕餮饕。。。饕餮。。。。。餮饕餮饕餮饕。。。。。饕餮饕。。。饕餮。。。。。餮饕。饕餮饕。。。。。饕餮饕。。。饕餮饕餮饕。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。。饕餮饕。。。。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。餮饕餮。餮饕。。。。。。。。。。。饕餮饕。。。。餮饕。。餮饕餮。。。。。。。。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。。。。。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。。。。。。。饕餮饕。。餮饕。。。。。。餮饕餮饕。。。。。。。饕餮饕。饕餮。。。。。。。。饕餮饕餮饕。。。。。饕餮饕餮饕。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。餮饕。。。。。饕餮饕餮饕餮饕餮。。。。。。。。饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕。。。。。。。。。。。。。饕餮饕。。。。。饕餮。。。。。。。。。。。。。。饕餮饕。。。。。饕餮。。。。。。。。。。。。。。饕餮饕。。。。。饕餮。。。。。。。。。。。。。。饕餮饕。。。。。饕餮。。。。。餮饕餮。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。。饕餮。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。餮饕餮。。饕餮。餮饕餮。。。。。。。。。。。。饕餮饕餮。。饕餮。。饕餮饕。。。。。。。。。。餮饕餮。。。。饕餮。。。餮饕餮。。。。。。。。饕餮饕。。。。。饕餮。。。。饕餮饕。。。。。。餮饕餮。。。。。。饕餮。。。。饕餮饕餮。。。。饕餮饕。。。。。。。饕餮。。。。。餮饕餮。。。餮饕餮。。。。。。。餮饕餮。。。。。餮饕。。。。餮饕。。。。。饕餮饕餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。餮饕餮。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。饕餮。。。。。。。餮饕。。。。。。。。。。。。餮饕餮饕。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕。饕。。。。。。。。。。。。。饕餮饕餮。。。。。。。。。。。。。。。。。。。。饕餮饕。。餮饕餮。。。。。。。。饕餮饕。。。。餮饕餮。。。餮饕餮饕。。。。餮饕餮饕餮饕餮。。饕餮饕。。。饕餮饕餮。。。。。。。。饕餮饕。。餮饕餮饕餮饕餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮。。。餮饕餮。。饕。。。。。。。饕餮饕。。。。。。。饕餮饕。。餮饕餮饕。。。。。饕餮饕。。。。。。。饕餮。。饕餮饕餮饕。。。。。饕餮饕。。。。。。餮饕。。。饕餮饕。。。。。。。饕餮饕。饕餮。餮饕餮。。。餮饕餮。。。。。。。。饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕餮饕餮饕。。。。餮饕餮饕餮。。。。。。。。饕餮饕餮。。。。。。饕餮饕。。餮饕餮。。。。。。饕餮饕。。。。。饕餮饕。。。。餮饕餮饕。。。。。。餮饕。。。饕餮饕餮。。。。。。饕餮饕。。。。。。。。。饕餮饕餮。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。餮饕餮饕餮饕。。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕。饕餮。。。。。餮饕餮饕餮饕。饕餮。。。。。餮饕餮。。。。。。。。。。饕餮。。。餮饕餮。。饕餮饕餮。。。。。。。。。。饕餮饕。。餮饕餮。。饕餮。。。。。。。。。。。。。餮饕。。。饕餮。餮饕。。。。。。。。。。餮饕。。。。。。。。。。餮饕。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。。餮饕餮。。。。。。。餮饕。。。。餮饕餮。。。。。餮饕餮。。。。。。饕餮。。。。。。。。。。。。。餮饕。。。。。。餮饕餮饕。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。。。。。饕餮饕。。。。。。餮饕。。。。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。。餮饕餮饕餮。。。餮饕餮饕。。。。。。。。。。。。餮饕。饕餮。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。餮饕餮饕餮饕。。。。。。。。。。。。餮饕餮。。。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。餮饕。。。。餮饕餮饕。。餮饕餮饕餮饕餮饕餮。餮饕餮饕餮饕餮饕餮。。。。。。。。饕餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。饕餮饕。。。。。。。。。。。。餮饕餮。。。。。。饕餮饕餮。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕。。。。。。餮饕餮。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮。餮饕。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。饕餮饕。饕餮。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮饕。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。餮饕餮。。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕。。。饕餮。。饕餮饕。。。。。饕餮饕。。。饕餮饕。。。饕餮饕餮饕餮饕。。。。。饕餮。。。。饕餮。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮饕餮。。饕餮饕。。。。。。。。。。。。。。。饕餮饕餮。餮饕餮饕。。。。。。。。。。。。。。餮饕餮。。。餮饕餮。。。。。。。。。。。。。。。餮饕餮。。。餮饕餮。。。。。。。。。。。。。。饕餮饕。。。饕餮饕。。。。。。餮饕餮饕。。。。。饕餮饕。。。饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。餮饕餮饕餮。餮饕餮。。饕餮。。。餮饕。。。。。。餮饕餮饕餮。餮饕。。。饕餮饕。饕餮。。。。。。饕餮饕餮饕。饕餮。。。。饕餮饕。饕餮。。。。。。饕餮饕餮饕餮饕餮饕餮。。饕餮饕。。。。。。。。餮饕。饕餮饕。。。饕餮饕餮饕餮饕餮饕。。。。。饕餮饕。饕餮饕。。。饕餮饕。饕餮饕。饕餮。。。。。。。。饕餮饕。。。饕餮饕。饕餮饕。饕餮饕。。。。。。。饕餮饕。。餮饕餮。。饕餮饕。。餮饕餮。。。。。。饕餮饕。。餮饕。。。饕餮饕。。餮饕餮饕。。。。。饕餮饕。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。饕餮饕。饕餮。。。。饕餮饕。。。饕餮饕。。。。。饕餮饕餮饕。。。。。饕餮饕。。。。餮饕。。。。。饕餮饕餮饕。。。。。饕餮饕。。。。。。。。。。。饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。。饕餮饕。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。饕餮饕。。。。。。。。。。。。。。。。餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。饕餮饕餮饕。。餮饕餮饕。。餮饕餮。。。。。。饕餮饕。饕餮饕。。。饕餮饕。。餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。。。。。。。。。。。。。。。饕餮饕。。。饕餮饕。。。。餮饕餮。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。饕餮饕。。。饕餮饕。。。饕。。。。。。。。。。。饕餮饕。。。饕餮饕。。餮饕餮饕。。。。。。。。。饕餮饕。。。。餮饕。。餮饕餮饕。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。餮饕餮饕餮。。。餮饕餮饕餮饕。。。。。。餮饕餮饕餮饕餮饕。。。。餮饕餮饕餮。。。。。。。餮饕餮饕。饕餮饕。。。。餮饕餮饕。。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕。。。。餮饕。。。。。。。饕餮饕。。。饕餮饕餮饕餮。。。餮饕。。。。。。。饕餮饕。。餮饕餮。餮饕餮饕。。餮饕。。。。。。。饕餮饕餮饕餮。。。。饕餮饕餮。餮饕。。。。餮饕餮饕餮饕餮。。。。。。。餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。。。。。。餮饕餮饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。饕餮。。。。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。。。。。餮饕。。。。餮饕餮。。。餮饕餮。。。。。。。。饕餮饕。。。。餮饕餮。。。餮饕餮。。。。。。。。饕餮。。。。。餮饕餮。。。餮饕餮。。。。。。。餮饕餮饕餮。。。餮饕餮。。。餮饕。。。。。。。。餮饕餮饕。。。。餮饕餮。。饕餮饕。。。。。。。饕餮饕餮饕。。。。餮饕餮。。饕餮饕。饕餮饕。。。饕餮饕餮饕。。。。餮饕餮。。饕餮饕餮饕餮饕餮。餮饕。饕餮饕。。。。餮饕餮。。。。。。饕餮饕。饕餮饕。饕餮饕。。。。餮饕餮。。。。。。饕餮饕。。。。。饕餮饕。。。。餮饕。。。。。。。饕餮。。。。。。饕餮饕。。。饕餮饕。。。。。。。饕餮。。。。。。饕餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。饕餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。饕餮饕。。餮饕餮。。。。。。。餮饕餮。。。。。。饕餮饕。。餮饕餮。。。。。。。餮饕餮。。。。。。饕餮饕。饕餮饕。。。。餮饕。饕餮饕餮。。。。。。饕餮饕。饕餮。。。。。餮饕餮饕餮饕。。。。。。。饕餮饕餮饕。。。。。。。。餮饕餮。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。餮饕餮。。。。。餮饕餮。餮饕餮。。。。。。。。饕餮饕。。餮饕餮。餮饕餮。。饕餮饕。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮。。饕餮饕。。。。。。餮饕餮。。。餮饕餮。餮饕餮。。。。饕餮。。。。。餮饕餮饕餮。餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。饕餮饕餮饕。。餮饕餮饕。。。。餮饕。。。饕餮饕餮饕餮饕餮饕。。餮饕餮饕餮。。。。。。。餮饕。饕餮饕。饕餮。。。餮饕。饕餮。。。。。。饕餮。。。餮饕餮饕餮。。饕餮饕。饕餮饕。。。。。。。。。。餮饕餮饕。。。饕餮饕。饕餮饕。。。。。。。。。。。饕餮饕。。餮饕餮。。。餮饕餮。。。。。。。。。餮饕餮。。饕餮饕。。。。餮饕餮饕。。。。。。。饕餮饕。。餮饕餮。。。。。。饕餮饕餮饕。。。饕餮饕。。餮饕餮。。。。。。。。。。。。。。。餮饕餮饕餮。餮饕。。。。餮。。。餮饕餮。。。。。。。。饕餮。餮饕餮。。。餮饕餮。。饕餮饕。。。。。。餮饕餮。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕餮。。饕餮饕。。。饕餮饕。。餮饕餮饕。。餮饕餮饕。。。。餮饕。。。饕餮饕。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。餮饕餮饕餮饕。。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕。饕餮。。。。。餮饕餮饕餮饕。饕餮。。。。。餮饕餮。。。。。。。。。。饕餮。。。餮饕餮。。饕餮饕餮。。。。。。。。。。饕餮饕。。餮饕餮。。饕餮。。。。。。。。。。。。。餮饕。。。饕餮。餮饕。。。。。。。。。。餮饕。。。。。。。。。。餮饕。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。。餮饕餮。。。。。。。餮饕。。。。餮饕餮。。。。。餮饕餮。。。。。。饕餮。。。。。。。。。。。。。餮饕。。。。。。餮饕餮饕。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。。。。。饕餮饕。。。。。。餮饕。。。。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。。餮饕餮饕餮。。。餮饕餮饕。。。。。。。。。。。。餮饕。饕餮。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。餮饕餮饕餮饕。。。。。。。。。。。。餮饕餮。。。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。餮饕。。。。餮饕餮饕。。餮饕餮饕餮饕餮饕餮。餮饕餮饕餮饕餮饕餮。。。。。。。。饕餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。餮饕餮。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。饕餮。。。。。。。餮饕。。。。。。。。。。。。餮饕餮饕。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕。饕。。。。。。。。。。。。。饕餮饕餮。。。。。。。。。。。。。。。。。。。。饕餮饕。。餮饕餮。。。。。。。。饕餮饕。。。。餮饕餮。。。餮饕餮饕。。。。餮饕餮饕餮饕餮。。饕餮饕。。。饕餮饕餮。。。。。。。。饕餮饕。。餮饕餮饕餮饕餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮。。。餮饕餮。。饕。。。。。。。饕餮饕。。。。。。。饕餮饕。。餮饕餮饕。。。。。饕餮饕。。。。。。。饕餮。。饕餮饕餮饕。。。。。饕餮饕。。。。。。餮饕。。。饕餮饕。。。。。。。饕餮饕。饕餮。餮饕餮。。。餮饕餮。。。。。。。。饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕餮饕餮饕。。。。餮饕餮饕餮。。。。。。。。饕餮饕餮。。。。。。饕餮饕。。餮饕餮。。。。。。饕餮饕。。。。。饕餮饕。。。。餮饕餮饕。。。。。。餮饕。。。饕餮饕餮。。。。。。饕餮饕。。。。。。。。。饕餮饕餮。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。餮饕。。。。。饕餮饕。。。。。饕餮饕。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕餮。餮饕餮。。。餮饕餮饕。。。。。。。。。。。饕餮饕餮饕餮。。饕餮饕餮。。。。。。。。。。。。饕餮饕餮饕餮。。饕餮饕餮饕餮饕餮饕餮。。。。。。饕餮。餮饕餮。餮饕餮饕。。。饕餮饕餮。。。。。。。。。餮饕餮。餮饕餮饕餮。餮饕餮。。。。。。。。。。。餮饕餮饕餮。。饕餮饕餮饕。。。。。。。。。。餮饕餮饕餮饕。。。。餮饕餮。。。。。。。。。餮饕餮饕餮饕餮。。。。饕餮饕餮饕。。。。。。。。餮饕餮。餮饕。。。饕餮饕。。餮饕餮饕餮。。。。。。。。饕餮饕。饕餮饕餮。。。。。餮饕餮饕餮饕餮。。。。饕餮饕餮饕餮。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。。。。。。。。。饕餮。。。。。。。。。餮饕。。。。。。。。。。餮饕餮。。。餮饕餮饕。。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕餮饕。。。。。。。。。饕餮。。。。。。。。。。。餮饕餮饕。。。。。。餮饕。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。饕餮饕。。。。。。。。。。。。餮饕餮。。。。。。饕餮饕餮。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕。。。。。。餮饕餮。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮。餮饕。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。饕餮饕。饕餮。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮饕。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。餮饕餮。。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕。。。饕餮。。饕餮饕。。。。。饕餮饕。。。饕餮饕。。。饕餮饕餮饕餮饕。。。。。饕餮。。。。饕餮。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮饕餮。。饕餮饕。。。。。。。。。。。。。。。饕餮饕餮。餮饕餮饕。。。。。。。。。。。。。。餮饕餮。。。餮饕餮。。。。。。。。。。。。。。。餮饕餮。。。餮饕餮。。。。。。。。。。。。。。饕餮饕。。。饕餮饕。。。。。。餮饕餮饕。。。。。饕餮饕。。。饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。餮饕餮饕餮。餮饕餮。。饕餮。。。餮饕。。。。。。餮饕餮饕餮。餮饕。。。饕餮饕。饕餮。。。。。。饕餮饕餮饕。饕餮。。。。饕餮饕。饕餮。。。。。。饕餮饕餮饕餮饕餮饕餮。。饕餮饕。。。。。。。。餮饕。饕餮饕。。。饕餮饕餮饕餮饕餮饕。。。。。饕餮饕。饕餮饕。。。饕餮饕。饕餮饕。饕餮。。。。。。。。饕餮饕。。。饕餮饕。饕餮饕。饕餮饕。。。。。。。饕餮饕。。餮饕餮。。饕餮饕。。餮饕餮。。。。。。饕餮饕。。餮饕。。。饕餮饕。。餮饕餮饕。。。。。饕餮饕。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。饕餮饕。饕餮。。。。饕餮饕。。。饕餮饕。。。。。饕餮饕餮饕。。。。。饕餮饕。。。。餮饕。。。。。饕餮饕餮饕。。。。。饕餮饕。。。。。。。。。。。饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。。饕餮饕。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。饕餮饕。。。。。。。。。。。。。。。。餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。饕餮饕餮饕。。餮饕餮饕。。餮饕餮。。。。。。饕餮饕。饕餮饕。。。饕餮饕。。餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。。。。。。。。。。。。。。。饕餮饕。。。饕餮饕。。。。餮饕餮。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。饕餮饕。。。饕餮饕。。。饕。。。。。。。。。。。饕餮饕。。。饕餮饕。。餮饕餮饕。。。。。。。。。饕餮饕。。。。餮饕。。餮饕餮饕。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。餮饕餮饕餮。。。餮饕餮饕餮饕。。。。。。餮饕餮饕餮饕餮饕。。。。餮饕餮饕餮。。。。。。。餮饕餮饕。饕餮饕。。。。餮饕餮饕。。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕。。。。餮饕。。。。。。。饕餮饕。。。饕餮饕餮饕餮。。。餮饕。。。。。。。饕餮饕。。餮饕餮。餮饕餮饕。。餮饕。。。。。。。饕餮饕餮饕餮。。。。饕餮饕餮。餮饕。。。。餮饕餮饕餮饕餮。。。。。。。餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。。。。。。餮饕餮饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。饕餮饕。。。。。。。。。。。。。。餮饕餮饕。。。。餮饕餮。。。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。饕。。。。。。。饕餮饕。。。。。。餮饕餮。。。餮饕餮。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。饕餮饕。。。。。饕餮饕。。。。。。。。。。。。餮饕餮饕。。。。。饕餮饕餮。。。。。。。。。。。餮饕餮饕。。。。餮饕餮饕餮。。。。。。。。。。饕餮饕餮饕。。。。餮饕。饕餮。。饕餮饕。。。。。饕餮饕餮饕。。。饕餮饕。饕餮。餮饕餮饕餮。。。餮饕。饕餮饕。。餮饕餮饕。饕餮。餮饕。。。。。。餮饕。饕餮饕。饕餮饕餮饕。饕餮饕餮。。。。。。。。。。饕餮饕餮饕餮饕餮饕。。餮饕。。。。。。。。。。。饕餮饕餮饕。饕餮饕。。餮饕餮。。。。。。。。。。饕餮饕餮。。饕餮饕。。餮饕餮。。。。。。。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。饕餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕餮饕餮。餮饕餮饕。。。。。。。饕餮饕。。。饕餮饕餮。。。。饕餮饕餮。。。。。。饕餮饕。。餮饕餮饕。。。。。。餮饕餮饕。。。。。饕餮饕。。。饕餮。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。餮饕餮。。。。。餮饕餮。餮饕餮。。。。。。。。饕餮饕。。餮饕餮。餮饕餮。。饕餮饕。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮。。饕餮饕。。。。。。餮饕餮。。。餮饕餮。餮饕餮。。。。饕餮。。。。。餮饕餮饕餮。餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。饕餮饕餮饕。。餮饕餮饕。。。。餮饕。。。饕餮饕餮饕餮饕餮饕。。餮饕餮饕餮。。。。。。。餮饕。饕餮饕。饕餮。。。餮饕。饕餮。。。。。。饕餮。。。餮饕餮饕餮。。饕餮饕。饕餮饕。。。。。。。。。。餮饕餮饕。。。饕餮饕。饕餮饕。。。。。。。。。。。饕餮饕。。餮饕餮。。。餮饕餮。。。。。。。。。餮饕餮。。饕餮饕。。。。餮饕餮饕。。。。。。。饕餮饕。。餮饕餮。。。。。。饕餮饕餮饕。。。饕餮饕。。餮饕餮。。。。。。。。。。。。。。。餮饕餮饕餮。餮饕。。。。餮。。。餮饕餮。。。。。。。。饕餮。餮饕餮。。。餮饕餮。。饕餮饕。。。。。。餮饕餮。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕餮。。饕餮饕。。。饕餮饕。。餮饕餮饕。。餮饕餮饕。。。。餮饕。。。饕餮饕。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。餮饕。。。。。饕餮饕。。。。。饕餮饕。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕餮。餮饕餮。。。餮饕餮饕。。。。。。。。。。。饕餮饕餮饕餮。。饕餮饕餮。。。。。。。。。。。。饕餮饕餮饕餮。。饕餮饕餮饕餮饕餮饕餮。。。。。。饕餮。餮饕餮。餮饕餮饕。。。饕餮饕餮。。。。。。。。。餮饕餮。餮饕餮饕餮。餮饕餮。。。。。。。。。。。餮饕餮饕餮。。饕餮饕餮饕。。。。。。。。。。餮饕餮饕餮饕。。。。餮饕餮。。。。。。。。。餮饕餮饕餮饕餮。。。。饕餮饕餮饕。。。。。。。。餮饕餮。餮饕。。。饕餮饕。。餮饕餮饕餮。。。。。。。。饕餮饕。饕餮饕餮。。。。。餮饕餮饕餮饕餮。。。。饕餮饕餮饕餮。。饕餮饕餮。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。。。。。。。。。饕餮。。。。。。。。。餮饕。。。。。。。。。。餮饕餮。。。餮饕餮饕。。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕餮饕。。。。。。。。。饕餮。。。。。。。。。。。餮饕餮饕。。。。。。餮饕。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。餮饕餮。。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。。。。。。。。。饕餮饕。。。。。。。饕餮饕。。。饕餮。。。。。。。餮饕。。。。。。。。。。。。餮饕餮饕。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕。饕。。。。。。。。。。。。。饕餮饕餮。。。。。。。。。。。。。。。。。。。。饕餮饕。。餮饕餮。。。。。。。。饕餮饕。。。。餮饕餮。。。餮饕餮饕。。。。餮饕餮饕餮饕餮。。饕餮饕。。。饕餮饕餮。。。。。。。。饕餮饕。。餮饕餮饕餮饕餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮。。。餮饕餮。。饕。。。。。。。饕餮饕。。。。。。。饕餮饕。。餮饕餮饕。。。。。饕餮饕。。。。。。。饕餮。。饕餮饕餮饕。。。。。饕餮饕。。。。。。餮饕。。。饕餮饕。。。。。。。饕餮饕。饕餮。餮饕餮。。。餮饕餮。。。。。。。。饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕餮饕餮饕。。。。餮饕餮饕餮。。。。。。。。饕餮饕餮。。。。。。饕餮饕。。餮饕餮。。。。。。饕餮饕。。。。。饕餮饕。。。。餮饕餮饕。。。。。。餮饕。。。饕餮饕餮。。。。。。饕餮饕。。。。。。。。。饕餮饕餮。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。餮饕餮。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。饕餮。餮饕餮饕餮饕餮饕。。。。。。。。。饕餮饕。。。。餮饕餮。。饕餮。。。。。。。。。。饕餮饕。。。。餮饕餮。。饕餮。。。。。。。餮。。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮饕餮饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮饕餮饕餮。餮饕餮饕餮饕餮饕。饕餮饕。。。。餮饕餮。。饕餮饕餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕。。餮饕。。。。。。。饕餮饕。。。。餮饕。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。饕餮饕餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕。。。。。。。饕餮饕。。。。。。。。。。。。餮饕。。。。。。。饕餮饕餮。。。。。。。。。。。餮饕。。。饕餮。。。餮饕。。。饕餮。。。。。。。餮饕。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。餮饕餮饕餮饕餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。。餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。。餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。。餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。。餮饕餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。饕餮饕餮饕。饕餮饕餮饕餮饕餮饕餮饕餮。。。餮饕餮饕餮饕。。。饕餮饕。。。。。。餮饕餮。。饕餮饕餮。餮饕。。。饕餮饕。。。。。。。。。。。。。。。。餮饕。。。饕餮饕。。。。。。。。。。。。。。。。餮饕。。。饕餮饕。。。。。。。。。。。。。。。。餮饕。。餮饕餮。。。。。。。。。。。。。。。。。餮饕。。餮饕餮。。。。。。。。。。。。。。。。。餮饕。。餮饕。。。。。。。。。。。。。。。。。。餮饕。饕餮饕。。。。。。。。。。。。。。餮饕餮饕餮饕餮饕餮。。。。。。。。。。。。。。。。。餮饕餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。饕餮饕。。。。。。。。。。。。餮饕餮。。。。。。饕餮饕餮。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕。。。。。。餮饕餮。。。。。。。。。。饕餮饕餮饕餮饕餮饕餮。餮饕。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。饕餮饕。。。饕餮饕。饕餮。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕餮饕餮饕。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。餮饕餮。。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕。。。饕餮饕。。。。。。。。餮饕餮。。。。饕餮饕餮饕餮饕餮饕。。。饕餮。。饕餮饕。。。。。饕餮饕。。。饕餮饕。。。饕餮饕餮饕餮饕。。。。。饕餮。。。。饕餮。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮饕餮。。饕餮饕。。。。。。。。。。。。。。。饕餮饕餮。餮饕餮饕。。。。。。。。。。。。。。餮饕餮。。。餮饕餮。。。。。。。。。。。。。。。餮饕餮。。。餮饕餮。。。。。。。。。。。。。。饕餮饕。。。饕餮饕。。。。。。餮饕餮饕。。。。。饕餮饕。。。饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。餮饕餮饕餮。餮饕餮。。饕餮。。。餮饕。。。。。。餮饕餮饕餮。餮饕。。。饕餮饕。饕餮。。。。。。饕餮饕餮饕。饕餮。。。。饕餮饕。饕餮。。。。。。饕餮饕餮饕餮饕餮饕餮。。饕餮饕。。。。。。。。餮饕。饕餮饕。。。饕餮饕餮饕餮饕餮饕。。。。。饕餮饕。饕餮饕。。。饕餮饕。饕餮饕。饕餮。。。。。。。。饕餮饕。。。饕餮饕。饕餮饕。饕餮饕。。。。。。。饕餮饕。。餮饕餮。。饕餮饕。。餮饕餮。。。。。。饕餮饕。。餮饕。。。饕餮饕。。餮饕餮饕。。。。。饕餮饕。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。饕餮饕。饕餮。。。。饕餮饕。。。饕餮饕。。。。。饕餮饕餮饕。。。。。饕餮饕。。。。餮饕。。。。。饕餮饕餮饕。。。。。饕餮饕。。。。。。。。。。。饕餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。。饕餮饕。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。饕餮饕。。。。。。。。。。。。。。。。餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。。饕餮饕餮饕。。餮饕餮饕。。餮饕餮。。。。。。饕餮饕。饕餮饕。。。饕餮饕。。餮饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。。。饕餮饕。。。。。。。。。饕餮饕。。。饕餮饕。。。。。。。。。。。。。。。饕餮饕。。。饕餮饕。。。。餮饕餮。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。饕餮饕。。。饕餮饕。。。饕。。。。。。。。。。。饕餮饕。。。饕餮饕。。餮饕餮饕。。。。。。。。。饕餮饕。。。。餮饕。。餮饕餮饕。。。。。。。。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮。。。。。。。。。餮饕餮饕餮。。。餮饕餮饕餮饕。。。。。。餮饕餮饕餮饕餮饕。。。。餮饕餮饕餮。。。。。。。餮饕餮饕。饕餮饕。。。。餮饕餮饕。。。。。。。。。。。。。饕餮饕。。。。餮饕餮饕。。。。餮饕。。。。。。。饕餮饕。。。饕餮饕餮饕餮。。。餮饕。。。。。。。饕餮饕。。餮饕餮。餮饕餮饕。。餮饕。。。。。。。饕餮饕餮饕餮。。。。饕餮饕餮。餮饕。。。。餮饕餮饕餮饕餮。。。。。。。餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。。。。。。餮饕餮饕餮。。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。餮饕餮饕餮饕餮饕餮。。。。饕餮。。。。。。。。。。。。。。。餮饕餮。。。餮饕餮饕。。。。。。。。。。。。。。餮饕餮。。饕餮饕。。。。。。。。。。。。餮饕餮。餮饕餮饕。饕餮。。。。。。。餮饕餮饕餮饕餮饕餮。餮饕餮饕餮饕。。。。。。。。。。。。。饕餮饕。。餮饕餮饕餮。。。。。。。。。。。。。。饕餮饕。。餮饕。饕餮。。。。。。。。。。。。。。饕餮饕。。餮饕。饕餮饕。。。。。。。。。。。。餮饕餮。。。餮饕。。餮饕餮。。。。。。。。。。。餮饕餮。。。餮饕。。餮饕餮。。。。。。。。。。饕餮饕。。。。餮饕。。。饕餮饕餮。。。。。。。餮饕餮。。。。。餮饕。。。。餮饕餮饕。。。。。。餮饕。。。。。。餮饕。。。。。饕餮饕餮饕。。。饕餮。。。。。。。餮饕。。。。。。餮饕餮饕餮。餮饕。。。。餮饕餮饕餮饕。。。。。。。。。。。饕餮。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。饕餮饕餮。。。。。。。。。。。餮饕餮。。。。。。。。饕餮饕。饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕餮。。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕餮。餮饕。。。。。饕餮饕。。。。餮饕。。餮饕。。。。。。。饕餮饕餮饕餮饕餮。。饕餮饕。。餮饕。。。。。。。。。。。饕餮饕。。。饕餮饕。。餮饕。。。。。。。。。。。饕餮饕。。。饕餮饕。。餮饕。。。。。。。。。。。饕餮饕。。。饕餮。。。餮饕。。。饕。。。。。。。饕餮饕。。餮饕餮。。。餮饕。。餮饕餮。。。。。。饕餮饕。。餮饕。。。。餮饕。。餮饕餮。。。。。。饕餮饕。饕餮。。。。。餮饕餮。餮饕餮饕。。。。餮饕餮饕餮饕。。。。。。。饕餮饕餮饕。。。。餮饕餮饕。饕餮饕。。。。。。。。。。。。。。。饕餮饕餮。。。餮饕餮饕。。。。。。。。。。。饕餮。。。。。。。。。餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。餮饕餮。。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。饕餮。餮饕餮饕餮饕餮饕。。。。。。。。。饕餮饕。。。。餮饕餮。。饕餮。。。。。。。。。。饕餮饕。。。。餮饕餮。。饕餮。。。。。。。餮。。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮饕餮饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕餮。餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮饕餮饕餮。餮饕餮饕餮饕餮饕。饕餮饕。。。。餮饕餮。。饕餮饕餮饕餮。。饕餮饕。饕餮饕。。。。餮饕餮。。饕。。餮饕。。。。。。。饕餮饕。。。。餮饕。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。饕餮饕餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮。。。。。餮饕餮。。。。。。。。。。。。。餮饕。。。。。。。饕餮饕。。。。。。。。。。。。餮饕。。。。。。。饕餮饕餮。。。。。。。。。。。餮饕。。。饕餮。。。餮饕。。。饕餮。。。。。。。餮饕。饕餮饕餮饕餮饕餮饕餮饕餮饕餮饕。。餮饕餮饕餮饕餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。。餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。。餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。。餮饕。。。饕餮饕。。。。。。餮饕餮。。。。。。。餮饕餮饕餮饕餮饕。。。。。。餮饕餮。。。。。。饕餮饕餮饕。饕餮饕餮饕餮饕餮饕餮饕餮。。。餮饕餮饕餮饕。。。饕餮饕。。。。。。餮饕餮。。饕餮饕餮。餮饕。。。饕餮饕。。。。。。。。。。。。。。。。餮饕。。。饕餮饕。。。。。。。。。。。。。。。。餮饕。。。饕餮饕。。。。。。。。。。。。。。。。餮饕。。餮饕餮。。。。。。。。。。。。。。。。。餮饕。。餮饕餮。。。。。。。。。。。。。。。。。餮饕。。餮饕。。。。。。。。。。。。。。。。。。餮饕。饕餮饕。。。。。。。。。。。。。。餮饕餮饕餮饕餮饕餮。。。。。。。。。。。。。。。。。餮饕餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮饕。。。。。。。。。。。。。。。。。。。。。饕餮。。。。。。。。。。。。。。。。。。。。。。。餮。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。餮饕餮饕餮。。。。。。。。。。。。。。。。。。。餮饕餮饕。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
是和同事们一起吃的。去年呢,忘了,应该是和她们一起吃的吧。 以前小思宇说,我们刚从学校出来,还跟学生差不多,所以可以像学校宿舍那样,后来慢慢地,每个人都有各自的交际圈,慢慢地对自己独立的空间的需求也越来越大了。也许是对的吧,可能放在这里说不是很切题。我只不过是有点恋旧,有点怀念以前的时光,虽然有时候也会不爽,但绝大多数时间是很开心的,三个很会闹的可爱的家伙。可是那样的时光一去不复返啦,大概有些事情就是命中注定的吧。虽然我的内心深处对于反抗命运的斗争本能还是依稀存在的,但是尘世间的灯红酒绿的诱惑对我来说,也几乎是致命地具有吸引力,唉! 这一年,回头看看,虽然生活得还算惬意,尽管中间有那么一段重大的打击,说实话应该是我给人的打击更大,但是我挺过来了,我换了另外一种方式生活。我自以为那是我有生以来最大的挫折,连续一星期,实在觉得笑是一种很奢侈很费体力的动作。不过我这样过来了,以后还怕什么呢!哈哈,祝小思宇、小玉玉和小妞幸福。祝所有在我周围的关心我的人幸福!2006年幸福,2006年以后更幸福!
当时正在公司的会议室里讨论问题,发现地在摇晃,同事们还开玩笑说,地震啦。当时还以为是开过什么大货车之类的,后来讨论结束后才知道是真的地震了 。看到网上的新闻,原来是台湾岛以南发生7.2级地震,影响到这里了,强!好像当年唐山大地震也就是7.3级。 这个笨猫猫,给我的账号是错的,怪不得转账n次都不成功,费了好多电话费,网上也转不了,还以为是软件系统哪里出问题了,气死! 每天要回来这么晚,实在懒得动脑筋了,郁闷!不知道是不是因为吃了火锅的缘故,肚子痛了一天。
88折也是折扣呀,比送券划算呀,送券就会鼓励消费,打折才实惠,也省了54块钱呢!! 花了一天多的时间把22集的《越狱》第一季给看完啦,看到15集我就开始不耐烦了,觉得他们是在拖延情节了,开始一边玩方块一边看片了,hoho~~~ eMule拖了个做电子贺卡的东东下来,唉,艺术细胞全部死完的下场就是这么惨,呜呜~~~
晚上睡少了,结果白天感到特别累,倒不是很困,晕! 看到一篇blog,比较不同的程序语言的,有点搞笑,倒不是像在bbs上的那种月经贴吵着不可开交的那种,是用女人来形容各种编程语言,回复也挺有趣的!
芳林来zte培训10天,我们几个在这儿的同学就打算一起见个面。周五下班,坐上391直奔华强北,xcc出差南京去了,就剩下afei了。然后三个人在漓江又一轩吃了一顿。芳林这猪,变这么肥,从肚子到脸,全都变胖好多,想当时在学校,多瘦小一个人呀!由于是晚上时间,也不是很想再去哪里玩,吃过饭,就随afei把芳林送上zte学院的车。然后我再把afei送到她回家的公交车上,我才自己去坐车回来。我觉得我很喜欢这种感觉,偶尔有同学过来,然后可以聚一下,了解一下别人的生活学习工作状况,不同于我们几个在这儿的人的状况。 回到家后看小说看到3点多,然后上床睡觉,结果第二天早上9点多就睡不着了,起床上网,无聊。洗了个澡,等到12点半过,去坐车,项目组活动,去梅林K歌。到那里已经是1点了,结果2个包间里只有3个人,晕,我还想我已经迟到1个小时了呢。起床开始一起没吃多少东西,看到有吃的,就把那些零食都消灭了。人陆续多起来了。因为用力在那里吼,哑了。大部分流行过的老歌都还是能唱的,至少高潮部分是会唱的,只是嗓音不好啊!尤其是女歌手的歌,唱不上去,晕!还逗了一下教授和疯丫头一会儿,哈哈,篡改歌词还挺好玩的,以前上中学的时候经常这样玩儿,大学里就很少了,因为大学里都只是安静地在电脑上听歌。 一直k到6点,然后老大说,一起去吃饭,果然,还是有点在预料之中的,在疯丫头的建议下,去吃韩国烧烤了。这边这桌的人个个是大食量的,上了就要抢,昏,呵呵!
所谓人不要脸,天下无敌,我为什么不让自己无敌呢? 白天和xcc还有他gf去爬小梧桐山了,像平常上班时候一样起了床,匆匆收拾了一下便出门,辗转到了莲塘,然后等了一会儿,等他们两个来了,一起走到小梧桐山,开始爬,人还真多。真是上山容易下山难,下山道开始一截好窄好陡,只敢扶着扶拦慢慢往下走。中午饭本来打算和阿菲一起吃的,结果她干其它事情去了,于是三个人就随便在路边找了个小馆子吃了一顿。然后去阿菲屋里,她回来了,四个人就在那里吃桔子、栗子,吹牛摆阵,一下午就这样过去了。阿菲原先打算去她舅舅家的,后来不知怎的,我说晚上去吧,晚饭和我们一起吃,居然答应了。四个人奔赴华强北民间瓦缸煨汤,大吃一顿,撑死了。 想想,我还真bt,自己不想要的却又想锁着人家。 得到当前所有榜单的源代码了,之前还想他是怎么调试的,原来留了这么一手的。
同事们都这么说,只不过才给了个B,加了2分。看评语是还不错的,还特地给我发了个cpptcl 1.1.2,呵呵,他不知道我早就研究过了。 顶级域名下来了,可以用http://www.llyfsoft.com/bbs/来直接访问三千无聊了。
终于决定在商务互联买个空间来整,把PHPWind挂上去。然后猛然发现,那个顶级域名呢? 晕!只好先用三级域名了:http://w36830.s7.freedns.name/bbs/
昨天down了一个Windows下用的Apache+MySQL+PHP集合包,今天装了后想试一下Discuz!,可惜总是有点问题,不知道是哪里出错了,于是又down来一个PHPWind,可以用,大概看了一下里面的设置选项,还算是挺简单的。设了个端口映射,就可以让别人从IP访问到了,hoho~~~ 得找一个稳定快速的ISP空间啊。
打算做一件无耻的事。一件有一点点技术含量,又包含了一点点社会工程学的事。 写一个注册表读写封装类,像VCL里的TRegistry那种。写一个SMTP模块,可以发邮件到指定的邮箱。写一个DLL Trojan,它被捆绑到某个版本的方块中,放到论坛里。DLL注入到explorer.exe,或作为svchost.exe里的共享服务。它搜索注册表中的用户名和密码,谁叫它是明文的!通过邮件发回来,这个不是重点,重点在于得知该台机器的主人是谁。搜索文件的打开方式注册的程序路径,分析路径,试图找到是否可能在该路径下的某个分支有源代码,把源代码文件一个一个通过邮件发回来。
头发实在长得难以打理,只好下决心去剪了,还洗了45分钟的头。本来还担心剪得很难看,现在看来,还没到很难看的地步,只是有点难看。 分析了一天的自动化设计,那用例颗粒也太粗了,分解出来的步骤越来越多,开始是几步,后来变十几步,再后来是三十几步,再再后来是五十几步,再再再后来,要七十几啦,我连忙停下,要不要把它拆成几个呢!还帮开发的写了个小脚本,不到100行,也花了1个多小时才算最后基本能用,我真是很粗心,做事不经过大脑的类型啊! 中午在食堂吃饭,完了去还餐具的时候,看到小妞在那边吃,远远地跟她打招呼。疯丫头问我在看谁呢,我说就那个黄衣服的,跟我穿情侣装的那个。晚上回来在QQ上,小妞说,今天看到我跟一个美女一起哦。然后两个人东拉西扯地又扯皮了一会儿。 我实在是没有自制力啊!而且是个很小心眼儿的人,几近变态的小心眼!呜呜,就因为去BBS上逛了一下,想起一些事,就让我觉得很不爽。不爽不爽不爽!
跑去对面小区里面买了张窗帘,没想到不够宽,唉,不知道是窗子上标的尺寸有问题,还是这窗帘本来就尺寸不对呢。买了张床单,呵呵,1.6米宽的,以前只有张1米宽的,搬了家之后一直垫席子,没什么机会用,床单买了也只是为了看起来更像样一点点,因为其实对于我个人来说,垫席子的话,只要有被子,过冬应该也是没问题的,因为还有睡袋和一张小垫子呢。还花了3.5元买了个很薄的塑料脸盆,终于有脸盆了,最终一直因为没有自己的脸盆,每天早上总是跑到厨房那边去用z3的脸盆,呵呵。 现在要慢慢学习自己照顾自己的生活起居,慢慢添置家用,慢慢学会享受生活。 从网上down了一百多张桌面,又打开WallpaperHelper来用了下,我自己都觉得难用,郁闷,还是重头再写一个好点的,总是有各种各样奇怪的问题,甚至连定时器都会有问题,总感觉是因为用了NeoWin的原因,这个NeoWin的实现方式有点不好,只好不用了。 我应该好好想一想,哪些应用可以使用嵌入式的脚本语言来扩展其功能。现在脚本语言太流行了,Python、Ruby是大红大紫,稍微弱势一点的Lua、Tcl等,也是各有各的用处。自从写了一遍TclSuck后,感觉一般的脚本语言的glue code轻量级实现我基本也会了,有了这样的glue code,做两边的实现很自然,可以各自用各自的思维习惯,但到底嵌入了脚本语言支持后可以用来做些什么,我还很迷茫,一点想法都没有。我的方块是唯一一个看起来可以用Lua的场合,其它的实在不知道了。比如WallpaperHelper,需要用脚本嵌入的支持么?我不知道。所以需要好好规划,考虑一下。公司的自动化体系将要全面从Tcl切换到Ruby,我觉得很诧异,这样的变革应该是不提倡的吧,实在看不出来目前公司的自动化系统把Tcl实现换成Ruby有什么好处,反倒是需要大量的重复开发,至少底层支撑是要全部从头来过了。不过我也不需要再想那么多,因为这跟我没多少关系了。我要做的是,先考虑一下TclSuck的实现,能否把Functor的支持加进去,然后分别实现一个LuaSuck、RubySuck乃至PythonSuck,因为我只要一个轻量级的,单纯STL依赖的库,我不想要一个还会对Boost有依赖的库。当然不是说我讨厌Boost,相反,我很喜欢Boost,这是个大宝藏,但Boost怎么说都是个第三方的库,要自行编译才能使用,更何况对于这样的glue code我不需要那么多的功能。
在沃尔玛买了个小小的折台,这下可以坐在地上打电脑了。 方块啊方块,重新写吧。 把《灌篮高手》剧场版看完了,虽然只有4集,而且每集只有20分钟左右,但还是让我看得很激动,毕竟是童年时候的回忆啊,况且这部动画片真的很能感染人的情绪,再次被它的主题曲和片尾曲感动。井上雄彦,真是做了件好事啊。一直以来《灌篮高手》没有出全国大赛的动画片,好在已有部分还是比较忠实于原著的,接着看漫画也不会觉得莫名其妙摸不着头脑,真是值得反复看的一部分漫画啊。
我愤怒地发现,我登录不进beta.blogger.com ,甚至ping都ping不通这个域名!为GFW的存在感到羞耻,更加的开始憎恨这个国家,这个社会,这个民族,这个统治阶级。防民之口,胜于防川?所谓上有政策,下有对策。你有GFW,我有Tor!这世界自从有了google,就有了让G.C.D忙的,有了google,你封不死我的BSP,我还是照样大摇大摆进来发blog,还不是用的FTP,也不是用的Email,而是用的Web在线编辑。 尽管速度是慢了很多很多,但这样的封锁只让我坚定了继续使用下去的决心。我不要使用国内的那些乱七八糟的稳定性奇差的BSP,我只想在这块全世界人都可以自由访问的天地占据一个小角落。 发现用http://missdeer.blogspot.com.nyud.net:8090/访问不太稳定,似乎用http://www.pkblogs.com/missdeer/就稳定多了,而且看它的界面,好像就是为了给我们这些身处于可怜境地的人儿提供一个快速稳定访问blogger.com的机会。 那些领导人应该都知道大禹治水吧,还不懂疏通优于围堵的道理吗? 不多说别的,将blogger.com进行到底!
唉!心寒啊!没有归宿感!使劲挖我的井吧!他们爱咋滴就咋滴了!自己想开点看开点好好活!
昨天晚上开始还可以访问我的页面的,还顺便发了个新志。过了一会儿再去,就打不开了,ping也ping不通,本来想是不是这边网络的缘故,就等一段时间看看。今天再来看,还是不行,跟昨天一样。GFW还真是不爽啊!赚点钱,移民算了…… 现在只有找办法访问我的页面了。目前找到两个办法,一个是在域名后面加个后缀,原来我的页面地址是http://missdeer.blogspot.com,现在改成http://missdeer.blogspot.com.nyud.net:8090/就可以访问啦,还有个办法,是通过http://flyproxy.com/这个代理服务器访问,直接在它的页面上输入http://missdeer.blogspot.com就能跳过去了。这两个办法其实都是通过代理转过去的,所以速度上明显不如以前直接可以访问的时候了! 今天好奇,用了一个http://search.blogger.com的blog搜索功能,自恋的偶搜索了一下missdeer,偶然发现了afei在半年前写的一篇blog,唉,一切都过去啦,再也不会有那样的时光了,都是偶的错啊! 最后再提醒一下,可以用http://missdeer.blogspot.com.nyud.net:8090/来访问这个页面哦!尽管速度慢了点,但blogger.com真的堪称世界第一的BSP了。
在公司网上看到有个哥们儿说,有FreeBSD、Debian、FC、Suse、Mandrake、Gentoo的光盘,只要一罐可乐就可以换。早上吃过早饭,顺便在小卖部刷了一罐,下午就发邮件打了个招呼过去了,换了18张碟,哈哈,虽然版本老了点,但装在家里那个老爷机上也没什么关系吧,自己从网上down的话,还要花好多时间,还要刻,要费些碟,所以这样还是值得的,啦啦啦…… 感觉好久没有好好练习方块了,虽然每天都会打一会儿,但最近都没有什么进步。真不知道那么3.0的速度是怎么练出来的,真是只是这样不停地打就能练出来的吗。现在只知道要尽量缩短思考的时间,尽量摆放到需要旋转次数少的形状和移动次数少的位置,其它的就不知道,只能这样摸黑练了。 突然觉得,要是我的方块可以装载JPEG格式的图片,skin的体积岂不是可以又小很多,再怎么样,JPEG这样专用的有损图片压缩方案压缩率就是比7z这样通用的无损压缩方案高得多。先看看GDI+或者libjpeg哪个方便点。
买了对周生生的耳环,还以为是黄色的,结果是白色的,不适合妈妈啦,只好以后再买其它的给妈妈啦! Firefox在我的机器上,启动时间超过10秒!估计跟我的机器的配置有比较大的关系,我猜即使在我老家那台Duron1G+384DDR的老机器上,也会在5秒钟内就启动吧!一点都没看出来2.0比1.5改进在哪里,唯一的印象的是,标签栏的外观改了,有两个扩展不能用了,其它的真的不知道了。不过最近一直在想,怎么能在Gecko内核的浏览器中“胡作非为”,像在IE中得到了IHTMLDocument2一样,也许用XPCOM可以吧,不过一堆的英文资料,看着头大。 挖了一会儿井,比前两天挖的都多,下面要做的是,消行处理、输入处理、配置对话框的实现。
糟了,我真的太没有自制力了。 好不容易上网最新时间down到Firefox 2.0正式版,试用一下,感觉打开网页的速度还不如1.5的呐!算了,先用一段时间看看,到底哪个版本好一点。有两个扩展也不能用了。
因为要缴房租了,去取了钱,顺便查了一下余额,天哪,我的钱都到哪里去了!唉,郁闷之极,这几个月来,一直为了这样的事情烦!心理总是不爽啊,不平衡啊! 每天下班回家,便挖一点,看心情好坏挖多挖少也不重要,最后能挖出一口属于自己的井就可以了。 给自己定了2大类目标,写在图片上,设为桌面。 技术目标:C++泛型编程、Lua及与C++集成、DX+Win32API游戏程序设计、编译原理。 产品目标:方块、Socket捕获、按键辅助、NES模拟器、音频播放器、桌面管理。
和尚挖水 有两个和尚住在隔壁,所谓隔壁就是隔壁那座山,他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去溪边挑水,久而久之他么变成为了好朋友。
就这样时间在每天挑水中不知不觉已经过了五年。突然有一天左边这座山的和尚没有下山挑水,右边那座山的和尚心想:“他大概睡过头了。”便不以为意。
哪知道第二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月右边那座山的和尚终于受不了,他心想:“我的朋友可能生病了,我要过去拜访他,看看能帮上什么忙。”
于是他便爬上了左边这座山,去探望他的老朋友。
等他到了左边这座山的庙,看到他的老友之后大吃一惊,因为他的老友正在庙前打太极拳,一点也不像一个月没喝水的人。他很好奇地问:“你已经一个月没有下山挑水了,难道你可以不用喝水吗?”
左边这座山的和尚说:“来来来,我带你去看。”于是他带着右边那座山的和尚走到庙的后院,指着一口井说:“这五年来,我每天做完功课后都会抽空挖这口井,即使有时很忙,能挖多少就算多少。如今终于让我挖出井水,我就不用再下山挑水,我可以有更多时间练我喜欢的太极拳。”
我们在公司领的薪水再多,那都是挑水。而把握下班后的时间挖一口属于自己的井,未来当年纪大了,体力拚不过年轻人了,还是有水喝,而且喝得很悠闲。
11点半左右,彭彭突然给我打电话,我很惊讶,说这么远有什么事啊,他说我回来了。更惊讶,呵呵。然后他叫我中午出去一起吃饭,我说晚上行不行,他说晚上要去珠海,于是我说再等半个小时吧。接着我给小思宇发邮件,她还多得意的,我从文字中都似乎能看到她满脸的幸福,说每个人知道后都很surprise。 12点我便出来,说在金泉乐,拦住一辆小巴便冲过去了。4个人,吃得还算开心,我也奇怪,自己居然也努力想多说几句话,要是平时,我肯定只是一个人闷头不响的。
前言 这次去贵阳玩,是完全没有计划的,只是想到有个表哥在,可以不住什么旅馆之类的地方了。有小妞可以找来一起玩,呵呵,就直接冲过去了,真是头脑发热!10月2日 早上八点就被闹钟吵醒了,准备一下行李,其实也没什么东西,把几件换洗的T恤装进去,再塞进一个笔记本,就没什么东西了,收拾了一下,然后就出门去坐车了。只是听说华联大厦有机场大巴,可我以前一次都没去坐过,只知道华联大厦在深南路边上,却不清楚具体的位置。前一天晚上在网上问了一下同事,说可以在上海宾馆坐地铁过去。于是先坐391到了上海宾馆,然后去地铁站,看了一下指引,原来只是一个站就到了,出来一看,就在茂业深南店旁边啊,晕死,大巴就停在那里,20元一张票,40分钟到机场,那时才10点半,比我计划的早到了半个小时,然后换了登机牌,无所事事了,就在候机室里坐着打瞌睡了,醒过来正好快11点半了,刚好可以登机了。登机后就给afei,小妞,表哥还有lili都发了条短信。倒是小丫头还没等我发,就先发过来问了,呵呵,不知道这一天小丫头是怎么过的,说是有师兄要约出去吃饭什么的,具体的我也不问了,不想那么八卦啦。发了短信后就关机了。飞机起飞后,我就一直等着吃中饭,呵呵,好像我每次的飞机都是在吃饭时间的,而且我也很喜欢飞机上的饭菜的口味,这次我要了份鸡肉,一看那榨菜,还是浙江余姚产的,晕。 1点半就到了贵阳机场了,看了下短信,表哥说要晚一会儿才能到,于是在门口百无聊赖地等了近半个小时,才看到他过来。突然感觉怎么变这么高大了,好像身高也比以前更高了,人也壮了点了,走路动作都像个成熟男人了,晕死,才比我大半年的人啊,一段时间不见就这样了,看到他后边好多白头发。看来有生活压力还真是我暂时体会不到的。路上他跟我说,问他二爹借了五万块钱去搞装修,等等。其实很不错了,我的房子还不知道在哪里呢,这样漂泊不定的感觉,而且我买房子肯定没这么好的机会了,才一千多一平米。我还能说什么呢。一路辗转打的到了他住的地方,顺便看了一下他的房子,90多平米的,装修还才开始,这样他的人生基本就固定下来了吧。其实我一点都不羡慕,我还是想四处走走,在飞机上的时候看到一本杂志上介绍欧洲的一些地方,比如都柏林,罗马,维也纳等等,我好想有机会都去逛一下,要努力赚钱啊。虽说我还是想回老家找个运营商的工作蹲起,但我很清楚,靠这样的工作赚来点钱,是买不起房子,过不上小资的生活的。所以似乎我的想法有点理想主义了,我想的是赚钱是有另外的方法的,而那个蹲单位里的工作只是为了充实一下生活,满足一下精神需求! 然后两个人坐车去花溪公园逛了一下,吃了一碗正宗的花溪王记牛肉粉,味道比起深圳那家来,似乎要好很多。深圳那次跟小妞小玉玉一起去的,把我吃出心理阴影来了。她们也略带笑意得说,看来花溪王记把我伤很深。到5点半的时候,我们就开始折道回家。奔到他女朋友住的地方,看造型,有点像超女,晕!还好,看来人比较活泼外向的,两个人也比较喜欢搞笑,在厨房里做笑,做了两个小时吧,才开始吃。小妞还叫我一起去和她还有她妹去吃肥肠鱼呢,不过想到也只有这次晚饭是和他们一起吃的,第二天他们就要去女方家里,所以无论怎么样,还是和他们吃吧,之后两三天怎么样都可以。 想不到表哥也会坐菜了,做的土豆红烧肉还味道真不错呢!就是往成熟持家型男人发展了啊! 吃完饭,看了会儿电视,回到他住的地方,打了一会儿方块,看了成龙的《80天环游世界》,就睡了。10月3日 早上早早地被火车的鸣叫声和轰隆声吵醒了。七点半的时候,表哥就收拾了东西,去见岳丈大人了,剩下我一个人,好自由。洗漱了一下,就打开电脑玩方块,大概9点多一点,小妞发短信来问我起床没,然后两个人开始商量见面事宜,最后决定10点半出门,在火车站见。10点半出了门,先问了一下小区的保安,然后走到岔路口,又问了一下人,等到一辆直接到火车站的中巴,11点10分到了火车站,大概过了10多分钟,小妞和她妹妹就来了,小妞说怎么不穿红色的衣服了,都不好认,我说嘿嘿这次没带红衣服,都是这样浅颜色的,还有一件你这样颜色的呢,小妞就问哪一件啊,我说是新买的,呵呵。 随后,我们打的走了,中途放下她妹妹,我和小妞则去吃了烤肉。这烤肉是用细铁丝串起来的,有各种肉类,比如猪肉、羊肉、牛肉、脆皮肠、黄喉、烤螺、猪皮等等,跟吃火锅的菜式那样多,我因为没吃早饭,所以还叫了一碗炒饭,还和小妞人一叫一碗冰绿豆汤。吃完烤肉,喝下那碗冰绿豆汤好爽哦,一直从喉咙头开始凉下去到胃里为止。 然后去贵阳大剧院看电影,小妞的两个同学已经在那里等了,有一个是去过深圳的,所以见过,还有一个是第一次见。我都好久没进过电影院了,他们买了好多零食,电影是个成龙和古天乐演的新片,很搞笑很有趣,里面还有个娃娃,也很可爱,剧情也可以,一直看到2点多。 看完电影,决定去花溪吃小吃去,坐了中巴车,一路狂奔,到了花溪,直接走到“小吃一条街”,看到一家做小豆腐的便坐下开吃,吃好了多小豆腐,还有冰粉、土豆饼等,又吃撑吃爽了,冰粉直接灌下喉咙的感觉就像刚才喝冰绿豆汤一样。吃完小吃,他们又带我去看“黄金大道”,走了一段路后坐上一辆小小的三轮摩托,可以承载4个人。到了那边看到有马可以骑,不过里面人太多了,便一路走过去。小妞还去玩转的糖,还转到一个凤凰。走到陶艺吧,看到都是小朋友们在里面玩,我们就不好意思进去了。看到有卖“玫瑰糖”的,我也是第一次听说这个名字,只是小时候看到过这个的制作过程,我们那里叫“扯白糖”,因为最后的过程是那糖不停地在被撕扯,从红禢色最后被扯成白色为止,所以叫扯白糖。这里卖的是没有扯白的,而且据说是带有玫瑰香味的,所以叫玫瑰糖,不过我是怎么也闻不出香味了,但他们说这是只可意味不可言传的。我和小妞就一人一个在那里绞啊绞的,还因为太过专心,没看路,一脚踩到马粪上。一路走下去,终于看到一条石子和石板混合铺成的路,两边种着很高大的法国梧桐。听小妞介绍,是因为这里每到秋天,梧桐的落叶掉满了地,一片黄色,所以叫“黄金大道”。小妞玩腻了那玫瑰糖,我就把她的那个也吃了,嘿嘿,甜死我了。看到那里有汽枪射击的游戏,我便过去玩了一下,6块钱可以打10发子弹,前5发因为有一发是打了7环,把成绩拖累了。后5发打了3个8环,2个9环,达到42环可以奖2块钱,刚好10块钱的话还可以再打2轮,小妞就上去试了一下,这家伙还打到几次10环的呢。走到快尽头了,我们折回来,又坐小三轮摩托到花溪公园门口,那里有公车站。 折回到小妞同学的家里,因为我们都很饱,吃不下东西,便打起双扣来。手气很差啊,才打到3,小妞他们都打到10了。出了门去吃烧烤,一直走到小妞家楼下,吃起烙锅来。这个烙字还是询问了几次,思考了几次来认识到的,呵呵,就是那种似炸不是炸,似烤不是烤的。点了一条鱼,一些臭豆腐,还有些其它我都记不得名字的菜,又吃爽啦!吃完过后,去了小妞家里,范妈妈在家里,看起来跟我妈妈差不多的一个中年妇女。还又给我们做了绿豆汤来喝,这下真的是撑死了。小妞的房间好大哦,不过好像床比较小,小妞还在那里说,没整理床,呵呵。10点的时候,才从小妞家出来,她同学带我去坐11路公交车,1块钱坐到大转盘的地方,问了一下去三江口,只要4块钱,便上去了,到了那路口,我叫他开进去一点,他说要5块钱,而我关键是想去打开那整钱,便叫他开进去一点。开始买了支雪糕,还说没零钱,晕,没办法,只好去隔壁的一家店里买了包云烟,才有了零钱付车费。再一人走回小区,开始还担心这么晚了,会不会被门卫拦住,还好,没拦。10:50左右到了住处,小妞发短信来问我到了没,我说刚好到,要去洗澡了。 打开电视,洗了澡,打开电脑玩一会儿,睡!10月4日 早上照例先来了一次,然后继续睡,结果8点半就被xcc的短信吵了,于是起来打方块。9点半过的时候,小妞发短信说可以出门了,10:20在火车站出站口见。这次是轻车熟路了,走到那岔路口,直接一块二角钱坐到火车站。稍微等了一会儿,小妞和彭力就来了,到火车站对面坐2路公交车,到黔灵公园门口,可惜很遗憾的是,下雨了。 只好取消了爬山计划,打的到了一个地方吃起丝娃娃。小妞教我怎么用一张巴掌大小的皮子包起那些刮成丝丝的凉菜,然后浇上一些事先自己和好的辣椒油,再一口吞下这个包包,像春卷一样,但要小一些,而且听小妞说是因为包想来像人们给婴儿包起来一样,所以叫丝娃娃。我好像吃了16个吧,挺好玩挺有趣的。不由地感叹,贵阳人还想会研究吃的东西,我使劲想了一下我老家那边,似乎真的没什么特别的小吃之类的,我们那边的人好像对吃的不是很在乎,只是随便吃点炒菜就罢了。吃完丝娃娃,又走到旁边一家小吃店点了一笼灌汤包和一笼灌汤饺子,被我和彭力一下解决了。往旁边一走,又吃了一个烧卖,好能吃啊! 吃撑了,就要走走消化一下嘛,就去逛了一下电脑市场,随便看了一下DC,比起深圳来还真的贵不少,比香港的当然更贵一点。其实电脑市场也只是随便看看,我并没有什么想买的东西。去看了下D版碟,只有很少一点,更何况我现在什么东西都习惯从网上down,有了eMule真是好啊!从电脑市场出来,走进一家叫“昨日重现”的会所,里面可以喝茶,咖啡,点了壶茶,坐了好一会儿。后来无聊了,彭力就叫了一个人来一起打双扣,唉,手气像前一天一样的差。 一直打到5点多,就回小妞家去,范爸爸在厨房做菜,不一会儿就开饭了,菜很丰盛,莲藕炖龙骨、蚂蚁上树、肉沫蒸蛋、辣子鸡、香肠等等等等,范妈妈太好客了,我又吃撑了,足足吃了4碗!范爸爸好像是个不苟言笑的人,只吃了一碗饭就放下了。就我和彭力吃好多哦,把几盘菜都消灭干净,把饭也全部干掉了。吃完饭,我们又打起牌了,小妞在那里说笑,花了1400的路费,跑到贵阳打了两天牌,呵呵。直到10点,才出来,到了大转盘处,原来有那种mini巴可以乘坐,1块半就能到了,比三轮摩托还省呢!10月5日 今天不出去了,起床后打开电视,再开了方块来打,又写了一会儿代码,有点怪,1秒的interval的timer居然很不精确,想让它在60000ms的时候能触发一下,结果总是差好多,54000ms左右就会触发,很奇怪。到了中午,去买了包花生和小米花糖来吃。照彭力和小妞的说法,这半天可是值400块的哦! 然后等到3点半过后,下去1楼找表哥的同事,没在,打电话也关机了。再回到10楼,敲开对面屋的人家,把机票钱和钥匙放在那里便出门了。有点雨,昨天也是因为有雨才爬不成黔灵山的,郁闷,而且没有太阳,气温便下降了好多,我只有短袖T恤,还好比较不怕冷。 坐大巴到火车站,大概4点20的样子,问了一下有没有机场大巴,走去看到机场大巴,发现是自动投币的,只好去买了个烤红薯换了零钱。突然又想到,大巴会不会开很慢,不知道到机场要多久呢,于是还是打的了,50块钱。司机问我是哪里人,我说是重庆的,哈哈,操着很不地道的重庆话,他果然说我的重庆话不正宗,我说我长期呆在深圳的,来贵阳是有同学。到机场还不到5点,于是在候机厅里看起《西游记》来,看得津津有味。看过《西游记》又去看卖书的地方,发现有本小说《和空姐同居的日子》还挺符合我的口味的,一直看到登机为止。 在飞机上吃了晚饭,这次的榨菜是涪陵产的了,呵呵。主菜是鱼,还挺好吃的,飞机上的饭菜总是很好吃,至少我是都这么觉得。大概1个小时,就到深圳了,第一次在高空看到灯光点点的深圳,广播中播报,深圳的气温30摄氏度,强!又坐大巴到华联大厦,不知道为什么,才9点,华强北的那些电子市场、电脑市场都关门了。三下两下就转车回到了家,开机,上网!后记 贵阳还是多有趣的,给我感触最大的就是在吃的方面,有太多值得非贵阳本地人去试一下,而且如果是像我这样对自助游是文盲水平的人,最好能有个本地的人带去逛,像小妞这样好吃又爱玩的人,真是绝佳的导游,还有她的同学的全程陪玩下,觉得还是挺开心的,有些地方没去成有点遗憾,有机会应该再去一次,呵呵。
10月1日 昨晚就被告知今早上7点半要打电话去叫起床,虽然是后半夜3点钟才睡下的,但还是设了闹钟,7点半的时候就被闹醒了,拨了一下电话,然后发了两条短信,便再也不想睡了,起来玩方块,真是堕落啊!大概9点的时候,收到短信说到上梅林了,我估计了一下应该马上能到我家了,就开始刷牙洗脸刮脸,9点20的时候就到了,我顺便又用了一下洗面奶,然后就在那里闲聊,大概等到9点50的时候,出门去坐车。到了百草园,找到同事们,他们已经在那玩了一会儿了,我几乎是迟到了20分钟。然后上去互相介绍了一下,开始打起羽毛球来,好久没运动过了。在接下来的不到2个小时里,陆陆续续玩了几次,然后就说去吃饭吧,不想去食堂,想不到毛氏湘菜馆已经被关了,要么被迁走了,那里正在拆迁。于是我轻车熟路地带他们到金泉乐湘菜馆,点了个美味鱼头(失败),莲藕炖龙骨(还行),酸辣鸡杂(也可以),手撕包菜(获得好评)还有个小葱拌豆腐(不评论)。那些女孩儿们本来食量就小,随便吃了点就不动了,我和罗总想吃碗饭,结果等了好久,硬说饭还在做,气死,我放弃了!然后各自做各自的事去,同事们要去逛街,我就去百草园超市买东西,买了几本书,两盒月饼,要带一盒去给表哥,还有些小东西,就坐车回家,回家洗了个澡,好舒服哦,这样的生活才健康啊,好久没运动了,吃饭的时候右手拿筷子都是抖的,屁股走路的时候也是酸疼,晕!洗完澡,在那里看碟,想不到我down错了,不知道是哪里的一部什么乱七八糟的外国片子,也叫《夜宴》,晕死!幸好还有《百慕大三角》于是看到6点,虽然很困了,但还是坚持住了,谁到自己睡那么晚呢,才睡了4个半小时,真是自作孽不可活啊!去对面的小吃店吃了晚饭,想起来要是自己会做饭就好了。吃完饭,就打算回去了,送别人回去,天黑了嘛,还有那么些书,月饼,那么沉,送去的时候还好,车上人不多,送到楼下,我就折回来了,回来的车上挤满了人,郁闷,只能站着,还困死了! 就这样,一天是过去了。上网查了一下去哪里坐机场大巴,明天要买去见表哥,呵呵。 突然觉得郁闷,怎么我达不到1.2x以上了。要把自己调节到“无我境界”,才能在原有基础上加快速度吧!呵呵,从《网球王子》里看到的这个名字,不过听里面的描述跟我的要求是差不多,只有不经过大脑,直接的肌肉反射就能做到相应的动作,才能提升速度! 单机3.0终于在今天发布了,算是国庆献礼,我都已经玩了好多天了。在论坛里得到的灵感,可以带skin功能啊,还有就是直接从Lua脚本里定义游戏逻辑,这样可以在不修改主程序代码重新编译的情况下,就能添加新的游戏方式,比如前几天在论坛里听说到的Cascade模式。我觉得我的想法要是这样真的能实现的话,肯定是很cool的,至少现在好像很少有这样做的tetris game哦。
和同事切磋了一下方块,呵呵,好玩,悍超纯点大概1.0x的速度,居然也能打到总监级别,厉害! 不知道为什么,跟他们打了几盘后,再自己打单机,发现好像比以前快了一点点,超过1.1x的机会多了很多。
快半夜了,xcc还给我打电话,两个人就因为一些能让我们郁闷的事又为我们的客户贡献了大半个小时的话费!这样谈过,心里就很轻松,连像他们这样我看着都觉得艳羡的人,都有这样的困扰,那我还在乎啥呢?冥冥之中,自有安排,不用刻意追求,一切随缘吧。 ccal被我加了几行代码调试得差不多可以实用的阶段了,下次再来吧,be happy!
在实验室里,一个女同事和我旁边的男同事在调校一个仪表,仪表就放在我的电脑旁边,两个人就两个头都处在仪表前,我就开玩笑说,来,给你们拍大头照。突然,觉得心里隐隐一阵酸味,想起那个家伙。我还是挺小心眼的,就是很难过自己那关,我使劲劝自己那都是过去的事了,心情才稍稍平静了一点点。
xcc给我建议的出游计划因为另一方的不乐意而泡汤了,这个家伙! 只好另作打算,去哪里闲逛一圈,实在不想这么7天都呆在屋子里头,对着电脑,妈妈说要少打电脑,以后会生不了小孩的,郁闷,比起长期放在裤兜里的手机辐射来说,这个影响应该小很多吧。不过妈妈的话也是不无道理的,本来在公司就是超过8个小时对着电脑,每天下班回家做的第一件事还是打开电脑来上网,确实无聊啊,上次luolu问我平常做些什么,我就是压根儿想不出有什么值得说的,生活质量之低下啊!出去一趟要花些钱吧,不过钱总是要花的,攒了也没用,这点钱能买房子吗,能买车子吗,不能!那为什么不把它花在其它地方能让自己也稍微高兴一点的地方呢,生不带来,死不带去啊,应该像Linux消耗物理内存一样,不要让它闲在那里! 改了一下LLYF WallpaperHelper,能保存和装载配置了,不过还有一点是,要加上月历生成功能哦,估计不是很难吧。^_^其实我觉得这个程序的功能应该作为鱼鱼桌面秀的一个插件来实现,但是鱼鱼桌面秀总是要抢其它前台窗口的输入焦点,所以我只好很惋惜地放弃了这个想法!
今天晚上去SHOWGOOD的新家里蹭饭吃了。两口子租了套两室一厅,布置得挺温馨的,小伙子转变得挺快的,也不知道是不是以前我们就没有发现,他居然还会做菜,而且还做得有模有样的,味道也还可以,虽然稍微,我说是稍微哈,淡了那么一点点,幸好我们老家那边就是吃得清淡的比较习惯。那苦瓜花生汤,清蒸鱼味道都不错,呵呵。有家室的人,生活就是不一样哈。 这游戏,真的很容易让人堕落的。火拼俄罗斯我就玩了好久了,一个单机版的也能玩一天,真是堕落啊,我都鄙视我自己了。我的速度提高也太慢了,练了两星期多了吧,大概就提高了0.2,从0.8x提高到1.0x了,又一次证明,我的各方面素质,至少从天赋上来说,实在是算差的。偶尔看一下coolkuai的论坛,关心一下怎么传说中的单机3.0版还不发布出来,好些人在论坛里叫嚷着要公测,没想到今天被我意外地找到了下载的入口,真不知道他们是不是故意的,直接用域名访问的是另外一个直接指定的页面,排版设计还要好看一点的,就有更丰富的内容,可能是他们专门给自己圈子里的一群人设计的。被宣传得神乎其神的3.0并没有想象中的那么吸引人,也没有多加多少特性,不过有几点还是很明显能看出来很体贴很迫切的设计的,比如能保存设置,2.0的每次新打开,都是没有开键盘加速的,现在能保存这个设置了,不过没找到它是保存在哪里的。另一个是,对QQ火拼俄罗斯界面的实现,更好地有现场的感觉了。其它的,我倒是觉得对我影响不大,据说是改了加速的内核,只是觉得移动时就是没有Q块上的流畅,2.0也是,还增加了打榜等等其它一些小特性。反正其它的我倒是觉得都是不重要的,只是宣传得太夸张了,什么巨献啊,重磅推出啊。我要做的话,就做一个仿Q块的,至少是联机功能一定要有的,可以另外写个Server,今天又突然想到,还要有专门的训练模式支持,因为本来就不想跟Q块竞争,只是作为一个训练工具。 硬盘又一次出问题了,这次是在从一个分区向另一个分区移动大量文件的时候弄出问题的,所有的东西都又不见了,也懒得再恢复了,只是可惜了那些照片。还有很多动画片,好久才下下来的,那些文档资料,工具软件,都没有喽,有点郁闷的说,再一次得到的教训,对于比较重要的东西,就应该刻到光盘上备份的!
下午的时候xcc发短信来问我有没有空,晚上一起吃饭,我当然没事了,反正也正在郁闷现在每到周五都是凄凄凉凉的,就答应了。 到了下班时间,我就缠住一个同事,要蹭她的班车票,哈哈,一起坐车到了梅林,路上还堵了一小会儿。 去接xcc的女朋友的时候,雨下大了,等我和xcc回到他屋里的时候,鞋子已经是灌满水了,裤子也全湿了。衣服稍微好一点,只湿了肩膀上一点。 然后去那个小馆子,三个人点了一个鸡煲,一个水煮肉片,一个葱花炒蛋,还喝了两瓶啤酒,才54块钱,哈哈,真便宜!
但是以前被GFW封过,虽然现在暂时解封了,但是以后呢,谁也不知道会怎么样!不过,先也不管这么多了,被封了又怎么样,考察了几个BSP后,包括MSN、Blogsome这些非国内的,最后决定就迁移到这里吧,因为实在忍受不了CSDN的blog不稳定了。
Category Shareware
总共花了十几个小时用Qt写了一个简单的、具有图形用户界面的、CoreDNS配置文件生成工具,只有一个主窗口,传统widget比较丑:
前段时间突然心血来潮开通了一个微信公众号,虽然至今为止也才写了十几篇文章,但是用了官方文章编辑器和一票第三方文章编辑器后,我决定自己写一个。
这个app在2014年就上架过,除了一开始送出去一堆兑换码以外,以每月大约不到1个付费用户的速度卖出过几份。后来也就更新过1个版本,后来就懒得更新了,直到2017年10月因长期不更新被下架了。
这是好几年前就开的坑,当年是对标Launchy,后来推翻重写,想对标Alfred,到目前为止,也仅仅是完成了很少几个功能,很多精力和时间都花在UI上了。一开始是照Launchy的完全图片自绘,最近加上了Alfred风格的UI。
自从知道怀孕28周起要数胎动,我就花了几天时间写了个简单的app给老婆数胎动用。
大约一年半前因为感觉遇到解决不了的技术问题,于是imchenwen的坑就扔下不管了。上个月的时候突然意识到,妹子喜欢看网卡的视频,优酷腾讯芒果爱奇艺等等,但是因为身体原因捧着个手机或iPad看会觉得头疼,看电视就要好很多,所以就萌生了在电视机上看网络视频的想法。
老早就注册有赞云了,之前随便玩了一下,感觉可以用,加上自己对web开发并不了解,就放下了。
最近这段时间都在写一个叫UMLGen的GUI程序,从名字可以看出,就是一个用来画UML图的工具,与大多数现有的WYSIWYG(所见即所得)的UML画图工具(比如Visio,StarUML等等)不同的是,UMLGen使用代码的形式来描述UML图的呈现,与LaTeX的思想类似,即WYTIWYG(What You Think Is What You Get,所想即所得),我个人认为这种方式特别适合程序员使用。现在可用性已经很好了,主窗口截图如下:
最近又要在一个Qt程序中解压缩一些zip文件,以前用过QuaZIP,总觉得如果能不引入一个额外的第三方库会更舒服一些,于是上网搜了一下,还真有办法!
抓取网络小说的小程序断断续续有了不少更新,除了支持更多的小说网站外,还有一些值得一提的内容:
前些天突然心血来潮,写了个小程序,用于从网上抓取网络小说,然后生成content.html,content.opf和toc.ncx文件,再放入一个合适的字体文件,比如经过我几番比较,在我的Kindle4上使用方正准圆比较好,最后用kindlegen生成mobi文件,于是可以使用kindle来阅读网络小说了。
imchenwen的进展不快,这段时间主要在做两件事:
不知道怎么想的,突然开了个新坑,因为bilibili mac client并不能好好地工作,所以自己写一个也挺好玩的。
Avege开源后并没有太大的变化,除了收获了180多个star,大概也没什么人真正用上,别说PR了,连issue都没有,不过也收集了一些意见和建议。
昨天把Avege客户端部分的源代码单独取出来,放到github上了。然后在v2ex上发了个帖,在twitter上发了条推,在Telegram上的一些群里发了条消息。终于有了一个star数过100的repo了:P
经过大半个月的折腾,兼容SSR混淆和协议的坑终于填上了,目前混淆支持plain、http_simple、http_post、random_head、tls1.2_ticket_auth几种,协议支持origin、verify_sha1即原版SS的One Time Auth、auth_sha1_v4、auth_aes128_md5、auth_aes128_sha1几种。
之前写好的tls1.2_ticket_auth在接收到大量数据时会decode出错,后来发现auth_sha1_v4在接收大量数据时最后一块数据时会要等一段时间才能收到。由于tls1.2_ticket_auth的问题在前面那么多天的仔细排查定位后,仍然毫无头绪,我觉得auth_sha1_v4的问题应该会容易一些,就先尝试一下修正这个问题。
代码几天前就写完了,就是调试不通,昨天晚上偶然在github上看到从libev版分离出来的obfsplugin,都打算用CGO集成到avege去算了,今天上午甚至把编译、链接错误全都改完了,后来想想CGO还是不太好。
本来实现了tls1.2_ticket_auth混淆方法后,我觉得够用了,便想直接去做auth_sha1_v4协议了,但是调试了两天,没调通,很沮丧,还觉得没什么头绪。至少在调试混淆方法时,我用C#版做对比,通过抓包可以明确比较我的程序混淆结果是否正确,但协议就要麻烦些,协议是将加密前的数据预处理一遍,很难对比我的程序是否处理正确了。
虽然Go实现的代码是照着C#版的代码翻译过来了,但是引入了很多问题,经过几天的仔细排查,现在tls1.2_ticket_auth混淆功能终于完成了!稍微记录一点需要注意的点,以便日后翻阅。
这几天断断续续地移植着SSR的一个混淆插件tls1.2_ticket_auth,至今仍然没能正常工作起来,忧郁啊。稍微记录一点读ss-go和ssr-csharp/ssr-libev的代码所得,以便日后翻阅。
Avege最早的目标是成为一个redsocks的另一个实现,用Go做方便地跨平台,同时相比redsocks原版要多增加shadowsocks协议的支持。可是后来却只实现了shadowsocks协议,就只顾着做其他功能去了。
一直以来说微信公众号的阅读体验不满意,但是现在越来越多的高质量的文章都发到微信公众号上去了,再加上之前Google Reader关闭,这让我几乎放弃了之前每天坚持阅读高质量文章的习惯。
前些天看到有人移植了SSR Android版,我就顺便看了看代码,结合网上的一篇文章,觉得似乎挺简单的,它(官方也)用Java/Scala写了个外壳和启动VPN service,其他功能是几个用C写的程序共同完成,包括redsocks,tun2socks,ss-tunnel,ss-local,pdnsd。
之前在做的滚球推荐app只能在Android上分发,后来想想还是咬咬牙提交到Apple App Store试试,不过还是做好了被拒的心理准备的,因为照以前的经验,这个App有两个可能的原因很明显会被拒,一个是功能太简单,基本上只是浏览一个表格而已,另一个则是用户付费的功能,因为Android系统在国内收费不易的情况下,我就一直懒得做,只是放了个页面说明,让用户加我们的QQ/微信来通过微信或支付宝等国内流行的移动支付方式来收费。
原本avege就是有一个解决dns污染的方案的,是参照ChinaDNS的原理写的,简单说来就是同时请求国内和国外的DNS server,当收到结果的IP被认为是国外时,丢弃国内DNS server的结果,只取国外DNS server的结果,不然就取国内DNS server的结果。这是基于一些基本的假设,比如总是国内DNS server先返回结果,比如GFW不会使用国内IP来污染。
之前说过想做个类redsocks的实现,纠结了一些天看代码后,现在终于用Go做了个初步能工作的版本出来,名字叫Avege,依然是某女推友的id。
在高中同学的公司里兼了个职,原本只说是提供技术部发展等方面的咨询和顾问等事宜的,于是我要的兼职报酬也不高。后来他说要我写个程序,做债权匹配管理,我就觉得有点坑爹了,我顺势就提要求配一个笔记本,虽然是最低配的。一直拖拖拖,一方面是确实拖延症严重,另一方面也确实觉得这东西应该工作量不大。后来做的时候发现还是有些折腾的地方的。
前段时间用ss-redir实现了后端是shadowsocks的翻墙网关,虽然真的实现了全局域网自动翻墙,但仍然留下了各种不足。
前几天发现公司网络有个奇怪的问题,公司的DNS解析居然把花生壳(oray.com)和公云(pubyun.com)的域名给劫持了。
昨天晚上那两个合伙人跟我说他们打算先不上网站了,先考虑进驻诸如饿了么,美团糯米之类的外卖平台,也不做中饭和晚饭了,只做早点。
昨天打算提交一个istkani的新版本到app store,其实没什么更新的内容,前段时间在UI上微微调整了一下,其他原本想加的功能一直由于拖延症而没动手。只是因为iOS8发布了,Xcode也升级到了6.0.1而想试一下。结果遇到了不少问题。
昨天收到Apple AppStore的邮件,是八月份的Financial report,原来八月份居然卖出了两份istkani,真是太让我意外了。本来自五月份上架以来,除了兑换码送出几十份以外,我就没怎么指望能把它卖出去的,虽然也有过一些升级的计划,增加新特性以及提升UI设计等等,不过后来还是一直拖延着。
这两天看论坛,又想到两个对我来说比较有用的东西。其中一个是密码管理。
最近有很认真地在写一个Google Reader客户端,仍然是使用的Qt,一切为了跨平台嘛。之前Ninayan用QML写的UI,虽然能做出一些比较炫的效果,但没有一个优秀的美工,再炫的效果最后得到的都是不好的用户体验。于是这次使用了传统Widget来做UI,感觉还不错,中规中矩的,源代码也放在github上了。
到现在为止,Google Reader的客户端功能基本上实现了,可能还有些小细节需要修改。前两天因为工作上的关系,找了点资料在看怎么提高socket的效率,公司那个产品全部是用的select模型,貌似Qt的QNetworkAccessManager类也是用的select,这个东西的好处在于大多数的系统都直接支持,思路也简单,但是对于追求高吞吐率的情况下,就得用各个系统内核各有的一套东西了,比如Windows下得用完成端口,Linux下,2.6以后版本的内核得用epoll/AIO,BSD/Mac下又有kqueue等等,可谓是八仙过海各有神通啊。然后我就又找到了asio,这个库以前用过Boost里的那个版本,没用好,当时的感觉是资料太少了,性能太差了,后来也都是尽量避开自己写socket相关的代码,直到后来用Qt中的QNetworkAccessManager。这两天抑制不住地想把QNetworkAccessManager改成用asio实现,以达到各平台优化的尽量大吞吐率。忍住!
基本功能完成后,我就开始想着把程序改成插件架构,以插件的形式支持从不同的源获取信息,比如Twitter,Facebook,国内的微博等等,也以插件的形式支持把当前内容分享到不同的宿。其实从功能上来说,跟Ninayan是有很大重叠的,毕竟当时写Ninayan也是为了做一个信息获取工具,只不过从UI的设计上限制了操作方式,最终在用户体验上会有很大的差别。
最近Ainesmile的进展几乎停下来了,因为想到要让它支持像TextMate那样的bundles机制,但又为了避开版权问题而不能直接使用TextMate的bundles,所以就想把那些bundle的格式转换一下用就行了,于是就要写个小程序进行文件格式的转换。为了这个转换小程序更具有通用性和实用性,我就很是贪心地想让它支持在JSON、Apple PList、Windows INI、Java Properties和plain XML任意二者间进行相互转换。本来想想觉得只是个很小的任务,可实际做的时间还是有很多事情要做的,而且想来这样一个具有通用性和实用性的工具应该可以发布给别人使用,于是在包装上也做了更多点的工作,比如画图标,而且为了能在Windows和Mac OS X上都能使用,同时以为以前用过的一个Rapid XML封装更容易使用,结果陷入了无尽的跨平台的fixing中。
昨天发现一个新语言,Rust,据说是Mozilla开发来为了替代C++重写Firefox用的,现在才0.3版本,语言特性也还在快速变化中。看了半天的tutorial,发现语法上给我的感觉是很像Ruby,又有Erlang的一点点元素,而它自称是一种系统编程语言,所以从一开始就很注重与C的交互。它是一种编译型语言,有个叫rustc的编译器,现在还只能通过自己下载编译源代码来使用它。看tutorial的时候突然有个念头,这些年不断冒出来的声称解决了一大堆问题的编程语言,实际上也就是它声称的那些个领域上表现较好而已啊,C语言才是王道啊,哈哈。
在编译Rust的时候,发现它自动下载了最新的LLVM和Clang的源代码并编译好了,于是我就想再试下Mac OS X下用Clang编译下Qt,以前曾经尝试过但失败了。这次也遇到两个错误,就是返回值类型要去const修饰,gitorious上已经有patch的,但在4.8.2上没有合入,自己改一下整个Qt 4.8.2就能用Clang编译通过了。Clang在Mac OS X上基于上处于产品级的质量了,但不知道在Windows上什么时候才能达到近似的水平啊,叹气。貌似Clang对unix-like的系统都支持得挺不错的,甚至能用来编译FreeBSD内核。
最近正在编写一个文本编辑器,取名为Ainesmile。按照惯例,这个名字同样是一个妹汁的id。
这个文本编辑器的目标是成为超越Coda、Sublime Text和TextMate的存在,所以基本的定位是一个代码编辑器,也可以做为一个通用的纯文本编辑器。它使用Qt开发,所以目前可以确认的是它将可以在Windows和Mac上运行,如果移植代价不大,将也会在Linux或FreeBSD等其他Qt支持的桌面环境中运行。
写这么一个文本编辑器的出发点,首先,我觉得Mac OS X上的几个编辑器的功能都很炫目,很有现代感,而Windows平台上除了e,就没有其他类似产品了,而e的功能也似乎只是TextMate的一个子集。其次,我觉得Mac用户真是人傻钱多的存在啊。
功能方面,我觉得实现起来没有特别大的技术难点,只不过工作量有点大。当前一个主要的问题是,美工方面,缺少一套用于菜单、工具栏的图标,以及程序图标。求帮助。
看了cnsw上一位年入10w刀的小牛的经验之谈,对比我自己的现状,确实做得不好啊!
审视一下自己的产品和网站,产品太小众,而且在质量上讲,确实我自己都不满意,这得改。我看了一下原来的计划,做了些调整,重构IDE推出新版本,增加PHP、Python、Ruby的支持,增加TextMate Bundles支持。另外开辟另一条新的产品线,数据库相关的,分别是几种常见数据库产品的客户端,设计管理工具,比较工具和代码生成工具。我现在都不敢预估工作量和进展了,叹气。
网站的问题更多了,页面关系比较冗余零碎;排版不清晰,凌乱,字体太小;文字内容不丰富;截图粗糙,大小差别太大,内容不清爽。这得最先改,就参考OmniGroup的好了。
加油!
很偶然才知道这个工具——Balsamiq Mockups,因为完全是在另一个主题的论坛里看到的,当时在那个论坛里之所以提到它,不是因为它的功能多强大,也不是因为它的用户体验做得好,更不是因为它能帮助人们解决实际问题,而是因为它卖得好!
以前听说那些做快速软件界面原型设计的人,是用VB、Delphi之类的WYSIWYG的RAD工具,当时我就觉得与其已经用这RAD工具了,还不如直接就添加上各种事件响应函数,然后一个产品就做出来了。直到最近看到了Balsamiq Mockups,最在这两天简单试用之后,才发现这确实是个很不错的工具。
它是用Adobe AIR编写的,所以不但可以在Windows/Linux/Mac三大桌面环境中运行,还可以在网页上运行(貌似作者原来就是在Adobe工作的)。跨平台只是一个优点,另一个很重要的优点的,它的操作确实很傻瓜化,不得不承认的是软件的功能其实也很简单,就是一组图片,拖放堆叠在一个画布上。
这是个共享软件,桌面版要79美金,如果不注册,它会每隔几钟就弹出个消息框来,并且不能保存图像,但它有一些可以免费获得注册码的方法。其实我觉得这个软件的功能很简单,即使自己实现一个,可能也不用多少时间吧!
Source Insight有大半年没更新了,我觉得以前一个同事说的没错,Source Insight可算是最不思进取的软件了,最后的几次小版本更新,都不知道到底有什么变动,反正我们最关心的一些问题都在。包括缺少Tab,缺少代码折叠,中文支持极差。不过总的说来,Source Insight的完成度是很高了,除了这三个缺点外,其他确实很难找出明显的问题来了。
我想做一个类似的源代码浏览工具,有几点Source Insight做得不错的地方,很值得学习。比如快速打开文件,快速查找函数和符号,上下文敏感的代码浏览,以及调用关系图示。Source Insight内建支持C/C++、C#和JAVA代码分析,其他的语言是通过扩展定义的规则实现的,这种方式也值得学习。
想到实现Bundle,是个比较大的挑战,有些部分必然会跟编辑器核心结合得比较紧密,对于我这种直接使用Scintilla控件实现的方式,很有可能需要修改Scintilla的源代码提供必要的支持。今天一想,其实如果基于我现在的Code Snippet的思路做下去,是很难做到TextMate的地步的,因为Bundle能完成的功能很多,输入输出条件也有好几种,而code snippet只是其中的一种而已。如果只是沿着把Code Snippet强化这个方向发展,最多实现到TextMate中Tab trigger的那种地步,而这些正是我之前一直在考虑的以为是Bundle的东西。小瞧了啊!没办法了,一步一步来吧。
昨天在QQ上跟人交流,知道一个诺基亚的手机应用开发大赛,到6月10日截止提交作品,到9月评出结果。现在算来还有足足2个月,不过我并没有好的题材。他是做图像处理方向的,而且是用QT的,所以移植到Nokia的手机上应该工作量比其他人小多了吧。另外他还给我看了一个老外做的画图软件,那界面真是赞啊!如果不是做像IDE这种严肃型的软件,其他的大众类软件真的得好好设计一下界面。
前些天Firefox自动升级到3.6.2后,看到Firefox也用twitter/facebook/blog进行推广了,看来这是大势所趋啊。之前试过几次想创建一个组织型的Facebook账号,结果一直没成功,今天发现原来是创建错类型了,Facebook有专门的为产品/组织等非个人形式的个体创建页面的入口。于是今天就在网站上加了twitter和facebook的链接,至于blog嘛,众所周知世界上最成功的blog营销案例,在软件行业应该算Joel on Software,不过Joel在那篇宣布以后不再写blog的文章中提到过,要靠blog聚集人气,不光要写自己公司的产品,还要写关于软件开发的方方面面,这样才会吸引各种相关读者的讨论。可是,我现在的致命缺陷是,我当前的英文水平完全不够用来写blog,真郁闷啊!
这几天终于把两个软件都打了个包,上传到主机空间中去了。
花了近一天的时间,在100多个国外的软件下载站用PAD的方式提交了一下。纯粹的人肉提交,不过我对这个效果一点都不看好,但也仍然是不能放过的,据说有的人能找到500个提交站,不用工具还真是很吃力的一件事。也有人说,只要提交几个主要的站点就行了。当然,download.com,奶牛站,softpedia和BrotherSoft我也都提交了的。不过前两个现在已经太牛气了,不交钱的话,是要等几天十几天甚至几十天也是可能的,我当然是用免费的,等吧!
网站也改了很多,不交流不知道自己的问题。去JoelOnSoftware的论坛上自曝了一把,虽然没几个人回复,但回复的几个人确实都指出了一些问题,自己绝对想不到的问题,而且那些老外说话也真是直接,幸亏我对英文表达的语气和情绪不是很敏感,如果是中文说的,我可能就出离愤怒了。但不管怎么说,指出问题对我来说是好事,修改了一部分,有些东西我现在没条件改了,比如要做个醒目的logo,除非以后去找美工。
另外,又去cnsw的论坛上寻求友情链接了,可惜也是没几个人响应。
昨天还被人发现程序打包有问题,看来VC2008的Redist还是要自动安装的好,省事得多,安全得多啊。
今天突然想起来,在wikipedia上添加一个词条,应该有些作用吧。嗯,明天就去加两个页面去。
这两天整调试器,经过不怎样的努力,到现在为止,功能上基本算是具备了,不过就是剩下些bug,主要有:
从debuggee发送过来的信息有时候经过XML解析会出错。
从debuggee发送过来的信息,有时候没有调用栈信息。
断点工作不正常。
有时候刚启动debuggee,debuggee就崩溃。
明后天就集中精力修改这些问题了,哈哈!
前次说到,我觉得我把wxScintilla的代码合得有问题了,我的程序中使用了wxScintilla不能多选。其实是我毛躁了,没认真看Scintilla的文档。其实当时我也是浏览了一遍代码的,发现在wxScintilla中处理用户输入后,就直接转发到Scintilla的平台无关的代码中去了,而这部分平台无关代码我基本是严格复制了官方Scintilla的代码,所以照理是应该没问题的。昨天在整理《Free Software Collection》一文时,考虑到用什么软件来替代UltraEdit,结果发现SciTE的列编辑模式已经可以做得跟UltraEdit很接近了,看了看修改版的SciTE-Ru,也同样如此。当时我还有点怀疑是不是需要在容器应用程序中做单独的处理,想想又有点不太可能。看了一下SciTE-Ru的配置文件,发现是有这么个选项的,后来就去看Scintilla的文档了,看到在Multiple Selection & Virtual Space一节里,确实有相应的设置选项。
土了啊,代码合得没问题,哈哈!
这两天又用wxWidgets,不得不感叹一下,资料实在太少了,只有一个现成的manual,其他时候就只有看看CodeLite、Code::Blocks的源代码了! 到今天为止,修改了脚本扩展的功能,可以在一个描述文件中定义多个扩展的信息。对于主菜单来说,倒是勉强够用了,不过当时因为想让描述文件中对扩展的描述尽量通用,将其他的信息都写到脚本里去了,现在看来如果要对工具栏也使用脚本扩展,那么这种方式实在太不方便了点,还是应该把这种静态配置信息的都放在xml格式的描述文件中,脚本中应该只有动态的逻辑。所以还需要修改。 今天又忘了,wxWidgets的程序如果使用Lua扩展,而扩展又装载wxLua的话,wxLua的二进制文件不能用和wxWidgets程序相同的wxWidgets二进制动态链接库,不然会出现各种奇怪的问题。这是让我目前比较头痛的问题。我现在是用MinGW来编译wxWidgets和相关工程,那么一来wxLua就只能用VC或其他编译器编译了,但我今天试了OpenWatcom和Borland C++ 5.5,连wxWidgets都编译不过,郁闷!
这是这三天来忙碌的成果,其实实打实只有近一天的时间是花在这个上面了。前天差不多提交了50个,昨天休息了,今天则是差不多提交了90个左右。本来说是一个150的列表,其中有重复的,有需要back link的,有类型不合适的,还有其他一些原因的,最终没有提交成功的,所以估计最后的总数在140左右。 今天开始就新的内容了,嗯!
原本我提交的时候,都是老老实实一项一项地填写软件信息的,虽然也知道有PAD,还装过个自动生成软件,但一直没用上。今天突然觉得应该多提交些网站,于是从cnsw论坛里找了批下载站的地址,开始提交,猛然发现大多数站点是只接受PAD方式提交的,于是没办法咯,只好老老实实生成各个PAD,再提交。 不过这样下来,发现用PAD提交,既然没有软件自动提交,纯粹人肉也不是很费时间啊!
昨天跟一个以前的同事在QQ上聊天,说到他有朋友是卖电脑的,问有没有什么软件可以OEM的。想到要OEM,必然要大众,要傻瓜,要新潮。于是我随便想了想,倒也不是真想去OEM,只是最后想到AV类的软件,实在是极其巨大的市场! 于是我又发散思维地想了想,最后觉得这类型的产品是有利可图,而且网上代码和成品软件很多,开始涉足的技术难度应该不是非常大。 唉,为了快速圈地,只好先投身AV事业了!
我到现在还是没有掌握到Windows图形界面的真正规则,只能使用各种现成的类库、组(控)件、框架来做界面。很多效果如果默认的控件不能提供,需要自绘什么的,我就傻眼了。 昨天又花了不少时间在做界面上。本来是想在一个Pane上放在一个自绘的ListBox的,结果问题不断,困难重重。其实到最后发现所有的问题都是只要使用适当的窗口风格就可以解决,我大汗!
今天偶然发现在svn trunk中的wxWidgets已经支持Ribbon了。在更新了代码后,我还特地用VC2008编译了一遍体验了一下。总的说来,可以算是Ribbon了,但感觉没有像XTP、BCG或MFC v9.0中的那么舒服。我看的是它自带的那个sample,还带着Windows标准窗口的标题栏,没有左上角的按钮和下拉菜单,也没有右上角的按钮。不知道是sample中没实现,还是wxWidgets本身就不支持。不过我想么,用wxWidgets本身就说明是重点关注它的跨平台可移植性,就不要关注这种平台特定的东西了,包括那GDI+也是。它既然号称look and feel native,那么代价就是界面不容易做得很有个性,就只适合做些严肃题材的软件了,比如IDE。 今天又看了下MSDN中对VC 2008 Feature Pack中对MFC界面增强的介绍,让我有点儿小小的郁闷,之前是过分谨慎,或者说固步自封了,没早点尝试这个增强库,而一直盯着XTP不放。今天看来,绝大部分需要的特性,在这个Features Pack中是提供了的。只不过现在还没仔细看过它的各个sample的代码,不知道它到底可以实现怎样的效果。
升级程序中有一个热替换功能,呃,这个热替换,其实是我自己发明的词,意思是如果EXE、DLL之类的文件正在执行,文件是不能删除的,那么升级时也要能被替换成新版本的文件,而不需要相应的进程退出,这就是所谓的热替换。 之前也一直陆陆续续有bug报上来,说热替换不成功,但有时候又是成功的,于是也一直没放在心上,把它归结于Windows这个API可能有问题,当然更可能是自己用得不对。直到昨天自己再一次调试时,发现一个诡异的现象。升级程序的可执行文件叫updater.exe,其中加载了dbghelp.dll,当我升级这两个文件时,必然需要热替换了,结果发现,在文件下载完后,替换确实成功了,dbghelp.dll确实已经是新版本的了,可是当升级程序在弹出提示框,提示用户升级完成后,用户点击确定,提示框消失,那个dbghelp.dll文件又诡异地变回旧版本了!一连试了几次,都是如此,简直就是灵异事件了。 当然,不可能真是灵异,这种单线程的逻辑调试起来还是比较简单的,单步跟踪了一会儿,就发现,原来在在提示框消失后,会调用一个结束处理过程,这个过程中首先会判断当前是否正在升级,如果是,则中断升级过程,并把已经替换掉的文件还原回去。而刚好这段代码写得有问题,把是否正在升级的标志置位,放在调用这个结束处理过程后了,于是总是会发生回滚还原的操作。问题的解决很容易,只是调整一下两个过程的调用顺序就可以了。
这周开始投入环境组网绘图功能的Demo实现。说简单点,这就是一个图形编辑器,就像Visio之类的。以前也有过自己使用GDI画图形的经历,但那时更简单的一点,没有要求图形可以移动,所以实现时做的事更少些。虽然这次说是做Demo,但我为了以后能以这Demo为基础,继续实际项目的完全实现,在初期就做了不少事情,费了好些心思。 首先是程序架构上,基本上是按照实际项目的设计来做的,以后也不用做大的修改和调整。界面上会有的元素,都留出位置了。花了近2天的时候,才把主界面的框架搭好。昨天又花了1天,把输入的数据源那部分功能也差不多完成了。今天才开始实现真正的绘图功能。 这次Demo主要就是为了预研或显示绘图功能,所以这里需要投入的精力更多。项目使用MFC开发,不使用任何其他第三方的库,传统而显而易见的作法是在CView上进行绘制。本着尽量OO的原则,最先可以想到的是,每种图形元素,可以用一个独立的类来表示,而所有这些类,有一个公共的基类,在基类中声明接口。以前的设计中,我只是让每种图形类保存了各自的位置和类型信息,并实现一个绘图接口。这次我突然发现,如果把相应的响应用户操作也放到各个图形类中实现,才更合理。比如点住鼠标进行移动,这得让图形类自己决定自己该进行什么动作,像一般的矩形,就可以直接将整个矩形进行移动,像折线,则可能只是在中间的折点进行移动。于是一般说来,这些图形类应该能处理鼠标的按键按下,弹起,光标移动等事件。现在觉得这样的设计是理所当然的,可在以前,我是绝对想不到这点的,也确实曾经把这些操作都放到外面统一分类处理。而且自从知道了Loki::Factory这个模板类后,对于这种大批类的操作,我有种近乎执着的热情想让它们不被任何除了这工厂之外的其他模块知道,直至不知道它们的存在。有了这一批图形类后,就需要一个管理器来维护这些图形类实例化出来的对象。这个管理器完全将这些图形类实例的创建、销毁、任务分派等与界面(CView)隔离开来。对于界面来说,图形对象管理器可以完成所有功能。 再说代码实现方面。这次专门看了一遍GDI+的SDK,准备试用一番,嗯,不算试用,是实际用上了。MFC中使用GDI+没有任何限制,在CView的OnDraw方法中把所有图形绘制一遍即可。当然也有双缓冲以免闪烁。网上的用GDI+实现双缓冲的文章和代码都很多,但一般说来只分两种:1、标准的GDI+做法,临时创建一个Gdiplus::Bitmap,将所有内容都画到这个Bitmap上,再将这个Bitmap画到设备上去;2、GDI风格的做法,先创建一个内存DC,GDI+都向这个内存DC画内容,最后将这内存DC都BitBlt到设备上。经过我的实验,发现第1种方法的资源消耗比较大,速度感觉上似乎也慢一点,但没具体测过,没实际数据来证明。于是我换用第2种做法,网上有一个很流行的CMemDC类,使用非常方便。但等我这样实现完后,发现移动某个图形时,需要刷新整个绘图区,还是会闪烁。上网随便搜索一下,发现一个很简单的解决办法:处理WM_ERASEBKGND消息,直接返回TRUE就可以了。
昨晚坚持到1点多,做了两件事:1、验证GDI+在MinGW中的使用;2、编译wxWidgets中access这个sample。 GDI+在MinGW中的使用,在网上有不少方法,但绝大多数是不行的,至少都有点小小的问题需要自己修改一下。我本来是没想过有这方面的需求的,也是因为最近想用用GDI+,就顺便想试试MinGW是否也可以。很快就搞定了,先到这里下载一个包含GDI+的头文件和库文件的包,然后把所有头文件解压出来放到MinGw的include目录下面,再把库文件放到MinGW的lib目录下面,其实我没用这个包里的libgdiplus.a文件,而是用reimp.exe重新生成了一个。网上有篇文章说,reimp.exe后面的参数是GDIPlus.dll,其实是错的,看一下reimp.exe自带的命令行参数说明就知道,人家明明是接受一个IMPLIB嘛,所以要跟GDIPlus.lib,之后会生成libgdiplus.a和gdiplus.def文件。这些文件准备好后,可以试着写个小程序编译一下,我就没自己写,直接试着用MinGW编译wxWidgets,带GDIPlus编译,中间会报两个错,错误提示很明显,只要打开那两个文件,把它报错的地方,定义类成员函数的签名的地方,不用加类名作用域就可以了。 编译access则花了我不少时间,因为其中不少时间是在等待wxWidgets库的编译。如果使用默认的编译选项,最后可能也可以得到一个可执行程序,但在运行时会弹出消息框说要定义一个什么wxUSE_ACCESSIBLITY之类的宏。这时可以修改一下access的makefile,在编译命令行中加入这个宏定义。再编译时,可能到最后一步是说某些符号链接找不到。我当时的第一反应是,编译wxWidgets时没有定义这个宏,于是修改src/msw/setup.h中的定义,将这个宏的值设为1,再编译,到最后也是说找不到一些符号链接,这才意识到是没有链接相应的库,还是修改makefile,加上-loleacc,给wxWidgets和access的makefile都要加,就可以正常编译过了,运行access也可以正常工作了。
看到搜狗输入法网站上有那么多皮肤,想到哪里可以利用一下。最后想到,桌面时钟啊,以前为了弄些皮肤来,还找了不少其他的桌面日历桌面时钟之类的小程 序,把它们的皮肤里的图片都抠出来,然后转换成自己的程序可以用的格式,还真花了不少时间。输入法的皮肤与桌面时钟的布局有些微差别,于是只好只用来显示 一下数字了,不能显示那种模拟钟面的了又花了近8个小时吧,其中还有不少代码是直接复制的。好在搜狗皮肤文件是用ZIP打包的,这比较方便,原先写的那块 解压缩的功能是调用7z实现的,那接口太繁复了,不好用,还自己特地写了个小小的dll来简化,但还是怎么看怎么觉得不爽。这次就索性全部改成zip的, 从codeproject上找了个解压zip的代码。 刚弄得可以显示出来的时候,发现显示的字体有点问题。首先是字体很小,其次是字体显示部 分是透明的,颜色不明显。字体小我倒不是很关心,但颜色不明显就比较严重了,属于不可控问题了。后来乱试了一下,偶然发现用GDI+来写字时,字体不要从 HDC那里获取,而要直接从字体名称和大小创建一个,这样就可以了,两个问题都一起解决了。 演示如下:
本来想当成二进制数据一样把文本内容以Blob形式存入Sqlite3的,结果整了半天,虽然最后存是存进去了,好像不是像我预想中的那样写二进制的Blob,而是就是作为文本存入了。不过倒是知道了对于大块数据的操作,在简单的SQL语句中不能方便地实现时,可以用sqlite3_bind系列API,在SQL语句中可以用问号作为占位符,然后将数据bind到各个占位符上去。这样一来的SQL语句要用statement来执行。 存进去后,取出来也是一个问题,本来以为Blob么,二进制么,还专门从别处移植了一段代码过来,结果那段代码可能有点点问题。反正最后我也是看出来了,因为我是原样照搬地把数据存入的,那么还是原样取出来就行了,我大汗!真不知道如果哪天我真要存入一段二进制数据时,应该怎么办了!大概,存入的方式也要跟着改吧。
不知道什么原因,我的机器上什么VC2008命令行来编译项目,无论是devenv.com还是devenv.exe,都会占满CPU,而真正的编译进程cl.exe却一直慢吞吞地,几个文件的小项目,也不知要等上多少时间,在持续集成时实在忍无可忍。 不过因为之前有一段时间专门学习了一下如何使用bjam,所以我就决定在CI上,使用bjam来构建项目。统计了一下我的项目的情况,有用MFC的,有用WTL的,也有用wxWidgets的,有用VC编译的,也有用MinGW编译的,无论哪种情况,bjam都可以满足需求。 使用bjam的一个比较方便的特性是,它能比较智能地自动为不同的编译器套件使用各自的命令行编译选项,这样使得一个bjam脚本可以同时不同的编译器套件来编译。不过实际使用过程中,还是有些需要区别对待的地方,这可能是因为bjam主要用于boost的构建这个目的而产生吧。 比如对于VC和MinGW,可能链接的库文件是不同的,要么是文件名不同,要么是所在路径不同;链接选项可能不同,也许是boost的原因,bjam在构造exe时,默认是使用控制台子系统,所以需要自己在链接选项中自行指定使用Windows子系统,而该选项在VC和GCC中有细小的描述上的区别。 bjam的另一个比较方便的特性是,它能自动寻找编译器套件默认的头文件路径和库文件路径。这比使用makefile要方便太多了,比如在MinGW中编译一个C++,注意,是C++,不是C,的程序,需要仔细地设置引用路径,而bjam中完全不需要,只需要一行代码就能搞定:exe Hello : Hello.cpp ;这个特性对我的情况来说也是很有帮助的,比如使用MFC的项目,鬼知道它要引入多少头文件路径,还有就是有个工程设计成既可以用VC编译又可以用MinGW编译,所以这又省了不少事。 再扯一个跟bjam关系不是很大的东西,编译使用了wxWidgets的项目。有一个小工具程序,可以方便地得到指定路径中的wxWidgets在编译时使用的选项,那就是wx-config。通过这个小东西,在编写编译脚本时,又可以省掉不少事。在http://wxconfig.googlepages.com/上可以找到Windows的移植版本,不过在bjam中使用时,会有一点点小问题,就是它的输出内容都在最后添加了一个回车,而bjam并不能让用户方便地设定编译选项在命令行上的先后顺序,所以如果恰好它的输出结果被排在命令行的中间位置,那之后的那些选项就被断开了,shell则认为这是两条命令,所以会出错。好在这个Windows移植版本提供了源代码,下载下来,自己稍微修改一下,也就是在输出的那条语句中把最后的std::endl去掉就可以了。 VC在支持预编译头文件时,一般是指定stdafx.h文件,然后加个编译编译选项来实现。在bjam中不能这样直接加编译选项来达到这个目的,而是专门提供了一个叫cpp-pch的规则来实现。不过,对于只在CI上才执行的bjam命令,有没有这个功能都无关痛痒。 VC有个很好用的特性,auto-link,boost就使用这个特性,这也使得在VC上使用boost比在其他编译器套件中要方便,它默认链接的都是静态库,使得发布都省了一些事。在bjam中使用时,只要设定好boost库文件的路径,其他的就不用管了。 在使用了MFC的项目中,会有一些特定的选项,比如它需要再指定程序的入口,这些工作本来都是IDE默默地在后台完成了,使用bjam时就需要自己留心了,一般的做法就是直接看项目属性中的命令行一栏,把一些个性化的设置都提取出来写到bjam编译脚本中去。
回来整了几个小时,没搞出什么花样,只是把tab页对象换了个地方。本来是没想到要换的,只是今天突然想起,要截获tab页关闭的消息,于是折腾了那么久,发现在原来的那个类里搞不定,不知道是什么原因。开始我只是想试试直接用wxFlatNotebook对象的Connect方法,可是根本不知道那些参数要怎么写。后来我把那类从wxEvtHandler继承了啊,消息映射也加了,但就是不行。后来看到wxFlatNotebook官方的sample里是把这消息映射放在一个wxFrame里处理的,于是我也照样学样把它放到MainFrame里去了,果然能截获了,而且从设计角度讲,这也比之前那样好,因为这个wxFlatNotebook应该是全局使用的。只是没弄懂原因,有点不爽。
无论是软件,还是程序库,应该选定一个并不太旧的稳定版本,一段时间内,比如半年,一直使用该版本。 一个明显的例子是之前用4.3.2版的gcc编译好的wxMSW,后来年到4.3.3版的gcc了,就下载下来试用了一下,发现原来的工程死活链接有问题,报什么虚函数找不到云云,再换回4.3.2就又可以了。由此看来,4.3.2和4.3.3编译出来的.o文件可能在内存等方面有变化。我也不想再花时间去用4.3.3编译一遍wxMSW了,太浪费时间了,而且如果要换,就要把其他相关的库都换一遍,至少包括boost,Xerces-C++,wxLua,青春啊,不能就这么耗费掉啊!
半生不熟地用着wxWidgets,全是照着代码改的,勉强能运行起来,不过似乎用gcc编译出来的release版本有时候会报错,不知道是哪里出的问题!可能是哪里资源没正确释放什么的吧! 界面的框架算是搭起来了,排除掉那个报错的bug就比较完善了。接下来完成插件扩展机制,一大块功能就可以用脚本完成了。
这次回老家过春节,年前几天没事,就着手做那么个小东西。这个小东西的原始需求是从老大那里听来的,老大则是从其他同事那里收集来的,主要的需求是,能自动从指定的路径下找出所有可执行文件,并添加到菜单项上,点击菜单项便能运行这个可执行文件。 这个需求的意义不考虑,直接进到主题,如何实现。刚开始我以为从网上应该很容易找到一个免费或者开源的项目来满足需求,在网上逛了几圈后,只注意到两个有点关系的项目,分别是Launchy和TextBox。我想了想,决定整合这两个项目的特点来做,至于最原始的那个菜单项的需求,就变成一个次要特性了。 主要的设计和开发大概花掉我8天时间,而且每天投入时间应该超过8小时,所以还是比较可观的,尽管功能看起来确实简单,而且迄今还有些未实现的。 程序最终使用VS2008开发,界面用WTL写,VS2008没有WTL相关的向导,装个VisualFC插件可以简化一部分这种工作。其他用到了嵌入式数据库sqlite3,用于保存搜索到的文件信息;用到了msxml,基本是必备的配置文件解析和保存方式;用到了Lua,实现了一定程度上的外部脚本扩展;还有boost、STLPort等等。 总的说来,这个项目的最大几点收获是:一、熟悉了WTL的使用;二、熟悉了Sqlite3的嵌入;三、对用脚本语言实现C++程序的扩展,有了一点心得。还有一些与技术无关的收获:思维导图确实是一种辅助思考过程的好工具;在wiki中随时安排计划,记录进度,撰写文档是一种好的实践。
幸亏有Code::blocks和CodeLite两个的源代码可以参考,可以省事不少,不过还是发现,要像现在用MFC一样的比较熟练地使用wxWidgets仍需要先阅读一些基本的资料,当然wxWidgets的manual也是必不可少的。 学习一种新的GUI框架的使用方式,关键还是在于了解并掌握它的消息处理机制。通常见到的GUI系统都是消息驱动的,所有所有的编程框架都不可避免地要有一套自己的消息处理机制,而且这套机制的设计好处,直接影响到整个框架的运行效率和使用效率。 总的说来,我感觉目前wxWidgets已经有点庞杂,好处是有些问题可以有多种解决方案,坏处是增加了学习成本以及降低运行效率。总觉得它不但最终生成的可执行文件体积大,而且运行效率太低。不过似乎用gcc编译出来的代码,运行效率也不如用VC编译出来的。假设能用Intel编译器来编译,是不是运行效率能更高呢? 现在用wxWidgets来写程序,还有个比较麻烦的问题是,跟用MFC开发相比,缺少一个好用的开发工具。以目前凡事都追求效率的情况来讲,写程序早已不是随便找个文本编辑器就能写代码的时代了,不光要有基本的文本编辑能力,其他自动完成、重构、提示、引用跳转、向导等等,无不影响着程序员的心情,以及开发效率。从这方面讲,目前已经没有哪个环境能跟VC+MFC比了。用vc也能写wxWidgets程序,但跟开发MFC程序相比,它缺了各种向导,比如Property视图,可以直接为各种系统消息、命令ID生成对应的函数声明,还有常用类派生的虚函数实现。 不过,总算起步了!
一直沉迷于网络小说,完全属于玩物丧志的类型!今天无聊完,郁闷完,打开VS来,决定先把框架搭起来再说。 总的说来,这是一个需要用外部脚本和配置文件协同扩展才能让业务逻辑正常运行的系统,而C++部分纯粹是为了实现用脚本比较困难的核心功能。虽然想了很久很久了,但一直迟迟没动手,玩物丧志是主因。 另一个不太重要的借口是,没找到好用的开发工具。微软的一个很好的实践是dogfood,很早以前看《微软的秘密》一书时就知道这个了,前些天听那微软的专家交流时,又看到这个,觉得很有趣。像Code::Blocks和CodeLite都是典型的dogfood,使用自己来做为开发工具。而我目前还处于一片空白的阶段,被Visual Assist X惯坏了的我又受不了其他工具的弱智,于是一直停在那里。今天想通了,就用VS来作开发环境好了,先用VC编译一个debug的wxWidgets,要retail版本时,就写好makefile,用gcc来编译。 这次恢复系统后,只装了个VS2008,这一方面可以让我不至于为众多的选择而分心,同时也减少多版本并存而可能出现的各种奇怪问题。前两天把原本只能用VS2005打开的WIND工程尝试着用VS2008打开,居然没崩溃,高兴之余把用WTL封装了的Scintilla代码也精简了一把,删掉了几千行代码,这下应该更不会崩溃了吧!
昨天下班为止,也没把预定的版本发出去,因为预定的需求没有完全实现,一个大的特性不能正常工作。所以今天上午就跑去公司捣腾了一把,两个小时就搞定了,比较安慰的是架构没有错,只是几处很细微的细节上犯了迷糊,尽管调试到解决了花了近一个半小时。 我有点怀疑的是有人说TDD的最高境界是不用调试,但之前的经历已经证实,我尽管有单元测试,但单元不通过时,我还是需要调试来查找原因!难道就因为我TDD没到最高境界?我想狡辩,不全是我的原因,肯定是他们的业务逻辑太简单了。这样又扯到另外一个问题,为什么我的业务逻辑会复杂,照Martin Fowler大叔的说法,如果一处代码太复杂了就,就要分解成几个简单的。可是以我现在的水平和智商看来,这是个悖论,分解后还不是要再组合在一起,仍然是复杂的,仍然逃不过调试的命运。但我又怕万一有不幸的人看到这篇文字,会提出另一个观点是,如果组合在一起仍然是复杂,那是架构有问题。那刚好把问题的责任转移到另一处,哈,我争辩不过。不过还好,我一点都不排斥调试,因为不得不赞美几句MS,他们做的VS里的调试器太好用了,或者说他们已经做出了世界上最好的调试器,别拿那些啥gdb之类来的扯淡。 在公司的时候突然想起来,我要用MinGW+wxWidgets写GUI程序,是否可以用Eclipse+CDT呢,从此可以摆脱MS的诱惑了。下午回到家整蛊了一个小时,不得不说,我还是继续用VS+VA吧,我想到的也就是个自动补全、智能提示功能而已,可惜Eclipse+CDT还做不到那样。 总之,我是个深受MS毒害的代码民工。
说话那天还在抱怨嵌入Python真辛苦,后来突然灵光一闪,马上解决了那个执行外部脚本文件的问题!既然现在已经能做到这一步了,接下来就应该考虑,能利用这个能力做些什么事呢? 总的说来,现在我已经有了嵌入4个不同风格各有千秋的脚本语言解释器的经验:Lua、TCL、Ruby、Python。以后如果有需求,我估计TCL是不会再使用了,总觉得它的语法太枯燥了点。剩下三者,对Lua和Ruby的了解稍微多一点点,但也还没达到能用来做独立应用的程度。相比之下,Ruby的那种怪异变态的语法,还是比较吸引人的,还有就是它带了那么多稀奇古怪的库,可以大大减少重复劳动,这比Lua来说,省事不少。但Lua的轻巧,却一直让我觉得是嵌入的最佳语言。实在让人难以取舍呀! 想了想,WIND就只用Lua嵌入了,因为这是一个相对比较追求性能的应用。而WallpaperHelper其实用什么似乎没多少影响,而且照现在的趋势,WallpaperHelper的体积已经不成为主要关心的问题了,功能才是最重要的。另外还想过要写打谱程序的,也要嵌入扩展。StoneBase的功能让人比较满意,但从写代码的角度看,它的架构不行,可扩展已经成了继续发展的必经之路了。但我还没想好,是用MFC,还是WTL,或者wxWidgets来写呢?
昨天说干就干,打开尘封很久的工程,添加一个窗口,把那几张现成的图片抠过来,然后计算一下桌面工作区大小,把窗口放在桌面右侧,像是侧边栏的样子。结果一开始,什么都没有显示出来,这是相对比较麻烦的出错情况,因为根据之前使用GDI+创建异形窗体的经验,这时候任何地方都有可能是出错的地点,所以要找出原因就要费点工夫。仔细对照之前写的代码,一点点的修改,终于能让它显示出一个窗口了,但是窗口仍然是窗口,没有按照预想的那样把png图片显示出来,并按图片渲染窗口形状。最后发现是在创建窗口的时候,因为心急,直接把窗口设置为桌面的子窗口了,如果把那几行代码去掉,就都正常了。经过这次实践发现,用GDI+实现异形窗体可以随意缩放窗口大小的,一般说来,要把窗口调整到需要的尺寸,通常是大于或等于图片原始大小,这时再把图片按窗口大小画上去就可以了,这种特性在绘制侧边栏的时候有用,比如可以只有小小一张图片,但侧边栏可能很长,就直接这样拉伸了。 能显示出侧边栏的底座了,就要开始考虑接下去怎么做了。鱼鱼和雅虎是两套不同的方案。鱼鱼只是能计算一下各个widget的大小尺寸,根据当前侧边栏上停靠的widget计算出其他widget停靠的位置。雅虎的稍微复杂点,它的一个widget的可见内容分为两部分,一部分是在桌面上散布的体现真正内容的widget;另一个部分可算是widget图标,停靠在侧边栏上。这样对于widget开发者来说,刷新界面时需要刷新两部分的隐性要求比鱼鱼要大,鱼鱼的只要刷新widget主窗口就可以了。当然雅虎的也不是强制要求一定要同时刷新图标,只不过有这样的表现的机会,为什么不利用上呢! 今天又偶然发现,雅虎的widget也使用了跟chrome类似的sandbox技术,从任务管理器上看多显示一个widget,就会多一个YahooWidgetEngine.exe进程,数完widget数目后,还多一个进程,我猜应该是侧边栏的。自从见到chrome后,我就莫名地对这种sandbox做法很有认同感,据说我们部门在北京的分部做的一个测试用例开发执行工具也是用的这种方式。不过相比Unix-like系统,在Windows下创建进程的开销相比就大了点,随便开了十来个widget看看,有两个进程内存占用10MB多一点,其他的都是1MB多,我估计如果它若是使用单片式结构的话,同样开这么些widget,占用的内存数应该没有这些的总和多吧。再说说由此引出的进程间通信的问题,毫无疑问,进程间通信的开销明显要比进程内通信的大,在Windows上应该更突出,不过对于像widget这种应用,进程间通信的频率和数量应该都不大,影响也倒不会太大;其次是从程序开发的角度讲,进程间通信应该更难使用,尽管Windows确实也提供了不少机制,但终归是难用啊。最后还有另外一个问题,对于稍微有点常识的Windows用户来说,这种方式是否也能得到他们的认同呢,某一天打开任务管理器突然发现有这么多相同名字的进程,会不会觉得反感呢,至少我是看到有人这样非议过chrome的。 再说点WTL相关的问题。昨天发现一个用WTL写的应用,在VS2005下编译,Debug下好好的,到了Release下连编译都通不过,删了一些怀疑的代码,还是编译不过,最后从WTL的源代码看到,原来只要在工程设置里把是否使用ATL的最小CRT关掉,就没问题了,之前也有因为这个设置引起奇怪的编译不过的问题,缺少官方正式支持的东西就是累啊,这WTL光是这些头文件包含,宏定义,就让人头大了。 最后八卦一下Inno setup,发现有时居然会out of memory,这时把里面两个压缩级别选项都从ultra改成max就好了,不知道是不是Bug?
昨天好不容易咬咬牙,把捕获未处理异常的功能提取出来封装成一个dll了。这是一个很简单的功能,所有的代码都是现成的,我只不过是把它从源代码复用的方式改成了二进制复用。当时公司里的同事说我这源代码复用的方式太落后,想叫我改成一个COM组件。而我又恰恰对COM很反感,所以一直都没动手。这次在一体化平台中涉及到2个exe程序,而只在一个主程序中用到了这个功能,有一天收到一个报告,另一个exe程序也会崩溃了,所以就有了要分离出来的想法。 提取成dll我当然不会用COM来封装,而是学MinGW中的exchndl.dll的方式,移植的主要工作是把MFC中的CString类都替换掉。这花了不多的时间,然后放在WallpaperHelper中进行测试。 除了记录了系统简要信息和调用栈信息,我还另外加了几项也许有点用的内容,包括当前系统中所有的进程、环境变量、当前进程所有的模块、所有线程信息。本来还想加些其他内容的,比如当前系统的服务信息、系统设备驱动程序信息、当前进程的所有句柄、所有文件映射、所有窗口等等,不过想到暂时这些信息也不是很重要,而且这样会让生成崩溃报告的时间更长,先还是放一边吧。 最近我想我真的是工作压力大了点,昨天下午睡午觉,梦到了很多乱七八糟的事情。最让我觉得气愤的是,居然梦到有个老女人,对我的工作指手划脚的,然后旁边两个同事也不知道在干吗,跟现实中的很相似。真是日有所思,夜有所梦,愤慨啊,竟然我的梦都被人这样强加干涉了!
昨晚在整理硬盘上的电子书,顺便想到我零星收集的n多资料,一般就是一张网页,或者一个txt文件,里面可能是一篇文章,或者一小段代码,却很可能讲述了一个技术原理或一个小小的编程技巧,我没有计算过总共有多少个这样的文件,估摸着应该有几万个吧,这些只是平时上网,看到觉得有用才收藏下来的,不像那些电子书,很大一部分是去年从一个同事那里直接拿硬盘对拷过来,有些根本不是我关心的领域的,比如无线通信之类的。 这些文档散落在硬盘上,虽然我也大体上划分了一些分类,比如algorithme、crack等等,但当真要找某个比较细节的内容时,很可能要花很多时间,还不一定能找到。于是我就想,要是有一个适用于编程资料收集管理的工具就好了。我是懒得再去网上找了,先不说能不能找到真的完全符合我的要求的软件,即使有(这个可能性很小很小啊),也不一定是免费的。以前看过几个文档收集管理工具,要么是纯粹的通用工具,缺少对编程资料的倾向性适配,要么就是纯粹收集源代码的,又缺少对文字内容的支持。所以又回到原来我说过的一句话上来,最好用的软件是自己写的。 以前用BCB写过一个电子书管理的工具,花了些时间,但实际上并不好用,界面也其丑无比,太业余了,这是促使我后来义无反顾地投入VC阵营的重要原因之一,在像XTP、BCG之类的界面库帮助下,用MFC做界面其实并不比VCL麻烦,而且以我个人的经验看来,在同等工作量投入的情况下,反而更容易做出比较专业的界面来。又跑题了,那个电子书管理程序的功能太弱,虽然当时也想过不光要能管理电子书,还要能管理普通的文本资料,但后来由于对界面的极度不满意,直到完全失去了兴趣和信心,就放弃了。 现在想用MFC+XTP写一个,数据库就用SQLite好了,不光能管理文本资料,也能管理电子书,这是我比较希望的一种方式。管理文本资料时,需要特别关注,可能有两种不同类型的内容,一类是文字描述,一类是源代码,所以要同时有两个视图来表达一份资料的内容。资料的分类管理是必须的,而且更需要的是一种比较方便的搜索功能,不但要能搜索标题,还要能搜索内容。再有就是文本资料和电子书的管理要融合在一起,看起来没有特别明显的分界,但又留有余地可以完全分离开来。 这个工具不是通用目的的,是为程序员专用的,所以用户范围可能少了点,但这也算是围绕着我的整体规划目标了,developing for developers!
项目组把mantis换成了redmine,相比之下,redmine似乎提供了更多功能,也更符合我们目前的需要。redmine是一个ROR(Ruby On Rails)应用,于是简单起见,我们使用了InstantRails这个傻瓜包,但是,有一个问题是,我们总是在InstantRails的界面上使用Mongrel启动Redmine,于是会出现一个Ruby运行的黑窗口,一直到运行结束。 从网上找了一些资料,发现至少有两种办法可以解决这个问题。一种使用Apache之类的专业Web服务器,然后安装FastCGI,把ROR在后台运行,所有外部请求由Apache来转发。另一种是使用Mongrel_service,把mongrel注册成Windows服务,这样就可以在后台运行了。于是我想试一下第二种方案。 本来gem install mongrel_service这样一条命令似乎就可以把这个gem包安装到本地,但实际上我发现我根本不能安装任何一个远程服务器上的gem包,可能跟网络环境有关。于是我只好到它的官方网站下一个gem文件下来,用gem install mongrel_service -l命令进行本地安装。这时会提示需要win32-service包,于是到Rubyforge上去找到官方发布,也下载到本地安装,然后又提示说要windows-pr,下来安装以提示说要windows-api、继续下来安装,继续提示说要win32-api,再下来安装,然后反向这个顺序依次安装,到了后来,提示win32-service的版本要是≥0.5.2或<0.6.0的,而我装的是0.6.1的,于是只好反安装,rubyforge上又找不到0.5.2的,从其他地方搜了一个源代码包,解开后,执行命令ruby win32-service.gemspec,会生成gem包文件,再来安装,又提示要VC,而且经过试验,如果是用的InstantRails 2.0中的Ruby,则要用6.0版本的VC才能正常编译。终于mongrel_service也安装好了,可以注册一个Windows服务器,启动这个服务,则用ruby运行一个rails应用,我这里就是redmine了,当然redmine需要MySQL支持,不想直接使用Instantrails了,把MySQL也添加到服务中,Apache是不需要了,启动这2个服务,就能无界面运行redmine了,哈,开源的东西,还真是有点麻烦呢!
总觉得心事重重,走在路上焦躁不安,忍不住安慰自己“熬过这个六月就好了”,心里刚刚默念完,突然觉得这句话很熟悉,似乎以前自己说过。不过要说真的说过的,那肯定得是一年前才可能的事了,去年的六月我又在烦些什么呢!确实好像这一年多来,一直过得很不顺心,每次都劝自己说“熬过这段时间就好了”,结果这样的时间一段接着一段。 计划有点宏伟,但对于我这么一个懒散的人来说,着实有点困难:WallpaperHelper——VC/MFC;SourceCoding——MinGW/wxWidgets;DCoding——MinGW/wxWidgets;CppCoding——MinGW/wxWidgets;PHPCoding——MinGW/wxWidgets;RubyCoding——MinGW/wxWidgets;PyCoding——MinGW/wxWidgets;LuaCoding——MinGW/wxWidgets;TclCoding——MinGW/wxWidgets;PerlCoding——MinGW/wxWidgets;TeXCoding——MinGW/wxWidgets;XMLCoding——MinGW/wxWidgets;Flowchart——MinGW/wxWidgets;SoftwareDiagram——MinGW/wxWidgets;NetworkDiagram——MinGW/wxWidgets;Go——MinGW/wxWidgets;Chess——MinGW/wxWidgets。
今天又读了一点Scintilla的源代码,因为要达到现在比较流行的AutoCompletion的下拉列表,旁边还能显示一个tooltip描述选中项,那种效果,所以要先熟悉一下代码流程。 总结一下思路,要至少增加2个消息,用于显示或隐藏描述选中项的tooltip用。增加1个回送通知,用于告诉用户有机会对选中项进行额外操作,这里也就是显示这tooltip。修改listbox的显示方式,主要有效内容要加粗,其他的不加粗。修改选中项上屏函数,用于过滤出确实要上屏的内容。 总的说来,工作量似乎并不大,但实际上我却很懒得动手,而且为了以后发展的需要,最好这部分功能能合入官方源代码中,而确实Scintilla的原作者Neil Hudgson曾经说过,自己不会去做这个功能,并且并没有说,即使别人贡献了这样的代码,他一定会合入。 今天顺便看了一会儿notepad++的源代码,有几个小功能还值得学习,不过我个人认为这代码写得并不好,至少不如Scintilla的代码,但有些设计确实不错,而且它还能支持简单的插件。但我认为它最不好的是,似乎它使用自己修改的Scintilla,这样它的通用性就不好了。
今天突然有个想法,关于前段时间的用WTL写个围棋打谱程序的念头,是否可以把棋盘、棋子绘画动作也抽象出来,棋子的位置、走法规则都提取出来,有一组严谨的约束,而且这组约束可以通过配置文件,或者脚本来描述,最后,C/C++代码则只用来完成具体的绘画操作,对这些约束完全一无所知,比如它只知道在哪个坐标画一个什么样的图形,而为什么要画这个图形,这个图形有什么其他的含义,都不是它需要知道的。 如果确实能高度抽象地完成这个描述,那么带来的灵活性则是非常有用的。对于单纯是一个围棋打谱程序来说,也许带来的好处并不明显。但再换个角度考虑,在这一套架构下,很容易通过写少量脚本或配置文件,而不需要修改一行C++代码,一个围棋打谱程序立马摇身一变,成了一个象棋打谱程序,或者五子棋打谱程序了。这样的诱惑,对目前的我来说,实在是巨大呀! 这个想法的灵感,源于Eclipse的编辑器,《Contributing to Eclipse》中有一小段描述可以贡献一个编辑器,当时看到这段描述,甚是激动,差点想把那个IDE项目中的编辑器模块也这样做了。这次又联想到打谱程序,同样是画棋盘棋子的,只要合理设计,理应也可以达到类似的效果。 不过随便想想,以在世界范围最流行的4种棋类(围棋、中国象棋、国际象棋、五子棋)为目标,要想尽可能简单且灵活地实现,还有点困难。如何表示棋子的类型、如何表示行棋规则、如何定义精确的棋子位置以便程序绘制等等,都是摆在眼前最大的障碍。五子棋最容易表示,只有2种棋子,直接落子,虽也有像五手两打,三手交换之类的奇怪规则,但这些似乎都是在棋谱解析部分的工作。围棋则略为复杂,一个明显的问题是,要能计算出死子,并提出棋盘,这个工作如果纯粹交给外部脚本做,怕是会有心无力,但照现在的设计思想又不能让C/C++代码来做。两种象棋就更复杂了,棋子的类型就相比多了很多,每种棋子的合理行棋方式又都不一样,虽然从纯粹打谱的角度讲,比围棋、五子棋也复杂不了多少,但是在棋谱录入时,则很让我头痛了,如何表示一个棋子从一个位置移动到另一个位置,是否可以移动,移动后是否棋子的属性有变化(中国象棋中兵过河可横行,国际象棋中兵到底线可变身),移动后是否影响了其他棋子(吃掉了)等等,关键是一套界面和逻辑的交互协议,不能设计得太偏向于是为某种任务而特意为之,但又得有足够的信息在两者之间传递!
今天在公司网上看到一人发了个Komodo IDE,装来看了看,猛然发现它是基于Mozilla XUL技术实现的,有点诧异,居然还真有用XUL技术开发的商业软件。然后就跟公司里的另外一个人讨论了一下,那人比较了解XUL,在去年还做过技术选型工作。 从中我了解到,有一种叫Remote XUL的技术,可以使得通过Firefox浏览某个页面,界面效果跟通用的桌面软件差不多,但实际上却真真实实是部署在远程服务器上的。其他能达到类似的效果的有JAVA Applet,或者MS的ActiveX,好像Adobe现在在搞的AIR也差不多,有种让人惊艳的感觉。看来该是有必要学一点这方面的新技术了,一直以来觉得跟Web相关的,都不是很感冒,但现在看来,它混淆了B/S和C/S,即桌面和浏览器的概念,很有意思啊,比如,假设有一种能适应各种浏览器的这类技术,那么做一个Web版的IDE什么的也不是问题了。 除了这种远程部署的界面技术,还有其灵活的可扩展框架也是让我感兴趣的。那人的胶片中对Eclipse RCP和Mozilla XUL进行了简单的比较,结论是更看好XUL的,不过我个人的观点看来,两者单纯从可扩展性上讲,各有优缺点,不相上下吧。XUL体系使用C/C++实现具体的界面控件,然后用XML描述界面布局和事件响应,用JavaScript完成实际的业务逻辑,响应XML中定义的事件,调用C++代码作出具体的动作。XUL要创建出新的界面控件比较困难,只能用已有的控件组合成新控件,所以像Firefox就实际上提供了扩展和插件两种不同的机制,扩展就完成只使用XML和JavaScript实现,而插件就可以实现比较高级的像内嵌Flash播放器之类的功能。总之,简单看来,相比Eclipse的实现方案,XUL并没有哪里特别不如,或哪点特别突出,只能说也是一种不错的机制。倒是让我多了解了一种扩展方式,自己设计可扩展的软件架构时,倒是要好好考虑一下了。
写个围棋打谱程序,这个想法好多好多年前就有了,上高中的时候就有了。大概是因为当时对围棋有点点感兴趣,纯粹的叶公好龙型的,虽说感兴趣,却没有认真学过,只是知道大致的规则而已。这些年,看StoneBase的发展,觉得挺有趣的,不过它的实现不是我喜欢的方式,所以我突然又决定自己写一个,而且想了想打算用WTL来写。 开始是有点犹豫用MFC还是WTL的,因为MFC相对较熟悉一点,而且有Xtreme Toolkit Pro可以用,做炫酷的界面确实方便。但是后来想想用WTL就看中它生成的可执行文件体积小巧的优点,看看StoneBase当前最新的4.6.1版本,exe文件也就只有8.24MB,而假如用XTP的话,当是它的dll就有5.5MB,还要加上MFC的dll,大概是3.6MB,这样附属的文件体积就已经超过StoneBase主程序文件大小了。还有一个想法是,希望能借此机会好好学习一下WTL的使用。 至于要做得什么样的,从特性外部行为上看,可以模仿StoneBase和MultiGo。比如首先要能支持几种国内常见的棋谱文件格式,还要支持棋谱库,MultiGo没有,StoneBase 用了一个叫Absolute Database的嵌入式数据库,我猜大概因为StoneBase是用Delphi开发的缘故吧。我可以用SQLite来替代的,不过StoneBase有一个很庞大的棋谱库,所以也需要能以某种方式读取它的数据库。需要有良好的打印支持功能,肯定很多情况下,需要把棋谱打印出来,对着纸自己敲棋子,那种感观享受不是电脑程序能比的。要有方便的棋谱输入编辑功能,要有格式转换功能等等。 具体实现上,我想尝试一下纯插件框架,也即用C++实现一组核心的功能,其他高层的业务逻辑全都使用外部脚本扩展实现。这种框架有点像Eclipse,又有点像Mozilla的XUL方案,要扩展的地方包括主菜单、工具栏、弹出式右键菜单、棋谱格式读写等。
昨天突然下决心要搞一下月历显示部分。惰性总是我的最大困扰之一。慢慢调试,发现其实要实现这个功能代码并不需要多少,大概不到100行吧,之前实在是高估了困难以至于一直懒得,也是怕的去动手做了。不过虽然代码量不大,到最后可以基本稳定地用也是花了不少时间去慢慢修改的。 今天去驾校上了理论课,由于晚上睡得晚,早上起得早,加上中午还没午觉睡,于是上课时间都被我用来睡觉了,都不知道讲了些什么。 回到家大概5点左右吧,还算早的,于是又写了一会儿代码,把农历也显示出来了,哈哈,虽然原来打算能让农历显示在右边或下边,可以灵活配置,今天实现的时候发现如果要显示在右边,似乎比较麻烦,还让它只能显示在下边吧,嘻嘻。 这样就可以使用那些大块留白的皮肤了,真是happy呀! 再把配置模块做一下,就基本可以拿出去让人用一下了,只是GDI+输出文字时,有时候会输出不是预期的效果,原因至今不明,还待以后慢慢定位。
一直以来只用MSXML进行XML操作,在Windows平台上,确实是一个非常非常好的XML操作库。只是一直以来有点不爽的是,用它的save方法保存的东东,用记事本之类的纯文本编辑器打开看,是没有缩进格式的,就是直直的一行数据一直写完为止。想过一些办法,但最终还是放弃了,libxml2里有个叫xmllint的小程序,可以格式化一个xml文件,不过毕竟是第3方工具了,而且它依赖的是libxml,不是msxml。 下决心在google上搜了一番,英文的不知道搜什么关键字,中文的倒是找着几篇,最后觉得CSDN上的一种方法比较适合我目前的情况,因为我就是用MSXML DOM的。例子是用JavaScript写的,转换成VC还费我一点功夫,不过最后总算大体满足要求了,但是还是有个老问题,用它保存的东东,最后字符编码改成UTF-16了,而且强行插入不了Processing Instruction,晕。
自从用上了VC2008,用它来编译日历程序,就开始被Windows先进的Side by Side技术困扰着。其实说被它困扰有点过分了,毕竟是自己水平太臭,眼界太窄,见识太少。在开发机上怎么整都是好好的可以运行的,换个机器就不行了。盲人摸象般的整了几天,还是没能解决,代码是在家里写的编译的,拿着可执行文件到公司的机器就是不能正常运行。昨天晚上又在网上搜索了很久很久,终于在MSDN上看到一篇文章,虽然是以VC2005来讲的,但对VC2008是一样的原理,按照上面说的分好目标目录,做好安装包,今天拿到公司一试,果然没有原先那个什么应用程序配置错误的消息框了,终于解决这个让我郁闷了几天的问题。 不过今天偶然发现,我用GDI+实现异形窗体,在Win2003下不能显示,在公司网上找了个别人写的也是用GDI+画窗体的,也是不能显示。但装了个雪狐日历精灵的早期版本看了看,它也是用GDI+画的,却能好好地显示在上面,应该是那段代码有问题,唉,看来得用虚拟机装上2000/XP/2003,做好全面的测试才行了,不在实际的环境中运行还真不知道会出什么问题呢!
这个日历程序拖太久了,最早以为去年就能完成的,后来计划改到农历年前,以为春节几天假期里可以弄完,谁知生了场病,于是给了自己一个再次跳票的理由,回来后以为2月底前可以做好吧,可是还是不知不觉过完了2月,这个东东的进展却很小,最后就想,第1季度应该可以完工吧,现在很明显,已经是3月底了,马上就是第2季度了,前段时间只顾着看小说去了,呼呼。 实在是忍不下去了,先把桌面日历部分完成再说。 桌面日历大框架已经成形,还剩下带农历支持的月历、指针型时钟两个主要功能,先把目标放在这上面吧。 昨晚上网随便搜了一下,就找到几个看起来还可以的时钟软件。时钟软件在界面上的策略基本上跟日历软件差不多,都是可以支持换肤的,只不是可支持的灵活性有点差别。把其中两个附带的皮肤的图片抓出来,嘿嘿,我这里用一下下。
在网上看到一个英文博客,有一篇文章作者谈到他希望一个代码编辑器,或者一个IDE应该有什么样的功能。看了之后感觉还算比较客观,基本没有特别个性化的要求,对于要做这方面工作的人很有参考价值。
给江江写了一个小程序,用于自动从一些excel文件中复制数据到另一些excel文件。但江江说有问题,我也不知道到底哪里出问题了,于是想加入日志功能吧,这样至少可以看看代码执行的流程。可就在这里,遇到一件怪事,居然写文件写不进去内容!开始我是用C库里的fopen系函数来写文件的,但是什么都写不进去,单步调了一下,好像fopen就有问题,该函数返回的是一个FILE*,但看调试器里,该指针指向的内容是一堆0,好像就是打开失败,但它却确确实实返回一个有效的指针了,郁闷!于是我就试了一下用C++库里的fstream,开始看好像是可以的,于是我就把原来自己写的那个日志类拿过来用,反正里面写文件的代码就是用fstream的,不过这时又不正常了,只是零星写了点完全无用的数据进去,其它信息压根都没有,真是郁闷啊! 因为是用了那个日志类,所以OutputDebugString的输出还是有的,这就让我觉得很奇怪啊!因为下班了,于是也不想再继续深究下去了,反正用DebugCapture捕获这些输出,再导出到文件,也勉强是可以用了,呵呵。 不过这真是奇怪啊,完全没有任何头绪!
总的说来,GDI+的资料似乎还是少了点,用GDI+来实现异形窗体实在是太酷了,不过似乎用PNG这种支持透明色的图片格式最合适,如果是像BMP或JPEG这种没有透明色的,最好还是用关键色混合的方法,这种方法网上已经有n多代码了,纯API或MFC之类的封装都有。不过GDI+的用起来总会出现点莫名其妙的问题,比如我在家里用时,发现换成Win2000 Pro中文版或WinXP SP2 Pro中文版时,在窗体上用GDI+写出的文字有时候就是不正常,总是显示为透明的,一定要透过窗体下面的颜色跟背景色相同时,才会显示出正常的颜色。
跟去年一样,我又只请了年前的假,但只请了5天,2月1日开始,2月12日结束。幸亏是2月1日那天上午去的,飞机中午到了萧山国际机场,雪已经下大了,当天晚上机场就被封了。之后雪是不停地下,机场就封了好几天。爸跟我几乎是同时到家的,也是很幸运,反正如果错过了当时那个机会,就很难回去了。 之后几天都过得很清闲,每天就是写点儿代码,从早上起床,一直到晚上12点左右睡下,中间除掉吃饭的时间,其它时间差不多全坐在电脑前了。在写那个WallpaperHelper,这个东东被我搞得太大了点,粗粗分一下,有4大模块:墙纸管理、行程安排、图片处理、桌面日历。其实自己没写几行代码,全是抄的别的,像行程安排,Xtreme Toolkit Pro里就有现成的,完成度比较高的了,图片处理用的CxImage,不知道为什么,用UNICODE编译CxImage的库,就是不能正常地链接,最后很无奈,索性把整个CxImage的代码都放进工程里,于是一个很严重的副作用,每次Rebuild时,就要花多好多时间。另外还有个郁闷的问题是,在调试器里创建一个GDI+的Image对象总是会崩溃。中途还遇到了很笨的问题,我还花了好多时间去跟踪,以为CxImage的代码有问题,结果真是笨死了,居然总是想去打开一个不存在的文件,而没发觉这个文件路径是无效的,晕死。 大年三十那天晚上,吃得太油腻了,然后又喝了很多冰凉的饮料试图解渴,结果吃坏了,肚子也坏了,还感冒,有一天晚上起来后再躺下,全身发抖,却又不是因为冷,精神性(神经性?)痉挛了不知道多久,抖得人都累死了,还是停不下。一直病痷痷了4天,于是乎,连食量也被减下来了,不过倒是省了很多事。 昨天晚上7点多的飞机,这国肮,是我遇到过的服务质量最差的了,空姐的态度也不好,饭菜味道也不好,到10:20左右,顺利抵达。倒是下午我刚出家门,小丫头发了个短信来祝顺风,让我小小地感动了一把,我这人啊,真是太低贱了。
换墙纸的东东本来主业是为了能自动换墙纸,结果现在重心却移到了日历和时间显示上去了。关于界面方面的技术问题基本已经都解决了,主要是学那些日历软件的换肤功能,可以把PNG文件直接作为皮肤来加载,接下来就是要好好设计一下皮肤的机制。 早在做输入法时,就已经能实现换肤和异形窗体,那时只能支持BMP格式的图片文件,但所有代码全是用纯GDI完成,所以实现起来很简单,用API就能直接画出来,在窗口上写字什么的也很方便。但现在为了能使用PNG格式,就不得不用了GDI+,用PNG的好处在于,从图片上就能直接应用某些区域部分不同程度的透明化,BMP是很难达到这样的效果的。于是,从实现角度看,区别还是挺大的,而且不知道是不是我用得有问题,有时候它占用CPU有点多。不过暂时不管这些,毕竟能用了,先考虑一下如何有效地加载皮肤,并能比较灵活地定制和扩充窗体。 最先开始动手做这个东东的时候,原始的想法是时间显示是一个窗体的实现,日历显示是另一个窗体的实现,这样可以预见到的是对于界面部分的代码必定很大程度上是可以共用的,还甚至想过怎么把这部分抽象提取出来呢。到今天突然觉得,其实这个完全可以用同一个实现,至于显示什么内容,可以通过设计一个具有良好弹性可扩充性的皮肤机制来实现。初步想法是,一个皮肤至少包括一个图片文件和一个配置文件,图片文件用来最终描绘窗体,而配置文件则描述剩下的其它内容,比如在什么位置,使用什么字体,显示什么内容,这内容部分也是由主程序定义的一堆描述性的转义命令,例如当前日,月,年,小时,分等等。现在的困难就是配置文件要被定义成什么样,这个皮肤机制才能有足够的灵活性和后续可扩展性。比如显示内容,我可以让它是定义字体后再通过程序来输出文字,也可以是直接将另一个图片文件中的内容贴上去,我应该怎么选择呢?另外,因为想用一套程序代码实现时间和日历的显示功能,所以定义的转义命令也要考虑得周全一点,除了当前年月日,时分秒外,还需要星期、月历,也需要任意指定的某年某月某日的日历或月历,除了要有公历外,还要有农历和二十四节气、节日等等。 而这些,则还完全只限于实现一个时间和日历的功能,像现在的雪狐日历精灵,已经可以以皮肤的形式还实现计算器,游鱼等更实用或更娱乐化的内容。如果考虑到这些,这个皮肤配置文件就需要设计得更灵活强大才行。顺带还有另外一个待决策问题,这个配置文件用XML描述好呢,还是用Lua之类的脚本语言描述好?从我个人的熟悉程度来讲,XML明显好过Lua,从表达能力上讲,也许Lua更强一些,但ANT不也用XML实现了一套比较强悍的语法了么! 总之,这皮肤的机制得专门花时间认真设计一下了。
时间总是过得飞快,转眼间就三天过去了。今天放假政策跟往常不同,大概是顾及到为补放假其它加班的日子不能挤在一起吧。 三天只在昨天下午去华强北稍微逛了一会儿,还是觉得挺无聊的。今天就安分守己地又在屋里呆了一天,在整一个自动换墙纸的东东。 本来从网上已经找了一个很简单的,可以实现定时从列表中取出候选的文件作为墙纸。不过那东东真的是太简单了,除了可以换墙纸,其他什么都不能做。我的要求就多了点,光是换墙纸的要求就比较高。除了能定时换外,我还希望能分别指定每个文件作为墙纸的持续时间,过了这段时间再换,还要能分别指定每个文件作为墙纸的样式,是居中或是平铺还是拉伸。 另外,我还要它顺便能像那些日历软件一样,在桌面上显示月历,或日历,并能显示一个时钟。既然有了日历,我就希望它能进行日程管理,定时提醒了。所以日历功能要比较方便强大,最好能有中国农历,这样提醒设置可以按照农历来设,比如像爸妈的生日都只有农历的,老不记得。然后是能打印,支持年历、月历、日历3种形式,还要能自定义样式。再次是显示日历、时钟理所当然地要有skin功能,这是作为一款日历软件的必备需求。 再有,一些锦上添花的功能,比如支持用外部脚本扩展,定期执行一条命令啊,发送个Email啊,关机啊等等。不过我倒是觉得,如果这个东东想让其他普通用户接受的话,脚本扩展功能是多此一举了,因为我猜大部分的普通用户是不懂,反而会觉得这软件难用,晕!只是我最近是近乎疯狂地希望给所有程序都加上外部脚本扩展的能力,呵呵。 说实话,这里看起来似乎没多少内容,但实际做起来还真是颇费时间的呢,而且我总感觉在家里写代码,状态明显不行,很多时候大脑似乎是处理消极抵抗状态,不像在公司,在极其困顿疲倦的状态下,还能逛敲键盘,而且居然出错的地方并不多!
最近渐渐会用Boost.Bind和Boost.Lambda了,真是爽快啊。现在明白,要用Boost,就得尽量使用STL,配合它的容器、算法才能发挥功效。如果自己写了容器,也要看情况写些方法,适应它的需求。今天写了好久代码,挺累人的,到后来真的头昏脑胀了,郁闷。 回来继续搞SocketHelper,除了要有像Wireshark的抓包功能外,还要加上nmap似的扫描功能,以后有机会再搞个可以支持无线网卡的抓包功能,呵呵。 现在Wireshark和nmap都用lua来做扩展了呀,呵呵。
周末整了好久,想在程序里嵌入Ruby解释器,可是发现在MFC程序里,只要include了ruby.h,编译就会不过,说什么fd_set啥子啥子的,很是郁闷,今天在公司,同事说只要include一下WinSock2.h就行了,晕,我当时怎么没试试。 SWIG果然能一下生成一大片的代码,而且可以通过宏来比较灵活地进行配置。只是最后效果怎么样,还没有试。总的说来,自从改用VC以来,得到不少好处,主要是很多开源的东西都会主力支持VC这编译器,相对来讲对Borland的支持就要弱一些了。
没有解决,还是老样子,只知道它是要把那几个dll复制到系统目录下,把npf.sys文件复制到drivers目录下,然后安装系统服务。至于到底最后做了哪些处理,也不得而知,反正我是把网上找得到的说法都试过了,都没用。当然很多是针对3.x版本的处理,我用的是4.0版,也尝试过反编译它的安装文件,反汇编它里面一个dll文件里的导出的函数,但最后还是没有什么进展。暂时放弃了,郁闷。
一直想自己写一个计算hash的工具,而最无耻的是,我对各种密码学意义上的hash算法根本不了解,只知道有这么个东东。不过现在流行的hash算法网上有一些现成的代码,C和C++都有,比如著名的Crypto++、LibTomCrypt等等。 本来跟hash算法是完全没有交集的,平台根本用不到,最多也就是直接LoadLibrary系统自带的CryptDll.dll,里面有计算MD5的函数,这是在好些年前就知道了的,也一直丢在一边。现在因为要做一下文件共享的东东,其中避免不了的是唯一标识一个文件,而一个良好的消息摘要算法就是一种可行的方法。鉴于网上早就出现了一些针对MD5碰撞的实际例子,所以我就有点不甘心只使用MD5算法,于是把LibTomCrypt的代码抠出来封装成C++的样子。这样的消息摘要算法计算过程一般分为初始化,更新数据,得到结果3步,所以可以把每个算法都封装成一个单独的类,每个类都向外提供这3个方法,这样只要根据需要可以以相同的计算逻辑得到最后的结果。 封装好了各个算法后,再提供一个类,封装更高层次的功能,比如计算一个文件的hash值。文件需要打开,然后每次读出一部分数据来计算,最后才得到一个结果。这样的逻辑不需要为每个算法类都写一遍,写到单独的类里即可。至于该类与各算法实现类的关系,比较OO的做法是,用继承,所有的算法类都继承自该类,就自然而然地有该方法了,但似乎还需要增加3个虚函数,这样父类的方法才能调用到子类的方法,这样就多了点运行时间和空间上的开销,尽管不严重;另一个比较GP的方法是,把该类写成一个模板类,而各算法实现类做为模板参数,这样就可以省掉因虚函数引入而带来的开销了,当然带来的成本是用户使用这些类时,需要同时知道这个类的存在以及各个算法实现类的存在,而前面讲的偏OO的方法是只需要知道算法实现类就行了。 上面解决了一个向外提供接口的问题。接着又有一个新的问题来困扰了我两天。因为上面已经有一个类是对于每个算法实现类都知道其存在的,但我又发现其中有几个算法实现类中的更新数据方法逻辑是完全一样的,要把数据根据当前算法的实际需要拆分成多块进行压缩运算,所以只是其中调用的压缩算法不一样,数据长度不一样,这样的情况也是代码复用的一个场合。但是开始的时候,我不知道应该把这段看起来可以公用的代码放到什么地方。同样,比较OO的做法是写一个基类,让这些算法类继承过来,同样需要一个虚函数,因为会有一个压缩运算过程,不同的算法是不一样的,虽然函数名可以一样,所以也多了一点开销;另一个当时很不想用的办法是,像LibTomCrypt中一样,把这个过程定义成一个宏,在这些算法实现类里都写一句这个宏调用,就没有虚函数带来的开销了,但我觉得这是C的做法,而不是C++,这个场合这种做法很丑陋;后来偶然在QQ群里看到别人谈及模板应用的一种方法,得到灵感,就像WTL那样的静态多态就可以,仍然需要一个基类,但基类是个模板类,而模板参数就是自己这个算法实现类,这样通过基类中的方法仍然可以调用到子类中的方法,但又没有虚函数的开销。基本解决这个问题! 后来又遇到一个问题,不过没有解决。HAVAL算法,可以有3、4、5轮计算,不同轮数的计算中间的步骤也会有点小差别,每种计算最后的长度可以是128位、160位、192位、224位和256位。照理,前3轮或前4轮的计算通过宏定义等方法可以在某种层次上封装可相同的逻辑,这样3种算法就应该可以共用一部分代码,可是实际上,用宏定义的方法不行,第2次修改过的宏定义不能影响到上面的应用了宏调用的地方,所以实际上代码共享不了,只好重复写了,以后想想办法能不能改进。 Panama hash算法的资料好少,Crypto++的实现又比较复杂,看不懂哦!
每次看到按键精灵,心里总有种奇怪的感觉,这个东东,忽悠了好多菜鸟,也赚了不少钱吧,可我心里却觉得这不值,是忌妒吗? 最近想着,做什么程序可以集成脚本语言解释器呢! 有些情况是可以预见得到适用的,比如这些天突然想学学围棋,于是在网上找了下打谱的软件,这种软件就适用。有个叫StoneBase的打谱软件是国内做得比较好的,但它并没有第3方可扩展性,照我的想法是,对于要兼容多种格式的棋谱文件,就可以用脚本来解析,规定一种中间格式,假设是标准的SGF,把所有其它格式在主程序的主动触发下都用脚本转换成中间格式。我暂时也想不出其它更多的地方可以用脚本的了,偶然看到它的论坛上有人发了个可以自动下载TOM网站上公布的棋谱文件,于是我就想,是不是可以干脆直接支持外部工具,但是转念又一想,都已经是外部工具了,就不需要集成解释器了…… 另外还有种情况,最近因为要写Socket程序,所以想到如何方便地调试这类程序,特别是对于客户端和服务器端都还没写出来的情况下。于是我想写一个辅助调试socket程序的工具,大概的想法是,它可以做为一个主动去连接的客户端,或者是被动接受连接的服务器端,连接上后,可以看到接收到的内容,还可以由用户手动输入内容发送,这种情况下,脚本的应用就比较有实际意义了,比如可以把接收到的内容交给脚本处理一下,脚本再根据实际情况发送一些内容,这比较适用于调试协议,像http/ftp等协议用脚本就能实现一个简单的原型。这个工具我已经想了很久了,但只建了个工程,却还没开始做,如果做好了,一定是个很实用的东东。除了这样的客户端和服务器端功能外,还要有用Detours静态hook创建进程,动态注入attach到已有进程,用WinPCap或Raw Socket(其实有了WinPCap就不需要了)抓包这几项功能。静态hook和动态attach是为了看进程调用WinSock API的情况,而WinPCap抓包就是一个普通的抓包功能,因为如果光是做抓包功能,我想我是做不过那些专业的做了好多年的工具的,如IRIS、CommView以及开源的Wireshark等等,所以重要的是前几项。又扯远了,脚本在这个工具里还可以用于解析帧结构、协议等等。 当然还有种情况,就是用于像按键精灵这样的工具上。 现在有4种脚本语言是我比较感兴趣集成到程序中的,分别是Python、Ruby、Lua和TCL,但实际上TCL与前面3个放在一起并无多少作用了,它的应用面比较窄,又缺少现代语言的一些元素,而且没有什么特别有优势的特性。Python和Ruby这两个大而全,且语言特性丰富的脚本已经能满足大多数场合的要求,而Lua则完全是看中它小巧快速,特别适用对性能有点要求的场合。Boost中有Python的粘合库,Lua以前有LuaBind和LuaTinker,但好像没更新好久了,至于Ruby我还没有了解。但我想,我总有一天会自己来分别写一套简单的,自己够用的库的。
今天晚上加班无聊,就在看各个CMO团队的TeamRoom,看到介绍CVS的内容,突然想做一个GUI的front-end,可是,回来后看了看WinCVS,就想放弃了,我是不太可能做得比WinCVS还要好的!现在的软件好用的优秀真的是太多了,本来还想把ProcessHelper增强一下的,看了看Process Explorer,也放弃了,理由是一样的。还有Total Commander,直到前两天我还在想,为什么会有这么多人喜欢用这个东东,界面又丑陋,功能也不见得强到哪里去。现在才隐隐约约地感觉到,它的强悍之处在于极强的可自定义可扩展性上。它可以方便地对菜单,工具栏进行自定义配置,每一个菜单项或工具栏按钮的位置,标题,图标,快捷键关联等等全都可以自定义,并且可以以插件的形式扩展其功能。也许,它就强在这里。
这两天突然又想起按键精灵,去它的论坛逛了逛,看有什么新鲜的东西。发现多了个插件版,专注于插件发布、讨论的事宜。本来想看看是否有什么附加利润可以赚取的,但翻过几遍后才觉得,这东西现在留出来的空隙似乎很小了,大部分用户需要的功能,都有了。另外看看它的代码编辑部分,也还算完善了,再做也只能做得比它的好一点点,大多数只是脚本使用者,是不关注这部分的,另一些脚本开发者来说,原来的功能也基本够用了,不会再愿意去买个其它的软件。 暂时放弃!
这是一个总结,也是一个开端。所谓总结,即是到现在我已经发现并已尝试使用过这些东西,现在整理一下,罗列出来。所谓开端,即是从现在开始,我要好好使用这些东西,应用到实际中去,提高效率或减轻负担。 小作坊,适合于个人单干,或小型几人十几人的团队,如果对于大型的团队,我觉得我们公司那套其实挺不错的,毕竟人家花了我也不知道多少钱从IBM引进来的。所以小作坊有一点很明显的区别是,资源很有限,从硬件到软件,从资金到人力,都是很匮乏的。这里罗列出来的东东,全部都是开源的,而且是相对比较成熟的,就是为了应对上面提到的小作坊的各种可能面临的困难和不足。另外还要提到的是,这里讲的是“协助”软件开发,其实是针对整个软件开发周期中各阶段的活动,而不是单纯的在编码调试阶段的活动。最后一点,这是面向Windows环境下使用VC/Delphi等桌面应用开发人员的方案。1、建模——StarUML这个东东据说是个韩国人开发的,用Delphi写成,功能也许没有Rational Rose那么强悍霸道,但用来画个UML图、序列图什么的,已经足够了,而且安装包才20MB左右,快速轻巧。想想Rose需要多少钱,其实我也不知道,嘿嘿!2、版本控制——TortoiseSVN当然用SVN,传说中CVS的替代者,而Tortoise这个shell扩展真的方面。在Windows下用SVN如果不用命令行,就用它了,没啥好说的。不过说实话,VSS也不错,尤其是2005版文件传输效率较6.0提高了不少,而且和VC的IDE集成得很好。所以见仁见智了,对于不用VS工具的,就强烈推荐这个东东了。在单机上可以直接找个文件夹作为仓库就可以直接使用。3、项目管理——Open Workbench项目管理?我用得上吗,我自己也怀疑。但它号称可以和MS的Project匹敌,本来是一个公司开发的,后来捐献给开源社区,貌似他们也比较有钱的说,安装包还是用InstallShield做的。我大概最多也就是用来作作日程安排而已吧。4、持续集成——Cruise Control不用多说了,就用Cruise Control了,刚刚才学会,其实也没咋学,就是把同事那个脚本抄来改了改,真的挺好用挺喜欢的,现在最新版已经是2.7.1了,拿2.5上可用的脚本直接就能正常使用,而且比起2.5来,还少了乱码问题。5、Bug跟踪——MantisBug跟踪系统好像很多,商业的、开源的都有,比如FrogCreek,BugZilla、BugFree等等,选择Mantis只是因为我已经有点习惯它了,主页上有打包好的,直接运行一个批处理文件就能正常工作,特别提醒一下,要把config_default_inc.php和config_inc.php里的SMTP配置都改好,然后默认的账号administrator和它的密码root,这个我颇花了点时间去搞,开始没看明白帮助,晕!6、开发文档编写——doxygen也就是在写代码的时候插入一些规定格式的注释,然后运行一把doxygen,就能从中提取出内容生成多种格式的文档。不过似乎好像,我自己很少写注释的说,只有开源的项目才这样做得比较多。7、用户帮助文档编写——CTeX也没啥好多说的,用户帮助文档Windows上以chm/html格式的最为流行,很多大型软件公司的产品都会配上PDF格式的manual。如果想生成PDF格式的帮助文档,就用CTeX吧,这个东东还真的不错,相比Word来,完全相反的两种思想和作法。Word一开始会觉得上手很容易,所见即所得,但是内容格式一多,再进行修改什么的就很容易乱,而TeX则相反,一开始觉得很麻烦,所想即所得,但是一旦初稿已经形成,再进行修改什么的,就不容易乱了,呵呵。8、安装程序制作——Inno Setup以前用过Wise,感觉还不错,不过人家是商业软件。后来找到了Inno Setup,就喜欢上了。它用Pascal的脚本,可以调用Windows的API,可以完成很多高级的任务。其它还有NSIS之类的也应该不错,但没用过,暂不考虑了,而InstallShield一方面是商业软件,另一方面好像显得有点杀鸡用牛刀的感觉,嘿嘿。 就是这些了。
本来我也只是好奇在网上搜寻一些IDE,看看它们有哪些优缺点可以借鉴参考的,不经意间来到一个共享软件的官方站点。有些站点是很容易就看出来是一个做共享软件的,很可能就是一个人在做。这个站点卖几款编辑器,分别是针对HTML、Perl、PHP的,我都down下来大概看了一下,觉得还是比较粗糙的,所以我开始有点怀疑这个能卖出去多少,从定价上来看,Perl和PHP的编辑器要$59,HTML那个$24,但同类竞争应该是比较激烈的吧,各种免费、共享、商业软件都在抢夺这么块市场,应该有很多做得比这些好多了。不过这个作者倒是有点意思,只是一个文本编辑器,他就变出三个花样来。但我查看了一下三个编辑器的窗口类,却是不同的,有点奇怪,不知道是出于什么原因,或者说,三个产品开发的时间间隔比较大,导致作者在新开发一款产品时使用新的控件。 另外搜索到一个PHP Designer 2007,记得我大学毕业设计的时候就用过它的,当时好像还是免费的,不过现在这个要€39,它就要比前面提到的那个专业得多,记得两年前用它时就已经觉得很好用了,现在就更强了。它用的TSynEdit控件,应该是用Delphi开发的,About里很老实地把它用到的所有控件都罗列出来了,大部分是用Mozilla协议的,比较乖啊。看来善用开源成果也是做共享软件提高开发效率和产品质量的一种手段啊。
昨天为止,把输入法在注册表中的所有能找到的相关项都删除了,但输入法管理器中的图标还是好好的,输入法ime文件没被删除的话,也还可以切换过去正常使用。只有重启系统了才会消失,说明这样处理是不够的。 本来就知道有个小小的程序可以近乎完美地卸载输入法,不用启动就能使图标消失。今天上网把那个小东西找来,还真的挺小的,用PEiD看了一下说是用Delphi写的,没检测到压缩壳都只有20KB,应该是没用VCL了,本来还想用DeDe来反编译一把的,结果下了个DeDe来,好像不怎么会用啊,反正是反不出什么东西来。既然这么小,就用IDA试试喽,装入就分析完了。流程视图都只有一小点,从字符串表中顺藤摸瓜,找到一个叫UnloadKeyboardLayout的API调用,上Google随便一搜就看到有篇Blog写的如何用该API来卸载输入法,真是的,以前输入各种关键字都没有找到这篇Blog,还害得我大费周折地去反汇编,还好,也总算解决。 顺带还多了解一点内容,原来HKL就是输入法在Keyboard Layouts下面的子键的数值。
昨天今天翻看五笔爱好者论坛几年前讨论大熊猫输入法的老帖子,发现一些有趣的想法,比如词库用数据库来实现。 今天就动手把SQLite3.4版的代码下下来,并加入输入法的工程一起编译,看起来好像编译是没问题,不知道实际用的时候怎么样。 另外想到的是,要让输入法能直接使用sogou拼音输入法的皮肤,也就是ssf格式的文件,其实也是zip文件,只是后缀名改了,于是要加入unzip的代码,而既然加了zip格式的解压功能,索性把rar格式的解压也加进去算了。这两块的代码因为直接就测试使用了,还真出现了一些问题。首先是unrar的代码都是.hpp和.cpp后缀的,而整个输入法的工程原来一直只用C,所以要用extern "C"来修饰一下。然后发现unrar的文件包含关系还真是奇怪,它会直接include那些cpp文件,但如果直接把那些cpp文件加到工程里来编译是会出错的,这从它的makefile中也可以看出来,并不直接编译其中几个cpp文件,但也不能把它们直接删掉,真是奇怪啊!再后来的问题是,因为我想反正输入法最后生成的就是一个动态链接库嘛,让它多导出几个函数可以让辅助工具使用,所以加入RARDLL预定义宏,指示把rar代码编译成DLL,再把几个函数名写到def中去,这样就可以导出这些函数了。但还会有问题,再加个预定义宏SILENT,就能正常运行通过了。之后出问题的是unzip的代码,首先unzip的代码并不能自动覆盖已有的同名文件,所以只好在调用前先把目标文件夹内的文件都删掉。后来看起来好像运行得还算正常,但突然发现,release模式下,不能直接激活输入法,在激活时会调用unzip来解压文件,这时就直接崩溃了。但如果是先用rar或7z格式的皮肤,就不会崩溃,再切换到zip格式的文件,用unzip也不会崩溃,比较怪异。最怪异的是,这只有在release模式下直接运行会出错,如果是通过VC下的调试器,或OllyDbg这样的调试器里运行,就算是release也不会出错。这就导致问题很难定位了,本来就没有多少调试方面的措施在输入法里,而这又是第三方库的代码。想到debug模式的是没这问题的,于是又想到编译链接选项里动脑筋,经过少量的试验,最后发现,只要加上了缓冲区检查编译选项,release模式的也不会崩溃了。唉,VC的这些选项还真是大有学问啊! 今天一下加入了3个开源库,于是趁机把版权声明也整理了一下,呵呵,一个小小的输入法还用到了不少东西呢,现在就有7z、unzip、unrar、lua,还有从网上找来的一小段一小段的代码,以后辅助工具里估计还会加入Boost的东西。最后用debug模式生成的ime文件有1.9MB,用release模式生成的有1.04MB,用upx的--best选项压缩一下,最小也有近500KB,一个五笔输入法做到这种程度不容易啊,哈哈。而且还不是最终成品,成品应该还会再大点点。
昨天把输入法中的两个存在已久,但一直没引起重视的bug修正了。其中一个是,分号转英文或大写字母转英文的时候,不能混合输入数字;另一个是,大键盘输入数字后回车,紧接着输入句号或斜线都会变成英文标点。这两个标点都是在我引入分号转英文、大写字母转英文和大键盘输入数字转义时引入的,但因为其实这些场景自己用得很少,而且影响也不是非常大,所以一直没有很重视,昨天忍不下去了,就改了。 今天把分号选择第二个候选字的功能也修复好了,因为那段时间引入分号转英文,就直接把这选择第二候选的功能屏蔽掉了。这回看到要修复好像很容易,况且很多人好像都习惯使用这个来进行第二三候选,不像我只用左右shift,呵呵。 还要加入五笔加加那样的手动造词功能,嗯!其它bug也还很多,比如状态栏有时候出不来,状态栏的窗口跟随,保存词库时死循环。
今天发现有一个办法可以暂时让英文长度超长时宿主程序崩溃的问题,但也很无奈,不知道是什么原因。办法是在release的编译模式下让链接选项中选上生成调试信息的选项,这样最终生成的文件体积就会大一点,但确实不会有崩溃的现象了。真是奇怪啊!今天其它什么几乎都没做,想着开始给它进行优化了,主要是从速度方面。 在公司里的活儿也郁闷呢,VSS2005如果没有.NET的环境的话,连那两个DLL组件都注册不了啊!
终于又了了一块心病啊,把设置对话框改好了,终于可以显示成属性对话框了,看起来比原来的专业多了,原来的那个真的太难看了,所有的选项都放在一个对话框里,最开始的更夸张,所有的选项都是复选按钮,几十个复选按钮堆在一个对话框里,这个不爽啊! 之前也是试图改过几次的,但是能半途放弃了,因为总是遇到死机。也真是奇怪,一个输入法能引起死机,应该说一个属性对话框能引起死机,也太不可靠了吧。本来还以为是我的电脑的问题,今天去公司弄了一下,公司的电脑也死掉了。说明确实是我的代码的问题,仔细看了看另外一个可以正常工作的代码,发现有些消息我没有处理。加上后,果然在某些时候能弹出对话框来了,再然后就定位到肯定是我在填入实例句柄和父窗口句柄的时候引入的问题。回到家又经过少量实验,发现实例句柄用DLL创建时获得的那个就行了,父窗口句柄可以是NULL,也可以是宿主应用程序中接受输入焦点的那个窗口,不要是输入法自己的那些窗口就行了。 真是心情舒畅啊!不过好像状态栏换肤有问题,另外一个大心病是英文长度超过10个引起的崩溃问题。 小乖输入法渐渐地向可以发布的状态靠拢了!
突然发现在公司的那台机器上,开了我的输入法后,notes就会闪得很厉害,根本不能用了,郁闷,在其它的程序里敲入字符后,也会让整个屏幕闪烁,但是回家来看,发现重现不了,在我的本本上表现得很正常啊。 今天就只是改了一下,可以直接输出全角空格了,嘿嘿,努力努力往五笔加加Plus方向靠拢啊。不过五笔加加的稳定性,我只能说,真是佩服啊! 再加个手动造词的功能,以及状态栏换肤的功能,就不再新加功能了,程序弄得稳定点才是。再把辅助工具完成了,就可以正式对外发布了。
在网上无意间搜索到五笔爱好者论坛中的一个老旧的帖子,是五笔加加Plus的作者EasyCode提到的,他列出了几十行的反汇编代码,仔细看了一下,翻译成C代码后一试,居然真的能在Firefox中实现光标跟随了,真是太高兴了!这样,小乖输入法更具有实用性了,之前一直自己都怪它不能在Firefox中实现光标跟随,所以一直不用它,不过在其它环境下,比如公司里只用notes时,也已经慢慢改成只用小乖输入法了,呵呵。 现在还有些问题是,Release模式下,输入英文超过10个后,会崩溃。另外,缺少一个造词的功能。再有,状态窗口不会自动跟随主窗口。 辅助工具也整了一下,可以画出位图来了,设置对话框基本上可以用了。WTL就是没有文档不好,不过幸亏它的类名,方法名这些都有点模仿MFC的样子,还勉强可以猜一下,在猜不到的情况下,直接用API也是可以的,呵呵。
今天在整一个属性对话框,用WTL三四行代码就能整出一个来,不得不让我感叹类库对于开发效率提升的重大作用啊!想想曾经用纯C+SDK画过一个,费了好大的劲啊!以后没什么特殊要求的话,尽量用WTL了!
经过查看DDK中的IME源代码,学习了一下后,发现有一个办法可以算是避规那个在某些程序中显示不出候选窗口的问题。只要在接收到某个通知的时候,强制移动一下候选窗口就可以了,不过光标跟随问题没有解决,它只能固定地停在一个位置,不过也已经算是重大进步了,哈哈,真是开心啊。可以搞一下词库以及内部表示的问题了,不时地出现一下词库乱掉的问题,很恼火的!
“换肤论者”,呵呵,这个名词是在公司内部一个论坛上看到的,说的是一位同事说sogou输入法可以换成好多不同的外观,然后下面就有另外一位同事说,原来是个换肤论者。现在我发现,我也是个换肤论者,上sogou的网站看看,有好多比较漂漂的皮肤,然后又看到像极点中文之类的五笔输入法也是可以直接支持换肤的,想我用的五笔加加就不行,虽然当年它刚出来时用的组合框和候选框合一的界面新颖大气,可是这么多年过去了,也看腻了。无聊了,于是打算把我自己在整的那个输入法弄成可以换肤的,呵呵,大概的样子就像sogou那样,可以让候选框使用不规则形状,其实是用一张图片加掩码来合成一个region,再设成窗口的形状。用google在codoguru上搜到一段代码,可以把一个bmp转换成region,太好了,直接套上,真的可以直接显示不规则窗口呀,好开心!不过昨天发现问题,先是大红色(RGB(255,0,0))的掩码不起作用,但粉红色(RGB(255,0,255))的可以,单步跟踪到那段代码里面,发现是GetRValue等操作的时候在对一个色彩值取值时好像顺序错了,于是自己改了一下,改成大红色的也可以了,但其实没改对。后来又发现,对于超过一定高度的图片,窗口只能显示出上面一部分,又找了好久,把一些有用没用的代码都删掉,还是没找到原因,一直搞到后半夜2点,弄得心力交瘁啊。今天回来一下,原来在每次重画窗口时有一个MoveWindow操作,里面把高和宽都写死了,高只写了个90,所以只要超过90个像素高度的图片来操作,都会有问题。然后又发现,有一张淡蓝色掩码的,也没有正确的合成region,再跟踪了一会,又是那边取色彩值的地方的问题,又改了一下,现在也可以了,不知道是原本代码中的问题,还是其它什么问题,因为代码中提供的示例程序,是用黑色(RGB(0,0,0))这样特殊的值来演示的,可能并不能很好地测试到。 关于在Firefox中不能显示的原因,所说是因为自由拼音输入法并没有完全按照IME框架来写的,所以有问题,难道我要去找DDK中的那个例子来看看,然后重新写了一个。 不过说实话,自由拼音中的结构真的有点乱,而且效率也不行,特别是词库组织方面,比较土。尤其是后来被另一位作者加了五笔功能,代码更乱,连用UNICODE编译都会有问题。真要好的话,真的不如好好学一下IME框架,能支持UNICODE从头开始写一个。 目前已知问题:1、有些程序下弹不出候选窗口;2、有时候词库会乱,要重新打开一遍输入法才行;3、有时候会引起程序死掉,今天在公司里用Word就碰到过,所以不能用于重要场合;4、拼音的词组词库有问题;5、有时候状态窗口也显示不出来;6、还有很多其它小问题。
这两天在整那个输入法,很多是模仿五笔加加Plus来的,因为我的使用习惯已经深深地被五笔加加Plus影响了。把分号开头转英文,大写字母开头转英文弄了,把状态窗口也换了,不过真难看啊,呵呵。 只是有些程序中显示不了候选窗,一点头绪也没有。这个问题不解决,几乎可以说,这是个没用的输入法。
下午躺在床上突然想到,原来在TclSuck中是怎么做的,看了一下,这么简单,虽然不想给日志类加个模板参数,所以不能有模板成员变量,但一个作为回调的成员函数属于哪个类是未知的,所以一定要用模板,要把这个信息保存起来,只要先定义一个普通的非模板类作为基类,给这个基类添加一个虚函数,再从这个基类派生成一个模板类,就可以保存相应的类型信息了,而日志类中保存的是基类的指针,所以那个虚函数的作用也很明显了,狠一点的,可以把那个虚函数声明为纯虚函数,因为基类实在不需要让它做什么事,只是为了中间过渡一下而已! 傍晚去百草园见了一下hover,他进上研所了,来深圳大队培训,周四就走。吃完饭回到家,给afei打了个电话,她却告诉我belovedog也在大队培训,还说下午她们去见面的时候忘记叫我了,我当然要埋怨死afei了,于是给belovedog打电话,约时间见面。 熟识的人进公司越来越多了,从普通校友,到老乡,到同班同学,还有……
基本可以满足自己使用的功能上的需求,即使发现哪里不能满足了,也可以马上自己改。不过实现得真是很难看很丑陋啊,是拿不出去见人的!而且在写这个类的时候,暴露了我的一大能力缺失,我对标准库和Boost一点都不了解,一些常用的组件应该怎么用我都不知道,全靠看帮助翻手册才勉强搞定。 这个类开始是在VC2005下写的,然后拿到BCB2006下试了下,发现BCB连Boost::function库都不能好好地支持啊?真是受不了,而我写这个类时,有一部分功能是依赖于Boost的,比如支持回调,所以如果没有Boost,这部分功能就不能支持喽,当然其它的功能还是可以用的。目前可以将消息写到控件台、OutputDebugString(也就是调试器)、文件、系统日志。其实当时有个想法是,Windows下可以写到系统日志里,Unix-like的系统下应该用Syslog,不过这个就暂时不管了,哈哈!除了可以写消息外,还可以定制消息输出的内容格式,其实是不同内容在同一行中出现的顺序,呵呵。当然,如果编译器能支持Boost,就可以用回调,可以用全局函数,或仿函数(目前还不能支持类成员函数),就可以完全定制输出消息的格式了! 除了依赖的Boost库外,全部的代码只有一个头文件,而且其它的依赖都是标准库或系统支持的库,方便啊!
五一长假终于结束了,这是最省钱的一次长假了,只买了个双肩背包和一瓶15ml的眼部护理凝胶,呵呵。本来还跟小丫头说,每次长假是一次比一次花得多,小丫头就说我就是这样变穷的。 代码结构改掉,引出的问题还真的挺多的。因为希望能尽量减少对VCL的依赖,于是不用IntToHex,改用Boost::Format,突然发现有很严重的性能问题,调了好一会儿,甚至想过要放弃而改回VCL,最后发现,只要合理地整改程序结构,多余的操作不做,速度自然就提上去了。不过让我还是有点担心的是,Boost::Format是不是真有性能问题。暂时也不管了,反正能满足要求了,而且把AnsiString::Pos也换成用Boost::string_algo来实现。另外还有一个问题是,TCanvas还没能去掉,应该直接换用API画。 其实这次代码重构的一大目的是为了把原来写在MainForm类中的3000行代码精减,初步目标是控制在1000行以内,如果能更少就更好了。另外一个目的是要把不同类型的功能划分成不同的模块来实现,这样也是为了能更好更方便地支持多种类型的插件和协件。 再次,这回要把各种全局设置、协件、插件、外部工具等设置都做到同一个设置对话框里去,所以想要一个更好看点的界面,看到Foxmail里那个不错,观察了一下是用了TZlistbox控件,网上找了一下,好像是付费的。如果直接用TListBox就太土了点,又观察了一下VS2003里的向导,是用HTML做的,原来是没注意过的,也是因为MS用HTML做的界面经常做得像Native程序一样,所以也看不大出来,上次听同事说起过,今天看了一下,就是几个HTML文件在那里切换,自己实现几个接口就行了。当然,今天又得到一个教训是,在这种情况下,能让脚本做的事,就尽量让脚本做,放在C++里增加了不少复杂度,而且某群人说过比较极端却也不无道理的话,“一行脚本顶一百行C++代码”。比如原来我嵌入的WebBrowser里面没有XP风格,后来发现只要加一句HTML代码就行了。还有,一直没解决的屏蔽F5刷新的问题,在网上找了找,其实几行JavaScript代码就搞定了。 最后,看到有个叫ShowHTMLDialogEx的API,可以直接弹出个对话框浏览HTML文件哦,比较方便。
看着LLYF Spy中臃肿不堪的代码,实在惨不忍睹啊!于是下决心把LLYF Spy彻底重构一遍,原来已经算是1.8版的了,现在刚好来一个大版本升级,作为2.0吧!看看以前的升级版本历史记录,还是有点值得回味的,呵呵。最开始的几个版本都还是在学校的时候写的,从1.0到1.6都是,1.7是工作后买了电脑后做的第一次升级,并尝试用Inno Setup做了个安装程序,把几个其它小程序一起打包了。1.8是突然某一天在公司里想要一个抓任意形状区域的图像的功能,于是又改了一下,并且编译环境也从C++ Builder 6.0升级到BDS 2006。现在2.0的计划,不但要给它外形整容,还要给它内部调理,另外再把其它的几个小程序也清理掉,能整合的整合。看看新出炉的版本历史:2.0+增加主菜单+增加协件支持+增加Lua、Python、Tcl脚本插件支持、增加COM插件支持+增加外部工具配置支持+Website探测增加对Firefox的支持+增加全功能性的设置界面+支持英语和简体中文两种界面+添加到Office插件中+添加到Windows Bands、IE Bands中-移除了几个原来在主界面上的功能,转到协件或插件或外部工具来支持x重写了主要核心代码,用户可能体会不到,但对LLYF Spy的发展来讲具有重大意义 1.8+增加多种抓图方式x插件信息对话框中的WebBrowser增加XP风格x更小的可执行文件体积,使用BDS2006编译连接 1.7 + add some new plugins.+ add external tool integrated.+ add color pick dialog.+ auto records the form status...
作为一款输入法软件,有几点将会是致命伤:1、在某些环境中不能正常显示候选窗口,比如Firefox、Opera等程序中;2、不支持GBK字库或UNICODE字集;3、不能用UNICODE选项编译,因为编译了后运行不正常;4、有时候看不到状态窗口,或者没有方便的进行设置的方法。 以上几点按受影响严重程度依次排列,目前我正被这些问题困扰着,都不知道怎么解决啊!
前些天都说要做个LLYF Articles的,要能把指定目录下的网页文件都打包成chm文件。在公司里反正也无所事事,就用MinGW写了个命令行程序,基本可以实现这个功能了,只是有些方面不完善,当然如果用它来扫描Boost的目录,也是可以生成可用性比较高的HtmlHelp Workshop的工程文件了。但是,不知道为什么,用MinGW想写个GUI的程序,就总是有奇怪的问题,连对话框都弹不出来,几乎一样的代码用VC2005编译一把,就可以好好地弹出对话框来,晕倒!不过也随它去了,反正核心功能部分都已经完成了,哈哈。 今天下午快下班的时候,原来项目部的老大跑过来问我怎么没把计划发给他。我压根没想过这个东西要发给他,于是尽量把责任推到现在的老大的头上去了,其实我确实也写不出什么计划来,硬要我用SharePoint来做,以前没接触过,更不好做估计了,而且也一直没有好用的机器啊!今天把老大旁边那个PIII1G、20GB、256MB的老爷机搬过来,里面还装了个2.4内核的RedHat,呼呼。两个老大在那里扯皮,我在旁边只有偷偷地笑,现在的这个老大简直有点无赖啊! 下一站小乖,呵呵!学一下用WTL做界面吧。
突然决定做这个东东,主要功能是用来收集各种零散的文字,比如从网页上看到的有价值的文字片段等。不过让我决心做这东东的,却不是这个原因,而是想通过这玩意,能自动把分散在众多文件夹中的boost帮助文档打包成有序的,至少是能按照物理文件存放的分级打包成chm格式。 先要写一个能递归查找文件的功能,再按这种目录结构写成HtmlHelp的index文件。还要注意能剔除掉空的文件夹。
除了界面不好看之外,功能倒是绝大部分都完成了。先是把virtual listview多选不准确的问题解决了,用了一种很土的方法,遍历每一个记录,看是否被选中。把指定文件的打开方式部分也稍微修改了一下,先主动创建进程,如果不成功,再用ShellExecute指定程序打开或用ShellExecute让Windows来决定用什么打开。还在状态栏里加了个进度条,在导出列表的时候,如果记录比较多,就可能会花比较长的时候,如果中间没有什么提示还真会让人误解,所以这时候用进度条就最合适了。顺便发现了几个小错误。另外还可能会有问题的地方是,在TreeView中填入的文字,在用SQL语句写入Access时,可能会有单引号的问题。这也是个挺让我觉得奇怪的事情,为什么SQL语句中不能用单引号,写两个单引号就没有不会报错了,但写入的就是两个单引号了,这样读出来的时候还要自己在处理一遍,把两个单引号的地方改成一个单引号显示出来。 其余的顶多是加个Shell右键菜单项吧,这个也可考虑用比较简单的方法实现,给*.*类型的文件加个项,打开的时候因为会把路径传进来,所以就可以处理了。 另外就是,做个像CyberArticle样子能收集网页上文字的程序,本来这个功能想做在Ebookshelf里的,不过感觉两个东西的功能差别还是比较大的,合在一起感觉比较怪。所以还是单独拿出来好了,关键点是要能至少支持IE6/7和Firefox 1.5/2.0。
把设置对话框做得差不多了,就是从注册表中读取打开方式的时候稍微还有点点问题,另外把查找功能也做了,剩下就是把ListView多选的问题解决掉,以及其它一些小细节处理了就可以了。
这两天不知道怎么了,总是觉得眼睛花花的,其实就是想堕落一下,呵呵。回到家,坚持写了一会儿代码,又跟人QQ扯皮了一会儿。效率果然很低呀,这里改点那里改点的,还是没把设置对话框全部弄完。如果不是可以用Boost库里的一些东东的话,自己弄可能还要更慢些,当然为了用Boost库,也是要花时间在学习上的,Boost的文档可以说在开源领域里是做得算很好很好的了,不过里面的例子太少了,而且不知道是不是因为我对英文不习惯的原因,总觉得找不到全部我想知道的信息。说起来Borland的文档也是糟糕呀,BDS2006中的都不知道把原来的例子代码片段放到哪里去了。 这个小程序里,用到了Boost的Foreach和string_algo库,我猜其实我用到BOOST_FOREACH的地方是可以用Lambda和std::for_each来代替的,不过不熟啊,呵呵。已经搞得差不多了,设置对话框里只剩下搜索注册表中文件关联信息了。 白天在公司,看了一下Latex的相关资料,觉得还是多好玩的,回来把CTex装上,发现里面带的工具还真是全。以后得好好学一下,因为用这个可以做PDF格式的文档出来,可以不用D版的Word、PDFFactory这些软件了。
人又有点犯懒了,不是很想动了。画了个设置对话框,里面的代码就都留着不写了,查找对话框也不画了,直接用系统定义的那个了。白天在看Boost的文档时,偶然发现有个string algo库,可以对string进行一些诸如查找、替换、分割等操作,这样就方便了,可以把那块引号变换的代码省掉了,自己写的还指不定什么时候出现问题呢,现在就一行代码搞定喽。 鉴于人越来越懒,决定把设置对话框和查找功能完成,再把那个ListView多选的bug除掉,就算1.0版完成吧!
主窗体类的实现文件又变成有1000多行了,郁闷。能导入导出目录结构了,这样就方便很多了。基本上弄完了主菜单和工具栏了,但也更难看了。翻开以前的计划看了看,原来还要加IE/Shell右键菜单啊,要能收集了网页文件后再打包成chm格式啊。要做好一个程序真难啊,还有些bug没解决。还要加注册和设置的功能。
把ListView改成可以多选的virtual listview,有点问题,有时候不能获取到全部的被选中的项,在csdn上也看到有人有这样的问题,不过并没有提到解决办法,只是说用普通的ListView就没有这样的问题,难道我也改回去。改回去除了显示速度变慢这个缺点外,能得到另外一个好处,就是如果从后面添加了记录,不用全部刷新整个ListView。 原来那个OnEdited的事件是可以用的,它的参数中最后一个就指明了新的标题,而指向节点的那个参数里的标题属性还是老的,这样也好呢,可以决定是不是在某些时候不应该被修改。 另外想到,应该有个搜索功能,至少能按书名,或文件路径来搜索。其次是,有点想加个ListView和TreeView间的拖拽功能。拖拽以前都没做过,不知道麻烦不麻烦,其实我觉得这个小程序最麻烦的是数据库操作了。 今天从浏览器登录到Gmail中时,突然想到,如果邮件客户端的界面可以做成像这种,应该也很炫哦,把所有相同主题的列成一个,然后可以在一个浏览窗口中统一浏览。看了一个Foxmail、Dreammail、Koomail、Outlook、Notes都是没有这种界面的,其它的客户端程序也不了解,不过Gmail这样的可能也算得上是首创的了吧。然后我就又有点发神经了,想自己写个客户端了。
终于有点实用功能了,可以把磁盘上一整个文件夹下的所有符合要求的文件都导入到相应的节点下去了。在TreeView中用鼠标点击选择某个节点后,也能列出相应的记录。虽然效率是低了些,但是功能总算是完成了。突然想到,ListView应该可以多选,TreeView中右键中应该有个可以选择文件进入导入的选项,而不光是导入整个文件夹。还应该加个选项,可以校验磁盘文件的有效性,自动把失效的记录删掉。总觉得界面是太丑了,想让ListView中可以在每条记录前面添加一个对应在Explorer.exe中显示的图标,另外,如果让Toolbar中显示的图标是32bits的,会不会好一点。 再有,Access创建的文件实在太大了,添加了几条记录后,就变成900多KB了,用WinRAR压缩了一下,变成40多KB,原来压缩空间有这么大,就想是不是可以集成压缩和解压缩功能,这点用7z或zlib都可以实现,不过没研究过怎么在BCB中使用,而且以前也没研究过怎么使用压缩功能,只研究过在VC下来解压缩。
从数据库中读出数据并填充TreeView部分总算搞好了,用了一个递归的函数,还用了map之类的容器,把一些需要的数据保存起来,想起来,要是不知道STL这么好用的东东,还真是很麻烦呢。 之后要做的是仔细地控制TreeView。如果对TreeView进行了某个节点的改名,就应该update到数据库中去;如果TreeView中的节点少了一个,也应该把数据库中对应的那条记录delete掉;如果选择了TreeView中的某个节点,就应该把对应这个节点的所有书籍信息都select出来,并显示在ListView中,这依赖于把这些信息先保存到一个vector中,然后刷新ListView,如果信息量比较大,则对ListView的刷新速度有所要求了,因此,从一开始就应该设计好用virtual listview来实现,如果不算检索数据库的耗时,1秒钟插入显示10000条记录应该是没有问题的。 弄完了上面这些,就可以考虑其它的用户界面方面的问题了,比如加个选项,可以自动清除掉已经不存在磁盘文件的书籍记录;可以整个分类的书籍一起移动或拷贝到某个文件夹下;可以由用户配置合法的文件后缀名,并定义各自的打开方式等等。 不知不觉,又把所有的代码都写在主窗体类里去了,真是不爽,但是我又不知道如何可以把其中一些代码移出来,因为所有的代码都直接用到了一些VCL控件,控件是添加在主窗体上的,所以总是要在主窗体类里写才能找到。 在网上找到一个讲SQLite的中文网站,里面有一些中文的文档,还是挺有用的,比如知道怎么用VC来编译SQLite的dll文件了,估计Borland的编译器也是可以的,但最简单的方法还是直接用implib工具从dll文件生成lib文件,VC的编译器套件里也可以用lib工具从def文件来生成lib文件。Access生成的文件实在感觉大了些,不爽,说不定哪天我要把它换成用SQLite的数据库。有些开源的东东还真的很不错的说!
终于经过翻阅了手头能找到的所有关于VCL使用ADO连接数据库的资料,连猜带蒙,好不容易回忆起来怎么来用了。其实就是FieldByName()->AsXXXX的用法,后面的XXXX可以是Integer、String、Boolean等等。虽然这个用法是试出来了,不过还有不少的困难摆放在眼前,其中一个很大的拦路虎是,TreeView很难用啊!我那样的设计,要把TreeView中的每个节点对应到数据库中的一条记录,这就是比如繁琐的一件事情。还有一个原因是,我对ADO控件的了解,也仅限于直接写入SQL语句操作一下,甚至连SQL语句都是现学现卖的,临时需要了就临时看一下手册,什么select、delete、update、insert等等。这样一来,原本可能可以很简单的事情,被我弄得很麻烦了。 接下来要做的是,从数据库里读出所有TreeView所需要的数据记录,每条记录由3个字段组成,分别是节点ID、节点名称、父节点ID。强制规定第一条记录肯定是根节点,后面的记录肯定至少是根节点的孩子,在TreeView中添加了根节点后,再读出所有其它节点,并根据父节点ID依次添加上去。还有点很郁闷的是,TreeView的节点名称编辑完了,没有恰当的得到编辑后的名称的时机。有个OnEdited事件,还以为可以用,结果得到的还是编辑前的内容,有个OnEditing事件,也不能得到当前最新的内容,晕倒!以后没什么事能不用TreeView,千万别用这个这么难用的控件了。 最后想说的是,Access的数据库怎么体积这么大,只放了3张表,表里都没什么数据,那个mdb文件就有800多KB了。 唉,想想,一点技术含量都没有,不过能卖钱就好。
用ADO连接Access就先放下了,在公司里找了些资料看了看,还是没什么头绪。回来只是把其它的文件搜索、文件报表生成等功能完成了,剩下的主要就是怎么跟Access交互了。总是觉得TreeView有点难用,ListView倒是比较好用,以前用过比较多次了,而且没有什么特殊的要求。 倒是这次总想着怎么把Boost应用进来。Boost::foreach和Boost::lambda是最近才看过的东西,但是这种小程序没多少场合可以应用,很多时候都是不需要多少算法或是表达式的,只是简单的过程式的流程。还有一点就是,应该好好把STL的内容熟练使用,有些事情自己处理虽然也不是很费事,但如果直接使用STL中的算法来完成,不但更高效健壮,可读性可维护性也是更好。 luolu说,她可能要读博士了,还说,是因为没事情做,所以才想读书的。人和人的差别真是大呀!
今天经过半个小时的交通堵塞,终于比平常晚了半个小时到了家里。发明迅雷的人真不是人,这么抢带宽的东西也做得出来。 写了一会儿Ebookshelf,这个东西本来是自己用的,因为有了不知道多少本的电子书,却没有好的管理工具,只好先自己写一个。还为了用什么工具开发犹豫了好久,主要的当然是BCB和VC之间的抉择,不同的编译环境会涉及到不同的各种问题,比如打算用SQLite或Access来做数据存储,哪种接口在哪种环境中更容易使用,然后是WTL和VCL哪个更方便。最后的决定是在打开电脑后几分钟才下的,用BDS2006+Access,因为SQLite只提供了DLL和DEF文件,我又不知道怎么为VC的编译器从DLL和DEF文件生成导入文件(即lib文件),而Access的连接用VCL中的ADO控件是异常方便。另外一个原因是,本来BCB用的lib文件是可以生成了,但是直接include了sqlite.h编译都不过,也不想再研究了,就只好用这种组合了。不过比较郁闷的是,原来虽然也用过几次用ADO连接SQLServer或Access,但今天用起来时,发现很多东西都忘了,都不知道怎么从获取到的记录集中提取出指定字段的值了!原来的那个程序也找不到了,好像就是最近那种整理邮件的时候都删掉了。另外还有个问题是,总觉得我用VCL画出来的程序界面很不专业、很业余。主要大概是各种颜色搭配,以及控件的一些细节属性没设置好,这个角度讲,其实用VC的MFC或WTL就好多了,能一下就生成标准的Windows应用程序界面。先把涉及到数据库操作的部分放一放,接口都留出来,等哪天复习一下再补上吧! 部门又发了一本《读者》合订本,还是2003年下半年的,去年的还是2004年上半年的呢,真是抠呀!而且邮件一发,雨烟就说要罚那个知情不报的人,教授也真是可爱,居然还敢承认,呵呵。 下午又跟疯丫头一起看了一点数据特性的代码,那个新员工写的代码还真是有趣呢,虽然一个文件里面的函数只实现了1/3左右,还是被我们找出了几十个各种类型的问题,有些是压根就编译不过的。其实我觉得这种阶段就拿来让测试部做代码检视是不太合适的,至少也得能编译通过吧。尤其是在看了各种模板应用后,发现编译器在编译期间就能帮助找出不少错误的,所以没经过编译器的代码最多也他们开发内部互相检视一下算了,拿到测试部来有点形式主义或者说是小题大作。不过这样也好,至少疯丫头的PI值是提上去了,哈哈!
现在的新问题是,编译器不能编译显式特化泛化类的成员函数模板!从BDS的联机帮助上看到,这是编译器显式禁止的。郁闷!也就是说,LuaTinker中的代码,是不能直接用上来的!唉,真想不用BDS了,用VC不就行了。可是用VC的话,我只会用SDK,画界面真的太费时间了!其实还有个办法,就是好好学一下C++的模板元编程(template meta programming),再自己写一个好用的C++ Wrapper for Lua,呵呵。看几本书:《Modern C++ Design》、《C++ Templates》、《C++ Template metaprogramming》;研究几个源代码:Boost、Lua、LuaTinker、LuaBind。 有点多哟!
春节过年回家,因为上不了网,反而出乎意料地拿出不少时间来写SkinBuilder。一点一点地完善,总是觉得有很多地方要改进,呵呵。 现在已经实现方块池和预览框使用固定大小的矩形框,不再用进行确定;可以选择矩形的颜色、粗细、实心或空心;Lua脚本格式的配置文件生成,全是自己用iostream写的,因为要写的内容和格式都很简单;可以查看已有哪些生成;重新load已有的task和配置文件进行再次编辑;能用7z格式打包,这点是通过直接调用7z.exe来实现的;导出时,检查必需项是否齐全,包括背景图片和配置文件,导出后子窗体的标题作相应的修改;打包时,把背景图片和配置文件都改名,对于jpeg格式的图片能自动转换成bmp格式的;有了一个splash窗口,其实是用about窗口;重新load后能画出已有的矩形框,这个还费了点时间,原因是试验的时候总是使用黑色的,刚好不容易看出来,所以一直以为没作好,晕;文件关联,包括打开方式、图标、单一进程实例打开,不是很花时间,一部分代码还是在机场里等飞机的时候写的,呵呵;打开task文件能改变子窗体标题,这也是应该的;工具栏暂时被我屏蔽了,懒得写了,呼呼;本来打算做的无限次undo/redo的,后来想想,意义不大了,因为任何时候新画的都能把以前画的覆盖掉,还要undo干吗! LuaSuck写了一段,写不下去了,一来对C++泛型编程的了解远远不够深入,另一方面对Lua与C++的交互方法也不够了解,先整了些够用的功能。应该再好好研究一下LuaTinker和LuaBind,它们都是面向Lua 5.0的,直接放在5.1里好像会有些问题。 SkinBuilder就先这样告一段落了,接下来是连连看,然后是方块。晕!
终于能连上来了,老泪纵横啊!这个时代,越来越依赖网络的时候,越来越不喜欢本土服务的时代…… 好不容易啊,终于可以在TImage上画线条了,晕死!剩下要处理的是,怎么把文件中的图片装成背景。还有就是,对于方块池和预览框,是大小固定的,不是用拉矩形框的,而是要跟踪鼠标的坐标直接画固定大小的矩形框。 下午,小丫头给我发短信说我们公司给她发录用通知了。说实话,就像我自己被录用那样高兴,昏。不过她肯定会犹豫,我当时不也犹豫了一会儿吗,后来还是乖乖老实地来了,因为我懒得再去花心思在找工作上了。不过小丫头现的情况跟我有点不一样,她是有正经工作的,要一个人下决心跳槽也许不是那么容易吧,不过要是换作现在的我的话,哪里给钱多,就去哪里呗,还追求理想么,干自己感兴趣的事?有点可笑的幼稚,理想是随时间和经历变化的,现在的理想就是想办法怎么赚更多的钱,赚更多的钱就是现在自己感兴趣的事!小丫头要是过来了,拿的钱会比我还多,晕!由此可见我混得多么失败啊,唉!
其实SkinBuilder的功能还是很简单很简单的,只要能用鼠标拖出个矩形就行了,要是能加入7z的压缩功能就好了。现在只是实现了大部分的MDI界面的功能,很多东西都忘了,晕。要是Lua脚本可以能支持持久化就好了,说不定有什么扩展包是可以用的,只是我现在不知道吧。 我现在似乎又陷入了以前那样的困境……郁闷!唉,无奈啊!
把属性对话框界面的大部分功能都完成了, 该整Skin合成器和LuaSuck了。本来想试试用Delphi下的KOL和MCK的,结果稍微尝试了一下,编译Demo都通不过,不想研究了,直接cancel掉,还是拿出BDS来用C++Builder和VCL写一个。因为想写成MDI的,所以比SDI的麻烦了好多,界面部分就整了好些时间。 我的方块Todo list: 1、Skin和游戏逻辑脚本的ListBox要在创建的时候选中当前的项,不然会被改掉; 2、属性配置要映射到游戏中。 oneaddone居然是自己开的公司,牛,世界上就是不乏牛人啊!
先说段题外话哈,有点郁闷哦,昨天把QQ签名整了一下,今天叫教授去看,教授就去看了,我让他猜是啥意思,没想到他一下就看出来了。因为字数太少,所以这些讲到涉及到敏感话题的爱什么什么的特征就很明显,所以照教授的话来说,地球人都看得出来啦,我欲哭无泪丢人了要疯掉了。我就跟他说我没脸见他啦,不敢去公司啦,要立马辞职啦,不然会被算计的。然后跟小丫头去归隐山林啦,哈哈。教授说大家都想看你,还在那里使劲嘲笑我,说内裤也会有今天,我头都要炸了!气死人啦!不过再想想也没什么的,本来内心里就是想逗一下教授这个家伙,所以才这么做的,不然干吗要去叫教授去猜呀,哈哈。教授可有趣了,所以我就喜欢整出一些稀奇古怪的事情逗他,特别好玩,哈哈哈哈! 属性对话框画了好久了,真的是一边查MSDN一边写代码的,所有的消息,无论设置或查询都要自己处理,开发效率真是太低了,不过慢慢写代码也是一种享受,有种成就感,如果一直都要死要活地赶,不就跟给别人打工没区别了嘛。剩下还要做就是处理消息,如果设置被用户改动过了,就应该把Apply按钮设为Enable,这些消息全要自己截获呀,呜呜!
用PSDK写界面真是太太太麻烦了,每一个Windows Control的操作都要通过原始的Win32 API来进行,不方便啊!做完方块,应该考虑找一个现成的好用的库,或者自己写一个轻量级的。如果继续这样下去,大量的重复劳动时间耗费,太不划算啦!比如有个IP Address的Control,现在我有一个string形式的IP地址,要把它显示在这个Control里,要写好多代码呢! 要善于利用现有的库呀!不过我现在只信得过编译器自带的C/C++库和Boost呀,ACE还没试过好不好用呢,网上看到有人曾经抱怨过,有些奇怪的问题的,如果遇到了,又真的实在不好解决的话,就也真的只好另外找一个了,Boost不也要加一个网络应用的库吗,不知道进展怎么样了。重新发明轮子,这个真是说得太贴切了。比如这里我用到了一个文件搜索功能,以前都是直接用Win32 API来搜索的,要写个二三十行,现在用了C库里的函数,十行都不到就实现了我需要的功能。那些重复的代码就是C库的编写者已经帮忙写了呀! 中午跑到生产中心去自助了,有螃蟹呀,虾呀,扇贝呀,青口呀,呵呵,三个人吃到天下大雨回不去为止,本来还打算买伞的,后来雨小了点,后来又大了,便想叫教授送伞的,嘿嘿,结果最后还是坐了点对点回去的。 今天心情不错呀,原来我是这么容易被收买的!晕!!~
一边看MSDN,一边敲键盘,终于可以实现属性对话框的各种基本功能了。Apply、OK、Cancel都可以按标准Windows应用程序的样子做动作了。要吸引别人在某平台上做开发,详细的文档和丰富的例子是一大诱惑呀! 看到CSDN Blog上有人在讨论wxWidget、QT、GTK+,反正我觉得,在Windows平台,要省事就用VCL、如果想用MS技术,用就WTL、或者就纯手工打造SDK慢慢画吧,就像我现在写方块一样。游戏平台的丰富程度令人咋舌,手机、掌机、家用机等等等等,对于小游戏来说,手机和掌机应该是以后可以考虑开辟的一块市场,对于网络游戏,像QQ游戏那种,Linux版或许也可以吸引一部分用户,不太确定,可能国外的用Linux的人更多点吧。 把属性对话框的界面部分全部实现后,再弄LuaSuck吧,有了LuaSuck才能弄Skin和游戏逻辑脚本支持,不过Skin只要能读取Lua脚本中的几个变量的值就够了,只要确定了接口就行了,游戏逻辑脚本,其实也就是调用几个固定名字的Lua函数,不过LuaSuck还是要做的。另外就是,要写个Skin打包工具,可以比较直观地在现成的图片上定义相应的属性,生成Lua配置脚本,再用7z打包。完成了这些,才能再考虑联网的问题!晕!
实践是一种很好的学习方式。加了个类,也算是学习别人的样子,尽自己的力抽象一下,把配置模块提取出来了。属性对话框得花很多时间啊,这时就体现出一个好的GUI库的必要性了,可以大大地节省编码时间。那只给我一个念头:以后除了要用DX的游戏程序,其它的一定不再不用VCL了,VCL太好用了,其它的Framework也没试过,不喜欢MFC的结构,WTL不知道咋样。或者自己写一套简单的?看CSDN Blog上有个人一直在宣传自己做的一个基于WTL的GUI库嘛,我不需要非常齐全的功能,我只要一些常用控件就行了。 现在发现Singleton是种很有用的技巧。在使用过程中发现,如果一个类被实现为Singleton了,一定要顺便把析构函数也声明为非public的,这样就不会不小心把它delete掉了。Metaprogramming还是非常值得学习一下的!
在看LuaTinker代码的过程中,惊奇地发现,它居然用了可变数量的模板参数!!这个这个这个,对我来说,不啻于晴天霹雳,《Modern C++ Design》上可是写着“Variable template parameters simply don't exist.” 我打开VC2005又试了一下,明明白白,VC7.1到VC8,都是可以这样用的。到底是哪里出问题了,谁错了…… LuaTinker在处理C++ free function的时候,是把pointer to function当作light userdata压入了virtual stack,网上到处都流传着一份不知道从哪里散发出来的用proxy手法解决的方案,感觉不如LuaTinker的爽。
在好几天前对MSDN的一番研读后,终于把PropertySheet显示出来了,其实真的很容易,很简单,至少比想像中的简单多了。唉,用惯了VCL,再来用SDK,实在觉得吃力。要是以前,随便拖个Form,放个TPageControl,早就完事了。现在,里面的4页Dialog一个个描就不说了,在BCB里也是需要的,然后要写Dialog的消息处理函数,一个个标准的回调过程, VCL里就只需要对自己感兴趣的事件重写处理函数就行了。然后是注册表操作,VCL里的TRegistry也是多方便,多健壮的。自己写一个类似的封装吧,不但花了不少时间,还没有TRegistry好用,昏倒,不过现在勉强能满足当前的需要了。 之后要做的,要把各个Dialog消息处理函数填完,然后是LuaSuck。这几天也读了好几遍《Programming In Lua》,还有它的Reference Manual,对Lua的了解又进了一步。Lua为了屏蔽数据类型的差异以及编码风格的统一,*所有*的与C/C++交互的数据都是通过一个virtual stack来完成的。一定要记住这一点,所有的操作都是针对那个virtual stack来的。LuaSuck的目标和TclSuck类似,①可以使C++程序与Lua程序里的变量互通,②可以在C++程序里自由调用Lua的函数过程,③可能方便地用C++函数来扩展Lua。虽然SWIG应该能很好地完成①和③,但在上次写TclSuck的过程中,我深刻地体会到库的编写的乐趣,远远大于库的使用的乐趣(晕死,真的像Andrei Alexandrescu说的那样了)。
稍微打了一下交道,发现他写程序的经验好像还是挺丰富的,代码写得工工整整的,要么就是思维比较活跃,有些小技巧什么的,挺实用的。虽然之前看那程序的外在表现,觉得很多细节什么的都没考虑,看了一下代码结构,才觉得真是下了好多心思的。而且他说,如果要做网络联机的,要不卡的话,还得花些功夫。也许我是太低估了这事的难度了,我写程序从来不考虑什么架构之类的,上来就编码,遇到过不去了,才会停下来,然后发现很难再改了,这样下去,永远只能单干,只能做fans,做不到professional。 现在大概了解了一下,他是怎么实现录像功能了,原来每个动作他都是会保存一下的,每个动作有唯一的编号,以及可选的参数,估计在保存动作的时候也会保存一下时间偏移。hoho~~~ 要走的路很长啊,要学的东西很多啊!
总觉得现在的实现也很不好,说起来这么简单一个东西。只是把消行和左右移动处理了,对于出现新块前的时间空隙还没找到合适的解决办法,结束条件判断也是。 猫猫说我骗人,说了要写她的,结果没写,哈哈,因为昨天比较投入地去做我的方块去啦,所以就冷下了。今天也是,挖井还是挺有意思的。 雨烟和疯丫头去广州考试去喽,下班的时候,雨烟走得急急忙忙的,跟她说话都不怎么搭理,晕。真是有想法的人啊!自从上了大学,越来越怕考试,在这方面的能力也急剧下降。祝雨烟和疯丫头考好哦。
郁闷。本来以为有方便的算法了,应该很容易做好了,结果还是有N多问题。我的算法实现能力真是低啊。 经过比较耐心地检视代码和调试,纠正了那些严重的错误,不过还剩下很多事要做。首先,在一个方块到达底部后,要出现一个新的方块,这里会有一个时间间隔,要改。其次,方块满行了要消行。再有,要判断方块到达顶端,并结束出现新块。
方块以前写了那么多的垃圾代码终于被证明是有很多问题的。因为写得很垃圾,所以改都很难改,要想看出哪里出问题都很麻烦,所以我干脆把那些代码都删掉了,应该要重新写一遍,用简洁一点的算法 。 TclSuck就这样算完事了吧,不想弄了,能直接支持C风格函数和类成员函数的扩展了,并且参数个数限制也提高到了10个。其实说实话,那个实现,我自己都觉得很累赘,不过就为了写那个季度技术案例,能混过去了。估计也不会有什么好的结果,最多得很二级归档C吧,这个觉悟我还是有的。但是重要的是,我自己对C++泛型编程技术有了一定的认识,并且居然已经能实际做点事情了。而且TclSuck是真的可以实际应用的,假如哪一天真有需要在应用程序里嵌入TCL解释器,现在的成果就派上用场了。 有了TclSuck的经验,我想下一步,是做个LuaSuck。因为方块里是要用Lua的,而原来的在MspEmu里的实现只是最原始的方法,所以还是得自己写这“胶水”代码。LuaTinker似乎是可以用,但它基于5.0.2的版本,而LuaBind在提供强大功能的同时,粘附了对Boost的需求。因此最后的结论是,再自己重新造个轮子。
在实际写代码的时候,才突然发现解决不了的问题,原本还以为只要花几分钟或者十几分钟就能搞定的事,郁闷!只好放下,又看了一下C++/TCL的代码,仔细地想,为什么它就可以这样大摇大摆地做那些事情。真是实践出真知啊! 收到按键精灵的作者转来的300块钱了。好happy,简直像捡来一样,只是down了个国外的杀毒软件,扫了一下说有Adware,哈哈。有外快的感觉真好,真想再其它地方想想办法挣外快,谁叫工资这么低呢! 做完了TclSuck,要不先把LLYF Spy移植成一个按键精灵的DLL插件,看能不能赚点钱来。
今天去开通了招行的网上银行,虽然开始费了点事儿,没仔细认真地看帮助说明,最后还是可以了。很方便啊,把一卡通和信用卡都绑定了,可以直接在网上进行查询以及一些其它的操作。查了一下,钱真tmd少啊,郁闷,不jump不行啊,真是官逼民反啊!所以要使劲挖自己的井啊! coolkuai3.0大功能上的设计是很不错的,照oneaddone的说话,亮点是加了打榜功能。确实打榜功能是很不错,可以无限扩展新的玩法,不过似乎还是固定地依赖于它的核心,所以可定制程序不会很高。3.0在一些细节上,考虑得不是很周到。 我的方块,可以换肤,一大亮点;可以让用户定制游戏逻辑,比coolkuai3.0的可定制度高得多,而且coolkuai3.0不开放这部分功能,又是要用二进制dll形式实现,此之谓第二大亮点;可以联机对战,像Q块那样支持最多6人同时进行,还可以旁观,这是第三大亮点。另外就是,所有的skin下面,都提供了统一的操作界面,这点还是比较有用的,不用粗暴地要求用户要进行某些操作时,切换回原始界面了。 上面这些是计划内的,要一点点地实现,打算试试ACE这个framework。用VC除了画界面不方便外,其它的都很好用啊!
回家就写了两个函数,晕,4个小时哦,一边聊天,一边打方块,一边看网页,一边写代码,果然,只写了不到200行,呵呵!看明天或者什么时候把顺变逆变的写完了,就可以加上接受输入的代码了。还有就是,消行的处理,不能就这样,应该有个落块的动作之后的延时,这样让玩家知道是因为这个落块导致的消行。 要努力哦!《PIL》还是很值得反复看的,因为对于Lua方面的资料真是稀缺,除了《PIL》,再就只剩下官方manual值得看了。而对于它与C/C++的接口使用,LuaTinker是个比较值得学习的资源,因为代码很少,不会让人看到头昏。如果说,要能完整地看完C++的实现技法,参考三本书,应该就可以了,分别是《Modern C++ Design》、《C++ Templates》和《C++ Primer》。《C++ Primer》可算是一本完整的C++语言参考书,所有基本的知识几乎都讲到了,《C++ Templates》则可算是讲述了C++中template的完整使用参考吧,而《Modern C++ Design》是一种policy based的编程技术的完美演绎,对于如何使用template来产生代码生成器这样的任务,提供了极佳的范例。而LuaTinker的实现,正好是这几方面知识的一次良好体现。
晕死,我用的算法怎么这么麻烦!算了,不管这么多,最后能用就行了,谁管你里面用了多巧妙的算法呢! 现在要考虑的有:1、到顶了后,怎么让它停下来;2、随机程序不够啊,怎么总是连着出来好几个一样的块;3、消行的时候,活动块怎么处理。
哦呵,有动画了,但游戏逻辑还没实现好,看来真得慢慢想一下,幸好没有一开始就用Lua脚本来实现,不然我肯定疯掉了。定时器改用高精度的了,不用GetTickCount了,大致实现了在一个循环里做多个定时任务了,只是对于方块的速度,跟coolkuai3.0还有点区别。真的每天只能做一点点事情哦! 看了一下LuaTinker,刺激啊!给我最大的刺激便是,要好好学GP,好好学C++ Template,好好学《C++设计新思维》!短短不到1000行的代码,给Lua的C接口加上了一个很C++的轻量级wrapper,果然,Andrei Alexandrescu发现的和总结的技术对于实现库,是很有用的!好些语法,我都没看到过,每每让我顿悟,原来C++可以这样用!LuaTinker真是个有趣的东西,看看它的源代码,一来可以学习一下C++ Template的GP方法,二来可以学习Lua的与C的接口使用,真是一举两得!
昨天跑去和xcc还有他女朋友一起吃饭去了,那家梅林的小馆子,可以吃到比较正宗味道的川菜。3个人才吃了50块钱,3荤1素,外加2瓶啤酒。从小馆 子出来,才想起要给家里打电话,因为在馆子里,手机没信号。妈妈果然很着急,因为打不通我的电话。然后三个人走到一个住宅小区后面的小公园,有些公共的健 身器具。我想起疯丫头住这个小区里,就给她发短信说,我在她家阳台下,于是两个人在那里打电话,最后,她在她房间里朝着我挥小红手绢,那情景真是有趣,就 像xcc说的那样,完全一个童话里的人,可怜的小女孩被关在城堡里,朝着外面的小男孩呼救。回到家,发现z3回来了。 写游戏还是多好玩的,尤其是在写的过程中可以试验各种新学到的技术。现在想起来有点遗憾,当年在学习就应该做这些事的,不然现在就可以做更高级的事了,或者至少做这些事应该轻车熟路得多了。 我想还是先内嵌支持游戏逻辑吧,这样程序流程比较好调试,不然同时调试Lua脚本和C++宿主程序,会死人的。到时候可以设置个开关是否使用内嵌支持的标准方块逻辑,或者只使用外部Lua脚本定义的游戏逻辑。 7z格式的解压缩支持暂时也够用了,本来还想加入对rar和zip的解压缩支持的,后来想想,一来暂时不要放时间和精力在这个上面,应该先关注游戏功 能实现,二来为了保持程序文件体积不再为了些额外的trivial功能增加。其实可以在有空的时候,编译一个dll,同时支持这3种格式的解压缩。 游戏逻辑中有几点要注意的,是否贴边了,是否着地了,这两点是最关键的,贴边了就不能作某些方向的旋转和移动了,着地了,就应该返回一些统计数据,同时要把下一块丢出来。还有就是定时回调的支持,也是主要为了作些技术数据统计用的接口。
很奇怪,单独编译了7zDec.exe的时候,就好好的,只要是用VC7.1或VC8编译,都是可以好好地运行列表、测试和解压的,但是集成到我的方块里的时候,就出问题了,早早地便退出说OpenArchive出错了,幸亏有源代码,幸亏前些天刚刚学会在IDE里用debugger调试,经过N分钟的单步跟踪调试,发现最后到一处调用Windows的ReadFile时,总是会返回读取了0字节,这是出错的最终源头!经过几秒钟的思考,决定不用ReadFile这个API,因为源代码中通过预定义宏,来决定在Win32平台上使用依赖平台的文件操作API,而其它平台下都使用C的库函数,马上在前面把那个宏定义取消掉,果然编译通过了并正常运行解压了!加了些函数,可以把用7z格式打包好的skin文件解压到Temp目录下面,哈哈,安逸!不过很怪的是,我把画缓冲的代码注释掉了,但它还是大模大样把图都画出来了,为什么啊,撞鬼了!先不管它了,至少暂时这样可以用了,就先放着吧。 我把Lua的源代码都放进来一起编译,到luaopen_io的地方还是会崩溃,跟踪了一下是到一个sethvalue的地方,不明白为什么会这样,Lua的代码我没看懂,所以暂时只能把luaopen_io这句注释掉来拖延一下时间。好不容易从LuaTinker的官方网站上down到了0.2a版的源代码和二进制文件包,韩文还真一点点都看不懂哦!以前看到过Boost.Python的使用代码片段,发现这样的使用方式还真是独树一帜,之后大概就出现了为各种脚本语言提供粘合剂功能的库,都是使用的这种风格的,至少现在看到Lua就有Luabind和LuaTinker了,LuaTinker是个轻量级的封装,可以学习一下它的封装方法。 用SDK写程序,还是很有成就感di,嘿嘿,就是开发效率太低了。
堕落了。 写了几行就不想写了,去玩去了。可以画出方块池里的方块了,把Lua解释器也集成进来了,不过调用luaopen_io的时候就崩溃了,为什么呀,用的编译器是VC7.1的,自己拿Lua5.1.1的源代码来编译的lib和dll,无论静态链接还是动态链接,到这个地方调用都会崩溃。不知道如果拿源代码来一起编译,会有什么结果呢,呵呵。剩下就是很烦很杂的一些事了,游戏逻辑啊什么的,很多细节要处理。我还想到要写一个skin生成器,至少应该能在一张现有的图片上方便地定义各个元素的位置、大小这些信息,如果每次都是在图像编辑软件里慢慢画,浪费时间不说,人是要疯掉的。还有就是一定要支持压缩打包,不然光秃秃的bmp文件放在那里是很占用空间的,而且看起来很不专业的样子。试了试,一张24位色的1.38MB的bmp文件,用7z可以压缩到36KB!强悍啊,可以让它支持7z、zip和rar的解压,虽然程序启动的时候会慢点,但文件好组织啊。其实有个7z的支持就够好了,之后再考虑zip,最后考虑rar的。游戏逻辑放在Lua脚本里做,有些其它的东西就可能不好做了,比如速度检测等等。因为为了简单,Lua脚本知道的事情越少越好,所以嘛! 上网down了个Q块的外挂,不好用,呵呵。
把MoveWindow的问题改好了,也不知道是哪里出问题了,反正就是这样改了一下就好了,可以缩放成想要的大小了,还把画界面的位置也计算了一下,可以直接画在Client的左上角(0,0)的位置了,哈哈。另外一点就是,把Clipper也弄好了,本来是设置了Clipper,就画不出东西来,后来看了一下返回的错误码,说是BltFast不能Clip,换用Blt就好了,虽然说如果是用软件实现的Blt速度会没有BltFast快,但MSDN上说也只是快了10%而已,更何况它说在硬件Blt的条件下,两者是没有区别的。其实速度不速度现在来看,根本不重要,因为一个小小的方块游戏,对动画要求实在不高,完全用GDI做也可以比较流畅地实现的,要是我开始就是在BDS下用VCL的TImage来写,估计已经快到了可以玩的程度的,呵呵,不过这样也好,学一下C SDK和DX。看了一下DX8里的samples,里面的代码写得真是整齐啊!顺便加了个图标,不过还不清楚为什么没能在窗口左上角显示出来。 本来打算把画方块池的功能完成的,但是人懒了,动了一下就不想动了,呵呵,慢慢来吧。 在看maillist的时候,偶然看到有人提到什么时候用Lua,突然得到提示,为什么不用Lua来做配置文件呢。我还老老实实地用ini文件或者xml文件,要解析也得再研究一下用Win32 API直接怎么解析,以前都是用VCL里封装好的类,唉!这样也好,只要写好一个Lua的交互模块,就可以既用作配置文件解析,又用作游戏逻辑定义了,一举两得啊! 想了想,skin里要定义的数据还是有点多哦,包括主界面图片大小,方块池位置,预览框位置,道具池位置,系统按钮位置,功能按钮位置。 白天考虑了Lua脚本中需要定义的游戏逻辑,包括move_left、move_right、move_down、speed_down、rotate_next、rotate_prev、on_timer、on_cycle、game_start、game_init等。在初始化的时候需要提供一些基本的信息,比如游戏等级等,另外就是对脚本应该有校验,MD5算法比较合适。
用C++ SDK和DX7,还真是烦,什么都要自己处理,郁闷啊!花了好多冤枉时间啊,先是图片压根就显示不出来,后来终于跟踪到原来是在IDE里调试的时候,根据可执行文件的路径来得到图片文件的路径下是没有这个文件的。把它放进去,再看看,发现可以显示一些乱七八糟的颜色了,再设置断点,跟踪到装载位图文件的函数里,发现总是试图去delete一个不知道哪里的值,才明白过来,原来这个结构在使用前应该先清零的,郁闷啊! 现在图片终于能显示出来了,但还有个问题,就是因为没计算好,总是画到(0,0)的位置上去了,另外就是不知道为什么,用了AjustWindowRectEx和MoveWindow后,窗口总是会消失……把这问题解决后,就剩下实时画方块池的任务了! 另外再好好规划一下,跟Lua怎么交互!
现在真的越来越懒了,只写了几行代码就不想动了。似乎DDraw在Normal模式时不能用FLIP?不确定,想不到有这么多未知问题,代码产出率太低了。白天在公司的时候,用VC6编译了unzip、7z这些,似乎还行,回到家,用VC7.1来编译,全都通过了。可以集成unzip和7z的解压缩功能了。 看来还是得好好学习一下怎么使用DX,也不用最新的技术,只要DX7的接口就行了,D3D也暂时先放下吧,DDraw和DSound最先要紧。 首先,只考虑矩形的界面,把主界面画出来,定期调用Lua脚本中的游戏逻辑,再根据Lua脚本返回的结果把方块池、预览框和道具池中的内容画出来。这样看来,似乎没有多少事,就是用DX画个界面,把Lua集成进来。还有一点要考虑的是,怎么做键盘加速和游戏录像功能,同时再考虑一下联机功能。今天在公司看到一段高精度计时器的代码,对于键盘加速,似乎有点帮助,就是定期检测按键状态,按一定速度发送WM_KEYDOWN,用IDA反汇编了kbace.dll,大概看到就是这样做的,也许具体的细节需要再研究。联机从技术上似乎也不是很有问题了,唯一需要的就是时间和毅力了。 好好学习《Windows游戏编程大师技巧》!
诱惑真是让人难受,总是忍不住去做些很费时间很不上进的事情,比如打俄罗斯方块! 打了一段时间的俄罗斯方块,进步很慢,好像现在很不稳定在1.1x的样子,不知道那些3.5以上的人是怎么练出来的。原来,是因为确实缺少一些必要的知识,所以可能很不现实达到那样的高速,尤其是要平移。现在知道是因为键盘加速了,但还有一些小技巧,比如手指的动作应该尽可能地灵活,并且幅度小,这样可以高速地击打按键。另外就是要尽量缩短思考的时间,一方面,应该在完成一件事的时候可以同时进行思考,比如在移动的时候可以思考下一块的动作,另外一方面,应该对一些常见的形状形成条件反射,看到那样的形状几乎不经过思考而直接由肌肉反射进行移动摆块。现在只能想到这几点,但这几点要做好就已经很不容易了,大概剩下的能做的就是不断地练习练习再练习了! 修改了一下tracetcp.dll中的一些代码,再在SocketCapture里对接收到的消息进行解析,其实也就是把字符串截断成几个,分别显示在ListView的几个列里。只是还是没找到正常关闭completion port的办法,郁闷,会把程序弄崩溃。 在微软的网站上看到Vista RC1的下载,32位版本大概有3GB,填了几张表格,回答了几个问题,终于可以下载了,先下一个再说。
今天听到一个同事说,他觉得电视的《红楼梦》比书要好看,然后被我们几个周围的人一起狠狠嘲笑了一把。晚上2点多睡觉,早上8点不到就起床,身体还真有点吃不消,白天的时候就觉得又累又困。zzz终于也辞职了,他的动作还真快,比起我那个同事来快多了,他今天就没去公司了,因为昨天下午6点开始,他的所有权限都已经没有了。我那个总是一起吃中饭,讨论一些编程问题的同事,应该也是再也用去公司了,今天另外一个同事买了一些零食,就说是他剩下的一点钱买的。人员流动就是这么快,倒是我,还暂时只能窝在这个地方,我没那么洒脱,没那么大胆,得找好后路了才敢动。 大概想了一下SocketCapture,在WinSock监视部分要把API的名字单独列出来,至于进程名,可以在宿主程序中通过PID计算得到,而且为了能获得比较快速的响应,我在想,是不是应该把计算得到的进程名保存起来,下次得到PID就直接查表了。还有一点要记住的是,在工作线程里操作ListView时,记得要用临界区包起来。另外有一点要考虑的是,ListView的显示性能问题,是不是应该改成Virtual ListView呢,看到LLYF DebugCapture的速度,真是太慢了,当时不知道是怎么想的,居然没考虑到?倒是LLYF Spy中的那部分功能是用Virtual ListView来实现的,响应速度还算可以了,15K条记录大概要全部删除的话,不到1s就可以了,添加记录倒不知道需求有多快。做完这些,还剩下过滤功能,数据显示功能这两大块。之后,再考虑其它的周边需求小特性。不过最近我总是在为界面的事儿郁闷,总感觉为什么我用BCB画出来的界面看起来非常业余呢! 我现在都还像个学生一样,总想学点自己感兴趣的东西,而且还很多。今天在公司里就看了很久的编译原理的东西,想着怎么做一个所谓的“按键语”的解释器。另外要学的是,基础算法,这方面我最薄弱了,因为一直以来数学都学得不好。看了一本写棋类游戏的书,就对那些算法感兴趣了,可以写个象棋和五子棋的程序,集打谱、人机对弈、联机对弈功能。还有音频开发和简单的图像处理算法,因为打算要写一个音频播放器,要给那CaptureHelper加上简单的图像处理功能,要写模拟器。甚至有点想写一个像QQ火拼俄罗斯的东东,但是要有加速功能,更强的娱乐性(用coolkuai上的人的话说),我是真的疯了,我确定,一个人有这么多精力吗?我似乎全是兴趣驱动的,而且目的除了希望能获得经济利益,还为了多学点知识,hoho~~~
早早地回到家,把Detours里的代码copy过来试了试,用Complete Port和Named Pipe协作完成的IPC机制看起来对高吞吐量的需求是可以很好地满足,有时候就是不得不佩服那样的人,可以把程序写得那么好。剩下要做的是,把数据分解成不同的字段,可以方便地提取并显示到ListView中去,另外就是把dll改一下,可以用global hook注入到其它的进程中去,或者用remote thread,对于没有消息循环的进程,消息hook就不起作用了,只能用remote thread来解决吧。 看了千千静听的论坛,突然想自己也写一个这样的程序,我真是疯了,总是想着自己把所有的东西都做了,主要是看不惯用不惯,但别个又不能照着我的意见来修改实现我的需求,只好自己操刀动手。不过这个难度也大了点吧。 从论坛上down到一个叫Volume Logic的音效插件,有for WMP、for Real和for Winamp的,就是没有for foobar2000的,有点不爽,换上WMP一听,惊人的效果,立马给人不想再用其它播放器的念头!就是可惜了没有foobar2000的版本,还有,似乎是有iTune的版本的,不知道什么时候能把它集成到iPod里,这样,用随身听也能听到高品质的音乐了,人类的智慧真让人佩服!
Category Software
CoreDNS有一个官方的prometheus插件,可以暴露一个http接口给prometheus使用。通过观察度量数据,可以了解到自己网络使用情况,有些比较有趣。
前些天突然发现家里台式机(Windows 10)上的Firefox不能工作了,具体表现是:
自从给blog换了个theme,一直断断续续在调整一些细节,于是不免要用到jekyll,不过前些天手贱给公司的iMac升级所有gems,结果升坏啦,一运行jekyll serve就会报错:
自从知道nginx后,就再也不愿意用Apache了,总觉得Apache配置复杂、体积笨重、运行缓慢,当然这些只是我的无根据臆想。原本用nginx只是用来做静态站,做反向代理,今天zhangh说想要个Wordpress做产品展示页面,于是只好弄一下。顺便感叹一下他的执行力。
发现FreeBSD上的LXterminal很容易在输入长命令时换行错位,于是胡乱覆盖掉前面的内容,就很难好好地输入完一整条长命令。这事在Debian上没遇到过,我也只在Debian上装过LXDE并使用LXTerminal。其他在Linux上用过的Terminal也只有GNOME Terminal和Mate Terminal,感觉吧每种Terminal都是配合自家的DE的,虽然可以混用但心里总是有点疙瘩。
买硬盘有一段时间了,当时的想法是可能要做Linux平台的开发,所有自己家里的机器上也得正儿八经地装个Linux某个发行版,于是纠结了很久,终于在京东上花了总共780块大洋买了个WD的绿盘2T。结果把硬盘装入机器后,只是分了十几个分区,就再也没动静了。
后来过了大概2、3周吧,实在对自己鄙视得受不了了,翻出两个8G的U盘来,一个是花了20块大洋从淘宝买的,谁料想过了没多久公司(已经是前公司了)又因为十周年纪念每人发了一个8G的U盘。于是从网上找资料看了一下,在Windows系统下用一个叫Win32Image Writer的程序把Linux发行版的ISO镜像写到U盘里,就可以从U盘启动安装了。
先是装了个Debian 6,用的GNOME,装好后发现屏幕闪得厉害,估摸着是显卡驱动的问题,据说ATI的显卡Linux就是支持不怎么好,我的是Radeon HD 4540,从网上找了一圈各种解决方案,试了各种配置和开源闭源驱动,都没效果,很失落。本来对Debian的印象很好的,就是一种运行速度快,而且稳定的发行版,因为曾经在公司用VirtualBox装了LinuxMint和Debian同时编译clang,发现在Debian下要快不少。可是现在的闪屏问题使得这个系统处于基本不可用的状态。后来我还试了换GNOME为KDE,果然没用。于是知彻底绝望了。
因为Debian的闪屏问题搞不定,于是只好试着装装Ubuntu12.04这种小白发行版,它果然一装上就所有驱动都搞定了,不光是我那块显卡,连在10.04时需要自己找相同芯片其他牌子无线网卡的驱动源代码来自己编译安装才能使用的Fast无线网卡都直接驱动了。真是让人感叹果然是个适合我等小白使用的发行版。本以为问题就这样搞定了,于是下载了qt呀,qt creator呀,clang呀之类的源代码,都编译了使用。可是好景不长,不到两个星期,就出现各种问题。比如启动特别慢,在红黑屏要停留很久,一开始都以为是启动不了了,后来才发现是因为需要时间很长。再后来,各种已有的分区不能自动挂载了。虽然可以自己敲命令挂载,但终归让人心里极其不爽。到现在,居然不能关机了,一直停在关机logo界面里了。失望透顶,Ubuntu是从7.x以来,各个版本都装过的,窃以为最不稳定的Linux发行版,没有之一。
今天实在对Debian和Ubuntu失望之极,打算再换个发行版试试。之前在VirtualBox中用过不短时间的Arch,Fedora,openSUSE和Mandriva,对于Arch和Gentoo,我就担心显卡问题搞不定。对于后三者,不是很喜欢它们的包管理机制。于是最后打算看看Mint吧。以前在VirtualBox中也装过Mint,现在公司里还装着用呢,它默认不使用GNOME或KDE,而是使用Mate或Cinnamon,感觉挺精致的。在装Mint还是LMDE之间犹豫了一会儿,后来看LMDE用的是Debian的testing源,在我看来相当于放弃了Debian的稳定性这一大优势,所以还是用Mint吧。安装过程仍然一样,写入U盘可以当Live盘启动,然后安装,很快很傻瓜。而且我之前装Debian和Ubuntu把它们的/home都放到同一个分区,而且两个系统中都用相同的用户名,在Mint中也这样做,就可以直接使用以前做好的一些把配置写到/home目录的软件的配置了。
Mint用了近一天了,感觉不错,就看它能用多久吧。
前两天才知道GDIPP是LGPL的,放在googlecode上。昨天把它所有的源代码clone下来了,然后编译了一下,倒是全部编译出来了,不过运行后貌似没什么效果,囧了,有空读一下它的源代码。众所周知Windows的字体渲染效果不怎么样,所以对于自己有一套效果良好的字体渲染手段是很有吸引力的,我就是想试一下把GDIPP集成到自己的程序中去。
看到推友@davidx_me说有个叫WBIM的for Mac的五笔输入法,马上去下载了来试用一番。之前一直用系统自带的那个五笔型输入法,相当不好用,不但字符小,应该是GB2312的吧,而且连候选提示都没有,其他的常用选项更不用说了。试用了WBIM后,就爱不释手了,虽然跟小鸭、极点神马的在可配置选项上有所差距,但总体来说,已经可以说是鸟枪换炮了。
它有着大部分常用的输入需求的选项,比如繁简切换、中英文标点、全角半角、空格,还可以自定义翻页的快捷键,可以自定义用户词库,比较遗憾的是貌似不能自定义选择候选的第二三项的快捷键,不过好在五笔输入绝大多数是选择第一项的,所以也可以忍受。
再有一个还算满意的是上屏速度不慢,虽然偶尔还是有点呆滞,不过也在可以忍受的范围内。
最后要说一下,这个软件目前貌似是免费的,这对于混迹于人傻钱又多的Mac用户群中偶尔几个穷人来说,实在是个福音。
看到有人晒他用的Firefox扩展,想想自从我走出学校以来,就开始用Firefox,已经4个年头了,也晒下我用的扩展,Firefox如果不用扩展,还真是连IE都不如呢!
Adblock Plus,这个几乎是所有装了Firefox后都会装的扩展吧,我当年是过了好久才反应过来,用Firefox确实很少弹出各种广告窗口哦,全靠它了。
接上,有个同事后来跟我说,有个小NoScipt的东东,很霸道,我试了,果然把每个页面上的一堆脚本都禁了,确实从事实上到心理上,都更安全了。
AutoPager这是个国人做的扩展,可以自动把下一页的内容接到本页下方,造福了我这种懒人,看论坛可以一滚到底,当然我最开心的是用它来在线看小说,几百章也可以拼成一页,好壮观!
AutoProxy翻墙利器,不想花钱用VPN,只能用Tor之类的免费方案,但又难忍它的龟速,当然要把白名单里的网站剔除掉了。
Echofon似乎是个不翻墙也可以用twitter的方案,功能一般吧,有时候还自动登录不了,界面也不好看,还不能自动缩短网址。
FireGesture好像是Firefox中最流行的鼠标手势扩展吧,其中有一个版本用着很不顺手,好在过了没多久升级后,又顺手起来了。现在用鼠标手势操作浏览器大概是非菜鸟的必备技能吧。
接着是一组扩展合用,为了让Firefox的界面像Chrome那样,主要是先装个第三方Theme叫Chromifox Extreme,然后是扩展Chromifox Companion,这样可以让Firefox的Tab,工具栏,地址栏的背景色,位置等跟Chrome比较想像,然后是装Hide Caption和Hide Menubar把标题栏和菜单栏都隐藏起来,这样至少跟Chrome有九分像了!
比较有意思的是Google Redesigned扩展,可以把Google Reader、GMail、Google Calendar的默认界面替换掉,嗯,我就是个换肤论者,就是想试试不同的界面!还有个Integrated Gmail,可以在Gmail的web界面中又同时显示当前账号的Google Reader以及Google Calendar内容,对于gfan来说也是值得试用的,一个入口多种服务嘛!
Weave Sync可以将书签、浏览历史、密码和Tab信息保存到远程服务器上,不过我是没什么大用,因为我基本上只在我自己的机器上用,而且Firefox也被我用命令行的方式重新指定了用户数据的目录,所以直接备份也不麻烦。
除了这些,还有什么QuickDrag呀,Tab Mix Plus呀,UnMht呀,CoolPreviews呀,Coral IE Tab呀,Flagfox呀,Shorten URL这些扩展,平时装着也是装着,用得不多,但偶然想到时若没有这些功能,又会觉得有点儿不舒服,姑且留着吧!
今天在安装程序中添加了2个网页快捷方式,因为用的是ISTool编辑的,所以就直接用它来编译了,结果试了几次,都发现没正确添加上快捷方式,连原来应该有的其他的快捷方式都没有了,甚至发现我本来让它在所有文件复制完后,应该有个选项可以让用户选择是否运行程序的,连选项都没有了。 真是奇怪的问题,于是在CruiseControl的历史记录中翻出最近的历史,发现还是正确的。想到这个安装脚本的区别基本没有,主要在于使用的是不同的编译工具。于是用命令行ISCC.exe编译了一下,居然是正确的! 这ISTool原来还是自己做了一套编译功能的说?
前些天才知道,tor也是会被封的,要用tor bridge才行,至于bridge的ip从哪来,网上到处有说,也就是给某邮箱发个邮件索取来的。 这两天发现,这些bridges也是时好时坏的,于是笨办法是不停地索取新的bridges来用,今天发现得到的ip有的是之前得到过的,也就是说可能是不好用的,只能试试之前没用过了。 唉,封得越来越死了,无语!
昨天一时好奇,从网上下载了CTeX 2.8 Beta1来,安装好后,尝试着编译原来的一个纯英文的文档和一个Beamer做的幻灯片,结果发现全都有问题。首先是编译速度非常非常慢,CPU占满。然后是原来用grphicx的地方,直接插入png的语句编译不过。最后是发现Beamer包的应用和bibtex联用的地方,最后一次pdflatex编译时,编译不过。 速度慢倒暂时也忍了。至于插入png的语句编译不过,通过网上找到的资料,下载了个ImageMagick,里面有个convert.exe,可以将png转换成eps,而实际上这eps也只有在普通文档中是可用的,在Beamer中仍然要用png,这是让人很郁闷的地方,几方处理方式不一致,是让写程序的人很头疼的事。 好吧,这些都是可以放一边的。最最关键的是,那个幻灯片编译不过呀!如果不编译最后一次,那参考文献就不行了。于是继续上网找办法,发现一会儿工夫有了CTeX 2.8 Beta2,嗯,实际上我是很有心理准备的,这么一个小Beta号的变更,是不会有大变动的,但仍然不死心地尝试了一下,果然不出所料还是不行的。于是在CTeX的网站上看到正式发布的2.7.1.42版本CTeX,仍然不行。期间还试过有个CTeXLive2008的集成包,呃,也是不行的! 我相当的郁闷!于是上CTeX的论坛上发帖求助,直到今天有个管理员给了个2.4的CTeX下载路径,才算最终搞定!对于这种不了解的东西,不能随便升级了,要升级前也得对能正常工作的旧版本做好备份工作,以便及时回滚啊! 昨天差不多搞了整整一天,幸亏现在网速快了,不然还得花更多的时间呢。被LaTeX折腾了,教训啊!
本来计划是明天才开始做这个功能的,不过因为着急着要尽快走流程办手续,只好把这最主要的任务尽早实现了。 总的说来,基本算法是完成了,不过还是有些小bug。大体的算法是这样的:三类连接线,包括折线,样本曲线和贝塞尔曲线,其中两种曲线要都Flatten一下,最后变成一组前后相连的线段,然后将这组线段分别与矩形的4条边计算交点,把离交点最近的跟踪点作为新的连接线的一个端点。 这里要注意的是计算交点的顺序问题。也就是说,如果是从连在矩形上的端点开始遍历那组线段来计算交点,那么应该以最后一次的交点作为最终结果。而如果是从另一个端点开始遍历计算交点,那么应该以第一次的交点作为最终结果。 其次是中间点的调整。像折线,一个比较简单的做法,把交点与端点间的所有连接点都删掉就可以了。而样本曲线则应该调整中间的切点位置,贝塞尔曲线则是调整两个控制点的位置,以免新生成的曲线因为中间那些点的牵引而仍然横穿矩形。
今天大概花了两个小时吧,加了右键菜单添加子对象的功能。这个功能的实现,有几个部分需要关注。 首先是图形绘制部分。这是需要修改最少的部分,因为之前的工作已经实现了子图,子对象就是在子图中添加的对象,只需要在相应的响应函数中实现添加子图,在对应的图中添加对象即可。 其次是右键菜单动态生成。这部分也不是很麻烦,只要识别出当前点击位置是什么图形,该图形在业务意义上可以拥有哪些子对象,就可以拼装出一个完整的右键菜单。 最后是花了不少精神的配置信息读取部分。本来配置信息都是从配置文件中读取的,因为并没有对配置文件与配置项的对应关系做严格的限制,所以原先的设计中,把配置项的信息基本上都是做成实时读取的,今天又要拿来用一次,就显得原来的设计似乎不是很方便。不过我还是没做更多的改进,仍然沿用原来的做法,实时读取某个对象可以拥有的子对象的类型信息和其他描述信息,以便于添加到右键菜单和后面的创建子对象 。 今天的任务基本完成。数了一下代码量,这个项目总共才4.7Kloc,挺少的,很出乎我自己的意料之外。这么算来,假设我在这个项目中已经投入20天,那么有效产量大约是230行每天,比自己订的目的500行每天少了一半多啊!
这次的需求中提到,能为一个图形关联一个子图,用该子图来描述该图形的内部结构信息。展现给用户的语意是,当双击一个图形时,则展示该图形关联的子图。 今天投入去实现该特性,基本没有遇到什么阻碍,因为原来的架构设计可以满足这个需要。当初把用户界面视图绘画层,图形管理器,图形对象三部分独立开来实现,所有用户操作都从视图绘画层接受,将操作信息传递给图形管理器,再由图形管理器转发给各个图形对象进行响应。在那之后,我曾经考虑过,这么做是不是有点儿过度设计,这个图形管理器的操作响应转发功能是不是多余的。现在却发现,这样的实现才刚刚好,一个子图,对应一个图形管理器,视图绘画层要始终跟踪当前起作用的图形管理器对象,任何时刻都只跟一个图形管理器进行交互。这样,没花费多少力气,只是增加了创建图形管理器,维护图形对象与图形管理器的对应关系以及销毁图形对象和图形管理器的功能,就可以实现子图功能了。 在实现这个功能时,有一个小心得,及早加入dump文件捕获功能很有用的,因为即使是开发阶段,也不是每次都在调试器中运行,所以当在自测试时偶然出现的崩溃现象,可以及早通过dump文件进行定位,而且因为是Debug版本,所以通过dump文件分析出的结果往往比较精准和明确。 除此之外,还发现一个以前没想到的现象,原来MFC中,CDocument类的OnCloseDocument方法,居然会销毁自己,及其派生类对象,如果要做些扫尾功能,放在派生类的OnCloseDocument方法中时,一定要把调用CDocument的OnCloseDocument方法放在最后。
昨天熬到快后半夜,从Embarcadero官网上把Delphi/C++Builder 2010的ISO安装镜像下载了下来,并从网上找了个一年试用的license,装好了来体验一把。 在4年的大学本科生活中,可算得上用了3年半的C++Builder,在毕业后从事测试工作的那近2年的时间里,也断断续续地用着,所以总以为自己对C++Builder的感情可能是不容易割舍的。但是经过昨天晚上和今天晚上短暂的试用后,嗯,只是把一个C++Builder2007的工程转换为C++Builder2010,编译有不少通不过的。我放弃了,我想说:Byebye,C++Builder!编译不过的地方,我看了一下,都是因为Unicode这个编译选项引起的,我粗略地找了一遍工程设置,似乎没有可以修改这个选项的。说实话,我感觉最好的版本是C++Builder6,后面跟Delphi合并使用一个IDE后的版本,差不多每个大版本都装过,但都没有让我继续用下去的念头。 出2009时,我曾自己安慰自己,彻底放弃它了,这回有了2010,还是忍不住弄来装了装,真的彻底放弃了,没有一点亮点!一款C++开发工具,我关注的是三方面:IDE、编译器、类库(框架)。曾经在BCB6.0和VC6.0的年代,这三方面BCB都是占据优势的,可是这之后的7、8年来,VC在大幅进步,而BCB却是裹足不前,VC现在都已经精进到几乎没事可做的地步了! 就让它,活在回忆中好了!
图形编辑功能已经做了两周了,到现在为止,也只能画出矩形框,在矩形框之间用白线、样本曲线,或贝塞尔曲线进行连接。又一次发现,只有在编码实现的时候,才会遇到很多之前没有想到的各种问题,而且有些问题要解决,也是要花费不少功夫的。 要考虑图层的问题,如何定义每个图形所在的图层,在绘制时,才得比较方便快速,而且需要可以随时修改图形所在的图层。图层的影响是多方面的,例如在绘制整张画布及图形对象时,要从底层开始绘制,而对于在某个点上点击选中一个图形对象时,却要从上到下进行遍历查找。 还考虑随时可以修改画布的大小,因为在添加图形,或修改图形位置时,是随时都可能把图形放在一个走出当前画布大小的位置上的,这时程序应该可以自动检测出需要扩大多少。对于向右、向下方向的扩大处理很方便,直接将画布大小重新定义即可。而对于向左、向上方向的扩展,则除了重新定义画布大小外,还得把超出部分归整到(0,0)这个坐标上,也就是说,要把所有已存在的图形对象的位置都调整一遍。 再要考虑子图的问题。也就是说,一张完整的图片,在某一时刻,只是显示了其中一部分图形对象,这部分当前被显示的可以作为一个子图来对象,而没有被显示,则是属于其他的子图。每个子图之间应该没有多少强相关的关系,最多是一个图形,与一个子图可以有包含(从属)关系,一个子图用来解释一个图形。常见的一种应用场景就是,双击了某个图形,就展示另外一张图片。这就同样要求设计一种灵活高效的数据结构来保存这些信息。 从当前的实现情况看,每个图形对象中,都有不少成员变量,保存了一些中间数据,这些中间数据不属于图形对象的本质属性,却对于图形在特定时刻进行动作起着重要作用,从代码美观角度讲,感觉很冗余,所以要考虑如何优化,减少这种成员变量。例如对于一些状态变量,或许可以用位域的标识。
开始做那个图形编辑程序1周多了,现在遇到了瓶颈,因为原来的设计考虑得太不全面,很多很明显的问题都没有有顾及到,结果到实际编码实现到一定程度时,发现原来的程序结构有点不行了,不够用了。 主要的矛盾在于,原本我的设计上是,每种图形,都各自响应用户操作,互相不知道其他同类的存在。而实际上这是不对的,或者说不合适的,比如连接线,在端点确定前就是要知道那个位置是否贴到某个图形上了。另一方面,当某个图形上的连接点移动时,同样得通知所有跟这连接点连着的连接线,或者是某个图形被删除时,得同时删除连接在它上面的所有连接线。 本来所有图形对象都在一个管理器进行任务分派,现在看来,至少有得有一个类,可能还是这个图形对象管理器,做更多的事情,可以查询它所管理的图形对象一些特殊的状态,还要维护图形对象间的关系,可以是一个邻接矩阵,或一个邻接链表,反正就是一个图的表示法。这些不是我现在的主要困扰,我的困扰在于,图形对象怎么来调用这些查询状态的操作。本来图形对象被那个管理器对象包含了,另一方面那些查询状态的操作得知道所有这些对象,这样的循环依赖,让我感觉不爽!
话说,我并不是计算机科班出身,因此很多基础的知识都是不知道的。这不,发现SQL真是有必要要好好学习一下了。最近在很多地方用到了数据库来存储东西,于是不可避免地需要写些SQL,最最基本的SELECT、INSERT、UPDATE还是会点的,不过也仅限于在单表中进行操作。 前两天发现一个可以显著提高在Sqlite3中SELECT性能的方法,那就是建索引。因为IDE需要AutoCompletion和Calltip功能,而用于这两个功能的数据都是存在一个sqlite3数据库中,该数据库目前已经有不少数据了,光是一张记录了方法的表,就有1万多条记录,从中SELECT是经常要做的操作,所以能提高点性能是很有意义的事。自从给该表建了索引后,至少感觉上非常明显,AutoCompletion几乎没有任何停顿就提示出来了,而以前的话,有个明显的停顿,虽然这个停顿的时间并不长,但已经能让人感觉出来了。这只是一点,让我觉得学习一下SQL有好处的地方,就让我尝到了莫大的甜头。还有一点就是,有不少地方的SELECT的条件,是从这次其他的SELECT中取得的数据,而我全部都是分成一条SELECT一次操作来进行的,我想,如果能把这些SELECT合并成一条语句,应该还是能再提高点运行速度吧。
嗯,一直以来都以为UTF-8和Unicode是一类的,今天才明白过来,UTF-8确实明明是多字节一类的才对啊,我的理解能力实在是太差了,唉! 不过今天倒是也知道了,如果只是要在ANSI、Unicode、UTF-8之间进行转换,使用两个Win32 API就可以全部搞定了,不需要用什么iconv和ICU了。总是觉得微软做的东西易用性真的很好,通用软件产品很适合普通用户使用,而那些开发工具、库、API对于开发者来说,也很好用啊! 唉,我也就只用玩一下这些容易的东西了。
看《Windows高级调试》猛然发现一个问题,书中的例子都是对exe进行调试的,而且几乎都是知道问题重现步骤的。这跟我现在的情况可差得很远了,我只有一个core dump文件,不知道问题出现时的操作。看书上都是一直操作,直到问题出现,然后在调试器中断下来,查看寄存器,堆栈,句柄等信息,再抽丝剥茧一点点推测出问题的根本原因。我不行啊,我在源代码中加入了一个自定义的UnhandledExceptionHandler,在问题出现后,就转到那里去执行了,连最后现场都被破坏了的! 晕!
无意中在一个讨论组中看到Chrome的新differential算法Courgette(http://dev.chromium.org/developers/design-documents/software-updates-courgette)的讨论,其中提到一个Develper Channel从190.1到190.4的升级例子:完整升级包:10,385,920字节,一般bsdiff算法:704,512字节,而Courgette算法:78,848字节,近十倍的空间效率提升啊!真是太恐怖了,直到今天我才知道,原来对于二进制补丁,也是有这种优化算法的,汗啊!http://neugierig.org/software/chromium/notes/2009/05/courgette.html 这篇文章也对这个算法进行了介绍。大体上,Courgette算法目前是基于x86体系的,适用于exe、dll等可执行文件补丁,它会将这些新旧版本二进制码进行反汇编,在反汇编的基础上进行比较,据说是将二进制文件中所有的internal pointer/reference的地址重新符号化, 然后再计算differential,得到补丁。 另外一个博客中也有一篇讲优化二进制补丁算法的,http://blog.csdn.net/housisong/archive/2006/04/11/658863.aspx。 由此我想到我们现在的自动升级程序,都是完整文件下载替换的,土了啊!
啊,非SHFileOperation莫属!今天要实现个文件夹复制的特性,于是就想到这个API,可是很不幸,无论我怎么整,都报个1026错误!从网上找了一圈,发现代码根本一模一样的,人品问题啊! 后来在花费了不知道多少时间后,也许是1小时,也许更多,等不及了,花了10分钟自己用递归写了个函数来实现文件夹复制,我吐血三升!
今天看到一篇文章,讲鼠标手势算法,觉得有点意思。现在不少软件都有了鼠标手势支持,尤其是浏览器,几乎成了高级用户的标准配置了。 这算法分为4步。 一、过滤鼠标移动动作。如下图所示,这步过程把一连串的鼠标移动动作中幅度过小的动作过滤掉。这跟系统配置也有点关系,不同的配置下,记录鼠标移动的速率等量纲有所不同。
二、限制鼠标移动方向。如下图所示,对于简单的鼠标手势支持,只支持上下左右4个方向,就把其他方向的动作都归并到这4个方向中。一般就是比较一下上下方向和左右方向的差值,取大的那个作为最后的方向。
三、简化移动方向序列。如下图所示,这步非常简单,原本是右右上上右上上的方向序列,简化后变成右上右上了。
四、匹配和推演。这步是最困难的,表面是把夹杂在长距离移动动作中的短距离动作过滤掉。大概的做法是先把整个动作序列与一组预定义的序列匹配比较,如果匹配失败,就把这序列中最短幅度的动作过滤掉,再进行匹配,如此循环往复,直到最后匹配到为止。
提高软件生产力,意味着可以在更短的时间内交付质量更好的软件产品。软件生命周期的各个环节都对此有着极大的影响,而从开发人员的角度讲,有几件事是力所能及的。 一、提高代码产能。单纯的代码生产力,比如一个开发人员原本一天能写100行代码,经过一段时间的学习和锻炼,相同规模相同难度相同质量的代码,只需要半天就可以完成了。 二、提高代码质量。这个质量指代狭义的稳定性、鲁棒性,代码bug少。这一方面也是通过学习、锻炼可以获得此类能力和经验,另一方向,引入合适的工程方法,比如TDD等良好的实践,也有一定的效果。 三、发扬“拿来主义”。现在可以从各种渠道获得并使用的代码片段、函数库、类库、框架、组件、中间件、软件等等不计其数,并不是所有特性和功能都要自己着手开发实现。只要代码功能满足实际需要,质量在可承受的范围内,可维护性也过得去,以及license没问题,就拿来直接用吧。可重用的,不光是代码,还有架构、设计思想等。形式上,无论是源代码复用,还是二进制组件,都可接受,甚至可执行程序也可以。 四、提高代码复用性。自己写过一遍的代码,尽量不要写第二遍,复用吧!代码重构一种使得代码得以提高复用性的不错的办法。 五、提高架构可扩展性。为了更快更好地实现后续新增需求,高可扩展性的架构是一个良好的基础。可扩展性的对面是可裁减性,假如有一天突然要求去掉其中的一些特性,这种情况也是存在的。这点对经验的要求和依赖比较高。 六、提高架构和代码的可修改性。需求发生了变更,或者原本对需求的理解就有问题,或者发现了bug,这些情况都需要对代码进行修改,别因为一个功能上的小改动而引发代码上的大改动。 七、使用先进的工具、方法和流程。比如眼下流行的敏捷,使开发流程减少僵化。使用优秀的IDE,智能感知、重构、自动代码生成等等。使用版本管理工具,定期对一些代码进行指标度量。 八、宽松、舒适的环境。环境好,对开发人员的身心都有好处,长期收益极大。 九、快捷、方便的求助渠道。向人请教是一种很省事的方法,但很可能影响其中一方的状态。上网搜索则是另一条有效途径。 当眼下软件生产力严重不足的情况下,这是仅剩的几件我能做的事了。
老雷说,画图功能可以让Excel来做,我曾经还抱着试试看的心理在网上找有没有免费的代码可以方便地生成各种柱状图、饼图的,没找到,也实现懒得自己去画了,于是硬着头皮去用Excel了。 VC的程序操作Excel,而且不光是为了存取数据,所以用COM是最正规最有效最理想的方法。如果是用MFC,可以让IDE自动生成其中的某几个接口的封装类,这样的好处是封装得比较高层,使用起来更方便简单一点。如果直接导入类型库,会生成整个类型库内所有的接口和类型的封装,不过是底层一点,最多是用一下COM智能指针封装的接口,可以少处理一些引用计数的问题。 先可以录一个宏,查看VBA代码,就基本知道要用哪些接口的哪些方法了,但实际上如果用VC通过COM来操作,会发现跟VBA的结果经常有些出入。这让我有点纳闷。不过今天整了一天,总算勉强完成任务了。
今天把一个用了wxWidgets、Xerces-C++、luabind的工程用bjam写了个构建脚本,可以用MinGW来编译,也可以用VC来编译,这就是bjam的好处,很少需要关心不同编译器的命令行参数。 经过这次实践,还发现alternative的选择原来是要跟它的属性完全对应上才行。比如一个目标,写了toolset和variant以及threading,则在命令行中要把这三个全都设置上,不然它就说找不到匹配的目标。这让我有点头痛,假如我只想在命令行上选择toolset,而让其他两个属性固定死,那怎么办。 不过还算可以了,目前基本能满足实际需求了。
bjam编译Windows下的rc文件不用特别指定,就像其他C/C++代码文件一样,直接放个文件名就行了,它能自动认出来,并调用相应的资源编译器来,只不过生成的二进制文件后缀还是跟代码文件编译出来的一样,不过并不影响最后的链接过程。 对于debug或release下使用不同配置的情况,需要至少每一种情况写一遍目标,同样如果是不同的toolset也这么处理。 今天把一个使用WTL写的工程用bjam系统编译了一把,果然也不是很麻烦,不过需要写不少特定的参数,bjam的默认配置不够用了,所以这样的情况还是不适合用bjam的。简单地说来,适合用bjam的场合,至少是没有一个好用的IDE的情况下。 想起直接在bjam里用wx-config来生成的编译选项,居然会出错,因为wx-config的输出后面多了个回车,用make就没影响,而链接选项在bjam中也没影响。没办法,去网上找到wx-config的源代码,只有一个文件,不过有几千行,稍微找了一下输出的代码,把末尾的回车换行去掉,再试了下,果然可以了。
要在工程的根目录下放一个Jamroot文件,可以没有扩展名,也可以加.jam为扩展名,这样其他子目录下的可以命名为Jamfile了。 基本上是个大小写敏感的系统。 还没找到怎么让它来自己编译Windows的资源文件。 用path.glob-tree可以指定目录来进行glob-tree,如果光用glob-tree,是只能从当前Jamfile所在目录开始全部搜索的。
在编译Luabind成独立的库时,顺便学了一下bjam。bjam在某些场合下挺有用的,如果之前用的是make,再来用bjam,感觉就是用过汇编之后来用高级脚本语言。 折腾了一阵子后,我的感觉就是bjam几乎是完全给boost设计的。其中最突出的特点是,编译器无关。它在这方面做不了少工作,只要指定一个toolset,它就能自动查找编译器所在的路径,而且不用关心编译命令行,因为大部分常用的选项它都提供自己的抽象方式来表达。还有就是它似乎有良好的可扩展性,在boost的源代码目录下有几bjam的工作目录,下面有几个子目录,里面分别存放着一些jam文件,在写jamfile时,可以import模块进来用。 我捣鼓了一阵,把自己一个工程,里面有几十个C++源文件,从GNU make转成了bjam工程。感觉有点新鲜,但总的说来,它应该是适用于这样的场合:工程是可移植的,即要跨操作系统,跨编译器。
主要的内容生成功能基本完成90%了,于是就研究一下怎么把这html内容通过SMTP发送出去。原来有一个从CodeProject上找的SMTP类,直接用WinSock写的,倒是也可以正常工作,接口也很简单,而且当时沾沾自喜经过自己修改,是可以支持中文的,其实是自己土了。现在只是想把这个类再修改一下,可以直接发送html内容,不过看起来似乎有点儿复杂。 用Outlook Express发了几个邮件,用Wireshark抓来看了看,看得云里雾里。后来找到另外一个示例程序,有源代码,也可以发送html,用Wireshark看了看,发现差别还真大。最后看到一个说明里提到,RFC2110里就是讲这个的,于是马上找来瞄了几眼,终于有点儿理解了。原来Outlook Express在一封邮件里包含了2封邮件的内容,分别是html和plain text的,这样无论对方的客户端能不能支持html阅读,都可以方便地看到真正的邮件内容,当然html中的链接嵌入对象除外。
老雷要一个自动发汇报邮件的程序,这个任务落到我的头上,于是我这周开始整这玩意儿。所有的数据几乎都是存放在MySQL里的,一个是RedMine的内容,另一个是组里自己开发应用程序使用情况统计工具,服务器端也使用的MySQL。今天我发感叹地跟开发那应用程序使用情况统计工具的同事说,幸亏你们当时选用了MySQL,不然还要更麻烦一点,比如万一选了个Access或者Sqlite3,还不能方面地远程访问。如果是SQL Server,还得使用一套不同的数据库访问方法。 通过这两天使用mysql++来访问MySQL的经历,我感觉无论是MySQL引擎,还是暴露的API,都挺不错的。大概是因为ADO访问SQL Server用得有点反胃了。那段经历让我觉得最为不爽的是,如果SQL写得有点问题,就会抛异常,而且这异常就是catch不了,因此很难排错。这次用mysql++在这方面就做得不错,异常可能catch到,而且给出的出错信息很准确,定位很方便。另外有点值得一提的是,mysql++里有一个重载了很多类型转换符的String类,呵呵,这也是一种办法啊,不过使用operator+时却遇到了点小麻烦。 开发这个程序最大的收获大概就是这个了,大部分情况下,可以用MySQL来代替MS SQL Server了。再扯远点,Access也有点不好的,打开的时候特别慢,用Sqlite就挺快的,而且Sqlite3还是是弱类型的,呵呵。
之前说到,用多了chrome,竟然不知不觉地想着firefox的界面也想跟chrome一样,说干就干,先去找theme,要能尽量模仿chrome的,还真找到一个chromize extreme,不过它只能支持3.1b1以上版本,没办法了,我现在是3.0.6,只好去重新down了一个3.1的装上,还是像以前一样,用命令行参数,将配置目录指向3.0.6的目录下,这样就可以使用3.0.6中已经有的一些东西,不过有些扩展不兼容,暂时不管了。装了chromize extreme后,挺像chrome了,除了多了个标题栏。找到一个hide caption扩展,不过发现它不能用在3.1版本中,于是另外想办法。最后只好用custom button扩展,加上一段脚本,叫max的脚本,会自动将firefox弄成最大化并隐藏标题栏。 搞定!界面看起来真的像chrome,感觉舒服多了,哈哈,就是不能用3.0中的一些扩展了有点遗憾!
突然发现,怎么Firefox有标题栏,怎么有菜单栏,怎么这theme就不正常了呢!使劲点了几下菜单,也没变化,切换了一下theme,重启firefox,菜单栏不见了,再切换回去,怎么标题还在! 突然想起来,这标题栏似乎一直都在的!是chrome用多了吧,傻掉了,汗!
还是搞不定,郁闷! 首先我用vc2008编译从svn中取出的boost代码,总是有问题,只能生成一些libxxx.lib,没有生成动态链接版本,这个问题在boost正式发布的版本中是不存在的,真奇怪。
其次,无论是正式发布的还是从svn中取出的代码,编译的boost::program_options,在与STLPort一起用时,是必定出错的。debug模式编译基本能过,但链接死活不行。release模式则索性编译不过,这个问题在取消STLPort时,就不会存在。但是如果不用STLPort,在链接时,会报符号冲突。
如果实在不行,也没办法了,只好不用boost的需要编译的库了。boost中大部分的库是header only,这总算让我觉得比较欣慰。不过昨天看到Boost.Log以提交review了,而且看了一下它的文档,需要依赖了boost中的好多库,其中好几个需要编译的,比如boost::filesystem、boost::system、boost::date_time等等,郁闷,一直在等着boost出一个log库,准备工作还那么麻烦啊!
在复杂的Internet环境中,用惯了firefox,用惯了它的扩展后,再也不想用其他浏览器了。这两天又装了几个扩展,太好用了。 noscript,自动禁止了一些无用的页面脚本。Coolpreviews可以在鼠标指针移到超链接上时,自动弹出页面预览窗口。FireGestures,就是现在在很多软件中流行的鼠标手势。 像chrome这样的实验品,我最多只是在局域网环境中用一下,一来忽略了外网环境中特有的复杂性对它的过高要求,二来它的超快速度在局域网中也能更好地体现。
前不久为了使得MSXML输出到文件的内容有良好的缩进格式,在网上又转了一圈,最后终于在一个老外的论坛里看到一段代码,使用SAX的方法,果然可以几乎完美运行。再也不用以前找到的使用xslt的方法了,使用xslt的方法是很久以前在国内哪个网站上找的一段javascript代码,自己翻译成了C++的,最后效果不是很令人满意,主要有两个缺点。一是文档开头的处理指令没了,要在额外添加,二是对于没有文本内容的节点,它还是会添加一个结束标记,累赘冗余。 这两天在写WIND时突然遇到的问题,本来只是使用STLPort替换了VC9自带的STL实现,用着也没什么问题,后来想试试boost::program_options,结果在编译时,报boost::program_options的lib跟WIND编译时使用的标准库不一致,一猜就晓得是因为当初编译boost::program_options没有使用STLPort编译,于是想重新编译一把。翻了好几遍boost自带的文档,也没找到具体的方法,在网上又转了几圈,还是没发现有效的方法。今天又是偶然在一个老外的论坛上,看到一个回复,简单试了试bjam果然可以正常运行下去了,唉! 又靠了次老外。
这两天才发现,用msys运行configure生成的makefile是直接编译链接有问题的,最后链接的时候总是报找不到一个什么sqlite3Backup函数。今天在源代码文件中查找了一下,发现这个函数是在backup.c文件中定义了的,所以代码有问题的可能性不大。于是看了一下生成的makefile文件,赫然发现没有编译backup.c的动作,加上后,再make一把,果然通过了。 看来sqlite3的configure脚本没有跟着更新啊!
今天终于解决了向SQLServer2005存xml时使用的字符集的问题了。 年后第一天上班,看到年前一个邮件,说是有个文件导不进去。拆下来跟踪了一下,发现是中间生成的xml文件不完整,通过简单的试验,直觉告诉我是字符集的问题,因为我将这xml文档的字符编码设成gb2312了,而鬼知道别人会写些什么特殊字符进来。把文本粘贴到UltraEdit中看了一下,果然有一个非gb2312范围的字节。我想,这种情况都出现了,无论如何都不能再继续用gb2312了,只能往utf-8之类的方向去考虑了。实验证明,以utf-8编码的xml文档是完整的,可是又回到一年前的问题,utf-8编码的xml文档写不到SQLServer 2005中xml类型的字段中,只能写gb2312的。 实在没办法,这方面没有人可以提供相关的经验指导,只好去看SQLServer2005的online help,好在是中文的,随便翻了一会儿。中间联想到,会不会是MSXML保存时并没有真正转换编码,实际上当然不是。又联想到,该不会是因为没有BOM吧,结果我没有去试。后来偶然看到其中一段说明,可以用utf-16,而且不在乎有没有BOM,如临大赦啊! 用ADO写回去时,先读出整个文件,因为开头的BOM的原因,需要再用SysAllocStringByteLen生成一个BSTR,不能直接用_bstr_t,再填回数据库,就可以了!
今天在公司网上看到有人在发Chrome的绿色可执行包,于是又好奇心起,下载下来玩了一下。以前也装来玩过,不过当时的版本还没有足够的稳定,时不时崩溃或挂起,于是摆弄了三两下就不玩了。这次下载下来的似乎则要稳定得多,毕竟是经过好久的beta测试了。
这次给我最大的震憾是chrome的速度真的很快,比IE和Firefox不是快一点两点,而是快很多!也许在外网环境还没有这种体会,因为等待的时间全耗在网络延时上了,在局域网环境下,网络延时极小,浏览器的渲染速度差异就很明显了。
本来在公司里,我也只是用3.0版的Firefox,因为用它来浏览redmine比用IE快多了,其他的应用场合主要是写wiki,用的mediawiki程序,以及看CruiseControl的报告,还有一些静态页面,比如用doxygen生成的html文档。换用chrome后,只能用震惊来形容,除开网络延时不说,真的是一点链接即出来整张页面!
不过总的说来,以chrome目前的状态,我也只能在公司里用用,写写wiki,看看报告,换到外网复杂的网络环境,chrome还不能胜任。首先,firefox有Adblock plus扩展,对广告的拦截效果非常好,用过它的人已经离不开它,chrome就没有类似的东东。其次,firefox下的鼠标手势,增强标签浏览,内嵌IE等,都是日常需要的功能,chrome也不行。再还有,似乎chrome的稳定性还是有待提高,偶尔还是会出现阻死在那儿的现象。
要是哪天firefox能弄得这么快就好咯!
最近几次在网上看到有人提到xmind这个东东,今天偶然看到有安装包,也不用上网下载了,就装来试了试,是一个基于Eclipse RCP开发的,简单看了下,快捷键的使用习惯上跟MindManager是一样的,其他的常用功能也基本都有,而且还有官方的中文版本,又是免费的,实在是最佳的思维导图绘制工具。 之前试过FreeMind、MindMapper和MindManager,最终觉得MindManager最好用,但这三个只有FreeMind是免费的,用盗版的MindManager心里总有点疙瘩。现在好了,换xmind了,哈哈!
今天稀里糊涂地试了一下,把线程里的run_reactor_loop给try了一下,居然有用,欣喜若狂。现在想想真是糊涂啊,这也太扯了吧! 不过话说回来,那块的代码在上次写完后,一直心有余悸,不敢再去动它,也不愿意再看它,有点反胃的感觉。今天下决定看了看,还真发现几处bug,有没关闭句柄的,有没有添加消息映射的而处理代码却是写好了的。今天这么一整,至少崩溃问题又要少一些吧! 虽然现在用ACE已经勉强能够运行了,可我还是有点想再换回用boost::asio去。当年用boost::asio也不知道是哪里出错了,死活不能好好地连接上再互相发点数据,现在有了这点儿用ACE的基础,而且比起当初boost::asio也是正式release的版本很久了,也许一方面是我用得不对,也有可能另一方面是因为我用的从svn里直接check out出来的代码确实有点儿问题呢!
因为考虑到要跨平台,所以不能用MSXML了,而且对于MinGW能不能直接使用MSXML我都不抱希望,于是在几个开源的可跨平台的XML解析器中进行选择,并且只能是用于C/C++的。候选项包括expat、TinyXML、libxml/libxml++、Xerces-C++。我不喜欢expat的实现方式,也不习惯TinyXML的只有DOM的解析方式,而libxml/libxml++则是因为捣腾了一阵子还是没能用MinGW正确编译,最后的选择只剩下Xerces-C++。而实际上编译Xerces-C++也花了我一些时间。网站上最新的是3.0.0,倒是有VC7、VC8、VC9的编译好的包,不过我要MinGW的,所以下载下来源代码,看了一下网站上的说明,先装好msys,选好参数运行./configrue,就会生成makefile。而这生成的makefile似乎并不能直接用MinGW的make过,需要稍微修改下,也就是把其中所有的什么dirstamp目录的创建和依赖都删掉,方能编译。 编译wxLua稍微好过一点,不过一开始绕了点远路。从CVS下下来的源代码,到build/msw下找makefile.gcc文件,这个文件少了写了两个编译选项,以致于在生成库时在链接时总是去找WinMain,开始不明所以,硬是把LDFLAGS设为-shared,在编译库时是没问题了,但编译出来的.exe文件就不行了。后来发现只要添加LINK_DLL_FLAGS := -shared和LINK_MODULE_FLAGS := -shared就可以一切正常了。当然wxLua依赖于wxWidgets,所以事先要设置好WXWIN和WXCFG环境变量,而且最后面不能有反斜杠。只要设好了这两个环境变量,用VC9倒是可以很顺利地编译过。 有些时候不免要抱怨一下,开源的东西,易用性可能确实差了点。
昨天遇到一个问题,用MSXML操作XML时,删除一个子节点,可是死活删不掉。后来想到一个变通的办法,把这个子节点的标志性属性值改掉,这样其他处理过程就认不出这个节点了,就相当于删除了,很黄很暴力。 今天再去定位这个问题时,发现原来那子节点真的被删掉了。进一点试验发现,只要在删除该子节点前,先随便改一下这个子节点的一个属性值,下面的删除操作就正常了,但如果没有那个修改操作,就删不掉,真是怪事! 我当时还以为是不是因为子节点下面还有其他孙子节点,还想是不是要修改一下删除子节点的封装方法,递归地删除掉所有子孙节点呢!看来不必了!
今天在公司看到一个同学在用e,有点好奇,早听闻它有“Windows下的TextMate”之称,以前也下载来装过,只看到界面很简单,功能也很简单,于是就没下文了。今天又有点兴趣,就让同事共享给我再试用一下。 还是老样子,界面上没什么改进,也许比之前我试用时功能上有所增强,但以我目前的眼光看来,它还是太简单了。总的说来,只有一个特色功能,就是bundles。不过可能TextMate赖以成名的就是bundles了,e就是全盘照抄了,从网上看到,说e的作者和TextMate的作者是老乡,两人协商过,让e可以直接使用TextMate的bundles。所有的人都说,e只有TextMate的一小部分功能,这我也是相信。但是最让人受不了的是,e运行极其不稳定,随便点几下就是挂起,或者崩溃。这么烂的程序居然也来卖,而且听同事说可能卖得还不错,我想这全沾了TextMate的光啊!因为说,它的一切思想,无论是从程序开发的角度,还是用户体验的角度讲,都是很好的,但这一切都是TextMate赐予的,e里唯一有点自己特色的是,用类似异步可插入协议的方式来修改配置。我没用过TextMate,不晓得它在这方面是怎么做的。 看了e后,另外一个同事就说,我们现在的Impeller应该也好卖吧,有语法结构树,有自动完成,有调试执行,我笑!
今天做另外一个工具的一点维护工作,需求是通过用户输入的宏名,宏值,类名,函数名以有函数返回值,工具要能自动到指定的文件中找到指定的位置,自动插入生成代码。本来这个需求是上个版本就已经实现了的,今天只是对需求有略微一点修改。可是最大的问题是,今天发现以前实现的这个根本不能用啊,文件是能找到,可是位置却是错的,根本毫无联系。 调试了很久,实现过程是首先利用MSR的greta来找到参考标记,取得标记的位置,然后插入生成的代码。一开始怀疑是取得标记的位置不对,其实冷静地想想,这种可能性几乎不存在。不过我还是傻傻地加入代码,看标记位置取回的字符串内容,毫无疑问,肯定是对的。接着怀疑是Scintilla的插入方法有问题,同样事后想想,这种可能性也微乎其微。不过我也不死心地,加入代码,看该位置的Scintilla文本,果然已经是不正常的内容了。 正在束手无策之时,突然不知怎的,灵光一闪,可能是因为看到其他一个项目中使用多字节编码的greta,觉得可能是这里引起的问题。greta在匹配文本时,在unicode情况下,一个中文字符和一个英文字符都是一占一个长度,而此时Scintilla还是以多字节方式处理,一个中文字符占两个长度,所以greta算出的位置对scintilla来说并不能对应上。想通了这一点,立即将工程编译选项切换到多字节方式编译,果然就正常了。 这次遇到这个问题,也能为以后实现相关需求,或者解决类似问题,提供了极大的参考价值。
从学校出来后,重装系统的次数大大减少,自从买了个本本,只是恢复过一次,今天是第二次,当然不算帮别人装的。 为了减少工作量,有些小小的算不上技巧的伎俩。记得第一次恢复是用的光盘,今天拿出光盘,发现读不出来了,大概是光驱的问题,于是直接选择恢复到出厂设置,反正我的恢复光盘中的内容跟出厂设置差不了多少。 选好后,可以去干点别的事,比如我就出去边吃饭边看电视去了,这样不知道总共花了多少时间,最后一直到设置机器名和用户名密码的地方,这时才需要人工介入。首先需要安装中文支持的MUI包,装完跑到控制面板里设置一下语言,使得界面上可以正常显示那些能完善支持中文的软件。 然后是安装那些必备的软件。 对于那些绿色版、免安装版、安装后更改文件夹后仍然可用的软件,则应该放在非系统分区中。这样下次恢复系统了,使用可以直接使用。比较典型的是Foxmail、QQ、Firefox(它要通过命令行参数实现)等等。 对于必须要运行安装程序才能使用的软件,则根据一般建议安装在系统分区,这样在恢复系统时,也能自动清理掉。这样软件包括Visual Studio、Office(虽然现在实际上不装这个了)等等。 接着是安装系统补丁。有个比较省事的办法,是装个360安全卫士,用它一扫描,发现所有的hotfix,自动下载自动安装,又可以去做些其他事情了。我就打了一会儿游戏,还去洗碗,整理床被等等,哈哈。 做完这些,基本上可算是恢复系统了,但实际上要花很多时间,对于我来说,似乎需要6、7个小时才能搞定!
还是因为贪心啊,想用盗版软件啊,这下好了,中毒了,不幸中的万幸,不是一个后果很严重的,照赛门铁克的说法,是个误导性的病毒,老说你的机器有风险,还自作主张地把网络给拦截了,有的程序都不能正常使用了,比如foxmail,每次都说打不开socket,暴汗,IE则根本不能打开网页了,幸好一直用的Firefox,不过很多页面上方加了一条腥红的字“Warning! Your system is in danger. You need a full scan of your computer.”,还把很多的超链接的颜色也改成了腥红色,真恶心啊! 盗版软件害死人啊!
要做一个配置界面,用户通过该界面可以修改一些系统配置项。本来配置项是一直都有的,不过不需要用户修改,都写死在配置文件中,这次有了新需求。大体上分成两个部分,一部分用于操作配置文件,另一部分当然是用户界面! 配置文件是XML格式的,用MSXML组件的CString封装版本来操作,用这样封装版本的好处主要有三点:一、所有接口都用CString而不用BSTR,方便与MFC程序交互;二、封装的方法中有一些简单的出错处理;三、有一种简单的用于跟STL中算法适配的迭代器,方便操作节点列表。 问题出现了,图省事,我直接在界面类中获取配置操作类中的DOM数据结构,想直接在界面类中遍历XML,结果发现每个节点想取属性时都会异常。开始怀疑是迭代器封装有bug,于是换了几种访问元素的方法,还是异常。后来猜测难道是不同线程使用COM的原因,想想也没有多线程啊,加上CoInitialize和CoUninitialize,还是异常!于是病急乱投医,想会不会把操作XML的代码全都放在配置操作类中,就好了呢。说干就干,因为要根据读出的配置信息操作界面,所以需要一个通知界面类的方式,我选择了callback,又因为callback是个界面类中的一个成员函数,所以越弄越复杂,最后为了能少写点代码,或者说看起来直观点,动用了boost.function,其实不用它也不会麻烦多少。好不容易全都改过来了,还是异常!我已经接近崩溃的边缘了,再异常就是我神经要异常了! 所谓柳暗花明,最后无意间看了看配置文件的内容,猛然发现根节点下的第一个子节点是条注释!用DOM解析时,注释也是一种节点啊,昏,耗费掉我差不多2个小时,又被XML摆了一道。
周末无聊,就尝试着用VS以外的工具来写代码,都决定用MinGW+makefile了,所以不存在编译器的问题,不过最后还是放弃了,因为代码编写的原因。 尝试了Eclipse3.4、Netbeans6.5,Nightly Build的Code::Blocks和CVS snapshot的CodeLite,总之一句话,写C++程序,VS+VA的王道!确切地说,其实我是离不开VA了。 今天在公司的论坛看到别人在讨论代码编辑器要怎么做,有一个老员工列举了他用编辑器的需求,我都觉得那已经不是编辑器了,而是一个IDE了。 看来,如果要有好用的IDE,除了VA,只有自己做了……
今天听同事讲了rdoc的处理流程,他完全是通过阅读rdoc的源代码来理解的,而且似乎他根本没有多少编译原理的基础的,汗! 总的说来,通过他的讲解,我了解到,rdoc的处理流程基本也是分为词法分析和语法分析阶段。首先,应该说有一个词法分析器生成器,叫SLex,然后由RubyLex提供规则,其实是一组正则表达式,SLex可以说是有一个正则表达式引擎,根据这些规则,生成token,提供给RubyParser使用,基本上是lex/flex做的事情。然后RubyParser根据这些token解析出class和model,建立起相关的实例,解析出相关的注释信息,通过yaml写到文件中。这里有点虎头蛇尾了,不过大体上也能表达清楚想要的意思了。 比较佩服的就是同事仅凭这些ruby源代码,就看到流程来,我怀疑要我上的话,如果没有这些编译原理的知识作铺垫,应该达不到他这样的程度吧!
今天把CruiseControl上的label改成svn的revision号了,在公司发现个问题,有一个项目里总是不能正确取到svn的revision号,虽然构建了,但从web上看不到结果,没有日志,晕!回到家,也改了一下,又发现另外一个限制,其实这个可能要算是svn的限制,当时我把源代码从vss迁移到svn时,所有项目都是放在一个目录下的,所以现在svn里各个项目的源代码commit后revision号是累加的,并不是各个项目独立的,于是在CruiseControl上显示的就是几个项目用了相同的revision号了,晕!不过第二个问题应该影响不大,因为照我现在的应用场景,一个时刻只会对某个项目的源代码修改,只要CruiseControl是一直开着的,出现这种冲突的机会也不多。
可测试性设计,即所谓的DFT,今天又一次重重地感觉了一次它的重要性。 系统中有一个权限管理模块,同一个物理用户可以不同的逻辑角色登录系统,系统中以各个逻辑角色为最小管理单元进行权限管理。一般情况下,用户可选择的逻辑角色范围是极有限的,绝大多数用户应该有只一个逻辑角色,当然在测试情况下,情况刚好反过了,基本上每个物理用户会有几个逻辑角色,容易暴露出问题。主要集中在,角色拥有的权限不正常,比如看到了不该看的,看不到该看的,可以做不该做的,做不到该做的。 一直以来,对这块的调试/测试都是很困扰我的问题,主要就是DFT没做好。最开始,把所有业务逻辑和界面绑定在一起,差不多每一条规则都要在界面上点来点去,构造很多与真实环境类似的数据去测试,非常麻烦,不容易遍历到各种情况。 后来将这模块重构了,把业务逻辑和界面分离,用单元测试来保障逻辑的正确性。从DFT的角度讲,这种代码架构方式,就是一种改进,对DFT的改进。 有了单元测试,还不能保证程序能完全正确地运作,因为除了逻辑正确,还有可能其他地方出错,比如输入数据就有问题。在前些天他们测试的一个版本中,依然发现了一些权限相关的问题,让我觉得比较郁闷,因为我一直以为应该是万无一失了的。不过事实摆在眼前,也逃不掉,今天老老实实地在那里定位,不过开始的时候还是异常困难,因为测试场景的千奇百怪,我的开发环境下,有些场景很难模拟。 后来突然灵光一闪,我应该为了方便测试,多写一点代码,多加点功能,比如当前这个问题,我可以加一个特性,能在某种特定条件下,使我可以以任意角色登录系统。说干就干,果然很容易地定位到了测试发现的几个问题的原因。 今天的经历告诉我,在软件可测试性设计方面,有很多值得研究的东西的,天呐!
项目里要有发送邮件的功能,想法非常简单,公司有个SMTP服务器,通过它直接就可以发送到notes中了。网上SMTP的源代码也是一堆一堆的,找了一个CodeProject上的,加上base64编解码也只有4个文件,接口非常简单,于是稍微改了一下,base64本来我就有,就只需要加入2个文件就可以了,附件也能正常发送,很是满意。不过上周五的时候突然发现,主题和内容中的所有中文都变成乱码了,有点气馁,随便又找了几个其他的代码,也是一样。 今天闲起无事,就想改一下。只知道在哪里看到过说要用base64,就能解决这个问题。尝试着先把主题编码了,发现收到后就是编码后的字符串了,这也是预料之中的。上公司的论坛发了个帖,没人回复。后来自己忍不住了,用Outlook Express写了个邮件,主题和内容都是中文,然后打开Wireshark,抓包,比较了一下CodeProject上那个代码发送的,看出区别了,原来也就是加上个charset="gb2312",再base64,就搞定啦!
早就想在保存文件时,能让用户顺便多输入点信息了,于是自定义保存文件对话框的需求就提上来了。在网上搜了一遍,各种方法倒是不少,不过都跟我想像中的有点区别,我想在MFC中做,就希望能尽量的简单方便。于是就搁下了,直到前天,在公司里想起这件事,问了问同事,同事给我一个例子,VC6写的工程,看了觉得很简单,但是回家自己弄还是不行。昨天又跟同事交流了一下,再加上晚上在网上找资料,结合着弄,终于成功了。 首先,添加一个对话框资源,加上需要的各种控件,最重要的是要加一个ID为stc32的控件,可以是Static,至于大小、位置,可以之后慢慢调整,以及对话框的风格要加上WS_CHILD。 然后,给该对话框添加类,基类就选CDialog好了,生成代码后,把基类从CDialog改为CFileDialog,尤其要注意,CFileDialog的构造函数需要更多的参数。 再之后,要给m_ofn成员初始化一下,先是dwFlags要有OFN_ENABLETEMPLATE,再lpTempate要指定到刚才活到的对话框资源。 最后,就是看情况,重载几个虚函数,比如OnFileNameOk,OnFileNameChange等等。 搞定!
昨天心血来潮,装上了鱼鱼桌面秀看了看,以前也是装过的,有乱码,现在经过几个版本的更新升级,软件名称也已经换过了,但是乱码问题还是没有解决,原来用Delphi开发的就这么郁闷啊!我用的是英文的XP,打了中文语言包,照理显示中文是没有问题了的,不过这个软件在安装路径中如果有中文的话,就不能正常启动。另外,界面上也不全是乱码,某些地方的中文还是能显示出来的。还有,装的2.1.1纯净版,运行非常不稳定,经常出错崩溃。如此看来,这个软件也就是界面上比较出色了。 说完了缺点,来看看它的技术特点。现在这个软件也算是一个widget工具了,可以有一个侧边栏,依靠在桌面的右侧,在该侧边栏上的可以安放一些widget,一般就是显示当前时间,当前CPU占用率,内存使用率,某个城市的天气情况等等,翻来翻去就是这么固定的几个内容,主要体现在界面上的设计有所不同。看了一下它的SDK,终于基本搞明白,原来是程序内部固定了只提供这些服务,外部每个widget有一个脚本文件,可以是vbs或js,调用程序提供的那些对象、方法,然后绘制界面。除了一个描述逻辑用的脚本文件外,widget还会有一个配置文件,记录一些最基本的信息,比如图片文件路径等。widget可以通过鼠标拖拽,拖到桌面上任意位置,也可以停放在侧边栏上。稍微想了一下,觉得这个应该不难实现,也就是侧边栏是一个单独的窗口,在拖拽widget的时候,检测当前widget的位置,如果进入侧边栏窗口区域,则自动调整widget的位置,看起来像是多个widget贴在侧边栏上一样,实际上还是各个窗口各自管理。如果拖出了侧边栏,则拖到哪算哪。后来看了一下窗口类信息,果然跟我猜想的一样,说起来我的LLYFSpy都不能正常使用了,抽时间也得好好整一下,就作为WIND的一个插件好了。 看完鱼鱼桌面秀,我又想起盛大的widget和雅虎的widget,于是上它们的网站看了看。盛大的是能放到游戏中去的,这是一大特色,但目前似乎还不能放到桌面上。雅虎的看起来则要比鱼鱼的专业得多,widget能做的事也多一点,界面响应和交互能力也要强些。雅虎也是给每个widget一个配置文件,但是XML格式的,而且把逻辑处理的代码也放到这个配置文件里,说起来,单纯从用户角度讲,雅虎的方案更好一点,但如果能把一个widget的所有文件都打包的话,这个优点就不存在了。如果从widget开发者的角度讲,可能鱼鱼的方案稍微好一点点,因为不同的格式放在不同的文件中,用支持syntax highlight、auto-completion的编辑器来方便得多,现在还很少有编辑器能同时支持混合的语言。 看了这些之后,我就想,我是不是能把WallpaperHelper里的桌面时钟日历功能扩展一下,不就也有一个widget功能了嘛!看它们用来扩展的都是vbs或js,鱼鱼似乎是直接用的MS的那个WSH组件,这有一个很大的好处,直接用WSH的强大功能,它内置了不少接口,像FSO之类的,还可以直接调用ActiveX,实在强大!雅虎的倒是看到一个js32.dll,可能是mozilla的那个js引擎。盛大的没看。但是我现在对于要嵌入的脚本语言,只能Lua感兴趣,公司里也曾经有人讨论过对于嵌入的语言使用Lua好还是js好,当时我的观点是看应用场景,希望脚本做些什么事,再来分辨做这些事用哪种语言方便。
今天断断续续写了几行代码,再次感叹,在这VS中配合VAX写代码给人那种酣畅淋漓的感觉,任何其他地方都是体会不到了。网上有不少人不少文章在说,使用IDE有很多坏处,让人不知道背后的机制原理云云,对于此种言论,我很不屑。不是说,懒惰是程序员的美德吗,既然有工具能帮人完成一部分工作,为什么不放手,而去追求那虚无缥缈的所谓“高手”的虚名。 从csdn上看到新闻谈及VS的下个版本,这MS的动作也太快了点吧,VS 2008才出来不到一年呢,CodeGear真的彻底完蛋了!再没有哪家公司能像以前的Borland那样生产IDE,跟MS抗衡了。 今天写代码时,发现需要记录一些想法,或者是计划,但我找不到合适好用的工具。之前也看到一个群组里有人开话题讨论用什么来记录想法,有人提到evernote,这个工具我也看过,是个共享软件,而且对中文的支持不行,仅这两个问题让我就望而却步了。之后再也没有其他的类似的好工具了,平时如果只是为了记录下问题、需求这种跟软件开发强相关的信息,我倒是搭建了一个Redmine服务器,它也有一点项目管理的功能,但还是太弱。在公司里,流行的做法是用MS Project来做项目管理,用Excel来记录需求,用notes上的CMM库来记录问题,不过我因为所在部门的不规范性,所以更自由一点,或者说其实是没有机会使用那么高级的东西,只好还是在redmine中折腾。 寻找好用的全流程软件生命周期管理工具!
这两天还是照平常一样,在网上看小说,因为看的都是盗链,看到后面的章节一般都是截图的。昨天偶然开了一个Opera 9.51,猛然发现在它这里图片出来的速度比Firefox里快多了,很明显的现象。不得不承认,Opera在这方面的努力真的很有成效。而Firefox对现在的我来说,最大的让人不满之处就是它速度实在慢了点。如果换作以为,我肯定还会再加一点内存占用过大,不过现在1.5GB物理内存使得我不再特别关注这个缺点了。不过速度慢这个缺点却是没有明显的可以弥补的办法。 都说Chrome的V8引擎已经作了极速优化,但是总的看来chrome还是个半成品,我已经太过习惯于添加了各种扩展的Firefox了,所以Opera也还是没能正式作为我的主用浏览器。而我就只能希望Chrome的出现能刺激一下Firefox开发团队,好好优化一下代码,提高点效率。
今天偶然看到一篇blog,讲述了chrome用到的各种开源代码库,至少有25种之多,让我不禁感叹,开源真是个好东西啊,真是软件界的共产主义啊。我内心是很认同这种做法的,觉得理所当然,而且自己平常也有这么做的倾向,只不过限于自己视野和认知,很多时候并不知道有合适的方案可供选择使用。 以后要多多了解这方面的内容并在现实中加以应用啊!
几个月前,就想从公司图书馆去借本《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了。
今天在公司就发现有人传了个chrome的完整安装包上来,都没有安装过程,直接双击,过n秒钟的后,窗口就弹出来了,很简洁,简洁得让人感觉像是个玩具。只玩了两下,就没了新鲜感,就凭它现在的状态,它是吸引不了我的,我还是继续用回Firefox,那些使用习惯设置,插件,都已经成为我暂时离不开Firefox的理由。 回家打开Google Reader一看,n多blog和discussion在描述chrome,顺便让我有那么一点点惊喜地发现这还能直接从svn里下到源代码!不过就像其他的各种开源源代码一样,不到真的要用时,我是决计不会去看这些源代码的,尽管我确实已经下了不少源代码了,包括Code::Blocks、CodeLite、notepad++等等,都是因为在某些时刻突然觉得这些源代码有一定的参考价值,而且update这些源代码也成为我每次打开电脑后几乎必做的一件事。但实际上,我却还是没有真正能从这些源代码中获取过多少有用有价值的东西,这不怪这些源代码,而要怪我自己。公司里有个牛人,看部门似乎是个做硬件的,却好像看过n多开源项目的源代码,包括那些BSD系统、Linux系统的,实在佩服这种人的毅力和恒心。 Google出浏览器了,对最终用户来说,也许是件好事,这样激烈的市场竞争,能促进产品进步。当然可能就苦了Web开发者,不同的浏览器之间必定有些不兼容的情况存在,而Web开发者则必然需要为了兼容几大主流浏览器而煞费苦心。 对于我来说,暂时影响不大,继续留守Firefox 3观望中。
发现机器上装的几个VS出问题了。6.0不说,因为压根没想过要用它。2003出问题似乎是最早的,大概是因为最早用得最多,就出问题也早,发现问题也早,现象是时不时弹出个消息框说什么GDIPLUS怎么出错了,而且一弹就会连续地弹好几次,让人受不了。2005本来还没怎么发现问题的,因为不常用,要用也是2003或2008,当时只是发现它的菜单怎么变中英文夹杂了,也没怎么在意,反正看得懂,最近一段时间想用它来创建个工程,发现这个wizard不能用了,估计也是因为这本地化引起的,老是去不存在的目录下查找那些html文件!最后说2008,2008是今年开始用的,春节回家的时候用它来写WallpaperHelper,当时安装的时候也费了些力气,新建个MFC工程来编译,发现还缺几个.exe文件,抱着侥幸心理从2005那里照着文件名拷贝过来,发现勉强也能用,结果今年上半年堕落颓废了,看小说去了,几乎写过代码,现在发现2008里的资源编辑器不能用了,资源视图里都打不开资源,只是报个RC多少号的错,我也懒得再去查这是什么错了,反正这个资源文件是肯定没错的,郁闷死! 没耐心继续跟它们耗了,直接卸载,重装!
最近这段时间,SVN和VSS混用,有些工程是放在SVN里的,有些是放在VSS里的,但总的说来,感觉SVN更好用些,也许VSS 2005已经提供了各种现代化的特性,但直到现在,我还只是以VSS 6.0的眼光看待。 SVN在编辑前不需要check out,这点我就很喜欢,在VS 2005中,可以设置得让IDE自动check out出来,但离开了IDE,还是得自己去做这点操作。现在我用的VS 2003,就会自行弹出个check out确认对话框,这让用过SVN的人觉得很不耐烦。尤其是在某些情况下一个操作会要求先后对多个文件进行编辑,这时VS 2003就会不厌其烦地一次又一次地提醒要check out每一个文件,比如要编辑资源,就会要改.rc文件和resource .h文件,如果是添加一个新的类,就会要求编辑.h和.cpp文件等等。 但是SVN也有很让人头痛的问题,比如它完全依靠文件夹下的.svn文件夹工作,而且似乎很容易出错,出错了还不容易修复,VSS就很少这类问题。还有就是似乎代码仓库也有类似的毛病,容易出错,出错也也不容易修复。 今天得到一个经验,如果一次性要添加很多文件夹和文件到仓库中,最好不要用add和commit操作,而是用import。前者需要2步人为的操作,所以感觉要花费更多的时间。今天我就是需要添加4个文件,总共有130MB左右的数据量吧,n多个文件,用add还正常,commit时还会执行adding操作,然后是send content,到中途不知为何就阻塞在那里了,等了一会儿耐不住性子就x了窗口,到仓库里delete掉看到的几个文件夹,却有一个文件夹之后总是add不了了。后来改用import,就全加上去了,汗! 但是如果是一点一点来的话,我更愿意接受SVN这种工作方式。
今天偶然发现有时候会出现内存泄漏,于是照老样子打开那个编译开关,打印出所有内存分配的记录,但是却发现又不出现泄漏了,或者说可能是没有跟踪到。这样整了一个小时,毫无进展,只好放弃了,要多掌握几种比较可靠的内存泄漏定位方法才行啊!
昨天就想把其中一段代码,一堆if...else比较字符串的代码替换成用gperf生成的hash来进行分派,但是昨天想了想我根本不会用gperf呀,晕死,于是想着回家上网找点资源。结果回到家还是什么都忘了,光顾着看小说和聊天了。 今天到公司里看到那段代码才想起来,昨天晚上堕落去了,于是有点儿沮丧。后来偶然发现,嘿嘿,在资料共享区有几篇关于gperf的文章,看来是我跟同事的唠叨发挥作用了。看了一下,发现它的输入格式虽然有点学了lex/yacc的样子,却比它们简单多了,而且我的需求也是非常简单,就是可能会有6种不同的字符串,我现在想让它能自动映射到一个枚举值。gperf的秉承了开源命令行软件的一贯作风,虽然只是那么小小一个功能,也提供了好几个命令行选项,幸亏有比较详细的中文说明,再加上功能实在不复杂,试了几次,就可以了。跟最新的flex/bison一样,我用了cygwin中版本号3.0.3的gperf,它也支持输出C++代码,这是我比较喜欢的一点,毕竟C代码混在C++中还是感觉有点别扭的。 另外一点说不上技巧的小提示,如果对生成的hash函数不放心,可以写个单元测试用例,跑一遍就安心啦,而且这种hash函数一般的应用场合下不会有太多的映射关系,看人家ruby用在识别关键字上,也就是几十个而已,单元测试遍历一个所有的映射关系,写一遍就一劳永逸,不错不错,哈哈。 这个小工具值得推广,以后凡是遇到3个或以上字符串需要比较时,就可以考虑用gperf来做这种工作,不但代码运行效率高,而且代码可维护性也上去了,一举两得。
好不容易等到可以公开获取的修改版Cruise Control,装上来试了试,问题多多啊,还没有文档,这才是让人郁闷的,现在的我已经越来越习惯看文档行事了。 这个修改版的Cruise Control有一个好处是,集成了多种工具,比如代码行统计、代码风格检视、代码静态检查、代码复杂度度量、重复代码检查等等,如果光是执行一遍这些工具,用官方发布的Cruise Control也可以做到,只不过这个修改版可以对每种工具的运行结果生成一个xml格式报告,最后将这个报告merge到Cruise Control的log里去,然后又扩展了对log的解析,可以以统一的报表格式查看各种工具的运行结果。 但是这个Cruise Control集成的这些工具运行得并不稳定,首先代码行统计的好像没一次正常运行的,总是阻塞在那里,要手动杀掉进程才行,然后是复杂度度量的生成的日志因为太大,然后merge的时候老是有问题,还有就是这个改过后的Cruise Control不时地会出现运行不下去的情况,真是郁闷,当然最不爽的还数没有完整的文档,我发邮件给该项目的接口人,结果回了个邮件说还在某些产品线试用,等试点结束后让我去问各产品线的负责人,靠!
公司内部的论坛里看到coLinux的介绍,于是从论坛里随手下载了一个装上试了试,只有最基本的一个可用的系统,这个系统作为Windows上的一个应用程序来运行,但表现上看,又是一个Linux,在shell下可以运行各种命令,查看各种系统状态数据。可如果仅仅是这些东西,对我还没什么用处,我至少也要在Linux下写几行代码吧,不过这些都需要自己额外安装,在公司不通外网的苛刻条件下,几乎没有了继续下去的兴趣。 另外有个比较完整的发行版,叫andLinux的,还在beta阶段,这也是开源软件常有的现象,WINE不就beta了十几年嘛。andLinux似乎直接提供了大部分需要的软件,特别是那些GUI的是我比较关心的。但是后来想起来,其实我即使装了,现在也没多少用途,主要目标还是Windows下写写代码,最多最多以后,可能会需要在其他平台上,比如Linux,很可能也有Mac,也有可能一些嵌入式设备上,但这不是目前要关心的了。所以这个coLinux对我来说,没啥用哈!
从David I的blog上看到,C++ Builder 2009会附带Boost 1.35.0一起发布。想起当初,我弃C++ Builder不用转向VC,其中一个原因就是Boost对编译器的支持上,VC远远好于C++ Builder,虽然几年前,都号称C++ Builder对C++标准的支持远远好于VC,但那也是2002年前的事了,当时就已经泛滥的VC6,虽然对标准的支持差了点,但还是很多人用,而C++ Builder对标准的良好支持只是作为广告的谈资,实际上可能并没有为它带来多少用户。后来随着VC2002、VC2003的发布,VC的进步也是突飞猛进,而且从那时起,很多第三方C++库也把支持VC作为优先考虑的事项,从此Borland的C++编译器就更没落了。 其实以我个人狭隘的眼光看来,C++ Builder也没达到预期中的好的效果,有一个原因是,它使用了以Object Pascal写成的VCL库,而不是用C++写成,这样为它配合使用其他C++库,造成了一定的阻碍。虽然因为C++ Builder提供了一定的Object Pascal的支持,使得很多为Delphi设计的第三方组件,可以在C++ Builder上使用,但这并不是它使用VCL带来的好处。 这次附带Boost库的行为,我以为,并不会为C++ Builder带来多少市场占有率,就好像其他编译套件都没有默认附带Boost,但它们的用户如果确实需要肯定会去自行下载、配置、使用,而从编译器角度来讲,其实最需要做的是改进编译器,提高编译速度、改善最优化能力、增强兼容性,使其尽最大可能地支持Boost。 以后,在Windows平台上,会不会只有一个叫VC的主流C++编译套件了呢?
这几天看google reader上Codegear blogs一栏上,不时地贴出Tiburon这个词,开始还没留意,直到过了两天,目光稍作停留,才发现,原来是Delphi 2009/C++ Builder 2009的开发代号!上wikipedia查了一下Tiburon,似乎是一个加州小镇的名字,也不知是不是说的同一个。软件以地名作为开发代号的例子数不胜数,Borland系的产品更是如此。 这两年是Delphi/C++ Builder的多事之秋,先是从Borland分离出CodeGear子公司,出了个Codegear RAD Studio 2007,之后就是将整条IDE产品线以两千多万美金的跳楼价甩卖给Embarcadero,一代传奇,以这样的方式终结,让人唏嘘。 Tiburon最大的改进是对Unicode的支持,说是所有的都是基于Unicode实现的,包括编译器、RTL、VCL、IDE、COM、dbExpress等等等等。我也不知道到底用户对这个特性的需求有多强烈,只是感觉这太晚了点,如果早5~8年就有这个特性,也许情况会好一些。除此之外,增加了一些新的VCL控件,不过说实话官方VCL控件的个数多少其实影响并不是太大,好多第三方控件库,各种酷炫的控件都有。另外还有些其他的改进之处,比如对Delphi语言的修改,使其支持泛型、匿名方法等,还有IDE的增强。比较炫的是C++ Builder集成了UML建模工具,可以使代码和UML模型同步,来回在两边编辑,这个特性我比较感兴趣,一定程度上说,Borland系不愧是最会做开发工具的。 然而,我现在已经不用C++ Builder了,转用VC一年多,也只是工作需要,以后会慢慢转向那些开源免费的开发工具上去,或者自己做。现在或许只是因为身上有那么一丁点自己也不太愿意承认的Borland情结,关注一下最新的发展动态罢了。
今天看了一段CodeLite的源代码,很小一段,从app开始看,到Frame。因为想学习使用wxWidgets,阅读现成产品的代码一种比较有效的方法。我并不知道到底有哪些程序是用wxWidgets的,到目前为止了解到的有FileZilla和Code::Blocks,以及这个CodeLite。 学习的主要目标是掌握如何创建各种类型的窗体,如果为窗体设置消息响应。如果在绝大多数情况下,都能比较快速熟练地解决这两个问题,那么基本上可以认为算是会用这个库了。 wxWidgets的处理形式跟MFC比较相似,都是有一个app类,代表当前程序,然后有frame类,表示主窗体,在frame类中再衍生出菜单、工具栏、状态栏等元素,也包括其他一些子窗体,比如CodeLite中,用到各种Pane,这些Pane通过wxAuiManager来管理,可在主窗体上依靠,或脱离主窗体浮动在外。CodeLite和Code::Blocks都用标签页(Tab)的形式作为主界面,也用标签页的形式做Pane,但两者在实现标签页时略有区别。Code::Blocks用了wxFlatNoteBook这个组件,而CodeLite则似乎是自己创建的一种组件,该组件将标签页头和页内容分成两个wxPanel来实现,标签页头部分又在这个wxPanel上使用Tab来展现出页头的效果。这样的好处是标签页头相比wxFlatNoteBook有更多的可控制选项,坏处则是需要自己写不少代码。 现在我最大的困难就在于,还是没有完全搞明白,这个界面是怎么创建起来的,一旦这个框架建立起来了,那剩下的业务逻辑部分都是比较清晰明了的,至少知道大方向上应该怎么走了。
虽然打算使用MinGW+wxWidgets来写程序,似乎是可以抛弃VC+MFC或者BCB+VCL这类商业软件了,但是,实际上我发现我根本离不了VC,主要是离不了VAX,这个超级好用超级变态强悍的VC助手。 早先的时候,只用到VAX的智能联想提示功能和跳转到定义或声明的功能,自从看了Martin Fowler的《重构》,VAX的诸多重构功能也成了我目前最常用的功能,日常工作写代码,离了它简直痛不欲生。 写代码最好用的是VC+VAX,但看代码最好用的,个人感觉还是Source Insight这个虽然不思进取,但基础确实不错的东西。Source Insight也可以用来编辑代码,不过比起VC+VAX来还是弱太多了,而且它也是要买license的,最关键的一点易用性方面不足是,多少个版本推出来,还是不支持标签页浏览,真是不可理喻,而且对中文的支持也是一直都没任何改进。 所以最好的工具是能集VC+VAX代码编辑功能和Source Insight代码浏览功能于一身的。但是目前还没有找到能达到这种效果的软件,从免费到商业的,都没有。回到最开始提出来的,要用MinGW+wxWidgets来做开发,还是比较困难的,比较折中一点的办法是,先在VC里做debug版进行开发和调试,定期用MinGW生成release版本进行测试,先打造一个好用的CppCoding工具。
昨天随口给一个同事讲了一下怎么部署用VC2005生成的应用程序,才能解决因为先进的Side by Side技术引起的应用程序配置问题。其实我自己也是半生不熟,没有掌握到真正的精髓。今天那个同事就给我打电话,说还是没有解决这个问题。于是我就亲自出马,上午搞了半个小时,还是没搞定。于是看我原来用VC2008写的WallpaperHelper怎么弄的,以及人家的Edraw是怎么弄的。一点一点凑,最后发现那个么临界点,只要先到VC安装目录下有个redist目录,里面能找到发布用的dll和配套的manifest文件,复制出来,然后把manifest中的内容复制出来,自己填写一个新的manifest文件,作为RT_MANIFEST类型添加到exe的资源中,这样就基本解决了。而且从中看到,manifest中的版本号可能比dll的实际版本号要低,但是没关系,反而如果自己强行把manifest中的版本号改了,程序反而不能正常运行,反正照着redist目录里的那样填就行了。
话说本来6月17日就是FF3发布的日子,不过由于时差等因素,昨天一直没等到它的发布,于是只好等到今天。回到家迫不及待地下载安装,然后把需要的扩展也跟着升级,对于一些没有对应版本的扩展,只好再上mozilla的网站找替代器,忙乎了一阵子。 媒体传闻得沸沸扬扬,说得悬乎神技地,但我用了一个多小时后,感觉也没多少值得表扬的。比较明显的改进是,内存占用确实比以前小了,可能只有原来的2/3或1/2吧。另外一个比较明显的修改是所谓的Awesome bar,就那花里糊哨的地址栏,也许是我还没用出来吧,反正觉得原来FF2里的也没有不好用到哪里去,这个也没有方便到哪里去,所以这个特性算不算得上是改进,我保留意见。再有,就是启动速度似乎是比FF2快了一点,不过对于我这样已经习惯于龟速电脑的人来说,吸引力也不是特别大。 倒是一些原本在FF2里用得好好的扩展,到FF3里不能用了,这让我觉得很郁闷,比如Tab Mix,还有能将网页保存成mht格式的Mozilla Archive Format,都找不到够格的替代品。还有,号称的15000项改进在哪里,仅仅是我这一个半小时的使用,就崩溃了2、3次,这个品质不行啊! 好了,牢骚发完了,要不是因为不想用IE,要不是看中它扩展多,升级方便,我才不这么啰嗦哩。
如果在goolge(不是“谷歌”)中搜索关键字“音乐播放器”,排在第一位的,赫然是千千静听,第二位提QQ音乐,第四位是Kugoo,如果搜索关键字“音频播放器”,则出现的是foobar2000,而前3位则连影都没有。这一方面似乎可以看出,中国大陆用户对此类软件的偏好和定位。 因为前些天看到Kademlia的介绍,想到可以结合着做一个不需要服务器的P2P音频共享播放软件,于是偶然关注了一下现在国内流行的此类翘楚。就个人感觉,最专业的还是foobar2000,虽然它的默认界面非常简陋,没有歌词显示,没有文件搜索等诸多目前国内用户用得最多的功能,但是它做为一个音频播放软件,在纯粹的音频播放功能上可是一点儿都不马虎,尤其是它的插件机制,从效果上看,远远强于其它的竞争对手。目前最新版本0.9.x的频谱显示功能,比起前几位,也是强得不行,就比较流行的狭小范围看来,大概只有WMP能跟它匹敌吧。不过由此带来的负作用是,新手上路困难,难以获得菜鸟用户的青睐。另外随便看了一个曾经的老大Winamp,现在是5.5.x版本了,不过在我的机器上极不稳定,立马就卸载掉了,而且似乎没有做好市场调查啊,亦或是老外的使用习惯上就是那样的? 中国市场的大半江山应该是被千千、QQ、Kugoo三巨头控制了,这三个软件互相之间做得很相似,唯一大点的区别是Kugoo是以文件共享起家的,经过几年的经营,可以极其方便地以P2P的形式直接下载歌曲文件,而服务器上只需要保存些索引即可,负载压力顿时少了。千千则是以纯粹的音频播放器出身的,注重音质音效等是它早些年发展的重点,然而国内用户似乎并不特别在乎这点,当年的在线搜索歌词功能为它短时间内赢得了大量忠实用户。 其中一个重要的现象是,音乐网络化。三个软件都可以打开一个小窗口,显示一个网页,通过该网页可以查看当前的音乐流行趋势,在线试听,甚至下载(中国不像美国那么注重音乐版权,中国人真幸福)。其它的功能特点,就都很普通了,无非是换下皮肤啦(这皮肤机制也都很土,就是换一下窗口边框,这点WMP就强太多了),有个播放列表啦,搜索显示歌词啦(foobar/WMP/winamp默认的都不行,至少得装插件才能支持),支持插件啦(似乎都没公开的SDK,foobar/WMP/winamp都有,这似乎又说明了两地用户的使用习惯和素质上的差别)等等。就这些明显的特点看来,中国用户跟欧美用户的使用习惯上应该有不少的差别,本土三巨头也算是依仗本地优势,因地制宜,殊途同归啊!
为了用上比较新版本的flex和bison,又不想额外装个啥Linux,于是只好走旁门左道了,在Windows上装个cygwin暂解燃眉之急。这个cygwin也是个小气的东西,只提供一个大小只有几百KB的在线安装程序,这个程序从远程服务器上下载了文件列表,根据用户选择,下载需要的文件到本地再进行安装。无奈的是我贪心了一点,想把所有的软件包都下载下来,结果昨天晚上开了一晚上,卡在一个包上,后面的都没动静了。 今天回来看了一下这个软件包列表,提取出所有软件包的远程地址,导入到FlashGet中进行批量下载,可是这个1.9.x版本的FlashGet有不小的问题,平常还看不出来,在下载项很多时,总是不时地卡住下载不下来,而要暂停一下再开始,才能继续下载。当时用它来下载那几千个sogou的皮肤,也把我弄烦死了。今天又是这个状况,偶然兴起,上网看了一下最新的版本,已经到了2.0了,于是索性装一个来试试,哈哈,似乎没有这个问题了哦,而且界面上也改得面目全非了呢!软件该升级的时候还得升啊,呵呵! 再扯些其它的,这东东放了一堆的广告上去,这也是没办法的,谁叫它是个免费软件呢,人家也要吃饭的。好久之前就听说它是能下BT的东西,不过我已经久不用BT了,改用eMule了。另外又看到它也用到了DHT技术,大概是为了下BT下载才用的吧。前些天看到一篇blog,讲了eMule的Kademlia相关内容,让我有点热血沸腾,这个技术再搭上一个音频播放器,只要用户足够多,就不用什么Kugoo了嘛!
几天无聊中,又拿起TeX来玩,这东东用来做PDF真不错,可用来写软件的user guide或manual,也不用做htm或chm了。 编译器用gcc,界面库用wxWidgets,多语言和国际化用gettext和iconv…… 今天偶然发现cygwin中的flex已经是2.5.35版本了,而gnuwin32中的才是2.5.4,bison在cygwin中是2.3,而gnuwin32的是2.1,差了不少了啊,看来得装个简装版的cygwin才行。 也不单是为了不用盗版,而是这些开源产品确实质量已经足够了,尤其是在开发方面。
偶然看到一则消息,遨游将自主开发浏览器内核,真是让我觉得有点不可理喻。当今世界,IE、Firefox、Opera、Safari几大流行浏览器正拼了个你死我活,遨游从MyIE开始,多少年来一直使用IE内核的外壳程序突然从中插一脚,在我看来,实在是前途困难重重,希望渺茫啊! 先不说遨游是否有这个技术实力,就算有了水平堪与一流产品比肩的成品,最后的宣传推广,以及后续维护发展,也是前景相当不乐观的!
鉴于编辑器模块的重构任务已完成大部分,从两个View中提取出了一个基类View,这样总的说来大概减少了近2000行代码吧,中途也遇到些小麻烦,不过最后都没花什么大力气解决了。 今天就又看了一天的lex和yacc的资料,真是犯贱呀,在学校的时候这么大把的时间不好好学习,现在却要临时抱佛脚。回来看了几篇blog,难道最近流行学习编译原理?从理论到实践,都有人在搞。以前还是很不在乎的,因为再怎么样,也很少有可能需要自己去写一个编译器出来。其实现在若不是要整编辑器,也很可能再也不会去碰这玩意儿了。 昨天看到网上提到一个软件CodeLite,于是好奇心起,装了一个来试试,使用wxWidgets开发,所以横跨Windows、Linux、Mac三大桌面系统。它只是一个编辑环境,编译器还是使用其他的解决方案,比如MinGW,不过除开编译器因素不谈,它是个自消费系统,跟Code::Blocks一样,在自己的环境下开发自己,如果下载了它的源代码想自己编译一把的话,除了要装必要的编译器和程序库外,还得先装一个它的Release安装包,这个过程很明显又给自己打了一把广告。 突然我有个大胆的想法,这似乎是给我一个完全抛弃盗版软件的机会。在Windows平台上软件的丰富程序,确实很大程度上影响了我们的日常生活。记得还在大学的时候,就很雄心壮志地想所有的软件都不用盗版的,如果遇到找不到开源免费的,就自己写一个。但很严重的一个问题是,我当时只会用C++ Builder,所以开发工具只能用盗版的。现在也没好过到哪里去,只不过从C++ Builder换成了VC而已。可目前,就似乎有另外一种选择,使用MinGW+wxWidgets,从CodeLite和Code::Blocks的表现看来,完全可以满足我目前绝大多数的需求,而且还带来另外一个意外的好处,就是跨平台!虽然都没怎么想过在其他平台发展,但现在有这样的低成本扩张机会,何不放手一试呢!从此可以不用商业化的开发工具啦,哇哈哈哈哈!
偶然看到这篇文章,Delphi for PHP已经升级到2.0了,不愧为曾经最强大的IDE生产商,把PHP的开发工具都做得这么神! Code insight,也就是auto completion、call tips等功能的集合,想当年,第一次用Borland C++ Builder 5.0的时候,就很诧异它的auto completion,不过那个版本并不稳定,后来没多久就出了6.0,发现稳定好多,不过以现在的眼光看来,它的速度就慢了点,还看到国内有个牛人自己写了个增强插件CodeFast,速度,内容上都有很大提升,但极其不稳定,几乎处于不可用状态。当时用得多开心的,而且以VCL出色的设计,开发GUI程序,尤其对于初学者,有极大的鼓励作用。由此,我也就以为,Borland出的IDE是世界上最好的IDE,这个原因,也一定程度上让我不再愿意去费力气转向其他工具,包括VC。 后来用上了装了Visual Assist.X的VC,发现VAX的能力太过惊人,再后来就是工作中,直接使用VC作为开发工具,就已经离不开VAX了,VAX的智能提示功能实在是太好用了。 工作中,负责的也是一个IDE的编辑模块,其中的auto completion和call tips则是重头戏,前段时间计划着增强该功能,但一直没有动手。曾经考察过几种当前甚为流行的IDE的这个功能,包括VC(其实是VAX)、C++Builder/Delphi、Netbeans、Eclipse、Visual SlickEdit,当时的比较结果看来,C++ Builder/Delphi的似乎是其中最弱的,Netbeans的则看起来比较炫,太显得啰嗦,VAX的比较适中(可能也是因为看习惯了)。但有一条明显的需求是,当光标在下拉候选列表项中移动时,旁边应该可以弹出一个tooltip来详细描述当前被选中的项。但是项目中使用的Scintilla控件似乎并不直接提供此类支持,因此需要修改控件的源代码,而这是我最不愿意做的事情,我希望这个支持应该由官方来做。 而今看到这篇blog,则提供了一个可以学习的范例,同样是脚本语言开发环境,别个是当前业界最先进的,当然应该取其所长,补我所短了。
其实学的是flex,从公司网上找的,大概也是gnuwin32中的某个版本。顺便在公司网上又找了些资料来学,纯粹只是看的话,是跨不过那道坎的,所以要自己写几行来玩。生成的C代码倒是能直接用MinGW中的gcc编译,这让人觉得很舒心。开始的时候不明白,为什么写的正则表达式好像不起作用,总是把该扫描分析的文本全都打印出来了,而我明明只是想让它打印被匹配上的那些内容就行了啊,经过仔细观察,最后发现,其实是flex生成的C代码中,自动把不匹配任何自定义正则表达的内容也输出到控制台上去了。所以有两个办法可以解决此问题,一是把匹配内容输出到文件中,另一是修改下flex生成的C代码,把默认输出的那个ECHO修改了。 让它分析一个3万行的rb文件,匹配几种常见的token,如常量、变量、数字等等,速度奇快无比,可能不到1秒吧,想想我原来用Greta写的全文匹配5种模式,不知道要多久,不过幸好在不是很晚的时候发现了这个解决方案。从中已经可以看到曙光,原来我的猜想、直觉应该是正确的。flex可以解析出token,因为我需要的是其中的子模式,所以光是flex还不够,需要借助yacc(现在用bison的比较正常吧)进行语法分析。我猜即使加上了bison生成的语法分析过程,扫描那个3万行的rb文件,得到需要的结果,应该也不会超过3秒钟吧。不过另外有个问题需要注意,flex和bison生成的代码里都有一些全局变量,如果在多线程环境中使用,需要非常小心地进行同步,不过也许,自己也是可以对生成的代码略作修改的吧,尽管这些代码的可读性在我看来真的十分糟糕。
因为我是一个半路出家的coder,除了会写几行C/C++代码外,所有其他计算机科班出身的人会做的事我都不会,这也是我的一大劣势。 其实前段时间就想过,要学一下lex和yacc的用法。有这个想法,主要还在于看到不少开源项目,比如doxygen、source highlight、swig等等,全都用到了相关的东西,而正是因为我对这方面一无所知,所以即使能获取到它们的源代码,我也不知道如何自己编译。 这两天在公司里,遇到一个问题。编辑器里需要auto completion,为了尽可能实现地进行联想,于是以project方式组织时,需要扫描单独文件的上级文件内容,把符合要求的几种模式都识别出来,其实也只有5种。于是我就用了一个比较简单,可以说是笨的方法,用正则表达式去全文匹配一下,5种模式就匹配了5次,当文件内容少的时候,问题不明显,可说是没有问题。当文件有几万行时,就不行了,CPU占用率一下就99%以上了,而且匹配一次就会持续十来秒,5次就可能要1分钟去了。而且这个动作是在打开文件的时候进行,所以如果连续打开多个文件,机器就假死了。这个问题一直在存在,存在大半年了,只不过没人提出来,我也没意识到其严重性。这次跟同事讨论起来,我才觉得不改不行了,但我又想不出好的办法,缺少必要的理论支持,绞尽脑汁也是无济于事的。我的直觉告诉我,用编译原理方面的知识可以解决这个问题,所以学习编译原理也将提上议程。 编译原理一直以来是我最怕学的东西之一,记得很久以前,高中时的某个假期吧,但毫无进展,不了了之。后来大学时考高程,其中有一部分就是编译原理的内容,全靠考前死记硬背,考时胡乱蒙猜。可能其他还欠缺些理论知识的支撑,也是一部分原因吧。 因为想做好编辑器,所以对代码编辑的支持是必不可少的,因此从现在开始,订个计划,学编译原理,lex、yacc使用。
今天一时兴起,修改了一会儿自动升级程序。这个自动升级程序半年前就做了,当时用的boost::asio来实现http下载文件,可是问题就在于下载时,CPU占用99%,而且下载速度并不快,这让我很郁闷,在网上也没有找到确实可行的解决方法。后来觉得功能基本可用了,就一直丢在那里不管了。 前些日子,另一个同事也开始为Impeller做了一个自动升级程序。那个程序的实现我不喜欢,它在升级时没有一个可见的需要升级的文件列表,进度条也只有一个总的,总之至少从界面上看,是个很土的程序。不过它除了能升级本地应用程序的必要文件外,还能进行Gems包的升级。另外,似乎它还可以在文件被替换的前后,执行一些额外的操作,比如一个COM组件可能需要注册,这时这个功能就很有价值了。不过,有时候我又觉得,有必要那么复杂吗,它还想内嵌一个Ruby解释器,能执行Ruby脚本,晕死! 在我心中,一个比较理想的升级程序应该是这样的:1、每次都是从一个指定的地方获取一个文件列表,文件列表中记录了可升级的文件的相关信息,如文件名、相对路径、大小、hash值、日期、版本号等,每次都是将本地的文件跟文件列表中的信息进行比较,才得出是否需要升级的决定;2、一般下载文件都是通过http的方式(比较简单)实现,这样可以实现多线程及断点续传;3、下载时,有针对当前下载文件的进度以及所有文件的总进度;4、允许用户中断升级过程;5、能自动替换文件,包括被打开的文件;6、能最小化到托盘图标;7、能通过配置就可以直接适应其他升级需求(配置可以放在文件中、注册表中,或直接通过命令行得到);8、在替换文件前后,可以执行简单的命令行,不需要执行什么脚本程序那么复杂;9、升级程序自身文件体积应该比较小;10、有良好的出错保护机制;11、可自动生成第一步需要的文件列表;12、支持子目录中的文件升级。 暂时就只想到这些,呵呵,抽空用WTL写一个。
话说我已经通过抠早期版本FileZilla的代码,能让程序在崩溃那一刻进行dump,但是却只是知道,dump时,如果有相应的pdb文件在搜索路径下,是可以直接得到详尽的信息的,如果当时没有pdb文件,就只能得到一些看似无用的东东。 其实我错了,大大地错了!也不怪中间各种各样的原因,关键是现在知道只要能保留下可执行文件相配套的pdb和源代码在本地就可以了。当初从别人那里拿来dump文件来分析,是因为搜索路径下的pdb和源代码都是跟那个可执行文件不匹配的! 我居然还想着通过什么策略把pdb分发出去,哈哈,太可爱太幼稚了!现在终于可以安心地发放可执行文件出去了,只是崩溃报告机制需要好好设计一下,如何能及时地把报告从用户处取回,考虑到公司的网络环境和使用政策,还是要费点劲的。 另外又引出一个新问题,配置管理怎么做?嗯嗯,越来越复杂哈!
这些天为了看一部网络小说,很是堕落啊,还熬过一个通宵,之后就一直没恢复过来,整天昏昏沉沉的。 开源里好东西还真是不少,前些天在公司网上看到有人提到一个libEtPan的库,原来是一个mail库,提供了pop3、imap、smtp、nntp等协议的支持,简单看看觉得还是挺有用的一个东东,可以放在程序里,结合程序崩溃报告,提供一个比较友好的用户体验。
今天突发奇想,看到Edraw的一个软件包里有个CrashReport程序,觉得这个功能真是很值得放到自己的工程中去。想想大概原理就是使用dbghelp.dll库中的Debug API来实现,不过具体细节我是一点都不懂。记起以前在公司网上看到有人提到过FileZilla就有这样的功能,可以在程序崩溃的那一刻记下程序堆栈,函数调用栈,寄存器等有用信息。于是我马上找来FileZilla代码,运气也好,刚好找到2.x版本的,因为3.0以上版本的源代码包中是不带这部分代码了。这部分代码模块独立性做得相当好,只要把那几个文件抠出来加入自己的工程,几乎不用怎么修改就可以工作了。要做试验的话,可以来个除0错误,或者向空指针写入值,然后运行,就会弹出消息框,并生成2个文件,一个是文本格式的简要信息,另一个是二进制格式的core dump。又在公司网上找到一篇用Windbg分析core dump文件的简要介绍,马上拿来试试,还真是好用,设置好symbol目录和source目录,它能自动从网上下载缺少的symbol文件,并能自动打开源代码文件跳转到引起崩溃的那行代码上,真是太爽啦。以后再定位程序莫名崩溃问题,要方便简单多啦。
这次是真的想学一下Python和Ruby这样的脚本语言了,主要是它们的开发效率都似乎比较高,有大而全的库,很适合写些小程序,完成些小功能。几次去书店和小卖部,看到几本相关的书,都想买下来,但最后都还是忍住了,想想我买了来很可能还是束之高阁了,而且网上一般都能找到英文电子版的。 对于这两个语言,我不期望能很精通,只要有点熟悉主要功用就行了,顺便自己用MFC做个IDE,当然目的不单纯,呵呵。
昨天感冒就比较严重了,流鼻涕不说,连嗓音都变了。人也有点昏昏沉沉的,不想干活。 无所事事了快一天,下午的时候终于下决心用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值,但我想,这个算法应该能自动切换,不同的时间自动使用不同的算法,这样就用户就可能很难猜出用什么了。
跑去华强北买了个TP-Link的无线路由器,只是觉得好玩,其实完全是多余和浪费。最多只是少了一根线插到电脑上而已。 以前在学校的时候,还以为路由器是好大一个机器,后来见到过一个同学拿来一个小盒子,才觉得好笑。不过再想想,更早些的时候不也认为交换机是好大一个设备嘛,后来去电脑城跟同学装电脑时,看到8口的交换机也才200多块钱,而且那都是快5年前的事了。昨天去帮公司一同事MM搬家,偶然间谈起说她有个无线路由器,当时觉得她好高档哦,呵呵。 买回来后,飞快看了一遍它那薄薄4页的说明,很简单,然后就把原本插在电脑上的网线插到路由器上,打开无线网卡的网络连接属性,搜索一下,再通过Web登录上去设置一下。因为本来就是一个交换网络里了,再设置时,选静态地址分配,并把默认的路由器IP改掉,不跟交换网络的同一网段就行了。因为要用eMule,所以还要设一个转发选项。另外就是,一切正常了,可以加个密码,免得让其它人家的人偷偷使用我们的带宽,呼呼。
这东东早就从eMule上down下来了,只不过当时看到它的建议配置是1GB内存,我估量了一下自己本本上可怜的512MB的内存,最后放弃了,只是跑去把公司里那个台式机装上了,虽然那个台式机也是512MB的,不过我总觉得自己把那台式机调校地比较好,呵呵。 今天不知是无聊至极了,还是禁不住诱惑了,还是决定要装上试试。因为本本的系统盘有70GB大,即使已经装了一堆的东西上去,还是空了50GB左右,所以不用像在公司里那么麻烦,一路next下去即可。想想那天公司里装的时候,先是报空间不够,删了一票东西后再装,好不容易装上了,系统盘就只剩下13MB空间,又删掉一票东西,最后好不容易弄出200MB左右剩余空间,还不时地会被notes、IE等东东写点临时文件进去,Windows就会弹出个气球来提示一下。 装上后,先想编译一下Xtreme Toolkit Pro来试试,静态库还好说,基本上顺序地编译链接过去了。到了动态库的时候,报rc.exe执行出错。后来搜了一下,发现根本没有这个程序,把.NET 2.0 SDK里的拷过来试试,发现可以用,接着是缺mt.exe,再拷过来,顺序pass,呵呵。 不过这个比起VS 2003来,还是嫌它占用资源多了点,平时还是不用了。VS 2003英文版好不容易从eMule上找来的呢。
自从大致了解了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文件,再更新一下配置文件就可以了。
今天偶然看到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,很好,很强大!
在开始决定使用doxygen后,一直有种隐形的强迫之力,促使我为自己写的代码作好注释。今天经过一番小小的努力后,到晚上加班时,终于可以warning free地用doxygen为我那个工程生成暂时令自己还比较满意的文档了。心里不免有些小小的成就感,心想这样的场合下写的代码,就是应该这样作好注释,为文件、类、变量、函数等等各种元素进行标记。 现在我用doxygen的方式还是比较落后的。先用doxywizard生成一个doxfile,然后把这个doxfile添加到VC的解决方案里,注意保存路径也是要和解决方案一起的,这样以后方便。再在VS的IDE里有个外部工具菜单项,添加一条指向doxygen.exe,参数当然是doxfile,路径是和解决方案的一样,运行目录也是和解决方案的一样,这样就在菜单上多出一项doxygen来。为图方便,可以写几个自动添加注释的宏,并把它们绑定到快捷键上去。目前我自己用的有为文件、类、函数以及普通目的几种定制了宏,定制宏的目的是一方面可以生成符合doxygen要求的格式注释,另一方面有些内容是可以自动填好的,比如文件名、作者、日期等等,当然这样的宏还是很低级很落后的,最好是能把这样的功能跟Visual Assist X之类的插件集成在一起,可以自动识别出函数名、类名等更高级的信息,并生成相应的注释,不过现在在还没找到更好的办法之前,就先这样将就一下吧。最后就是点击那个菜单项,运行doxygen,生成文档。 doxygen提供了很多选项,也支持非常多的关键字。在使用的时候,我也是一边摸索一边尝试,唯一的资料就是它自带的文档,在开源的项目中算是很不错的了。不过始终让我觉得郁闷的是,为什么中文的老有问题,好在现在有一个别人的自编译版本,1.5.1的能比较完整地支持中文了,先暂时这么用着。 另外有些经验。对于同一项目中不同目录下的同名文件,可以通过写路径来让doxygen区分出两个文件的不同,而且要注意的是,这个路径它是大小写敏感的。对于文件名唯一的文件,只要写出文件名即可。 注释写在头文件中比写在实现文件中要好,而且最好声明和实现完全一致,比如函数参数列表。注释中标识参数时,只要写参数变量名即可,不用写定义的类型,而且变量名要和声明时的完全一致。 doxygen支持todo list,它会把它单独列出来,比较方便,当然现在的MS和CodeGear的IDE也有对todo list支持。 最好对每个有点作用的变量、函数、文件、类(结构、枚举)、宏定义等都作注释,这样看起来比较舒服。 对于ATL中使用STDMETHOD(xxx)(yy,zz)这类形式的声明,如果doxygen认不出来,可以改成STDMETHODIMPL xxx(yy,zz)这样的形式,就可以了,不过我没试过其它选项,说不定哪里设置一下,前面的那种形式就能很好地识别出来了。 最好装上Graphviz,让doxygen使用它来生成类图、被调用图,很好,很强大。 还有就是要坚持,要循序渐进,在新定义一个变量,一个类,一个函数时,就给它添加注释,嗯,这样就能写出一份well documented code了!
跟TextPro的负责人交流了一下,发现分歧还是挺大的。他们只想做一个普通的处理中文文本,有正则表达式支持查找替换,还有一些简单的转换处理功能的小程序就可以了。而我原本还以为要做一个通用的文本编辑工具,至少类似UltraEdit、EmEditor之类的,只不过对中文处理增强了。分歧很大,我只好放弃了,不如自己玩自己的。 看了一下鱼鱼桌面秀,存在字符编码问题,我的系统上如果安装路径里包括了中文,就运行出错,处于不可用状态。其实我只是想看看它的插件编写环境,原来它用的SynEdit,还是比较完善了。晕!
doxygen真是个不错的东东,现在都有点爱上它了,特别是对于现在我这样的情况,我还是随时准备着要把手头的代码交接给后来的人的,所以为了减少沟通交流的时间,比较详细的文档是很重要的一步,而对于缺少设计文档的项目来说,源代码即是最好的文档。这时doxygen的作用就很明显了,在它的帮助下,可以很方便地扫描出当前项目下所有源代码中类的依赖关系,文件依赖关系,类说明,文件说明,方法说明等等等等!我现在用的办法是,先生成一个doxyfile,添加到项目中,在VC的外部工具中添加一项,调用doxygen生成该项目的文档,还是比较方便的。不过也遇到些问题,最奇怪的莫过于中文的支持了。我从官方网站上找来的1.5.x对中文支持都有问题,但从公司网上找的一个人家自己编译好的却没问题。另外一个问题是,对于不同工程中同名的类,它会只留下一个,丢掉了另外的,这就不好了。对于不同工程中的同名的文件,倒是可以通过指针建子目录来解决。不过也许是我还没用好,说不定是哪里的设置问题。
刚刚看到同事在用酷我音乐盒听歌,可以在线听,又有歌词,专辑封面等信息,觉得挺有意思的,于是下了一个1.3.0Beta的来试试,发现怎么都不能让它发声,于是经过短暂的尝试后,毅然决定要把它卸载了。可是,就在我卸载之时,猛然发现,我只是在设置里把下载的cache目录设到我的存放了几个GB的mp3目录下去了,而它却自作主张地把该目录整个地删除了,连招呼都不打一声,关都关不了,看进程一时间又没找到是哪个,于是,眼睁睁地看着那几GB的mp3全没了!
前些天因为那论坛上用gcc来做编译器,所以又翻出很久没动过的MinGW来。没有像VC那么强大好用的IDE,而且VC的debugger真的很强。开始很笨,用printf来debugging,后来觉得这样也太傻了太不专业了,决定要用一下gdb。看了一点资料,其实只要了解很少几条命令就可以用了,查看源代码,打断点,运行,单步,继续运行,基本就可以了。 今天发现,在emacs里,可以直接用gdb,都不用到外面的shell里,太强大了! 还发现,好像STLPort用-g选项编译,cout就可能有问题,不知道是不是我自己哪里弄错了。
今天突然又觉得自己的墙纸已经用了好久了,一直一成不变挺单调的,自己收藏的那么多pp的图片深居冷宫那么久,真是浪费了。想起自己一年前(还真的是一年前,去年十一的时候还在整呢)还用C++Builder来写一个呢,结果当时遇到一些问题,比如定时器没正常工作,晕,然后就丢下了。 上网搜索了一下,没发现什么好用的,总是有这样那样的问题。而且今天突然发现,好多好多软件的界面在我的机器上显示有问题,总的说来就是界面上的汉字显示不出来,全是问号,晕倒!另外就是,其实我希望的是,像ADC这样的东东加上一个定时自动更换墙纸的功能,可惜我找了几款日历软件,都没有这个功能,遗憾啊! 大概没有几个人觉得自动更换墙纸有多有用吧,所以随便下了几个更换墙纸的软件,也都做得很差劲。 没办法了,只好自己动手,丰衣足食了。用MFC写一个吧,以后有精力的时候,再考虑加上日历,反其道行之,呵呵!
相比MFC,我果然还是更熟悉VCL的使用。不过我不想再用回C++Builder了,我要用VC,就冲着Boost库对于VC的编译器的极佳的支持。今天又写了一点点代码,要把asio的库都好好体验一把了,UDP、TCP都要有,Client、Server也全都有。现在还吊死在C++上,只是因为我确实还不怎么会用其它的语言,在项目进度的压力下,我不敢贸然地尝试完全不同的概念和思维方式。今天只是稍微做了一点html页面生成的部分,还有很多要做,尤其是要能做成带不同的链接地址的,唉,走一步算一步了,问题总有解决的一天,先把最有把握的部分解决掉。后半个月看来是要晚上加几天班了,呼呼,原来那个项目还有一些遗留问题也要解决,真是郁闷。上午突然想起来,我那东东得有一个自动升级功能,想了好一会儿,构思着再加一个updater.exe,每次系统启动的时候运行一下,把该升级的都升级了,后来突然又想到,干吗不把这个功能作为客户端程序中的一个模块呢,不需要单独的一个project了。 还有就是,我还是想做一个流程文件编辑器的,因为用Excel也真的太傻了。但是今天粗略地想了想,这个编辑器其实还是有点复杂的,要求比较灵活呢!其实如果是用VCL来做的话,我觉得应该几乎没多少障碍,可是现在可能是MFC,或者其它的,很多事情我都不知道怎么实现。
今天开始搞新项目了,这个项目需求好久好久前就出来了,一直拖着,大概的设计思路我也已经有了,但从工作的角度讲,今天才是真正的开始,从需求分析开始。其实我觉得需求已经比较明确了,只是那些人到时候估计会不停地改口,这是很让人郁闷和气愤的,但也是不可避免的。 鉴于打算用类似Google桌面搜索那样的界面技术,所以得先研究下本地建一个http服务器有困难,看了看asio的例子程序,估计所有代码加起来不到100KB吧,但确实已经是一个可用的http服务器了,我都用bjam编译运行过来,效果很让我欣喜若狂,本来这样的只是为了本地建一个给本机用的服务器,足够了啊!所以不禁要感叹一下,asio真是牛x啊! 老大一直很担心到时候拿不出东西来,总是叫我好好讨论一下需求。我自己的想法,这个东西要是把所有支撑模块都做好了,业务逻辑其实是很简单的一块,随便怎么改都行,应该很灵活,即使到时候发现他们的要求变了,我应该也能快速作出响应。 中午没睡着,下午就虚了,晚上就又累又困了。
今天只进了一次系统蓝屏后,就再也进不了系统了,每次在登录界面等待输入密码就会蓝屏然后自动重启,开始还以为是哪个外接的外设引起的硬件不兼容,于是依次把网线、音箱、USB Hub、硬盘全都拔了,依然蓝屏。于是怀疑是电脑附近有什么磁场之类的影响,先把手机拿开,故障依旧,再把本本放到床上去,仍然蓝屏。真是把我郁闷坏了,于是打算进行系统还原,但我把所有重要的东西全都放在系统盘上啊,晕!先进入恢复还原的工作界面,试图把重要的东西刻到光盘上,结果不知道是哪里有问题,就是不能备份啊!退出来侥幸心理想看看还会蓝屏么,果然还蓝屏,最后想起有个安全模式。重启时狂按一票Fx键,终于要进入到安全模式了,偶然看到它居然提示要不要装载某个.sys文件,这倒提醒了我可能是哪个驱动搞鬼。进入安全模式后,先把系统盘上的重要的东西备份到外接硬盘上,再看了看,把360安全卫士和Kaspersky卸载了,再重启,可以进入了。似乎问题就这样解决了。 怎么办呢!没有杀毒防木马软件,还真是有点不习惯,心里不踏实啊!
下午正在睡觉,小妞打电话来把我吵醒了。打完电话,穷极无聊,想想怎么弄一下我的T43让它可以和我的N73通过蓝牙连接。一直都知道T43可以用蓝牙,但一直没用成功过。上网找了一下相关的资料,原来只要Fn+F5打开蓝牙功能就可以了。这样用N73就能搜索到了,但在连接的时候提示需要什么通讯码,就像识别标识一样。还以为是固定的,所以上网搜索了一下,没什么实际有用的信息。后来偶然发现,在T43上搜索蓝牙设备,可以找到N73,这里设一下PIN码,然后在N73里连接时要求通讯码输入那个自己设的PIN码就可以了,呵呵。这样就基本解决了T43与N73蓝牙通信的问题。不过试了一下,连接很不稳定,经常马上就断了,而且传输速率只有8Kbps左右。
话说同事那任务把他整得精疲力竭,昨天加班又是继续攻关这个遗留问题。老大的看法是RichEdit在显示的时候占用太多时间是主要原因,于是同事把RichEdit换成用Scintilla控件来进行显示,结果效率并不比RichEdit好,估计因为Scintilla是一个通用的文本编辑器,为了进行着色、词法分析等任务,在这种特殊场合下,并不是最优的方案。还是换回RichEdit,只好从提高字符串操作效率着手。把其中一部分操作原本使用CString的,全部改换成用C运行时库重写了一遍,尽量减少字符串复制操作,用原始的指针,同时也避免了原本非常频繁的CString对象的创建和销毁,再加上一点点从CPU优化的角度的编码技巧。最后发现似乎效果还是挺明显的,不过RichEdit内的数据如果一多,显示速度也会降下来,这个问题照我的看法,如果坚持要使用RichEdit的话,只能开个定时器,每一个固定的时间周期,把RichEdit中的数据减少一点,保证RichEdit中最多只存储一定数量,该数量应该还不至于明显影响显示速度的内容,否则就完全摒弃使用RichEdit,采用自己画的方案,因为每次只是画出显示的那一部分内容,速度应该很快,而难点是,要把所有内容缓冲到文件中,如何能在文件不断增长的情况下,快速准确地定位到需要进行显示的那部分内容。 这个事件,让我对现成库的效率都产生了怀疑的心理,MFC库的慢是为众人诟病的,但不知我更习惯使用的STL效率如果,它的string类,它的各种算法不知道应用到这种场合会是什么样的效果。必要的时候还是得靠自己手动解决,看了《软件优化技术》中的一点内容,编译器优化会帮我们做不少事情,但很多时候还得程序员帮助编译器创建更优化的条件和机会。
同事为了能快速地打印输出格式化的字符串,已经被弄得精疲力竭了,呵呵。这些字符串来源于Ruby解释器的输出,包括各种复杂的信息,所以需要在显示前进行相关的处理,比如提取出放在行首的颜色信息,把字符串断行等等。目前的问题是,输出显示很慢,要么就是闪烁,要么就是脚本执行已经被中断了,它还在那里慢吞吞地输出,其实确实字符串已经送到了,但进行字符串处理的过程太慢,导致脚本执行中断时,还堆积了很多没处理的字符串。 看一下我们这个项目的代码,一般都是只求功能的实现,几乎从来不关心代码运行效率的问题。我一直也是这样的毛病,以前也没怎么想过特意去怎么优化。现在这个事情突然让我对这方面很是关注。 一般说来,以这个例子来说,要解决,首先就是要使用更高效的算法,看到同事写的那一段代码,确实是很低效的,大量的字符串重复拷贝、对象创建和销毁、字符串匹配等等都是很耗费时间的操作,又不注意稍微节省点用,照老大的说法,一个CString被复制了几次,用个引用效率也能高一些啊!然后可以考虑从CPU层面的优化,当然当前都是调试版本处理,也许效果还不是很明显。 我想了一下,如果是我来做那部分东西,我会怎么办。首先,我可能会把所有的CString都用C++标准库里的string/wstring来代替。其次,我应该尽量会避免每次收到一个字符串时就new一个结构体,里面还有个CString成员,这样的分配内存和创建对象操作在这种场合都太费时间了。然后是,开一个合适大小的内存池,这样一边可以追加,一边可以取出处理。再就是尽量提高匹配的效率,选择一些比较高效的算法以及好好改写程序逻辑和代码结构。最后是,RichEdit似乎也有一部分问题,可以考虑自己画,把所有接收到的内容先写入一个文件,或某块内存,每次自己处理滚动条消息,然后计算比例,画出相应的部分内容,如果用双缓冲画几行字,即使用GDI应该也还可以吧。不过这样纯粹是我的空想,基本没有实践支持,所以具体效果如何,以及复杂度如何,我也不得而知。
今天用WTL写一个输入法的辅助工具,到了后来,又发现Release模式下链接不了了,看来不是个别现象了,最后排查到,到了C++标准库,就会有问题,报符号定义冲突的错误。这次忍不住了,上google搜了一下,发现msdn论坛上一个帖子说,只要在设置工程属性的地方,把链接ATL为最小化CRT改成no就解决了,试了下,果然ok了。亏我当时还郁闷了一天就放弃了,看来在Windows下开发不上msdn不行啊,尤其是用VC了,就更应该上msdn的论坛了,难得有英文的这种Web形式的技术论坛,呵呵,都已经有点思维惯性了,以为老外只喜欢maillist或newsgroup的。 用WTL写了两个小程序后(都还没写完),觉得WTL真的不错,不过编译速度感觉有点慢了,不知道是不是因为这些天只是用来编译C程序,对速度的感觉已经被影响。但是生成的文件小巧啊,我到现在还没弄明白,到底什么时候,会链接进来那个msvc**71.dll之类名字的文件进来,反正这两个程序里都没链接进来,也许是因为太简单吧。 WTL形式上有点像MFC,一个窗口会有View类,一个对话框会有对话框类,然后有消息映射宏,宏里写上了对应的消息名字和消息处理函数名,再在处理函数里填上相应代码就行了。不过实质上,我也知道是极大不同的。
真可怜,虽然是周末,明明是个让人睡懒觉的日子,可是每到那个时间点,就会自动醒来,然后睡不着,然后翻来覆去也睡不着,然后躺着觉得狠狠的无聊,然后起来开电脑! 昨晚睡下之前,发现了让日志类的表现像标准流一样的方法,其实很简单,就是加个成员变量,是一个标准流的对象,然后用一个方法把它的引用返回出去,外部用户就可以用标准流提供的各种设施了。不过这样有一个东西我还没搞明白,怎么知道人家一次IO完成了呢,我只是希望能通过它来接受用户的输出,之后我要把这些输出处理一下再用我的方式输出,这个时机我就不知道了。现在的办法是,到下一次再输出上一次保存的内容,很不爽啊,很不可靠啊!估计方法还是有的,只是我不知道而已。 于是可以不用一个特定的结束符了。还加了个过滤功能,比较有趣。用了一堆编译开关的代码调试起来还真是麻烦的呢,因为很可能写的某段代码是从来没被编译到的,所以错误一直都不会暴露出来。比如这个日志类,涉及到是否是Win32平台、是否是UNICODE编译、是否带有Boost库,几个分支一混合,就是n多种情况,哪那么容易都覆盖到啊!
今天终于是睡到闹钟响才醒来的! 还是觉得挺累的,在公司里没怎么做事,昏昏地过了一天,接到一个新任务,做跟VSS交互的模块,当前的主要问题在于需求尚不明确,而且可能会有些比较麻烦的需求。也懒得去仔细研究需求,就先看些文档和代码,VSS提供的一个ssapi.dll就暴露了所有接口,不过比较怪的是,在VC.NET2003中import时,6.0版的saapi.dll里IVSSDatabase接口居然没有Close方法,而8.0版的是有的!这也不合理啊,难道是真的没提供,亦或是VC的bug? 回到家后,就不怎么想动了,脑子接近处于停滞状态了。这些天越来越不喜欢用BCB了,感觉VC挺好用的,其实一大原因是得意于它的编译器对标准的支持程度好,还有一大原因是对Boost支持好!WTL也还算好用啊,VCL用Object Pascal写成就是感觉不爽了。MFC除了要带比较大的库外,用起来也不怎么不好用的,呵呵。
昨天审视了一下那些概念,猛然发现一个严重的Bug的原因,原来一直是因为我对BSTR等的概念不了解,才造成了这样的问题,哈哈,纠正一个严重bug的感觉真爽啊!现在也许真的是可以把那个任务搁一会儿了!除非到时候又有什么新的需求,或者要对某一块内容重构,对,有一块,现在的设计很傻很笨,缺少灵活性和弹性,如果要扩充新的内容,就比较麻烦,而且如果那个结构内容一多,就看起来特别怪异。 突然很想自己写一个简单的日志系统,那个胖子曾经还跟我吹牛他们设计日志系统的时候参考了ACE的很多东西,我看了一下,只不过是每天新建个文件,把文件名、行号和消息内容写进去而已啊,只能说它真的是个日志,根本没有所谓的系统的概念! 要日志系统,就看ACE、Pantheios、log4cxx、log4cpp、log4cplus、Boost.log(没被Boost接受)。其中log4cxx、log4cpp、log4cplus都是从log4j派生来的,后两个都好久没有更新了,log4cxx最后的发布版也是好久以前的了,svn里倒是可以取出最新的版本,不过对于Windows平台来说,它没了直接的VC的工程文件了,需要用ANT才能编译了,看过它的文档,功能还是很强大的,大概是得益于log4j的强大吧,而且它可以支持配置文件。ACE里的日志功能,设计得也是很强大,它还能自动缩进输出消息,这点比较有趣,但是使用时需要链接整个ACE库,这就比较不爽了,要是能单独把日志部分提取出来,或许用的人还多一点。Pantheios基于STLSoft这个库,功能也很不错,它使用Syslog协议,这个协议在RFC3164有描述,甚至自己在Windows平台上实现了这个协议。不过我除了Boost,很不习惯再用其它的非标准通用库了,所以这个Pantheios就这样被我cancel掉了。大概看了一个Boost.log的文档,发现大部分需要的功能,它确实也都有了,或许不如ACE的强大,但之后也存在着不小的提升空间,不知道当时Boost怎么没有接受它,现在它好像被搁置下来了,也没在maillist里提起过了,而我看boost-consult的vault上那个,照那个样子,应该不会被接受的,看来要让Boost加入一个日志库,还得等待一段时间了! 所以近期一段时间内自己写个小巧适用的,还是有点必要的哈!不过有一点很重要的是,需要能同时让VC7.1/VC8/BCB5.6.4/BCB5.81编译,最好还能在Unix-like的系统上用Syslog协议。
Inno Setup真的挺容易用的,小巧轻便,又免费。本来还专门整了个安装输入法的程序,把ime文件复制到系统目录下,再写一下注册表,调用一个API,最后把所有文件用WinRAR打包成自解压文件。其实这样的方案也不是不行,只是觉得自解压的界面丑了点,看起来更业余了点。于是抽空用Inno Setup整了个,ISTool才是其中的大功臣,把本来全部要用代码完成的功能分解到各个GUI窗口中进行设置。它可以完成复制文件,操作注册表,调用简单API等功能,实在太方便了。现在我这个安装程序还可以自动寻找上一次的安装路径,可以根据用户选择写入不同的内容到注册表中,用户体验应该说还是不错的,哈哈。 生成的安装程序在系统菜单上显示的“关于”选项,会弹出一个版权信息消息框,如果要改这个消息,应该改setup.e32文件中对应的信息。我开始用UltraEdit来改,但改了总是出错,于是把源代码弄来自己编译一个setup.e32,不过有一个问题是,我自己编译的体积要大好多,不知道哪里的问题,而且界面显示上有一点点问题。另外,安装程序文件查看版本的时候,在“备注”一项里,也会有固定的标识,也是可以用改资源的方法处理的,如果有代码的话,先修改一个SetupLdrVersion.rc文件,再编译成res,最后编译一把SetupLdr.e32就行了。在编译Setup.e32时,会要求有RemObjects的Pascal Script控件,下一个装上就行了。最后还有一点是,它居然不能用Delphi7来编译,看代码中的注意说,用小于7的版本,或者9都可以,9应该是2005吧,反正我在2007下面是编译过了的。
用cnsw.org论坛上某位据说是mm的话说,VCL打从娘胎里就不支持UNICODE。这让我觉得很痛苦,自从在VC2005下用API写了几天代码后,就不知不觉习惯了想用_UNICODE选项来进行编译了。唉,可惜的是,我现在是严重依赖VCL画界面了,不用它我还真的不知道怎么实现一些界面效果,比如我经常用到的PageControl。 Boost sandbox已经从sf.net的CVS迁移到SVN上去了,待Boost 1.34.0正式release后,Boost的主库也会从sf.net的CVS迁出。Boost是个好东西啊,不过跟VCL一起用的话……
在上网的时候,小丫头突然打电话来,出乎意料地。然后两个人聊了大半个小时,照小丫头的说法,都从公司里聊到家里了。还是照原来一样,小丫头在那里抱怨了一通,呵呵。五一要不要去成都呢,犹豫ing…… 写程序总是遇到些奇怪的问题。这两天在研究直接用PSDK写一个能支持在2个TreeView中进行节点拖放的窗口,昨天还一直很奇怪的,只有一个 TreeView能作为拖放的宿,另一个则怎么也不行,但两个TreeView的代码明显是相同的,因为都是从同一个类中的方法啊!今天给窗口加了个拆分 条,可以让鼠标拖动TreeView之间的拆分条来调整两个TreeView的大小,结果稀里糊涂的居然发现两个TreeView都能作为拖放的宿了,真 是奇怪呀,明明我一点都没改动TreeView的代码啊! 从别人那里要来了一个通过COM接口跟GT3K交互的Demo,这个Demo是在Excel中用VBA写的,不知道如果在VC中用,还有多少困难,看来得学一下COM的知识了,比较麻烦呀! 另外一边的人打电话来说,要讨论一下单板软件的相关计划等,呵呵,要做嵌入式开发去了,这让我觉得有点兴奋,因为从来没有接触过这方面的东西,只是别人写的代码倒是看过不少,虽然也从来不看代码流程,只是为了PI值发现些很低级的语法错误。 SharePoint总算第一次被我调得可以显示一点东西出来了,不过还没有研究怎么使用,因为那台老爷机实在太慢了,我无法忍受在这样蜗牛的速度中 进行操作学习。SharePoint的资料是少了点,没办法的时候,只能跟别人交流交流了。而且,才发现目前只要装Windows SharePoint Service 3.0就够用了,不用装Server了,哈哈。 把输入法的界面改了一下,Comp窗口和Cand窗口合在一起了,就像现在流行的输入法一样,不再是传统界面啦,这有一个好处——可以方便地让它支持 Skin,或者不规格窗口。不过老问题还是存在:Firefox中还是出不来。而且一直想把设置窗口改成用PropertySheet样式,但总是要么不 出来,要么弄死机,郁闷,只好暂时就要原来的了。还有个问题,也是这两天才遇到的,在用UNICODE编译的时候,为什么stprintf总是得到乱码?
输入法最后的文件后缀虽说一般是ime,但它是个地地道道的dll文件。有过几年地狱般的调试经历,好不容易从MessageBox升级到OutputDebugString,最后终于进化到用IDE里集成的debugger。不过一直以来都是只对完整的可执行文件进行调试跟踪,对dll还没有相关的经验,尽管也写过几个,但那都太简单了,基本不用跟踪就可以正常工作啦。现在的输入法就复杂了,开始没想通怎样可以进行源码级调试,还是退回到OutputDebugString,编译连接一把,在记事本中试一下。后来想想,它应该可以attach相关进程进行调试吧,白天在公司也看到过一个文档,讲的是怎么在VC的IDE里进行相应的设置。其实非常简单,在项目属性里,把调试一页中的命令设为notepad.exe就行了。随便在源代码中打个断点,启动调试,VC会弹出消息框说notepad.exe没有调试信息,不用管,继续,notepad.exe运行后,切换输入法到这个被调试的输入法,如果程序走到断点这里了,就会被断下来了,变量窗口、输出窗口都跟调试exe文件时一模一样,哈哈。有一点需要追加说明一下,这个dll文件一定要放到能被load的地方,像普通的dll的话,放在和exe文件相同的目录就行,输入法就需要先安装一遍,这时ime文件是需要放在系统目录下的,所以方便起见可以直接在项目属性里把最终的输出文件指定到系统目录下就行了。 另外再说一点和UNICODE相关的事。为了和国际接轨,程序使用UNICODE似乎是最好的方法,我就先在输入法安装程序中做试验,一个百来行的小程序,用UNICODE选项进行编译,结果还真发现了问题,有个字符串在写入注册表时总是写不全,这让我很奇怪。同样的代码改用多字符集编译连接就没有问题。看看代码我已经都尽量用各种字符操作的宏了,最后发现原因,_tcslen在UNICODE的情况下,2个字节只算为1,在写入注册表REG_SZ类型的键值时,需要指定字符串长度,所以其实只指定为实际占用空间的一半了,这种情况就需要特别处理。虽然发现了这个问题,在这么个小程序里还影响不是很大,而且很容易暴露问题,但要是输入法程序是用UNICODE编译的不知道还会有什么问题呢!怪不得极U被炒得这么火!
一直以来,基本上是用着加加系列过来的。以前的拼音加加,以及现在的五笔加加。现在拼音输入法市场可谓战火四起啊,原来的拼音加加已经失去了王者之风,蛋糕被微软、搜狗、google、紫光几个分食了。五笔输入都全是些个人的作品,也许真是因为使用五笔的人比用拼音的少太多吧,大厂商怎么都不原意做个好用的五笔呢。不过现在的极点、加加、小鸭都是很好用,又稳定了。 相对来讲,大概五笔做起来比拼音要简单一点,也可能是因为没有什么创意或技术上的突破吧。五笔是只要能打出字,稳定就行了,命中率什么的基本还不用考虑。而拼音就很大一部分精力可以放在命中率上,微软拼音在这方面就做得很不错,google也是朝这个方面发展,但两家东西都有个很明显的缺陷——响应速度慢。 要做好一个输入法也不容易呢,Windows定的框架就太复杂了,而且Windows平台上各种各样的软件,要全部兼容谈何容易啊!
想起要写些关于Boost源代码的东西,要把代码贴到blog上来,不免想要弄稍微好看点,虽然有个Boost中自带的演示Boost::regex的cpp2html工具,不过觉得太单调了点。上Google搜索了一下,还是能搜索不少来,其中一个放在GNU上的source-highlight引起了我的注意,这是一个由Lorenzo Bettini编写的命令行程序,能支持好多种语言的源代码输入,同时又支持包括Html、XML、LaTeX、DocBook等格式的输出。看到最新版本已经是2.6了,不过作者已经不屑于发布Windows下的可执行文件了,只好去sf.net的GnuWin32工程里找了一个2.1.2版本用用。这个小程序做得挺灵活的,作为输入的源文件规则和作为输出的目标格式都是通过外部的配置文件来说明的,这样如果要添加支持新的语言,只要添加新的配置文件就可以了,不需要修改重新编译程序。这是个很棒的小程序! 小丫头现在都知道怎么骗我了哦,真让我感动得想哭,突然觉得这种感觉就像《Hunter X Hunter》里奇犽的哥哥说他妈妈哭了,因为奇犽现在都会砍她了,她好感动的。
早上虽然醒过来了几次,但还是坚持睡到了11点半才起来,这对于我来说,从工作以来是很少见的,而且居然做了个美梦。经常有人说,梦里发生的事和现实中的正好相反,仔细想想,其实好像没什么道理,倒是这样被说了后,有心理暗示罢了。 也不吃中午饭,又想起前些天在玩TeX,下午就把CSDN上的Blog的内容全用LaTeX做成了PDF格式,虽然很多想要的功能没有找到实现方法,但也已经很有趣很好玩了。现在才知道怎么在CCT的环境下做书签,先要使用hyperref宏包,加几个选项后,只能用dvipdfm来转换,而且开始先得用latex编译一把,再用gbk2uni转换一把,再用latex编译一把,最后用dvipdfm来转换成PDF文件,这样就可以做出中文的书签了。 再来说csdn上的blog,那是我第2个blog,第1个是放在blogdriver上的,因为当时csdn上好像还没有,而看到有个当时在csdn社区很有点名气的gigix在blogdriver上建了blog,我也就去建了个,写过十几二十来篇的样子吧,开始出现了一次问题,打不开我的页面,跟网站维护人员反映了一下后就弄好了。过了些日子,又打不开了,这次再给他们反馈,他们却没像第一次那样马上弄好,而是拖了好多好多天,也不知道是什么时候弄好的,反正没等它恢复,我决定把blog迁移到csdn上,因为当时对csdn还是很抱有好感的。没想到csdn的blog系统太太太不稳定了,我写了100多篇后,持续了两年,主要是在学校期间使用,工作后,也用了快半年,实在忍受不了了,刚好遇到这个blogger.com被解封。blogger.com上的空间是早就开了的,只是当时只觉得老是打不开,还不知道有GFW这回事,所以一直用csdn的,而这里刚好情形反过来了,当然也是考察了一些其它的BSP的,比如MSN的,Blogsome的,国内的ChinaUnix的,最后还是决定放这里了。所以正式点的说法,这是我的第3个blog,虽然也遇到了再次被GFW,但只要还能通过某些不正当手段访问或发文,我是不会搬了。 把csdn上的blog内容copy下来,也当是个纪念吧!只是blogdriver好像访问不了了。
几乎又是玩了一天TeX/LaTeX,我觉得最大的障碍还在于文档系统的不完善,大概是被MSDN惯坏了,什么事情都希望有个大而全的文档可以随时查阅。它相当于一个编程语言,但它只能描述相关信息,却没有能力进行复杂的逻辑运算。其实要用它很简单,只要能找到完整的参考手册就行了。 遥祝小玉玉生日快乐,去年跟她说如果明年还可以帮她庆祝生日……这是不是就意味着某种暗示是不能了呢?世事无常啊!
在公司里,新版本的文档管理都切换到CVS系统了。今天,几个同事说要配置一下怎么使用,他们不知道CVS原本是一个命令行工具,都照着宣传胶片上的开始装上WinCvs和CvsNT,然后一步一步地设置各个选项,而最终目的只是为了从服务器上checkout出文档来。用命令行的话,登录一条命令,checkout一条命令,最多再加上登出一条命令,多方便!由衷地感叹,来自UNIX体系的命令行文化的简洁和强大!不禁想起那个Rational ClearCase,曾经安装卸载了n次,还是不能使用,真是郁闷。 再说回来CVS,现在看sf.net上,好像是CVS和SVN并存的,但感觉CVS的存在只是为了兼容原来的老存档,SVN取代CVS是迟早的事情,公司到现在这种时候还只是把VSS改换成CVS而不是SVN,就有点让人觉得土气了。不过公司向来对开源世界的东西比较反感,以及人员的技能素质整体也呈下降趋势,靠着一流的市场、二流的用服来销售和维护三流的研发做出来的东东,这样的情况是持续不了多久吧。
LLYF ToolBox里除了LLYF Spy,其它的都是使用BDS2006来编译的,相比BCB6,2006版本的编译器最明显最直观的改进是编译速度的巨大提升。另外,传说中的VCL改进使得更好的内存管理,导致的更佳的内存占用情况,也是值得升级过来的。另外就是,IDE界面和其它工具的改进,比如debugger,都说明,从BCB6把工程移植到BDS2006是多么应该呀!LLYF Spy一直没移植过来,是因为BDS2006中一直安装Flash的ocx控件没成功,而LLYF Spy中有个Splash窗体,尽管一直都在配置文件中把它屏蔽掉了,但当时是为了演示Flash跟本地应用的集成而添加上去的。昨天下决心去找了一下解决方法,要在BDS2006中添加ocx控件,应该先new一个package,然后再import type library,试了一下果然可以,对于有些函数说连接错误的,就把原型改一下,比如__fastcall改成__stdcall,还有就是加inline,设好obj文件的搜索路径,终于可以编译LLYF Spy了。 除了移植过去,还试图给嵌入的WebBrowser控件添加XP风格。这点当时我郁闷了很久也没想通,以为整个程序有了XP manifest就应该把它嵌入的WebBrowser也有XP风格。前几天看了一篇文章,才知道,原来是要另外作些处理。要调用InitCommonControlsEx,设置一个标记,再把shell32.dll和explorer.exe装载进来。还有种方法说是改写WebBrowser的接口,返回一个标记就可以,可是我试了不行,不知道是哪里出错了。
突然想到的,把一些本来设置成手动的服务改成自动,或许会加快系统启动速度。果然有用,大概是因为有些服务设置成手动后,本来是需要的,在系统启动时,却还需要花时间去检测,或是在启动的后期进行启动服务,所以速度变慢了。 好不容易下到个官方命令行版的svn,上去把CodeBlocks的源代码取下来。唉,如果不是因为可执行安装包下不下来,我才懒得弄呢!不过刚好试用一下svn也好,起码比起CVS要先进,比起VSS它是免费的,比起ClearCase它小巧。 射手网真是个好网站,一般流行的片子,都能找到字幕,哈哈,现在才大致知道应该怎么找字幕。 网上很难找make和gdb的文档!有还是有的,但我想要的是用chm或pdf格式的整理好的,却很少很少。如果以后都像写我的方块那样写游戏,可以先考虑用MinGW是否可行,代价是否很大。一般说来,需要一个好的代码编辑器,所以试试CodeBlocks,需要一个强悍的调试器,就用gdb,还需要良好的工程管理,就用GNU make。不过说实话,VC加上VAX插件,绝对是在Windows环境下最牛x的开发环境,但毕竟,都是要n多money的,而前面提到的那些工具,全是GPL的。可以试一下,也许还需要一个GUI开发库,比如Delphi/BCB中的VCL、VC中的MFC,免费的有wxWidget、Fox、QT等等,但都会拖一个大大的链接库,我不需要跨平台可移植,所以,看winx的表现,似乎是可以把WTL单独剥离出来,给MinGW用的,到时候再看看,说不定,只写DirectX游戏的话,对这方面的要求不多呢!
很早以前就尝试过用MinGW,总是因为遇到奇怪的问题解决不了而马上放弃。写个小程序,它硬是不照着人想的那样来,资料又奇少无比。但再想想,连MAME这么大的工程都能用它来编译,为什么呢! 配置好了编译环境,整了个makefile,写个小程序,用来生成HTML格式的文件列表的。遇到好多问题,最怪的就是,它生成的程序居然会自动解决命令行参数,比如*.*,它就自动把当前目录下的所有文件名作为参数传进去了,除非用引号包住。开始不知道原因,硬是以为它调用的库函数有bug-_-b 放弃bjam了,白天看了一下它的文档,跟Boost的耦合太强了,似乎不太适合作为通用的工程管理工具,还是用make算了,文档也多,基本上绝大部分的工作都能完成。
用VC7.1写榜单,榜单一般就是一个cpp文件就搞定了。因为有很多个榜单,所以一个一个建工程似乎稍微麻烦了点,后来想想用make能搞定不,可是我又不熟悉make,只好看看能不能写个批处理文件,用命令行来解决。看了一下LUA发布包里的编译用的批处理文件,再看看IDE里的工程属性,照着写了一个,舒服啊,可以一下把所有的都马上全编译连接了。
照着写单机的榜单,突然发现从某个修改开始,总是会把C运行时库也连接进来,真麻烦,仔细看看自己的代码,实在没必要拖个DLL呀,何况VC7.1的C库是msvcrt71.dll,是不由Windows携带的,所以要发布这个榜单的同时,就要背负需要同时发布这个dll的负担。在工程属性中把可能想到的所有的编译选项都关掉了,用depends看还是连接进来了。仔细想想,应该跟代码有关系。因为把我的代码贴到其它以前编译过不用连接C库的工程里,最后也会有C库被连接进来的。于是心一狠,在工程属性中设置连接时强制不连接C库,看它最后有什么提示。可以看到有浮点数的应用,就要求连接C库了。刚好这时浮点数的应用很简单,可以转换为整形的计算。然后再编译连接,发现是有要连接另外2个函数了,看看函数名,猜想大概跟程序运行安全相关,再到工程属性中把异常和缓冲区检测都关掉,果然可以编译连接通过了。再一步步试,最后发现是因为打开了缓冲区检测,每当程序中用到了数组的操作,就会有连接C库中的一些函数的要求。 终于搞定!
其实好久以前我就是这么想的了,我不想当一个职业程序员,我写程序的目的只是为了能帮助日常生活中的一些小的事情得以更方便的方式来实现。以前还在读大学的时候就经常写一个程序不是为了写程序而去写程序,而是因为在某方面有这个需求。比如阿菲连连看,完全是因为受不了阿达连连看的非注册版的限制同时又找不到好用的破解,像IPKeeper,就是因为受不了在校园网上BBS打魔兽的时候被人冲IP,还有一些其它的也是。当时最年少轻狂的时候,还曾经想过,除了Windows,除了BCB和VC ,其它我要什么软件,都自己写,呵呵! 晚上加班了,因为突然冒出一些事情来没做完,郁闷!后来有点烦了,也没多少心情做这些没做完的事,写了一会儿VBA脚本,以前在进公司前,几乎只会一点点Word,到了公司没办法,开始使用Excel,发现Excel的功能挺强大了,尤其是它集成的VBA可以帮助用户极大地提高工作效率,好多机械重复的事情写几行脚本,就可以人出去逛了,让电脑自己在那里干活,人就省心了安逸了舒服了。高中的时候学过的QBASIC现在派上用场了,VBA的语法基本上跟QBASIC一样,连Lotus Script也是用的这种语法,哈哈。而且VBA集成开发环境里的调试器也还算好用,呵呵。现在还有一个可以用脚本的场合,用例被调整结构后,很多可能是重复的,把重复的那些找出来,然后该删掉,或者怎么着,就可以整几行脚本来跑,哈哈,人又可以出去骚扰了。 此之谓程序改善生活,程序帮我偷懒,hoho~~
在VeryCD论坛里看到有Office Pro 2007 Plus的下载,马上down一个下来,等装的时候才发现要sn,而帖子已经不见了,只好找到另外一个帖子,里面有个截图,有sn,试了试,可以用。有D版用的日子真是爽啊!尽管在家里,真的很少会用到Office,但为了尝鲜啊。 打算去买个国内的空间,开个论坛,但论坛主题做什么好呢,才能吸引人气呢,嗯,得好好想想。
自从blogger.com被伟大的GFW前段时间封住开始,一直都是用Tor来发贴的,而同时又把pkblogs.com或nyud.net:8090的地址告诉别人,让别人也可以浏览到网页的内容,但是留言是不行了。昨天突然发现,居然又被解封了,真happy呀,可以暂时不用Tor了,blogger.com直接访问的速度还是挺快的,就像在自己家门口一样呢,呵呵。 昨天半夜的时候上coolkuai论坛,发现coolkuai作者还是给我回了信息的,只是很粗心啊,我明明写了我的邮箱地址的,他还叫我给个邮箱,发点资料给我。我无奈,只好又回了信息,但他又不睬我了。他说coolkuai可以实现很多榜单,有兴趣可以先做一下榜单。coolkuai3.0的榜单实现方法我以前了解过,其实原理很简单,根据用户选择的不同榜单到coolkuai的网站上下站对应的动态链接库到temp文件夹,该动态链接库导出几个定义好的函数,分别用于在不同时刻被主程序调用完成不同的处理。说实话,这个coolkuai单机版大功能上还是实现得比较算是有亮点的,比如录像,比如键盘软加速,比如打榜,但在细节上,说是不敢恭维都不为过吧。作者提到以后的发展,是想添加联机功能,呵呵。
给coolkuai的作者发了信息,但不回我,看来对我的加盟请求是不屑了。 没办法了,只能专心我的方块了。我的方块进度也着实慢了,以前是因为算法没弄好,所以花了很多冤枉时间。现在有算法了,却提不起精神了。其实我的方块需求也不是很多啊,就一个skin功能(基本已经可以工作了),外部脚本实现游戏逻辑(突然想把接口做得再通用点,可以任意添加新的脚本语言支持,比如加个Tcl模块,就可以直接支持用Tcl语言来编写游戏逻辑,而主程序是不用修改的),键盘软加速(大致方案已经有了,但怕是会效果不好),录像(这点还是没想通,觉得可能是用键盘录像钩子),联机对打(类似QQ火拼俄罗斯,有大厅可以看桌数,一桌最多6人,可以旁观)。 看了下Google AdSense好像200次显示才$0.05啊?比原来预计的又低了一半,晕。看来仅靠Google AdSense是不现实的,得有其它的注册来源。 WallpaperHelper、CaptureHelper、SocketCapture都是可以做为shareware的,另外还可以做一下按键精灵的插件,可以让它自动弹出我的网页,或者也作为shareware。 小丫头发短信来抱怨说要辞职了,仅有的自尊心都被剥削光了。唉,心里很多话,说不出口的。
看了一下csdn的blog访问量,发布在首页后,果然比以前多很多了。不过再看一下google adsense的账户里,增加得好慢啊,好像是100次显示得$0.05,hoho~~~现在累计都没有100次,要累积到$50的话,要100000次显示啊!得想想办法怎么吸引别人。我把Google AdSense放在了主页和blog上,blog就只能通过多写些文字来提高访问量,主页只能靠宣传我的软件了。目前只想到这些。Blog上要写有点新意,有点价值的东西,才能吸引别人访问。可以先写一下C++与Tcl/Lua等的交互,因为有TclSuck的基础嘛,然后可以写一下C++ template的学习心得,再然后,我希望可以参加coolkuai的开发,就可以吸引那些关心coolkuai的游戏玩家来访问,写coolkuai开发的WIP,本来方块要做也是做得出来的,但是coolkuai现在已经聚集了一些人气了,如果能好好地利用这种人气,就好了。 大概想了一下WallpaperHelper,应该左边有一个TreeView,右边分上下两块,一块是个ListView,另一块是预览框。这样可以组织多种主题,主界面可以朴素一点。另外要加日历、月历、年历和时间框的功能,这些就最好能有skin功能。感觉WallpaperHelper是实现难度最低的,等完成了之后,再好好考虑SocketCapture和CaptureHelper,还有我的方块呀!
昨天晚上去华侨城吃晚上去了。那个叫爱西华温泉的地方,吃了饭后,去里面的酒吧玩,到12点才走,结果结账搞了大半个小时,打的回到家都1点多了。 Inno setup是个不错的东东,现在越来越多的软件使用它来做安装程序了。很久很久以前,大概是三四年前吧,也试过,觉得难用,样子也土,就放弃了,转向Wise了。昨天搞了下,今天又研究了一下,真的已经是很好用了,做出来的安装程序也比较好看。把googlepages里的页面改了下,把LLYF ToolBox传上去了,还提交到了华军、csdn和upload上去了,不知道有几个会收录。其实要好的话,要把英文的那个页面好好做一下。 下午突然停电了,晕死了,实在无聊,就想出去逛一下了。结果就逛到电子市场去了,结果看到nano就不想走了,结果最后还是买了个2G的。然后就逛上去买了个USB Hub,就为了能同时接摄像头,鼠标和MP3。最后又逛到茂业,还买了双PUMA的鞋子,去抽了2次奖,真tmd的衰啊,这个我觉得不正常啊,凭什么啊,只中了2瓶水,后又顺便办了张茂业会员卡。晚上去交房租了,唉,钱啊!
几天前申请的Google AdSense,还以为不会下来了呢,因为我当时只是把csdn的blog地址提交了上去,那个blog已经一段时间不更新了,就是从搬到这里来开始吧。不过那里也是有近百篇的文章,总访问量也有1w多近2w了。终于收下来了,放了一个图片和一串文字的在上面,看了看美观效果影响不大。就打算放在这里来,不过有点郁闷的是,因为我是用Tor+Vidalia+Privoxy+ TorButton+Firefox这种奇怪的组合才能访问到blogger.com的,所以在定制我的blog模板时,添加Adsense总是失败。最后看到有一个添加HTML/JavaScript的,就加上去了。看了看效果,用Tor的话,会被Privoxy拦截的。用www.pkblogs.com来访问的话,就压根不显示。用.nyud.net:8090的话,可以显示,但是网页中的所有的链接都失效的。唉!看来只好首推csdn的那个blog了,以后多写点有点技术含量的blog,然后就发布到csdn blog的首页去,增加几个点击量。其它的生活娱乐方面的,都还写这里吧。 关于luaopen_io调用失败的问题,在Lua的maillist里问了一下,有人说是因为io库里有些函数的运行是依赖于Lua建立的特定的环境,所以要用lua_call来调用,要么,就直接用luaL_openlibs来引入所有标准库。看了看帮助文档,还有Lua的源代码,似乎好像就是这么回事啊! 现在看到我的方块里那一堆7z的源代码文件,就感到不爽,太多文件,充斥着我的方块的project,应该把它分离出去,对于7z、zip和rar专门做一个lib或dll,在需要的时候可以直接链接进来,而不需要添加这些源代码文件!
刚回到家就像以前的每天下班回到家一样,拿出电脑,连上电线网线USB线音频输出线,开机,开eMule,不料却连不上网。去整了一下Router,重启了也没用,于是无所事事地看完了《黑社会2》,总算是又解决一件事情。看完之后再看网络状况,可以上网了,又要重新设置一遍端口映射。唉,为什么动画片总是很少人下载呢! 然后和同事聊了一会儿天,又打乱了计划,只是添加了连接变量的功能。
下班后吃完饭,先坐车到九鼎皇,那里有个文体用品批发商店,进去买了个28块钱的飞镖盘,顺便买了三支镖,8块钱。回家丢了几个,看来便宜的东西质量是不好哈,那针眼很明显,而且镖尾不正 ,容易飞歪了。 把afei的blog从头到尾翻了一遍,还有几处零星地提到我的,呼呼。 TclSuck差不多已经把C++调用Tcl函数部分都封装完成了。接下来可以加入变量访问控制部分了。好在发现了,原来Tcl调用C++函数时,会把第一个函数名当作第0个参数传入,就像就像就像(好几处好几个文档提到的)C程序main函数的参数那样。这部分要分成两部分,一部分是调用全局函数(类静态函数也属于这类),另外一部分是调用类成员函数。对于已经完成的部分,真的是很难看的一种实现,而且完全失去了运行期效率。不过在外部表现上看来,它真的能让client application以一种比较优雅而且方便的方式来调用Tcl中的函数,呵呵。
都不晓得出什么问题了,慢得很啊,打开网页都很慢! 白天想了想,凭现在对Tcl的掌握,我是写不出这样的封装库的,因为只知道要写一个固定原型的C函数,再调用注册。但当时的直觉是,理论上应该是可以实现的,只是我不知道而已,就像Lua那样,有LuaTinker这样的封装。果然,上google搜了一把,找到个C++/Tcl库,看样子是实现得很好,它的说明文档里也说,是得益于Boost.Python的灵感。本来我都想,只实现Tcl的嵌入算了,现在好了,可以研究一下,把Tcl扩展了实现了。不过时间有点紧了啊!!
装了个IE7。在网上看到文章说到,装IE7的时候会进行正版验证,现在终于我也可以理直气壮地直接安装了。要是以前,肯定还要先去验证一下我的破解版是否是“完美”破解等等诸如此类的事情。相比之下,对于我来说,可以体验到的,就是多了个tab浏览功能,而且说实话,这个tab浏览操作习惯还不适应。其它的,也没看到什么特别之处,照“他们”的说法,就增加了很多特性,提高了安全性等等等等,我一个普通用户,是完全体会不出来的。 照Borland Blogs上某篇blog上说的那样,我用IE的时候,都是在Firefox里用IE Tab来进行的。不过似乎好像,IE Tab对IE7的兼容性……郁闷! 中午去笨笨家里吃饭了,虽然在同一间公司里,但却好久没见到她了,还有老板。阿菲也过来了,倒是阿菲,似乎反而要多见到一点。 小丫头找到房子了,我说我感动死了,我认识的人中居然有这样辛苦地工作生活的人,还比我小,还是个女的。哭ing!不是经常有那样的电影吗,哪个小孩子,生活艰辛,还很努力……下面的观众感动死了,哭得稀里花拉的! 打算学习LuaTinker的样子,做个Tcl嵌入和扩展的C++泛型封装库,其中使用的封装技术可以作为这个季度的案例来写。不过这次时间有点紧了,15号之前就要提交,没多久了。要达成这个目标,所需要的工作量似乎不大,只要能:1、在C/C++里调用Tcl函数,2、C/C++变量与Tcl变量绑定,3、Tcl脚本调用C/C++可调用体。可以趁此机会练习一下C++ template的应用,刚好做出来的胶水代码也有点实际使用价值,而且想在我的方块实现里不用LuaTinker,自己写一个类似的,更符合实际需求的。
好奇,看了一下coolkuai3.0的打榜功能,从网站上看到有几个trc文件,从文件名看,就是支持各种不同类型的打榜功能的,再打开coolkuai3.0,随便打一种榜,查看一下该进程的模块信息,果然发现它装载了一个在临时文件夹中的trc文件,再看一下这个trc文件的PE信息,没有导入信息,只有几个导出函数 Core/GetCore/OnAfterAction/OnBeforeAction/OnGameStart,用PEiD看也看不出是用什么编译的,反正体积很小,都只有3、4KB,也不像是用ASPack处理过的。oneaddone在这点上做得挺好的,用户根本不用管要下载什么文件来支持新的玩法,只需要知道在那里点选一下,就可以了。
和江江她们打方块去了,呵呵,速度也没啥提高,一直在1.2x,有点气愤,为什么我就练不快呢! 白天在公司,看了好久的《Programming In Lua》,还遇到一个C++ new的没见过的用法,去公司内部的支撑论坛问了下,好菜啊,没看过《C++ Primer》就这样水啊!我大概是从大学里开始养成的坏习惯吧,静不下心来仔细看书,总希望有个速成式的学习快餐,可以随便翻一下就能学会一些东西。大部分时候,都是看一下目录、前言、序就当是看过一本书了,到时候知道去哪里查阅就行了。 在看LuaTinker的代码的时候,还学到一招,创建匿名的对象,并直接调用返回值为该类对象引用的成员函数。有趣,这种匿名对象的生命周期好像只在当前代码行内有效。 又看了一点点LuaBind的代码,原来以前在Boost.Python的examples里看到的那种奇怪的语法,只是重载了操作符operator,和operator[],呵呵。从云风的书上看到,如果不是忙于各种各样的日常事务,大多数的程序员一定会迷上博大精深的C++。说得一点都没错啊,现在看来C++ template的运用,对我来说就是一个很大的诱惑。 要看懂LuaTinker的代码,还是很依赖于对Lua的深入掌握,尤其是Lua提供的C API,如何让Lua脚本能调用C++里的类方法,这样的技术是LuaTinker提供的重要功能。Lua与C之间通过一个virtual stack来实现通信,所以virtual stack的操作很迷惑人了。看来还是得再多看几遍PIL,再试着自己写些代码。另外,云风的书里也有提到过怎么进行这样的封装,不过我更倾向于LuaTinker这样的方案,因为目前我是彻底被C++ template技术迷倒了!
在ccrun上看到用GDI+来实现的skin功能,拿出用BCB6编译了一下,果然可行,效果也不错,然后想给LLYF WallpaperHelper里加一个类似的功能,看代码挺简单的,但就是编译不过去,说两个函数间搞混了,ambigous了,真是郁闷,后来没办法,想到看一下那个工程里有没有定义什么特别的宏,打开工程属性一看,比平常多了个STRICT的宏,加到自己的工程里一试,果然可以编译了,真是奇怪。想到这样的界面效果,最适合像鱼鱼日历秀那样功能的程序了,所以就可以加个日历、月历、时间的显示,突然想可以试试NeoWin那样的窗体继承,试了试还可以,右键菜单也能正常弹出来,只是在父窗体中实现的窗口风格改变似乎对继承下来的子窗体没什么效果。又稍微看了一下ccal的代码,基本是可以实用了,传入指定的参数可以生成特定年份月份的月历,包括阴历哦,这一点才是迫使我使用ccal的原因。突然发现一个软件要做好,真的要考虑很多方面的因素,现在我写程序完全是随着自己的性子来的,基本上只是大概估计一下要弄成什么样子,就开始动手了,计划根本不够严谨,说白一点,是缺乏设计能力,唉! 又跟江江他们打了一会儿火拼俄罗斯,现在打单机速度基本上可以稳定在1.1x,但是打Q块就不稳定了,不过打一下江江还是够了,大牛更水一点,悍超猛一点,不过那天看他截的单机的图上速度才1.1左右,感觉应该不止这个速度才对。如果只是这个速度,我也差不多啊。不过我现在发现我的摆法真是全无章法,一点都不好,很不整齐,垒不高!还是得多练习啊,速度的提高是首要的,其次是摆法。
今天一天写了几行脚本,为什么效率这么低呢,只是添加了个生成chm文件的功能,就花了8个小时!如果是用C/C++这样的语言来表达的话,我会不会更快一点?我怀疑,不确定,算了,随它去了,反正勉强能符合我自己的要求了。 一个好用的debugger还真是重要哈,以前在Lotus Notes上用Lotus Script写Agent的时候, 就已经发现了这一点,但当时也只是觉得大概这样的debugger只适合这样的脚本语言,这两天突然发现在BDS中的debugger也是很好用的,我真是土,用BCB那么久,一直没用过它的debugger,自己汗一个先,知道我以前调程序有多复杂多麻烦多痛苦了吧。最早在DOS下用QBasic或TC写程序时,调程序都是通过打印语句输出变量的值来做的,后来大概过了2年左右迁移到Windows上时,居然...居然是用MessageBox来显示变量值来调试的-_-b主要是VCL里的字符串和数值之间相互转换很方便,所以...唉,闻道有先后,术业有专攻嘛(又想起那个家伙)。用MessageBox有一个不好,就是会打断程序的执行,要人为介入使它继续。后来发现了OutputDebugString,其实是先发现了一个它的捕获程序DebugTrack,才知道有这个函数的存在,还依样写了个简单的版本,这个方法跟我在DOS下调程序几乎是一样了,输出一些变量的值,来跟踪程序的执行,好就好在不用打断程序,而且又用stdarg.h的一些宏,把它封装得像printf一样,可以方便地用一个接口来输出不同类型的值!直到前两天,才发现集成在IDE那个debugger,用起来就像调Lotus Script和VBA程序一样简单方便,还可以用CodeGuard,居然能自己检测出内存泄漏,哈哈,太好了,在日志文件中甚至能指出是哪一行分配的内存没被释放。啊,我真是太土了! 今天买了2号中午12点的机票了,计划5号下午回来,最晚6号上午吧,要回来要回来要回来,过中秋,呵呵。
今天看到某论坛上一张比较好看的CG MM图片,突然想起Dead Or Alive里的那帮MM,于是上google搜了一下,down下来好多图片,多了图片就是为了当桌面用的,想起我那个只是做出显示界面的LLYF WallpaperHelper来,用来后台自动更换桌面是绰绰有余了。不过这个程序只能用简陋来形容,真的只能用来更换桌面,界面实现地也不太友好,我的审美细胞实在不行。稍微改了一下,也治标不治本,有些实用的特性都没实现。还突然想到,要是能把桌面做成月历就好了,于是去搜了ccal的代码来,代码实现并不多,但我的代码阅读能力确实也差,晕。 在外面闲逛的时候,就想要做哪些东东,回到家对着电脑,却怎么也提不起劲来。Yuyuamp,这个名字还真有点别扭,YuyuNES稍微好看一点点,YuyuTetris呢,也比较怪,还有Yuyu Entertainment呢,哈哈! 我根本没有利用上键盘加速的优势,因为我一直都是一下一下点的,不是用的平移,郁闷,习惯改起来很痛苦!
昨天把WinSock捕获部分的代码封闭到一个类里面了,看起来似乎要舒服一点,维护起来或者有新的需求了,也应该更方便一点。不过现在,从Detours里copy过来的代码用起来还有一点点小问题,因为原来它是被用于一个单一功能的控制台程序的,而我现在这里每一次开始都是一个新的线程,所以结束的时候,应该发送消息让complete port自己结束工作线程,不然程序就可能崩溃。 今天在公司,花了几乎所有工作时间,至少有6、7个小时吧,写了几行VBA代码,可以把写好的手工用例自动导入到自动化分析的模板里面,并分成各个步骤和预期结果。虽然说花了那么多时间,但回去看一下所有的代码,并没有多少行,这里可以大致看出,用这样的语言开发效率在某些领域某些场合是比C/C++之类的语言高,我花这么多时间来实现这么简单的一点功能,完全是因为我以前基本没用过VBA,很多时间都是花在查找MSDN等帮助文档上了,想到一个需求,就想应该已经有相应的函数封装好了,于是翻来翻去看msdn和online help。中途也产生一点想法,或者说抱怨,这种语言还是比较麻烦,比如不能随时随地定义新的变量,觉得不爽。因为一开始都没有什么计划,上来卷起袖子就写代码,所以什么变量名啊,程序组织结构啊,都是乱来了,还好想要的功能大体上都实现了。 还有点不爽的是,VBA的编辑器居然不支持鼠标滚轮,晕死!不过虽然今天花了这么多时间,以后就可以少做很多机械的重复劳动了,只是不知道自动化组的人没有没做这方面的事,不然我的时间就是白费了!
今天旁边那个女同事从网上学来的看相功夫,要给我看手相,还说得有模有样的。首先说我,是个比较花心的人,嗯,我心想原来我真是这样的人啊。然后说我的钱可能不会多,再说什么健康啊智慧啊事业啊什么的,最后说到我的婚姻线,说我的老婆是个很有钱的人,晕,我的钱不多,就让我老婆钱多啊,真是有趣,还说这个老婆对我很好啊,是个很不错的人啊等等,反正最后的总结是,我的手相整体看来是不咋的,唯一好的就是那个老婆不错,又有钱人又好,昏倒,然后我就说对啊,我老婆有钱得很,是xx的首富,哈哈。梦吧! 想了一天,怎么实现键盘加速的呢,去公司那个论坛上问了一下,有人说等KeyDown时只要没有KeyUp,就一直发字符消息,这想法似乎有点可行,但是要是其它游戏程序里不是通过字符消息来进行响应的该怎么办呢! 另外一个还没有想通的是,录像功能是怎么实现的,看它的录像文件都很小,一般2.0版的录像文件是10几KB,而到了3.0版,则降到了5KB左右,查看一下2.0的录像文件原始内容,似乎是有不少的冗余信息。但不知道它到底是怎么实现的!
Category Plugin Framework
Qt Creator有个很风骚的插件管理器PluginManager,还有个很骚包的插件说明PluginSpec。基本上,所有的Qt程序的入口都是传统的C程序一样,代码流程从main()函数开始。
在main()中,先初始化用于国际化的translator,然后获取程序配置settings,接着就在栈上创建了PluginManager对象,之后为PluginManager设置搜索用的文件扩展名pluginspec,设置配置,再设置插件搜索路径。
设置好插件搜索路径后,PluginManager会从配置中读出被忽略的插件列表和需要强制使能的插件列表,然后开始在插件搜索路径中查找*.pluginspec文件,这类文件中记录了插件的名称,版本号,依赖插件等信息。找出所有.pluginspec文件后,就检查一下每个插件所依赖的插件的名称和版本号信息是否匹配。
接着再返回main()中,找出Core插件,该插件是整个Qt Creator的主框架,甚至实现了主窗口。如果Core插件有问题,Qt Creator就会打印出错信息后主动退出。
最后便是调用PluginManager::loadPlugins()载入所有插件。loadPlugins()首先调用PluginManager::loadQueue()以确定插件载入的先后顺序,该过程做了两件事,一是检测是否存在循环依赖的情况,这里用了一个很简单的方法,将当前的插件放入一个队列中,然后检测它所依赖的插件的依赖插件,如果新检查的插件所依赖的插件在队列中,那么说明存在循环依赖。另一件事便是安排载入顺序,同一个函数内通过递归,先递推将最被依赖的插件放入队列,然后回归将最后的插件放入队列,这样生成的便是解决了载入顺序问题的队列。得到载入顺序的队列后,便依次调用PluginSpec的loadPlugin()方法,这里它将插件状态定义为Invalid、Read、Resolved、Loaded、Initialized、Running、Stopped、Deleted共8种,loadPlugin()方法根据传入的要求的状态,进行相应的操作。Loaded时通过Qt本身支持的插件机制,装入动态链接库,之后是Initialized状态,调用每个插件的initializePlugin()方法,最后是Running状态,调用每个插件的initializeExtensions()方法。其中initializePlugin()和initializeExtensions()并没有多少区别,调用的时机也是挨着的,中间没有其他的操作。一般可以简单地这样区分,initializePlugin()中完成最最基本的插件初始化工作,包括创建插件内部的一些对象等,而initializeExtensions()中则完成那些内部对象的初始化工作。当然也可以不用严格遵守这种规则。
到此为止,整个Qt Creator就运行起来了,消息循环启动后,用户就可以进行操作了。
在app::OnInit()中,插件管理器先设置了一个安全模式,安全模式只是影响后续插件是否被激活。
在MainFrame的构造函数中,调用MainFrame::ScanForPlugins(),该函数根据配置又调用插件管理器PluginManager中的方法ScanForPlugins()扫描指定目录下的文件,该方法在指定的目录下查找dll(Windows系统)或so文件(UNIX系统),同时,需要确认当前是否以BatchBuild模式运行。所谓BatchBuild模式,可以这样理解,Code::Blocks启动后只是用于编译工程,不进行其他诸如代码编写之类的操作,所以除了编译器插件,其他的插件都不需要载入。每找到一个dll或so文件,PluginManager又会去找同名的zip文件,从zip文件中提取出manifest,manifest文件中保存了插件相关的版本号,作者,联系方式等无关紧要的信息。之后PluginManager::LoadPlugin()方法被调用,在该方法中实现了系统层面的动态链接库load并创建插件实例对象的工作。而且从这里可以看出,一个dll文件中可以有多个插件,PluginManager会依次将该dll中所有插件都创建实例对象。
接着MainFrame::ScanForPlugins()又调用PluginManager::LoadAllPlugins()方法,这个方法做的事情跟它的名字有点不对应,因为照我们传统的理解,之前PluginManager::LoadPlugin()已经完成了插件载入的工作。而这个LoadAllPlugins()方法只是调用了每个插件的Attach()方法,该方法做的事情可以归类为插件初始化工作,每个插件都可以有自己的独立的OnAttach()方法被PluginManager间接调用。并且每个插件类都从wxEvtHandler继承下来,可以让自己处理一些事件,比如响应菜单项点击或工具栏按钮点击等等。在Attach()中会将自己这个新创建的实例对象插入到MainFrame的event handler chain中,这样才能将事件响应流向插件实例对象。实际上Attach()就做的有意义的事只有使能了事件处理响应。
最后,便是做些插件在界面上的处理。比如在创建主菜单时,会让有需要的插件自己添加菜单项,并绑定事件处理函数。到此为止,插件就基本上可算是能正常工作了。
首先,之前我说过,现在的CodeLite没有一个很大的包罗万象的dll了,这个说法不是很准确了。因为确实仍然有一个叫libcodeliteu.dll的文件,只不过里面包含的内容确实不介Code::Blocks的那个dll是包含了完整的几乎所有的功能,而是只包含了一些跟IDE业务关系不大,却是比较底层而又基础的通用功能。
其次,CodeLite的插件使用C链接的方式导出几个知名函数,用于创建插件对象,查询插件信息等。而Code::Blocks的插件则不然,它们没有这样的知名函数,而只是从几个规定的插件基类中选择一个进行派生,而这个派生类又声明成dll导出,同时,又在定义插件的cpp开头处定义一个全局对象,用于注册本插件。该全局变量接受两个参数,分别是字符串类型的插件名字,以及泛型的插件类类型(也就是说,是个模板参数)。注册插件的那个全局对象保存了插件类类型,在需要的时候可以生成一个插件对象。所以这样可以省掉那几个知名函数,代价是需要导出插件类,容易暴露过多实现细节。感觉CodeLite的方法比较传统,但应该适用于多种编译器,而Code::Blocks的方法就Quick & Dirty一点,跟C++编译器的绑定就比较紧密了。从软件工程的角度讲,我倾向于CodeLite的方案,从项目进展的角度讲,我倾向于Code::Blocks的方案。
最后提一下,Qt Creator的插件也没有知名函数,但具体是怎么载入的,我还没仔细看过。Qt Creator的插件拥有多种状态,这点太完备了。
Qt Creator的插件机制比起CodeLite和Code::Blocks来要强大得多。每个插件至少有一个dll文件(以Windows平台为例),还有一个必须的.pluginspec文件。插件的基本信息在.pluginspec文件中描述,包括插件的名称、版本、版权、作者、基本信息、分类、网站等,最重要的一点是有依赖的插件信息。支持插件依赖可以获取得大的灵活性和可扩展能力,这点CodeLite和Code::Blocks都没做到,因为单靠一个动态链接库很难实现这种依赖关系的描述。
插件的实现同CodeLite和Code::Blocks类似,都放在dll中,但它的实现有点像是糅合了两者的作法,但又有所改进。Qt Creator应用程序本身的exe基本上只是实现了一个插件管理器,其他的IDE相关的业务逻辑全是由插件实现,甚至于主窗口也是放在一个叫Core的插件中实现。Qt Creator又定义了一组组的接口让插件实现,这点看来跟CodeLite比较像;但是它又基本上将接口的实现,至少是头文件全暴露了,插件在实现这些接口的时候可以直接调用它依赖的插件的服务,而不是通过接口调用,这点上看又有点像Code::Blocks的做法,我个人不是很喜欢这种暴露过多信息的做法,尤其是如果作为一个商业项目,应该尽量少地提供各种内部信息,当然Qt Creator本身作为一个开源项目,大概在这方面就比较随意了,如果全部用接口的形式交互的话,大概工作量会增多,跟实现一遍COM差不多了。
另外说一下,Qt提供了几个宏,用于定义插件类和使用插件,而且Qt框架本身的一部分特性也是通过这种插件机制实现的。只不过这种支持实在太过简陋,只能说了胜于无吧。
昨天查看了一下CodeLite和Code::Blocks的源代码,了解了一下它们的插件机制的实现情况,还是非常简单的。
CodeLite宿主程序是一个单独的exe文件(Windows平台下),插件都是单独的dll文件。宿主程序首先声明了一组接口,这组接口定义了宿主程序可以提供给插件使用的各种服务,比如访问当前编辑器等,然后宿主程序实现这组接口。接着再声明一组接口,这组接口需要每个插件都提供自己的实现,另外,插件还需要提供几个dll标准的导出函数,用于查询插件的基本信息,比如返回版本号,返回接口创建后的实例等,这跟Windows的COM很像,只不过COM规范更完善得多。插件要实现的接口包括在菜单中添加自己的菜单项,添加工具栏等。CodeLite启动后,扫描文件夹,取出各个插件dll,查询出接口实例指针,调用插件实现的接口,并将宿主程序自己实现的服务接口指针传递给插件,这样插件就可以反过来访问宿主中的数据。
Code::Blocks的实现跟CodeLite差别不大。Code::Blocks的宿主程序是一个很小的exe文件加一个很大的dll文件,所有的核心功能都在dll中实现,exe只是一个外壳。插件实现跟CodeLite类似,都是dll,区别在于Code::Blocks定义的插件接口类型有好几种,比如普通插件,编译套件插件,调试器插件等等,另外的区别就是,由于Code::Blocks宿主并没有采用接口的形式提供服务,而是将服务封装在核心dll中,所以插件要访问核心服务都是通过链接这个核心dll来实现的。
从开发者的角度看,Code::Blocks需要的代码量相对小一点,因为少了宿主接口声明,以及接口实现的衔接部分。但CodeLite的接口形式提供服务封装性更好一点,更类型无关。Code::Blocks的插件开发需要核心dll的那些头文件以及链接库文件,这难免有种暴露了过多细节的嫌疑,而CodeLite则只需要接口声明就行了。所以我个人更倾向于使用CodeLite的方案。
今天看到推友@liancheng说Mozilla/WPF/QT/GNOME3都同质化了,大体的意思是指这几种方案都把表现层和逻辑层分离得很独立,复杂的,高度重用的,平台相关的部分,用C/C++之类的语言实现成组件,表现层用XML描述界面,用CSS之类的样式描述skin,再用如JS之类的脚本语言描述运算逻辑粘合组件和界面。
我最早了解到这种架构是几年前Firefox开始大肆流行,网上这类技术文章也大量涌现。当时也是很惊叹于Firefox的扩展机制如此灵活,却对它的开发环境很是鄙视,而且用于表述逻辑的脚本语言是用JS这个我完全没了解过的东西,所以看过介绍后,就丢到一边了。后来也偶尔听说WPF、XAML之类的东西,但对.NET一直没啥好感,于是也没研究。最近几个月跟个网友讨论,提到QT的界面方案,大体上也是知道QT也采用这种架构了,而且也确实一直计划着做完眼前的这组东西后,以后全面转向QT了,但仍一直没抽出时间来研究。
今天看到@liancheng的讨论后,让我有点儿沮丧。我现在用C++/wxWidgets做主框架,好不容易设计并实现了一个并不精巧的插件机制,用Lua来编写逻辑,还总是有这样那样的限制,这不就是典型的重新发明轮子么,而且发明的是个不咋样的轮子。唉!
前几天,把所有的插件以插件为单位打包成zip了。不过不知道wxWidgets中的zip虚拟文件系统如何支持密码,至少是没找到相关的选项。现在的情况是验证了方案可行性,可以确认功能上的不缺失以及性能上的损耗在可接受的范围内,但真正实用是一定要有密码的,也就是为了保护插件中的源代码。以前还以为带了密码就不方便第三方开发插件了,现在想通了,其实只要我提供一个插件开发环境,其中自带插件打包功能,这样就可以用同一个密码了。既然wxWidgets没有简单方便的接口来支持密码zip,那就只好自己写一个这样的功能了,好在zip实在是一个很大众化的格式,源代码很容易找到。
宿主程序提供了界面国际化,那么插件不能提供国际化就说不过去了,至少得有这样的机制以供支撑该种需求嘛。 得益于wxWidgets对国际化的良好支持,要让嵌入的Lua解释执行的Lua脚本也能根据宿主程序的本地化信息进行正确的处理非常简单。wxWidgets中对要进行国际化的字符串用_()进行包裹,其实这是一个宏,用于调用真正的翻译功能,比如wxGetTranslation。所以在嵌入的Lua中将wxGetTranslation函数注册到Lua中即可,然后在Lua脚本的最开始处将该函数换个更简单的名字,比如_,这是最好的名字了,哈哈。这样就可以在Lua脚本中对需要进行国际化的字符串也用_()进行包裹,它会调用wxGetTranslation函数。 GNU的国际化方案套餐中,提供一个叫xgettext的工具,可以从众多编程语言的源代码文件中提取出字符串,生成po文件以供翻译生成mo文件。比较不幸的是,xgettext不能支持Lua语言,同时由于我这个项目中使用的插件描述信息中有一部分界面信息是在xml文件中的,这也是一种自定义的格式,所在很不幸地xgettext更是不能处理啊!所以我在想,我是否要先写个可以支持Lua和我这种xml格式的类似xgettext的工具呢?Poedit太扯蛋了,居然只能认它自己生成的那种po格式的文件,稍微改一点就报错了!
到昨天为止,基本完成Code Snippet的框架,剩下的都是些体力活。该特性要求在点击菜单项时,根据当前光标所在位置的字符串,替换成对应的代码片段。由于菜单项是通过插件添加实现的,而且Code Snippet又根据当前编辑的源代码对应的编程语言不同,也会有不同的处理,所以也是通过不同的插件实现的,这就要求插件可以再次调用插件。好在当初设计插件扩展框架时,已经考虑到这一点,所以虽然有实现过程中有需要慢慢调试的地方,但没有特别大的障碍。 完成Code Snippet后,应该开始Auto Completion特性的开发。该特性是本项目中可算是难度最高的特性之一,同时又有比较高的准确性和运行效率等要求。还有点比较头痛的是,针对不同的编程语言,可复用的东西不多。 此外,还有个功能应该尽早加入,就是处理文件的不同编码。比如通常,尤其是早期的代码,都是直接使用ANSI编码保存。而现在已经比较常用的是保存成UTF-8等编码方式,特别是像LaTeX的一些处理器直接要求输入文件是UTF-8编码。所以应该能在文件的装入和保存时,可以自动处理文件的编码问题,这可以通过iconv或ICU实现,不过问题就在于有了选择,才是苦恼啊!目前我倾向于使用iconv,因为相比之下更轻量,而且够用。 这些天发现,Lua的字符串连接符..效率还真低,怪不得Lua要提供*all和table.concat等设施。 本来Lua中操作XML有几种不同的选择,这跟在C++中情况差不多,我选择的是比较轻量的ltxml。而昨天在Code Snippet特性的开发过程中发现,我把所有的信息都保存在xml中,而每次完成snippet时都从xml中读取,开始几次还是正常的,但只要过一会儿,在调用xml.open时就会报什么试图index一个function值中一个number值,还真是诡异,但调试发现这时无论xml.open还是传入的参数都是正确的,很是纳闷啊。于是只好规避一下,只在开始时读一次,全部都装入到内存中,以后就直接读内存了。 一直以来,都是通过print来进行Lua脚本调试,真是应了那句“一夜回到解放前”。前两天才在界面上加了一个专门的输出窗口用于从Lua脚本打印字符串过来。好比是当年写Windows GUI程序时,用MessageBox调试进化到用OutputDebugStrng进行调试。昨天记起来有LuaLogging这么个第三方库,于是仔细看了看,很简单的功能,只有几个lua文件,可以记录日志到文件、控制台、socket、email或数据库中。于是我参照这些appender的实现,加了一个新的appender,用于将日志打印到宿主的插件输出窗口中,感觉不错。 接着是使用luabind的问题。在网上看到有人说luabind的各个版本都存在指针的double deleting问题,这让我有点惶恐。好在今天看邮件列表时,看到luabind的作者说,这种问题只出现在使用智能指针或类继承时切片的情况,而且要求是Lua的state先于这些对象被销毁,现在没有好的办法来修正这个问题。我想了想,这几种情况我现在都不会遇到,我只有最最简单的嵌入和扩展交互。之后,又发现有人在邮件列表中写了一个luabind和SWIG的性能比较,SWIG的封装比luabind的快一倍。看到这个结果,我觉得是意料之中,SWIG的封装方式比较底层,调用快也是正常的。不过luabind的作者说,他写了些benchmark的测试,在未发布的luabind 0.9中已经有不小的改进,虽然仍然不比SWIG快,但相比0.8.1版本,差距缩小了约一半,期待0.9的发布。 昨天无意中看到云风blog上一篇老文章提到有Lua Ring这么个库,可以在Lua代码中再创建个新的Lua state,让某些代码在这个新的state中运行,从而保护比较重要的核心state。我潜意识中认为,像我现在这个项目使用嵌入Lua来作为插件扩展的运行环境,确实要用一个比较安全的环境,即所谓的沙盒,但这个Lua Ring怎么应用上去,以及能有多少效果,仍然有待考察。 前些天,从SVN上更新的了wxPropertyGrid的代码后,发现用GCC编译不过了,直到昨天仍然不行,实在忍无可忍,真要骂娘了。上它的sf项目见面看了一下,自11月25日更新代码后,估计作者就压根没发现这个问题,于是在上面提了个单。今天发现作者已经回复那个单,并在svn trunk中已经修正了该问题,总算松了口气。 今天仔细学了一下如何让wxWidgets支持国际化,发现非常简单。只要在程序初始化时,自己创建一个wxLocale对象,把mo文件的搜索路径加进去,设置好当前要使用的语言。其他想要被翻译的字符串用_()宏替换wxT()和_T(),如果是个wxString对象,就用wxGetTranslation(),这样在这些字符串会自动从mo文件中读出相应的翻译后的文本,感觉比ini等配置文件,或是国际化资源dll的方案方便很多。不过为了让插件支持国际化,也可以使用类似的方案,但是我有poEdit时发现它只能从源代码中提取出需要翻译的字符串,不能全新的创建一个,这太土了,以后一定要自己写个好用的。 最后的一个问题是,现在的插件扩展机制,容易出现重复代码,比如相同的功能会在菜单中写一遍,在工具栏中也写一遍,这该怎么修改一下呢,呃,得仔细考虑考虑
昨天偶然发现一个超级严重的问题,程序运行一小会儿就会自动退出,什么提示都没有。至于没提示,这已经有一段时间了,照理说,内部状态、逻辑不正常么,可以给个Windows的崩溃报告嘛,可是它偏偏没有,弄得我要跟着崩溃了。 后来在代码中加入一些跟踪语句,发现出错的原因跟我的猜测一致,内嵌的Lua解释器栈溢出了。这是个很头痛的问题,以前听人说过,如果没有sandbox,插件运行环境是不可靠的,呃,最出名的是chrome的架构,经典的sandbox。但是我这个程序跟它的情况有点不同,在主窗口和子窗口上都有大量的用户交互操作,以及主窗口和子窗口之间大量的交互,子进程间的通信会很复杂。而且现在引起崩溃的,都是主窗口中的逻辑,所以还是会导致整个程序的不可用。 昨天晚上调试了好久,发现只要更新工具栏按钮或主菜单项的界面状态的响应函数打开后,过一会儿就会退出。所以最后可以把范围缩小在C++调用Lua函数的那一块代码上。我不怀疑Lua的代码有问题,凭我现在对Lua的了解,即使真有问题,估计我也是束手无策的。既然是栈溢出,而且时间不长就可以重现。我仔细地看了那块代码,又看了Lua manual和PIL,以及Luabind Documentation,发现我一直忽略的一个问题,在调用Lua的C API出错后,Lua经常会把出错信息压入栈中,而Luabind可能会直接将其封装为luabind::error类型的异常抛出,然后我就只是看一下那个字符串内容,却没其他处理了。这是一处错误,应该在提取字符串后,将其弹出。另一处错误是,我这里调用Lua中的函数,都是存放在一个表中的,所以中间无论哪个步骤出错,都应该把先前压入栈中的东西弹出。还有一处错误是,最后我从Lua栈中获取到函数后,用luabind::object封装了一把,然后luabind::call_function来调用,这时我又直接返回了,却没把这个放在栈中的函数弹出。 昨晚解决了这三个问题后,还以为所有问题都已经修正了。今天又测试了一遍,发现过了约半个小时后,程序还是自动退出了,而且连那exe文件都没了!我要疯了! 唉,这什么都是从零开始的,风险实在太大了。使用wxWidgets是第一次,复杂的内嵌Lua扩展框架是第一次,使用Luabind是第一次,使用wxLua是第一次,把所有东西混在一起用更是第一次!而且很不爽的是,已经用惯了MS的解决方案的我,没有像MSDN这样的大而全的文档极不适应,那些说使用开源的东西成本低的人,不知是真的短视,还是别有用心呢。
这几天似乎渐渐进入了正轨,发现并解决了一堆的问题。 从github上下载的0.9版Luabind可能不稳定,毕竟是没有正式发布,之前没有经过仔细的试用,后来实际用的时候总是这也不行那也不行,万般无奈之下退回到正式发布的0.8.1版。两个版本确实有不少区别,至少源文件个数都不一样。在实际使用的过程中发现,0.8.1中如果注册一个类时,无论有没有注册它的构造函数和析构函数,都要求它们是public可见的,而0.9似乎没这个限制。 比较郁闷的是,没找到一个可靠的办法,把一个类中的STL的容器类型的成员变量传给Lua。Luabind中有个return_stl_iterator策略,似乎是可以把它传给Lua,也能在Lua进行迭代,但是在应用程序退出时,就会报未处理异常。我想以后如果真的一定有传容器的需求,可以试一下SWIG。 在Lua和C++之间传递字符串是个很头痛的问题。C++中的字符串类型太多了,几乎每种框架或大规模类库,都会有至少一种自己的字符串实现类。在wxWidgets中用的是wxString,但跟Lua交互的最好就是C的字符数组。如果是只读的访问,那还是比较容易处理的,Luabind默认处理了std::string类型的转换,SWIG中只要包含了std_string.i,也是差不多透明地处理了。但是如果要把字符串作为输出参数,那就头痛了,Luabind中是有out_value策略和pure_out_value策略,但实际上我发现在Lua中用的时候程序就崩溃了。暂时也不想再深究这个问题了,顶多在必要的时候考虑修改一下接口了。 又是才发现,SWIG和Luabind中注册的类型是不能互相混用的。比如SWIG中注册的某个函数,返回一个类的实例,而Luabind中又注册了这个类的话,是不能作为那个返回值的类型的。所以有时候可能需要在两边都注册一遍某个类型。比较安慰的是,基本数据类型还是能混用的,呵呵。 对于有缺省值参数的函数,SWIG会自动封装成多个函数,每个函数使用相同的名字,只是参数列表不同。而Luabind一次只能注册一个函数,那个完整参数列表的函数,如果想要达到SWIG那样的效果,大概只能自己老老实实一个一个注册上。 再有是Luabind中,不能随便注册char*类型参数的函数,要注册得指定out_value策略,不过说到这里我就有点疑惑,Luabind好像不支持多个策略的啊,如果有多个参数要指定策略怎么办?而且虽然我没经过测试,但我想除了char *外,其他的自定义类型作为参数的,都有这个问题吧!
今天整理了一下项目中使用的第三方框架、库的列表,很多,有C++的,有Lua的,突然面临一个迫切需要解决的问题:怎么决定某个功能应该由C++实现还是由Lua实现? 最早决定让项目成为一个由C++构建主体框架,由Lua脚本扩展实现其他的业务逻辑时,只是单纯得想让C++完成一部分最核心的功能。但现在的问题是,怎么判定一个功能是否够核心,以及即使够核心了,还得考虑其他一些因素,包括实现难度,安全保护,代码架构合理性,代码和逻辑共享等。 众所周知,用不同的语言实现相同的功能,难度和工作量可能差别很大。以前听同事和领导不止一次说起过,一行脚本顶得上一百行C++代码。这也许有点夸张的成分,但正好说明差异巨大这个事实。引起这种差异的主要原因就我自身角度出发来看,在于对语言的掌握程度,不同的语言风格就对不同开发任务的适应度,以及可利用的现成的库和代码的丰富度和成熟度。 说起安全保护,是今天看到Lua的maillist上讨论LuaJIT时Mike Pall说起源代码保护时才提醒了我。一般说来,用C++编写的代码,经过编译生成二进制代码,比起用脚本语言写的代码生成的字节码(中间码)反编译要困难得多。而我本来考虑让众多功能都通过脚本实现,这就面临一个问题,如何保护自己觉得重要的代码。最早的时候想用Lua的官方编译器编译一把就行了,现在看来这个保护弱得可以。而最近又面临另外一个短期内不可能解决的问题是,我打算嵌入LuaJIT 2.0的解释器,而刚刚才知道LuaJIT 2.0不兼容Lua官方的字节码,只提供源代码级的兼容,似乎LuaJIT也没提供一个自己的编译器,同时即使有这样的编译器,万一某种情况下需要用Lua官方编译的文件,那么处理就不一致了!Mike Pall的意见是,用个zip之类的东西打包加密就行了,呃,怎么说,确实是个方案,但使得本方案只能自己使用的了,不能让第三方的开发者参与了!所以除非有其他比较完善的解决方案,不然那样的代码只能用C++实现了。 再说架构合理性,总的说来,到目前为止的进度,自我感觉这样的架构还是比较满意的,当然现在只是一个空壳,只能支持让主菜单、工具栏按钮和右键弹出式菜单的构建和触发都是由脚本插件扩展而成,接着就而对的问题是,像配置选项功能要由谁来做,这种功能有一定的复杂性,又有GUI界面,又有后台处理逻辑,是全部让C++做,还是全部让Lua做,或者是各做一点,那又是各做哪些和各做多少呢?几乎所有同时涉及界面和后台逻辑的功能点,都有这样的问题,究其原因在于,用C++实现了主界面,而在Lua中目前并不能很方便地操作这些界面。原本天真地以为,C++用了wxWidgets做界面,那么Lua中用wxLua就可以实现无阻碍互通了。现实是残酷的,现在光是想让wxLua中使用C++中创建的主窗口作为父窗口就搞不定! 最后是代码和逻辑的共享。这个问题不是很严重,如果是纯粹的计算逻辑最容易共享,一些常用的底层功能,两种语言都差不多拥有第三方库来解决。除了GUI,其他的代码(逻辑)要共享,通过luabind和SWIG可以比较方便地粘合起来。如果粘合起来还是犹豫不决,那就是架构合理性的问题了。 想不到这次决定构建一个基于C++的脚本扩展框架的应用程序,会引出这么多问题,大大出乎我的意料啊,我是一直以来对风险的估计不足啊!
今天完成了右键弹出菜单的插件扩展框架支持,基本上没有遇到什么障碍,跟原来想的一样简单。 除了这个,还把菜单、工具栏的插件扩展支持功能的代码重构了一遍,把这部分功能提取成一个独立的类,在类中完成插件扩展的相关功能,只有最终的事件消息响应函数仍然放在界面类中,这是因为才发现不是随便一个类的成员函数都可以绑定成事件处理器的。 顺便说个可能是wxWidgets的bug,动态创建的菜单,动态添加的菜单项,第一个图标总是显示不出来! 再一个是原本用SWIG生成的文件,我把它直接作为头文件,包含在另一个源文件中,而该源文件因为某些原因,经常会被重新编译,而恰恰这SWIG生成的文件体积巨大(超过25000行),所以编译要花不少时间。于是又仔细看了一下生成的这个文件,发现其实最终只是需要一个luaopen_libname的函数,这样SWIG生成的文件就可以作为源文件了,不用跟着其他文件编译了。
今天修改了插件扩展的描述方式,把菜单项、工具栏按钮的标题、路径和帮助文本,工具栏按钮的图片等信息,全都写到xml描述文件中,这样一弄,lua脚本确实精简了很多。到现在为止,已经可以正常地通过插件扩展实现主菜单和工具栏的点击响应了,如果要说更新界面状态,也不是很麻烦,也就是多添加一个消息连接而已。 再说右键弹出菜单,我粗略地想了想,应该不是很麻烦,也就是添加到各自的扩展点下即可。其实直到现在,我才想起来,我这种实现方式,其实应该跟Windows传统的GUI资源编程基本思路是一样的。主菜单用一个编号标识,然后是菜单项信息,需要足够多的信息可以标识出菜单项的位置(路径),然后是给菜单项添加消息响应。工具栏的实现也是类似,所以如果要支持右键弹出菜单,也沿用那套思路就行了。 昨天说到,如果在插件扩展中使用wxLua,那么wxLua不能使用宿主程序使用的wxWidgets二进制文件,于是我今天想用IUP来试试。我从CVS里取出IUP的代码,然后用MinGW编译出所有的dll文件,可是用的时候发现总是报IupClipboard符号在指定的dll中找不到,而我用depends看是有的,郁闷!但是用LuaForWindows里的dll是可以的,可是它是用VS2005编译的,要带一个VC2005的redist,不爽啊! 另外一个问题是,本来以为脚本扩展时用了wxLua,而宿主程序也用了wxWidgets,两个之间可以无阻碍地互相使用各种控件,今天才发现,当时太想当然了。我用SWIG封装了宿主程序中的一些代码,比如wxFrame,在wxLua中是不认识这种封装的,两种不是相同的类型。所以现在只能精心挑选一组必需的,常用的代码来用SWIG封装,现在让它生成的包括scintilla和scilexer以及wxcintilla的声明后,生成的文件有近30000行,编译要花不少时间。说起来,我应该再仔细研究一下SWIG的用法先。 这两天用wxWidgets,有时候感觉它比MFC、VCL要灵活,比WTL要易懂。这也许很偏面。不过我最不满的是它的资料太少,以及运行效率不高。
这两天又用wxWidgets,不得不感叹一下,资料实在太少了,只有一个现成的manual,其他时候就只有看看CodeLite、Code::Blocks的源代码了! 到今天为止,修改了脚本扩展的功能,可以在一个描述文件中定义多个扩展的信息。对于主菜单来说,倒是勉强够用了,不过当时因为想让描述文件中对扩展的描述尽量通用,将其他的信息都写到脚本里去了,现在看来如果要对工具栏也使用脚本扩展,那么这种方式实在太不方便了点,还是应该把这种静态配置信息的都放在xml格式的描述文件中,脚本中应该只有动态的逻辑。所以还需要修改。 今天又忘了,wxWidgets的程序如果使用Lua扩展,而扩展又装载wxLua的话,wxLua的二进制文件不能用和wxWidgets程序相同的wxWidgets二进制动态链接库,不然会出现各种奇怪的问题。这是让我目前比较头痛的问题。我现在是用MinGW来编译wxWidgets和相关工程,那么一来wxLua就只能用VC或其他编译器编译了,但我今天试了OpenWatcom和Borland C++ 5.5,连wxWidgets都编译不过,郁闷!
这两天在公司里,做那个插件架构,到昨天为止,大概实现了一半了,不过总觉得不对劲。这是一个没有经过实践检验的方案,看了那些已经完成的代码,再联想一下完全完成后的可能的模样,心里老是有点不爽,担心内存占用会不会太大了。 现在这个设计是在原来的基础上修改来的,主要的修改是在一个插件中可以定义多个扩展,插件只是扩展的容器,扩展才是真正实现可扩展性的设施。于是相比原来的设计,现在有了两种独立的对象,插件和扩展,而原来一个插件中只定义一个扩展,在代码实现时可以只定义一种对象。于是现在这种情况下,对现实世界的描述,大约会多出近一倍的信息量吧,这些信息如果全部保存到内存中,预计消耗会很大。本来这些信息是通过配置文件描述的,如果不全保存到内存中,就要能实时解析配置文件,这对运行速度也是一个考验,而且能否快速方便地检索到需要的配置文件目前也是个未知数。 崩溃!
因为要使得插件支持依赖,比如在插件描述中说明,某个插件A,依赖于插件B和插件C,而插件C又依赖于插件D,那么在装载插件A之前,需要先装载插件D,再装载插件B和插件C,最后才是插件A。 这个依赖关于跟C/C++程序代码中的头文件包含处理方式几乎一模一样,典型的做法就是把这所有的依赖关系最终用一张有向图表示,这样通过DFS可以查找到是否有循环依赖,如果有,可以彻底中断装载过程,或者只是简单地把最后一个回边打断而继续装载。 最终整理出来的插件装载顺序也是很容易的。首先查找没有依赖于任何其他插件的插件,无论是理论上还是实际上,肯定是有这种插件存在的。找到这些插件后,把对这些插件的依赖关系都删掉,这样肯定又多出一些插件是已经解决依赖关系的。再把这些多出来的插件作为被依赖的关系删掉,重复前面一步操作,最终可以将所有插件都顺利装载。
真的。 现在一个Lua解释器的封装类,一个插件注册表类,这样的结构是不够用的。至少需要有一个管理插件运行的模块,它可以屏蔽掉解释器的底层差异,使得使用这个模块的用户不用知道他们到底是在运行Lua脚本还是其他Ruby或是Python之类的东西。另外一点是这模块需要向不单是C++代码提供接口。也就是说,用脚本写成的插件需要使用这个接口。这个需求很合理,也很必要,不然的话,很明显的一大限制是不能再对插件进行扩展了。
因为怀疑,所以去确认了一把。自己也懒得编译了,直接从网上找了个人家编译好的wxLua,人家是用VC8编译的,我的工程是用MinGW编译的,结果真的可以加载了,我狂晕!不管了,大不了到时候提供个Lua for Windows的安装包链接。 再回来说插件的问题。昨天主菜单是能运行起来了,不过发现有个不爽的地方。因为插件是放在一个指定目录下的,搜索出来的顺序可不是人能控制的,于是添加到菜单上的顺序也是乱的,这就不好了。由此引出另一个需求,对于一个插件应该可以定义多个菜单项,这样至少可以让这一个插件中的菜单项保持可控的顺序。
想起插件的事,如果一个软件具备插件扩展能力,同时又希望其用户自行开发插件,那么这个软件一般说来需要提供一个良好的插件开发环境。纵观Eclipse,MSVS、MS Office等都是这样的,而且VS和Office中的扩展形式除了插件,还有宏,准确地说来,是开发宏的环境是随软件一起提供的,而插件的开发是要用其他工具的,比如VS。而我前面说的插件开发环境,其实对应的是宏开发环境。 这个开发环境简单的做法,应该是一个独立的程序,但与软件主程序之间有很深入的进程间通信,不然调试功能是不可能那么完善的。也有可能是还有一个中间的宏解释执行器,主程序和宏开发环境都是只与宏解释执行器进行通信,同时该解释执行器也有调试功能。这样做的一个明显的理由是,当调试宏时,主程序可能会被挂起,而这时调试界面则要求是活动的,所以放在主程序中是不容易处理的。 Eclipse可能不需要这么做,它也许可以在不同的实例中使用不同的配置,这样可以在一个实例中调试另一个实例。 还有一种比较极端或者不负责任的做法是,不提供开发环境,让插件开发者痛苦去吧。也许用比较高级的脚本语言来做为扩展架构的底层执行器,这个问题的影响会变小,因为脚本语言对调试的需求可能会小于像C++这种编译型语言。但我觉得无论怎么样,提供一点基本的用于调试的设施还是必要的,比如至少可以加入一种打印输出机制之类的。
首先,这个架构是一定程度上模仿Eclipse的,并做了大量简化,所以模仿得并不像,不过不得不说最原始的灵感和很多想法是从它那里来的。 支撑起整个可扩展架构是一个类,大概名叫pluginsRegistry的类。这个类一般可以使用singleton模式,它做一些与插件相关的最基础最底层的事。比如,在宿主程序(这里一般是一个C++程序)启动时,它负责扫描指定的一个目录(包括子目录)下所有文件,找出其中的plugin.xml文件,也就是插件描述文件。它并不一定要是xml来描述,也可以是用Lua来描述,毕竟Lua最早的用途就是作为配置文件的,而且这个文件并不会被程序动态修改,Lua也够用,但要注意的是名字空间污染的问题,一个办法是每个描述文件都使用完全相同的结构和变量命名,但每次都单独启动一个Lua解释器来解析。一般说来一个描述文件中声明一个插件,也就是一些基本的插件信息,包括插件id、插件扩展点和插件对应脚本文件路径这三项最主要的不可或缺的信息,以及一些诸如被扩展点,版本号,依赖关系,版权信息等等不那么重要的信息。扫描到一个插件后,这个类会把插件id,脚本文件路径对应着保存起来,并把该插件添加到指定的被扩展点上。所谓扩展点,其实准确一点说,应该是被扩展点代表一个插件会被激活(其中一部分)的时机。被扩展点一般也是由其他插件提供的,也就是说其他插件会在某个它认为合适的时刻,激活所有注册到被扩展点下的所有插件。所以插件描述文件中很重要的一点是,需要声明自己是扩展了哪个被扩展点,不然就永远不可能被激活。由此可以看出,另外一个需要注意的是,一个插件一般会依赖于另外一些插件,至少是依赖于提供它要扩展的被扩展点的插件。一个插件必须要指明它要扩展的被扩展点,这是别的插件提供的,另外它也可以提供自己的被扩展点,让另外的插件来扩展自己的功能,当然这不是必须的。为了说起来不那么拗口,在描述文件中,一般我称前者为扩展点,称后者为被扩展点,这是把同一类事物在一个所属中以其不同的功能或角色来区别而得来的。再回到这个类的功能上来,除了前面讲的这几点功能外,它还应该能向外界提供一个服务,通过该服务外界可以根据指定的被扩展点查询到所有注册在该被扩展点下的插件,理论是希望只是通过一个id就能唯一标识一个插件。这样每当时机合适时,提供被扩展点的插件就可以通过这个服务来做一些事情,最常见的是通知所有该被扩展点下的插件即可,那些插件自己应该清楚这时应该做些什么事情,还有种情况是,提供被扩展点的插件应该可以从中区分出一些插件,而不是全部,来通知。一个很常见的应用场景,主菜单,可以是一个菜单项对应一个插件,这时每当用户点击了菜单项,那么只要激活该菜单项对应的那个插件即可,而不是所有主菜单下所有的插件都要激活一遍。 通过前面的阐述,可以知道,这个类需要一个清晰简单的接口,这样才可以比较方便地既给C++代码提供服务,又给Lua脚本提供服务。尽管Lua从设计上就考虑了很多跟其他语言交互的情形,但这里我还是得小心一点,少使用一些只有某种语言特有的一些元素或特性。 最后,以一个实例来简单叙述一下这个架构是怎么真正让一些功能运作起来的。就还是以主菜单为例,主菜单也是一个插件,当然,它是用C++还是用Lua实现的我们不关心。重要的是主菜单插件首先有一个自己的id,并提供了一个被扩展点,假设叫view.ui.menu,这时假设那个类已经把所有扫描到的插件正确地分析过了,这个被扩展点下已经有一些插件了,比如file_open,file_save等等。主菜单插件在自己被初始化时,调用那个类来得到所有view.ui.menu下的插件,并依次激活这些插件的get_caption方法,根据这些个方法返回的内容,作为菜单项的标题,逐个添加菜单项,并把菜单项的id和它对应的插件(可能就是用插件id来表示)保存起来,当用户点击一个菜单项时,主菜单插件可以得知用户点击的菜单项的id,并从之前保存的信息中得到它对应的插件id,以此来再调用那个类来激活唯一对应的那个插件,那个插件知道用户是点击了菜单点,就执行一些操作,比如打开文件等等。 大致的流程就是这样。
重构auto completion和call tips模块,因为总体设计都被改得天翻地覆,而且决定开始使用TDD的方式进行,所以进度相对来说慢了些,更因为我自己一直静不下心来好好干活,真是令人烦恼啊! 话说其他一些相对可独立分类的小特性大部分已被我清理出来,但剩下还有一些杂七杂八的功能,我却不想再动了,因为从很早的时候就考虑好了这部分功能不应该由C++代码完成,而应该由host提供的扩展机制使用外部extension实现。但是现在的情况看来,这扩展机制短期内是不会加入的,因为老大似乎不支持这样的做法。另外一点是,组内大概除了我,也再没有其他人有足够深厚的兴趣和迫切的需求实现这么一个框架。 最早虽然想到了要用扩展,但并没有考虑很多,只是觉得只要能用内部嵌入的那个Ruby解释器执行一段脚本,而那个解释器同时也能访问到内部的一些数据结构和算法,应该就能处理目前的需求了。当时预见得到的需求也确实简单,比如点击一个菜单项,在当前光标位置插入一个字符串,该字符串可能是当前日期或时间等等。我当时想法相当单纯,甚至想的是菜单项还是依旧在资源管理器中画好,消息映射也还是添加好,最后实现的时候再调用Ruby解释器解释一个外部的脚本文件就可以了。即使这样简单,也比纯粹使用C++实现有一定的优势,至少如果需要修改实现逻辑,就只需要修改那个脚本文件,不再需要修改C++代码,不需要重新编译。 但是自从前几天快速翻看了一遍《Contributing to Eclipse》之后,我就想,要做就做得灵活点,也许不要求完全跟Eclipse一样那么强大有弹性,但也至少要满足以下几个要求:1、在主菜单、弹出式菜单、工具栏(、状态栏)上都可以扩展;2、在扩展之上还可以预留扩展点继续扩展;3、既然用脚本扩展,那么扩展加载应该也像Eclipse那样“懒加载”;4、需要有一种打包策略,足以支持起复杂的多文件的扩展。 暂时就只想到这些,嗯!重构完auto completion和call tips,就悄悄做这个。
下午去向人讨教了一下人家怎么设计实现Plugins机制的。据该人士讲述,当时他们的产品2.x版本面对各种千奇百怪的用户需求,以及进度压力(这与我们目前遭遇到的情况类似),经过研究COM相关技术和Eclipse(估计当时也是2.x版本)的Plugins机制,最后在3.0版本实现了目前(也是3.x吧)的Plugins机制。 首先,该软件产品一般的插件都是通过vbs脚本实现,他们内嵌了vbs脚本解释器,使用的当然是最流行最正规的IActiveScript之道。可以扩展的地方包括主菜单、工具栏、弹出式菜单、状态栏等。像Eclipse及其他很多软件一样,基本的界面元素是用XML描述的,以弹出式菜单为例,在XML中首先会定义视图之类的信息,而弹出式菜单是作为视图信息的子节点出现的,说明这个弹出式菜单是在视图上点击右键才会弹出。这里好像是XML里就直接指定了菜单项的ID,对应Windows程序里的命令ID,而ID范围是程序中已固化规定好的,不能超出这个范围。然后指定一个脚本文件,可能还会具体到其中某个函数,每当菜单项触发时,便调用这段脚本。可能还会有触发前、触发后的选项,可以继续使用自定义脚本扩展实现。另外,菜单项有一个状态,如disabled、checked等等,这是在另外一个属性中设置的,该属性同样是指定一个脚本文件或函数,刚好对应MFC中的ON_UPDATE_COMMAND_UI。还有一点是,菜单可能是针对某种具体的选中项才有项的,所以在XML中描述菜单时,可能会包含一个属性,用于指定对其有效的选中项类型,只有在该类型的界面元素被选中并在上面点击鼠标右键时,才会弹出这个菜单。再有就是菜单等界面元素不可避免的一个问题是国际化,他们是把各种语言对应的字符串信息分别写到不同的配置文件中,描述菜单信息的XML里通过指定个别名或ID来动态查找装入相应的字符串。如果激活扩展插件函数时,需要一些固有信息,而是通过规定的格式书写函数参数。 其次,除了支持脚本扩展,该软件还支持COM组件形式的Plugins,这种Plugins相比脚本Plugins肯定强大得多,也许就好比Firefox中的Plugins之于Extensions,不过在介绍时他们一带而过,似乎也不是很支持第三方的去使用这种机制。 最后说一点,为了实现能让vbs脚本访问host程序中的一些信息或方法,他们把所有的东西都用COM接口还实现。似乎这是目前而言,我们能找到的最简单的一种处理方式,所有的状态、中间数据信息都可以保存在host程序中,脚本应该只是描述逻辑,而不保存状态。但这也是我最不屑的,我还是比较欣赏Eclipse(3.0以后用OSGi的不知道有多少变化)的机制,希望我有机会能设计并把它实现!
这两天在想一些问题,怎样构建一个有足够扩展性和通用性的框架呢? 对Scintilla的使用有了一点经验后,就想好好利用它来做几个有点实用价值的东东,关键就在于想做的不止一个,但在文本编辑方面由于都是使用Scintilla,所以肯定会想到如果能让代码写得足够通用,所有工程都共享一个代码实现就好了,以后即便有了修改,只要修改一次,其他的最大程度上只要重新编译链接一下就可以了,不用再修改源代码。但这样的通用性要如何实现呢,组件化是一种常见的解决方案,这里Scintilla已经是一个现成成熟的组件,但它只是提供了最基本的能力,如果要把这些能力展现出来,还是自己写代码实现。 有鉴于Impeller项目越来越冗长庞杂的实现,我心里很是不舒服。它确实有那么多事要做,也许有些事不是它的责任,但那也只是极小一部分,但把所有事的实现都放在工程中用C++完成,我就觉得有待商榷了。比如有很经典的一段代码,用于在用户动作触发时,在当前光标所在位置插入日期和时间,这样微不足道的功能,花了好几十行C++代码。其实在大半年前,我还在维护编辑器模块时,我就想通过脚本来支持这些简单功能了,但后来因为这样那样的原因最终没有实现。这只是一个简单的例子,照我的想法,最理想的方案是程序从配置文件中读出相关扩展信息,根据配置在主菜单、工具栏、弹出菜单等用户最习惯的界面上添加可触发控制,当用户触发了这些控制时,程序从配置中读出需要执行的动作,可能是一段脚本,或一个脚本文件,或一个DLL导出函数,甚至是一个COM组件中的一个接口中的方法,总之在被触发前这些东西可是是实际不存在的,也即Eclipse提倡的懒加载规则。这里有几个实现上的难点,如何通过配置文件就动态地实现配置的用户界面;如何通过用户动作立即找到正确的执行动作;如何让主程序和扩展进行交互。一般说来主程序需要提供一些方法供扩展进行调用控制主程序的行为,于是有相应的问题是主程序通过什么方式暴露这些方法,又需要暴露哪些方法。如果这些问题都能解决了,还有另外一个问题,不同的扩展之间是否可以交互,它们的协议应该怎么设计。 总之在动手做那几个东东前,这扩展性和通用性的问题必须要有一个可靠可行的方案,不解以后自己得累死。
其实静下心来想想,这也是正常的,这样匆匆忙忙赶出来的东西,质量能好到哪里去,而且事实上不但稳定性差,易用性也是极差。照我自己的估计,再给两个月,才能基本到可用的程度,即稳定性和易用性都为大多数普通用户接受的程度。 心里好烦啊! 中午在菠菜里吃出一条虫子,我都怀疑我有没有吃下去更多条,晕!拿去换了10块钱和1盘西瓜,然后去买卡士喝了。疯丫头也吃出一个小蚊蚊,这是以前某人常用的叫法,然后也是换了10块钱和1盘西瓜。 唉,我终究是很普通一人,有时候确实太高估自己了。 asio用了这么些天,还是没掌握具体用法,用来用去还是问题一堆。 COM也是很烦人一东西,无奈的是有些时候不得不用COM啊,再加上组里最有话语权决策权的几人,都是COM的忠实粉丝拥趸,郁闷。也不知道是不是我自己太高傲了,总是要跟别人唱反调。但总是觉得人家确实也没多少让我佩服的地方,唉。 对于一牛x的编辑器,以UltraEdit为榜样来说,要直接支持脚本扩展,可以通过方便地激活一外部脚本,来操作编辑器,比如移动光标,输入字符,查找替换,复制粘贴,删除撤消等等,这是一类最基本最通用的扩展方式,可以有任意数量的脚本。另外一类方式是,可以配置宿主程序的界面,比如增加菜单项,增加工具栏按钮,而且这些菜单项和按钮的位置、文字、图标等内容是可以定制的,当然点击后,就会触发一个脚本的运行,这种脚本也可以有任意数量,任意配置。还有一类方式,是事件处理脚本,当宿主程序遇到某一事件时,就会执行相应的脚本,比如打开一个文件时,文件关闭时等等,理论这类脚本也可以有任意多个,但实际上不能太多,因为如果某事件触发时,结果要分别运行一堆脚本,这种性能问题应该会比较明显,并可能让用户受不了。暂时想到的是这3类脚本扩展支持,最近又因为对多种脚本语言的简单接触,又没有哪种让我觉得特别喜欢,所以我反而想要能同时支持多种脚本语言的扩展。这时,SWIG出场的机会来了,至少Python、Ruby、Lua、TCL都是被它支持的。 除了可以用脚本扩展外,是否还要提供2进制扩展接口,这点我还不太确定,2进制扩展可以有普通DLL和COM两种方式,差别不大,只是怀疑其必要性,它有多少价值,多少能力,有多少情况下需要它出场解决问题。 最后一点是,正则引擎需要能挂接,随时任意替换吗,UltraEdit是这样做的。
心血来潮,又去Songbird的网站看了一下,还把编译好的Preview的安装程序,以及SVN里的源代码都下下来了。只可惜看了半天的编译说明,还是没看懂,唉,这个说明也太烦琐了,条理都不清晰。这样看来,Mozilla的XUL解决方案怎么推广得了哦,想想Adobe、MS这些大厂商的解决方案,一整套完整的流程支持,各个环节都可能会有比较完善的工具支持,而且安装部署都会很容易,一张光盘,一个ISO镜像,一个setup.exe文件就搞定所有的事,一切都准备好给人使用,有多少比例的人愿意去花那么些时间搞那么麻烦的mozilla的东西。Mozilla社区确实应该好好想想,反思一下,为什么XUL技术出来这么多年,Mozilla里也用了那么久,却一直没有被大众接受,直到现在这些大厂商出来推,才火起来。也许从技术的角度讲,各个解决方案间没有特别大的区别或差距,但是易用性、友好性方面呢,可能差得太多了。其实这也是众多开源项目的通病啊,孤芳自赏的hacker想法是走不出hacker圈子的。 装上Songbird,听了几首MP3,就把它卸载了,现在的条件用XUL技术来实现这样的桌面应用时候还早了点,连一个窗口里点菜单,点右键,来回换输入焦点都会卡好几秒钟,有几个人受得了,换回foobar2000,看起来轻巧多了。所说Firefox3.0也是基于XulRunner来实现的了,就像Songbird一样,进程管理器里可能就看不到firefox.exe了,而是一个XulRunner.exe。这样就像Java之类的了,虚拟机实现的东西,除非是开发效率或其它有什么特别突出的优点,不然是不会被大众接受的。 Mozilla能有那样好的扩展能力,其实从某方面讲,跟Eclipse、Emacs等是一个原因,那就是脚本语言和本地代码的结合。它用XUL描述界面,用C/C++实现真正的逻辑,再用JavaScript把两者结合起来。这样看来,只要能把描述界面的部分规范下来,真正的核心逻辑用C/C++实现,再设计一个良好的两者互动通信机制,那么一个弹性极佳的系统也就设计出来了!LLYF Spy中,是应该好好设计一下了,2.0可以只做预研性的设计和实现,3.0可以考虑实现成一个程序员工具平台了,只要扩展机制实现得好,可以给它添加各种扩展功能,比如编辑器,比如听MP3,比如下载上传……
昨天偶然想到,IceSword使用的协件机制是一种处理主程序与其它相关性不大的功能之间关系的不错的方法。虽然想到了这点,但并没有马上去看它是怎么实现的,于是自己躺在床上一边嗑瓜子一边想,想了一会儿大概有了个轮廓。今天起来看了下IceSword,发现基本上我想的也差不多就这样了。它有一个C的头文件,提供接口声明,一个DLL提供进程间通信。而我当时想到的是需要一个LIB,可以静态链接进协件。如果有很多接口需要暴露的话,用DLL会好一点,这样相比LIB,能减小每个协件的文件大小。另外唯一剩下需要考虑的是,采用怎样一个良好的进程间通信机制,要快速稳定,同时又不能太消耗系统资源。 插件以前我只用过DLL形式的,其实似乎COM是很不错的一种选择,只不过我一直对COM没研究,看过一些文章,也还是没搞明白怎么用COM实现插件机制。了解过Eclipse和Emacs等弹性非常好的架构后,隐约觉得用脚本来实现插件也是一种极好的方法。重新修葺一遍代码,整理好功能接口,就可以为多种脚本提供支持了。不过还有一点需要注意的是,用脚本实现的插件,对界面的操作大概都需要主程序来支持了,比如显示一条消息,选择一个文件等。另外还有一点需要提到的是,如果主程序需要暴露很多接口给脚本插件,或者同时需要能支持多种脚本语言的话,使用SWIG是个不错的选择。
一直觉得Eclipse的插件架构很牛x,有时候自己写个小程序都想着怎么实现一个灵活的可扩展的架构,可是却不太容易,毕竟我软件工程方面的经验还是几乎为0。在网上闲逛看别人的blog时,偶然发现一个Dissect Eclipse Plugins Framework,对Eclipse的插件架构做了一定的描述,还自己用简单的实例来Dessect了一把,就像jjhou的Dissect MFC一样。对于自己要实现一个类似的,灵活的插件框架,无疑是很有帮助的,但是同样作者也是用Java来实现的,一定程度上讲,这种框架依赖了Java语言特有的语言特性,如果换成其它语言来实现,比如C/C++,或许还有其它的障碍,但总的说来,思想已经摆在那里了,Eclipse的那帮设计者真的天才!《Contribute To Eclipse》这书也写得挺好的,毕竟是两位实战和著作都颇有经验的大师合力的精心之作,中文版的翻译也挺不错的。 装了个Windows Live Writer,IE6也能标签(tab)浏览了,不过似乎有点问题,还是我自己没找到在哪里设置,每次新开窗口都是另外一个窗口,而不是一个标签,另外就是在标签间切换,有点闪。本来说起来像Maxthon这样的东西,我一直都只是因为它比IE多了个tab才用它,不过自从Firefox的易用性达到我的需求后,就再也不用了这些了,对于IE only的那些网页,还有IE Tab这样的插件呢!
Category lookfor
1月21日下午3点半就从公司走人了,到柯桥、绍兴路段堵了一会儿。
除夕,小丫头给我发短信说最近遭遇了很多很多不幸,跟做梦似的。她爸爸过世了,给人家干活时从屋顶摔下来。她自己流产了。我不知道自己可以做些什么。橙子在Facebook上说,还是放不下吗。我说,我想关心她,却没了以前的那种男女之情,倒有点像亲情。
春节的行程比较充实,初一中午在家接待干妈一家,晚上去干妈家。初二去大姨家。初三在家休整。初四接待大姨小姨,下午还去上坟。初五晚上去小姨家。初六,就是今天,到上海。
木有宽带的日子,真不习惯啦!
无意中偶尔看到的。你一定要幸福啊。居然只说“热死人了”,唔……
昨天晚上,近12点,锁好门,准备熄灯上床,却听到手机的短信铃声响起。当时我就猜,在这么个时间,说不定是那小丫头发的,不,应该是我很肯定,一定是那小丫头发的。拿起一看,果然是小丫头,那个我曾经叫她宝宝,后来一直称呼为小乖的女人。短信的内容倒比较意外,说自己头好痛,眼睛也好痛,要爆了,却又睡不着。于是我便拨回去。 两个人断断续续,说着从我毕业工作以来的两个人之间的几乎每一件事情。睡在同一个屋子里,一起逛街,一起去欢乐谷玩,给她买眼霜和书,帮她买数码相机和笔记本,她大队培训期间出去玩让我在家里着急,买了里芯已经烂了的苹果给她……她问我她要结婚了我祝不祝福她。我短暂地沉默后,回答当然祝福了。然后她就在电话那头哭起来,我问她为什么哭,是不是他对她不好。她说没什么,他对她很好很好。还说她最对不起的人就是我,我说我没有怪你,是我自己给你这个机会让你对不起我的。而且就算真的很喜欢很喜欢一个人,也不是一定要生活在一起的。以前听小思宇说起过,陈奕讯在一个访谈节目中说的,他都已经有小孩的人了,到现在心中还是一直放不下一个人,惦记着一个人。我也可以。 我给她说起我妈妈,那是一个眼光很挑剔的中年妇女,我把众多女同事,女同学的照片拿回家给她看,基本上都是挑缺点的。小丫头就说,是不是她的脸那么圆,我妈妈也是不喜欢的。我解释说,你那种圆脸,我妈妈是很喜欢的,还说了脸圆圆的,屁股也圆圆的,这样的女孩子才好。小丫头说,那她最终也没能成为我妈妈的儿媳妇。我说,那是我妈的儿子没本事,没福气。说到很少见小丫头哭,其中的一次,是那年雪灾,到了机场没车回家,给我发短信,在机场一个人哭,我正在家里吃饭,我妈问我在跟谁发短信,我说了后,我妈还叫我回短信让小丫头不要哭了,不然不漂亮了,而我却说小丫头脸圆圆的,哭起来的样子很可爱的。 还说到,我曾经在她的照片袋里看到她和一个男生的大头贴,我心好酸好痛,当时怎么那么老实,没有趁上街的机会拉她一起去拍大头贴。她说,那个男生是yaya以前的男朋友,居然让人误会了,哈哈,印象中好像也只有这么一个男生一起拍过大头贴。后来她又说到,当时我千方百计把她介绍进公司,本来是希望能离得近一点的,想不到一下就被派到成都去了,是不是当时后悔得要死。我说,后悔倒没有,就是很痛恨这个命运,想不到在命运的面前真的一点能力都没有。真的,我不但痛恨这个命运,还痛恨着这个公司,就是它把小丫头弄到离我那么远的地方去了,便宜了以后可能成为她老公的那个小子。我问小丫头,如果她还是一直呆在深圳的话,我应该还是有机会的吧。小丫头轻轻笑笑。 小丫头说,很怀念以前在深圳的日子。呃,她只在深圳呆了不到半年。我说我也是,我很怀念她在深圳的日子。 几乎把我觉得最幸福的事情都回忆了一遍,最后我说,以后不要哭了,你哭我也会难过的,你已经不和我一起生活了,那就要在其他方面有所补偿,你担负着让我们两个人都快乐的责任。
今天去关内给小丫头迁档案和户口,早上睡到8点多,很不情愿地起床,不过也比平时上班时晚了一个多小时了,昨晚睡得也不晚啊,怎么会那么困呢。洗漱完毕出门,已经过了8点半了,等328路,结果一直等到9点才勉强挤上一辆。 到了那公司,还不到10点,这出乎我原来的预料,心里顿时放松了一点。那么一个小公司,里面有个女人招呼我过去,我拿出迁户申请和商调函。被告知那些个人资料是要填好的,于是又打电话问小丫头那些东西怎么填。接着又被告知要交档案保管费,每月20元,从2007年2月交到2008年9月,还好不是很多,但我还是忘了拿钱上去,跑到楼下的招行ATM机上取了钱上去,结果那儿的财务部说他们不收现金的,但是大概看在我已经拿了几张红纸片的份上,乱糟糟地不知道从哪里找出一本开收据的本。最先招呼我的女人把档案都装入一个档案袋,贴上纸,盖了十几下章,然后找出小丫头的户口卡交给我,第一站的任务就基本完成了。 随后是要去高新派出所办迁入户口,因为不知道坐什么车,所以一下楼就打了个的。也不知道是不是绕路了,比我想像的要久。而且想不到那派出所在那么一个偏僻的地方,不过好在一进门就看到办理的地方,取号排队,开始还取错号了,大概一直排了半个小时的样子吧,才轮到我,那办理的大姐一看就说出我们公司的名字,看来我们公司在那儿的业务很多啊。没几分钟就办完了,时间都耗在坐车和排队上了。 出了派出所,看到路对面就是一个公交车始发站,看来只有转车了。这车也是绕路的,绕了好久,到了市民中心,本来想坐个391回公司的,结果等了10几分钟也没等到,失去了耐心,决定再次转车,先坐到梅林关,再爬上一个小巴,1点半差3分的时候终于赶回公司刷卡,这样就只需要报上午半天的假了。 坐下吃了块巧克力,因为早饭和中饭都没吃,饿啊!然后给小妞打电话,问她有没有吃的,她说有小面包。于是我先跑到人事服务中心,把户口卡和档案交回去,结果那管档案的mm说还缺转正定级表,我郁闷,这党员还真麻烦啊!指不准还得跑一趟关内,累啊,要是自己有车就好了!
早上接到小丫头托人带来的身份证,马上打开ppt看了看各个步骤,还是不明所以,直接就跑去人事服务中心找人。等车等了10几分钟,开过了五六辆,全是满员的。先问开具迁档案时要用的《商调函》什么的,结果问我档案现在什么地方,我一听就愣了,当时我问小丫头时,她自己都不知道在什么地方。然后去开迁户口的申请,结果那mm说要证明,这也是情理之中的事,不过小丫头给我的那个ppt里留的两个联系人明显不对嘛! 两边都办不成事,只好给小丫头打个电话先,让她马上发个邮件证明一下,又顺便扯皮了几句。开好迁户申请,打道回府,离回来快1个小时了,这办事效率也太低了点,瀑布汗~
要说起咖啡,我第一反应就会想到那特别喜欢咖啡的小妞,上半年时她以前的BF送了套煮咖啡的用具后,她遇到熟人就会叫去她的小屋里品尝一下她自己磨好煮好的咖啡,呵呵。 昨天跟小丫头打电话时,她说起要去开个咖啡店,还要自己会煮一种独特口味的咖啡,呵呵,挺小孩子气的语气说的。只是我确实也曾经多想去过这样宁静的生活的,以前还说要回乡下去养一群小鸡小鸭的,已经好久都没想过这个事了,渐渐地迷失在这个匆忙的生活节奏中了。 今天下午去中心书城逛了一圈,把几本稍微厚点的咖啡有关的书都买来了,也许这又只是一次心血来潮,呵呵。
今天去加班了,难得哦,突然一下子变得很忙,这星期连续三天晚上加班,对我来说几乎是难以想像的啊。加班回来就先给妈妈打电话,然后给阿姨发短信。 给小丫头打电话,没人接,于是放下,看网页。过了一会儿小丫头发短信来说,9点以后她就接听免费了。于是安安份份地等到9点,再给小丫头打。这次小丫头似乎心情不错呢,还好像比以前会搞笑了,真是有点意外,倒是换过来我唉声叹气了好几次。记得刚来公司的那一年,经常心情不好的时候就会给小丫头打电话,那时她还在学校里,而且几乎每次她都是很固定的活动,也是我们学校的人最平常的活动,上BBS、看碟、打游戏,以前我在学校的时候也是这么过的,所以总是给我一种很怀念的感觉。以前每次跟小丫头打电话都会把糟糕的心情变好,真的很奇怪,现在却好像不行了,可能是跟我的心态有关系吧,现在的心态跟以前不一样了。 所以,人千万不能随便动感情啊,不然像陷入了泥潭,难以自拔啊!
贫穷的人只能以贫穷的方式向自己在意的人祝福。 昨天忙乎了半个晚上,想今天给小丫头一个小小的惊喜,结果今天发现昨晚最后打包成安装程序的时候还是出了问题,枉费了我画了好一会儿的splash了。 不过大部分主要的功能还都是按照预期实现了,呵呵。 小丫头生日快乐哦!
就在出门前的半分钟,一条短信把行程改变了。 小丫头说,做女人好辛苦啊。我说,做女人长好看点,就有好多人追。小丫头说,没人追。我说,76GG啊,还有莫名其妙打电话来的啊。 做女人真的很辛苦啊,幸好我不是……
在上网的时候,小丫头突然打电话来,出乎意料地。然后两个人聊了大半个小时,照小丫头的说法,都从公司里聊到家里了。还是照原来一样,小丫头在那里抱怨了一通,呵呵。五一要不要去成都呢,犹豫ing…… 写程序总是遇到些奇怪的问题。这两天在研究直接用PSDK写一个能支持在2个TreeView中进行节点拖放的窗口,昨天还一直很奇怪的,只有一个 TreeView能作为拖放的宿,另一个则怎么也不行,但两个TreeView的代码明显是相同的,因为都是从同一个类中的方法啊!今天给窗口加了个拆分 条,可以让鼠标拖动TreeView之间的拆分条来调整两个TreeView的大小,结果稀里糊涂的居然发现两个TreeView都能作为拖放的宿了,真 是奇怪呀,明明我一点都没改动TreeView的代码啊! 从别人那里要来了一个通过COM接口跟GT3K交互的Demo,这个Demo是在Excel中用VBA写的,不知道如果在VC中用,还有多少困难,看来得学一下COM的知识了,比较麻烦呀! 另外一边的人打电话来说,要讨论一下单板软件的相关计划等,呵呵,要做嵌入式开发去了,这让我觉得有点兴奋,因为从来没有接触过这方面的东西,只是别人写的代码倒是看过不少,虽然也从来不看代码流程,只是为了PI值发现些很低级的语法错误。 SharePoint总算第一次被我调得可以显示一点东西出来了,不过还没有研究怎么使用,因为那台老爷机实在太慢了,我无法忍受在这样蜗牛的速度中 进行操作学习。SharePoint的资料是少了点,没办法的时候,只能跟别人交流交流了。而且,才发现目前只要装Windows SharePoint Service 3.0就够用了,不用装Server了,哈哈。 把输入法的界面改了一下,Comp窗口和Cand窗口合在一起了,就像现在流行的输入法一样,不再是传统界面啦,这有一个好处——可以方便地让它支持 Skin,或者不规格窗口。不过老问题还是存在:Firefox中还是出不来。而且一直想把设置窗口改成用PropertySheet样式,但总是要么不 出来,要么弄死机,郁闷,只好暂时就要原来的了。还有个问题,也是这两天才遇到的,在用UNICODE编译的时候,为什么stprintf总是得到乱码?
想起要写些关于Boost源代码的东西,要把代码贴到blog上来,不免想要弄稍微好看点,虽然有个Boost中自带的演示Boost::regex的cpp2html工具,不过觉得太单调了点。上Google搜索了一下,还是能搜索不少来,其中一个放在GNU上的source-highlight引起了我的注意,这是一个由Lorenzo Bettini编写的命令行程序,能支持好多种语言的源代码输入,同时又支持包括Html、XML、LaTeX、DocBook等格式的输出。看到最新版本已经是2.6了,不过作者已经不屑于发布Windows下的可执行文件了,只好去sf.net的GnuWin32工程里找了一个2.1.2版本用用。这个小程序做得挺灵活的,作为输入的源文件规则和作为输出的目标格式都是通过外部的配置文件来说明的,这样如果要添加支持新的语言,只要添加新的配置文件就可以了,不需要修改重新编译程序。这是个很棒的小程序! 小丫头现在都知道怎么骗我了哦,真让我感动得想哭,突然觉得这种感觉就像《Hunter X Hunter》里奇犽的哥哥说他妈妈哭了,因为奇犽现在都会砍她了,她好感动的。
有时候不禁要感叹,男人和女人对于同样的事情,平常的事情,怎么会产生那么大的意见分歧。下午的时候,小丫头给我发邮件,说ClearCase的命令不知道怎么用,我看了一下,觉得这些命令望文生意都能猜出大概的作用来,于是很直接地说,我觉得是因为你懒。没想到小丫头火冒三丈,说再也不理我了,还说为了这句话哭了。把我郁闷坏了,咋就为这么句话搞得这么严重呢。以前怎么说她,她都是不会生气的呀,都是懒洋洋或乐呵呵的样子,今天怎么就会哭了。心里必然不好受,坐在那里又觉得度日如年,于是只好出去逛一圈。回来还是郁闷,看看时间,还没过多久啊。于是试探性地又发了封邮件给她,语气自然是很诚恳的。还好看到她的邮件中说话已经略带娇嗔了,才舒了口气。呵呵,我竟然这样把小丫头弄哭了。 说实话,我当时还真的很怕她真的再也不理我了,我甚至把我能想到的最坏的结果的情景在脑海中都演了一遍,不过好在小丫头的本性是个温柔又随和的人。 晚上回到家,小丫头还在公司,于是打电话给她,一直打了一个半小时。从大年三十那天以来,我们一直没通过电话,因为在公司里可以用notes,同时在外面可以发短信。聊了很多,小丫头在那里不知道受了多少委屈,唉,可怜的孩子。 今天终于换了项目部了,不过似乎接下来的事我会做得比较郁闷哦!
我感到很难过。上班的时候我打电话过去,她说都是被我害的。虽然有点开玩笑的成分,但这个也是空穴来风啊!下班后还突然发个短信来说其实没这么严重,只是没事了发下牢骚。我其实已经从那天起,一直背负着愧疚和歉意,今天只不过又加重了一点而已。唉!
可以好好享受一家团聚的生活了!跟小思宇和我说的语气一样,小丫头说初十不想去上班了。呵呵,这家伙! 唉,我要好好想办法多赚钱,以后养个全职太太,呵呵!
下午我在干妈家,小丫头发短信来说,回不了家了,没车。当时小丫头的心情我是依稀有印象的,感觉像是很久以前也体会过。那种思家的情绪,对于每个才离家的人来讲,都是一样的。这样,小丫头在家的日子又少了一天,呼呼。
下午正在看碟,小丫头发短信来,说办公室里只有她一个人了,给家里打电话哭起来了。我辗转找到她办公室的座机号码打过去,小丫头略带哭腔地说,以前都没这样过。 我也不知道该说些什么,就跟她东拉西扯了半个多小时。可怜的小丫头,第一次离家在外一个人过除夕。真希望我能在她身边啊! 小丫头明天上午9点多的飞机,一路顺风哦!
下午离下班还有一个小时,就想逗一下教授和疯丫头。于是发了个群体邮件,把教授狠狠逗了一把。小丫头说,以前怎么没发现我这么有文采和幽默。我黯然,文采我是没有,没办法,可是幽默呢。我一直自以为还算会搞笑的,但小丫头却这样说。想起来,似乎afei也这样评价过我吧。以前小思宇她们不也说我自闭嘛,而且我就一直这样给自己下了定义了。其实仔细想想,对于小思宇她们来说,她们平常接触到的都是那些口若悬河滔滔不绝的做市场的人,这是普遍情况,我一个做研发的哪像那些人那么会吹呀!但对于小丫头来说,大概是因为平常和她在一起的时候,觉得是跟一个自己比较亲近比较亲密的人在一起了,就往往忘了表现一下自己开朗活泼的一面,而把深埋在心底的忧郁自闭的本性暴露出来了。我只愿意给她看到我的懦弱无助,而在其他人面前,我乐观嘻哈、放荡不羁、玩世不恭。可能这就是人的两面性吧! 明天就要回家了。想想当时跟小丫头两个人在那里扯皮,她要我陪她坐火车,我要她陪我坐飞机。可是现在,那个要我陪她一起坐火车的人不在了,我还是只能自己一个人走。唉,就让我叹口气吧,虽然我经常跟小丫头说不要叹气,叹气的时候幸福就会溜走,唉!
江南女子的特质。我这样形容小丫头,结果还被疯丫头笑了,这个蒙古女人,呵呵。
我站在你的门口,徘徊犹豫。我没有进去,我从你的门口走过。
我住在五楼,楼里没有电梯,每次都是走楼梯上下。我们对下的4楼一直特立独行,没有防盗门,我搬来半年多了,一直没有。那天星期五晚上,跟小丫头一起回来,小丫头爬楼梯可弱了,说累死了。到4楼的时候问我,到了没有。我说还有一层,就我们下面这个4楼的没有防盗门。 昨天晚上回来,一口气爬到5楼,心里闪过,怎么下面的好像有防盗门的?但也没有多想,就做其它事情去了。今天回来,看清楚了,确实装了一扇簇新的不锈钢防盗门!小丫头走了,它这儿也变了。 小丫头走了呢,去成都了呢!今天晚上小丫头就睡在成都的某个地方了呢!中午快12点半的时候,小丫头发短信说“上飞机了 再见了”,我故作镇静地说“呵呵,昨天就再见了”。下午快16点20的时候小丫头发短信来说“我已到成研”,我说“好好干,加油,多攒点钱,以后我去蹭你”。 看着手机,既希望有短信来,又怕有短信来。我忍不住,甚至有幻觉,好几次不经意间觉得闻到了小丫头头上那轻轻的香味。 突然觉得生活太没意思了,生命太没意义了。我讨厌这个世界,我讨厌这个人生。
这是小丫头留在深圳的最后几天。小丫头来深圳的情景,似乎就在不久以前。 星期四,下午,小丫头发短信来,说把她分到成都。我如同当头被打了一闷棍。当时,小丫头还没来报到之前,得知她会被分去北京或上海,我就已经痉挛了一阵子,好不容易慢慢习惯并接受了这个事实,并且下定决心,在网上把认识的在北京和上海的朋友、同学全都打了招呼,要过去那边。结果却是特别意外的另外一个说是打击都不为过分的消息——成都!我不知所措,刚刚还跟教授、疯丫头谈笑风声,紧接着的是一阵心绞般的疼痛,我疯了。晚上,QCC吃饭,我跟去,我笑不出来,却不能扫大家的兴,我勉强挤出点笑脸。我偷偷告诉雨烟。吃完饭,跟雨烟一起去百草园英华苑取了小丫头寄放在那里的行李箱。一边往研发东门走,一边雨烟不停地劝我开导我。走到东门,雨烟自己坐班车去了,我留下等小丫头出来。小丫头迷路了,在研发中心都迷路了。等到小丫头,一起坐班车,回住的地方。小丫头很疲倦的样子,我还好,只是心里像翻江倒海。小丫头玩起电脑,我坐在旁边看。很宁静,很安逸。告诉她明天要在8点10分前出门去坐车上班,然后就睡了。 星期五,一起出门,去上班。一起吃早饭。以前都是跟小妞一起吃的,自从搬了家后,一般都是一个人吃。这是和小丫头一起吃的唯一一顿早饭,以前就算在一起,在家里,都是睡过去了,一直等到中饭的。我告诉小丫头,我们一般在这个地方吃中饭,如果中午没人陪你吃饭的话,就来这里找我们。吃完饭,小丫头转头就要往外面走,被我叫住,应该往另外一个方向走。怎么mm都会有点路盲?小丫头在五楼,我在六楼。12点了,照平常一样出来,跟着雨烟和疯丫头。电梯上,雨烟回头问我,怎么跟着她们。然后两个人开始扯皮。雨烟问我不难过了,我说难过啊,难过也要吃饭啊,雨烟说怎么不去找大耳环mm一起吃饭,我说我一直跟你们一起吃的啊,雨烟说人家大耳环mm就要去成都了你也不找她一起吃饭,然后就转头跟疯丫头说昨天晚上我可郁闷了。然后教授他们插进来,开始一起扯皮。看到小丫头过来,疯丫头说欢迎插队。小丫头说,这样算不算插队哦,我说当然算啦。吃完饭,小丫头说手机没钱了,要给家里打个电话说一下情况。我把手机拿给她,她跟她妈说你要坚持住要有心理准备,我要去成都了。打完电话,我说手机下午你拿着吧,还要订机票的。下午快下班的时候,雨烟叫我过去帮她调自动化,其实是没有什么问题的,就是要等一会,她还没等一会就立马手动结束了。后来发现真的是只要等一会儿就行了,我就很大声地说,叫你等一会儿不等。然后扭头就走了,雨烟就在那里说,你居然这样跟我说话,不就是让你的大耳环mm多等了一会儿嘛。我头也不回,管自己走了。走到下面,刷了卡。没发现小丫头,于是想打电话。前台的还不能打外线,刚好逮到猫猫,就用她的手机打我的手机。小丫头说已经在排队刷卡了。后来她说,其实知道是我打过去的,因为一看是上面登了名字的打过来的。然后一起去食堂吃饭,再一起坐车回家。回到家,小丫头玩了一会儿电脑,说要出去跟大队培训的同学玩一下。小丫头出去了,我无所事事,翻起书来看。很无聊,很无聊,很无聊。10点过后,发了条短信,喊她回来。我骂自己,有病,又陷入这种怪圈了。过了20分钟,还不见回来,只好打电话,小丫头说马上就要回来了。我骂自己,有病,又陷入这种怪圈了。小丫头回来了,我静静地看着她。小丫头玩起电脑,我坐在旁边看。很宁静,很安逸。小丫头说,终于可以睡懒觉了,是的,大队培训期间睡不够是人所共知的。 星期六,早上9点,孙同学打电话来,我说在睡觉呢,她说两只猪。到了9点半,实在睡不着了。起床,到客厅看电视。很无聊,很无聊,很无聊。小丫头起床了。我在床边坐着,看小丫头收拾。小丫头说,要跟大队培训的同学去吃中饭。我说,算好时间,下午还要坐车去看你们的迎春晚会的。小丫头问我中饭怎么办,我说叫外卖呗,小丫头略带歉意地笑笑。看时间还早,小丫头玩起电脑,我坐在旁边看。很宁静,很安逸。小丫头说,怎么还不来啊。我说不用急,你们12点去吃,吃到1点半。后来果然,1点半的时候,小丫头就回来了。说要睡一会儿,然后我玩电脑,她在那边睡着。我去关门,回头看见她侧着身躺在那里,脸圆圆的,真可爱。孙同学又打电话来,说车子的事。我说睡着呢,她说怎么这么能睡。到2点过5分的时候,我把小丫头叫起来。然后出去等她,等她换完衣服。孙同学在小区门口的公车站等着,几个人吹了会儿牛。我等不及了,说先走了,跟孙同学说,你带着她,孙同学说放心吧,不会把你mm弄丢的。我到路对面的站坐391,到市民中心。我到的时候,已经开始2个小时了。看了一会儿,看了经典的《华为时代III》,然后就挡不住了,睡着了。等我醒来的时候,已经接近尾声了。抽大奖的机会没有了,因为我的奖券没扔到抽奖箱里去。结果还意外地弄到一个幸运奖,被人赶过来的位子,有个“福”字。会完了之后,就跟教授他们去找吃的地方,磨蹭了好久,之后是找不到哪里坐车,把雨烟弄郁闷了。最后坐公交车到梅林,吃小肥羊。吃了很多条泥鳅,疯丫头怕极了这个,哈哈。吃完,坐328回去,还怕回晚了,先给室友发短信,要是小丫头先回去了,帮忙开个门。结果等我9点半到了家,发现小丫头还没回来。孙同学说已经应该回来了。正如我估计的,小丫头找大队培训的同学去玩了。跟妈妈打了个电话,说话的兴致都没有。很无聊,很无聊,很无聊。把小丫头传给我的照片刻了张盘,然后就没事做了。11点过的时候给小丫头打电话,想喊她回来,结果没人接,只好发短信。回了个马上回来。11点半的时候,再打电话,小丫头说,就快到楼下了,不要慌。一种很奇怪的语气,以前从来没见过的语气。我在阳台上望着她回来。我在客厅里踱步等着她回来。小丫头见到我,轻轻地说了叫sorry,以前从来没听过。然后就进屋去,小丫头玩起电脑,我坐在旁边看。很宁静,很安逸。小丫头说,手机停机了,话费用完了,我说用我的吧。小丫头跟人语音聊天起来,不知道过了多久,我去睡了。我问她明天几点起来,她说9。 结果8点多,我就睡不着了。等着小丫头起床。然后一起收拾东西。她要回她以前住的地方,整理东西。在梅林倒车的时候,我问她想不想吃包子,她有点不好意思地说想。过去买了两个大灌汤包,结果她说不喜欢吃肉的,于是去换成菜包。到了沙嘴,小丫头有点感慨,离开了半个月的地方。她说,去吃饭,然后把我送走,然后她收拾东西。走到下面的一家湘菜馆,一人点了个木桶饭。两个人都没什么食欲,她是因为刚吃过2个包子,我是因为什么,我不知道。吃完说,去华强北看手机吧。于是坐到华强北,顺便把她买给她爸的衣服寄了。走来走去,说还是去看看以前的那些同事。于是打的到市民中心旁边的新少年宫。那些人看到小丫头,都特别热情。他们都很忙,于是我和小丫头走到观众席,看节目,一直看到6点,从4点开始,我就过半个钟头催一次。出来后,决定再回华强北,吃个晚饭,然后送她走。看到卖烤红薯的,小丫头就想吃,2块5买一小个,还真是贵。不过小丫头只能吃半个。下车刚好看到元绿回转寿司,就带小丫头进去吃,她说以前没吃过。小丫头吃不了多少,因为刚刚那个红薯就已经撑死她了。但是两个人还是吃了75块钱。小丫头说好奢侈啊,我说趁现在还能奢侈就奢侈吧,以后有老婆了,就要干吗干吗了。然后说起以后的事,我说2年后,如果有机会你愿意,我就把你弄到上海去。她说,那时候我就已经有老公嫁人了。我说,所以我留了后路的,说是你愿意的话,而且只说了2年,要是3年后,我已经估计你嫁人了。走到公车站,我说,我会去找你的。直到212路公交车来,那几句在心里构思默念了n遍的台词还是没说出口。等小丫头上了车,我把头扭到一边。直到车开动,我望着车里的那个小女孩,挥挥手。我掏出手机发短信给她,我一定会去找你的。我只觉得眼睛有点湿,有点忍不住,比当年我离开重庆时,在江北机场的时候感觉要舍不得得多,我不知道为什么,难到真的是因为心底里预见到这次的分别是这生的分别吗!小丫头发短信来说,其实我一直怕你放不下我。我说,放不下有什么用,该走的还是要走的,该分开的还是要分开的,我这几天觉得很幸福,让我有机会照顾你,尽管不周到。路边的店里适时地播起一个女声的“……寂寞沙洲我该思念谁……”
等你走后心憔悴白色油桐风中纷飞落花随人幽情这个季节河畔的风放肆拼命的吹不断拨弄女人的眼泪那样浓烈的爱再也无法给伤感一夜一夜当记忆的线穿杨过往支离破碎是黄昏占据了心扉有花儿伴着蝴碟孤燕可以双飞夜深人静独徘徊当幸福恋人寄来红色分享喜悦闭上双眼难过头也不敢回仍然渐渐恨之不肯安歇微带着后悔寂寞沙洲我该思念谁等你走后心憔悴白色油桐风中纷飞落花随人幽情这个季节河畔的风放肆拼命的吹不断拨弄女人的眼泪那样浓烈的爱再也无法给伤感一夜一夜当记忆的线穿杨过往支离破碎是黄昏占据了心扉有花儿伴着蝴蝶孤燕可以双飞夜深人静独徘徊当幸福恋人寄来红色分享喜悦闭上双眼难过头也不敢回仍然渐渐恨之不肯安歇微带着后悔寂寞沙洲我该思念谁当记忆的线穿杨过往支离破碎是黄昏占据了心扉有花儿扮着蝴蝶孤燕可以双飞夜深人静独徘徊当幸福恋人寄来红色分享喜悦闭上双眼难过头也不敢回仍然渐渐恨之不肯安歇微带着后悔寂寞沙洲我该思念谁仍然渐渐恨之不肯安歇微带着后悔寂寞沙洲我该思念谁
昨天晚上睡觉着,把电脑抱到床上,跟float聊了一会儿,她说要点名表扬我一下,因为我的blog上说了一些让她觉得要赞赏的话。好奇地熬到今天,去她的QQ空间看了一下,就抄了我三句话,不过也让我的虚荣心小小地满足了一把。 今天去买了机票了,11号的,去的时候6.5折,回来的7.5折,还是花了我2030个大洋啊,呜呜,越来越穷了。顺便去请了假,从12号开始请到17号,原来一直在等,等消息确定,自从知道小丫头被短信通知了后,我便可以心安理得、死心踏地地去请假去买机票了,今年,还是一个人走。所谓的人算不如天算啊!
今天下班后找小丫头一起去吃饭,等我走到百草园门口时给她打电话,说在等打针。我在门口等了一会,忍不住了就进去找她,原来是要打吊针。于是先出去吃饭,在百草园门口随便找了一家馆子,有粥喝就进去了。叫了个皮蛋瘦肉粥,一个黄金豆腐,还有个清炒生菜。除了生菜,另外两个的味道都不怎么样,黄金豆腐还都是用鲜蛋打的蛋花,晕! 小丫头不停地咳,还是带痰的。吃过饭就陪她去打吊针,吊了1个多小时。还说现在已经是有所好转了,前几天是还有发烧的,有一次去跑操,结果不行了,让一个男生背回去的,甚至连那男的是谁都不知道,长啥样都没看,可怜的小丫头。 小丫头说,她们部门已经给她发短信通知她不要急着找房子了,因为要被派到其它研究所去。呼~~~也许她在深圳,就只能再呆这最后一星期了。
小丫头下午发短信来,说在打点滴,病倒了。下班后给她打电话,本来想过去看看她的,顺便拉她去吃饭。这个家伙总是不想吃饭,还说医生说只要休息就行了。饭都不吃的人,休息有什么用。可惜她说要去上课了,于是只好作罢。
小丫头在大队培训,还当了个什么班干部,呵呵,这让我对人的性格决定命运这一论调更加深信不疑,像我这种人是绝对不会跑上去竞选的。她还说,当时因为在台上唱了几句,就选上了。我好奇地问,唱了什么。结果她唱起来,晕,小薇……还真有个性,呵呵。 昨天小丫头叫我上网找些配乐诗朗诵的东西,上网搜了一把,没多少,把能下的都下下来了,发现也才几十MB,刻个DVD也忒浪费了,于是把街舞教学的那些视频,加上K Mega Lite和千千静听一起刻了,刚好4GB。今天就给小丫头拿过去,本来说是到培训中心食堂找她的,结果她打电话来说,回百草园了。于是吃完饭,就走去百草园了,刚好身上也不带钱,就断了坐小巴的念头。刚走进百草园,小丫头就出来了。于是两个人一起往外走,去培训中心,小丫头还昏了头,走错路都不知道,呵呵。从她打电话的时间看,就知道她没吃中饭,这个家伙。还说带她去食堂买点吃的,结果走到教室门口的时候,好像里面有点事情,她就直接进去了。
在回百草园的335上,看着旁边闭着眼睛假寐的女孩,除了叹惜,实在想不出任何的神情和动作来表达我乱麻般的思绪了。 小丫头穿着浅绿色睡衣的样子真可爱。 唉! 前天,妈妈突然发短信来,说做了个很美的梦。梦见我带了女朋友回去了,我上班,婆媳俩在家带孩子。我晕倒,回说还早得很呢。估计我妈除了无奈,没有其它想法了。 套用某某人曾经很爱说的一句话:“大自然真奇妙!”
嘿嘿,小丫头说我只会记流水账,是啊,从初中开始,一直在写流水账,到高中的时候遇到一个比较宽容的语文老师,对于反应真实生活的文章,即使是没有文采的流水账,他也会赞赏,于是更加变本加厉,从此只会写流水账,哈哈!我这个没有文学素养的粗人,流水账也可以记录曾经发生过的美好和痛楚,平淡中见真知。哈哈,其实是借口啦,当然不像小丫头,一腔的忧愁、一肚的苦水、一堆的酸楚,化作让人心动的文字。男人不需要多愁善感,把所有的伤感和悲鸣藏在心底,带给对自己重要的人阳光和快乐。
昨天就发邮件打了个招呼,今天下班后,带着我的巨巨外置硬盘去了,想不到这位哥们的硬盘更大,是250GB的,比我的大了90GB,晕!电子书有20多个GB,看了看我的4个分区,本来是想放到专门放文档、资料的分区里的,一看居然只剩下8GB多的空间了,很奇怪,先不管了,放到另外一个空很多的分区里。后来才想起来,前段时间才用eMule下了17GB多的MAME ROM,还有很多其它的Emulator,当然占去了20多GB了。拷完东西,出来给小思宇打电话。把睡袋和垫子拿回来,小思宇说在收拾东西,因为明天就要回去了。真牛,她们领导也竟然真肯让她请假这么久,昏倒。 昨天晚上跟小丫头聊天,说了四五点原因,说得很沉重。其实我在想,如果在不远的以后的某一天,这几点原因中超过一半得到了改善,我可能还是会考虑、会继续。唉!
早上8点的时候,手机就响了,也不知道是谁,郁闷死了,一个打错的!然后想想就还是起来开始洗澡收拾,9点的时候出门,发了条短信。在梅林倒车,在金地花园下车。回忆一下当时走过的路,嘿嘿,还好还记得怎么走的。但哪个房间就忘了,只是依稀记得好像是10楼的,于是只好打电话问了,果然是在10楼的,呵呵。上去坐了一会儿,看了一会儿电视,都没几个台,因为没装数字电视,关外这点比较好,装了有线电视就可以收到好多个台。有个水电工在修下水管,下去买了个新的。过了11点半,说去吃饭吧,走到下面附近一个自助火锅,还真便宜,一人18元,锅底10元,哈哈,我拿了很多水果,吃了很多蟹肉。 吃完火锅,说去医院吧。于是坐到华强南,福田医院站,乱找了一通,总算找到了所谓的福田人民医院。走到体检科,玩了一下视力表,哈哈,我还有1.5呢。结果被告知下午不体检,只有每天上午8点到10点,郁郁地出来,既然都到了上海宾馆了,就逛一下街吧。去天虹、NICO、曼哈逛了,一直到5点多,累了,走进曼哈的麦当劳,买了可乐和鸡翅,亏了,没用优惠券,郁闷! 逛得腿酸! 突然想学一下make或bjam,或者两个都学一下。因为觉得用命令行只能每次全都编译连接一遍,有点浪费时间!写游戏还真是能学到不少东西,居然已经转换到这个上面来了,呵呵。
早上9点多时就被电话吵醒了,因为要来换抽水马桶。到了1点多的时候,很无聊,给小丫头发短信问她在干吗,然后决定去逛下街,就约好地点。比小丫头早到了大半个小时,说是堵死了,其实已经都到了,只是她不认识路。两个人逛了一会儿茂业,觉得买不起,于是走到曼哈,有些东西确实要便宜点。小丫头买了两件连衣裙,总共才花了315元,难得有这么便宜的女装哦!之后她也不想再花钱了,也差不多刚好到吃饭时间了。刚好找到这个机会有人一起去吃火锅,就跑去华神吃了一顿,浪费了一个白菜。2个人吃了142元。小丫头说,每次都是我请她吃,下次她请我,还说欠了我好多钱,哈哈。其实我就想找机会去吃顿重庆味的火锅,叫了雨烟好多次,均未果。 小丫头说我的blog写的都是方块,或者程序。我说偶尔也有写生活的呀,她说真的是偶尔才有哦。呵呵!
终于能连上来了,老泪纵横啊!这个时代,越来越依赖网络的时候,越来越不喜欢本土服务的时代…… 好不容易啊,终于可以在TImage上画线条了,晕死!剩下要处理的是,怎么把文件中的图片装成背景。还有就是,对于方块池和预览框,是大小固定的,不是用拉矩形框的,而是要跟踪鼠标的坐标直接画固定大小的矩形框。 下午,小丫头给我发短信说我们公司给她发录用通知了。说实话,就像我自己被录用那样高兴,昏。不过她肯定会犹豫,我当时不也犹豫了一会儿吗,后来还是乖乖老实地来了,因为我懒得再去花心思在找工作上了。不过小丫头现的情况跟我有点不一样,她是有正经工作的,要一个人下决心跳槽也许不是那么容易吧,不过要是换作现在的我的话,哪里给钱多,就去哪里呗,还追求理想么,干自己感兴趣的事?有点可笑的幼稚,理想是随时间和经历变化的,现在的理想就是想办法怎么赚更多的钱,赚更多的钱就是现在自己感兴趣的事!小丫头要是过来了,拿的钱会比我还多,晕!由此可见我混得多么失败啊,唉!
小丫头又跑到公司去上网了。我问她怎么就为了上网就跑过去了,她说想出来走走,顺便想写一下总结。然后两个人就东拉西扯了一会儿。其实我们聊的话题很少很少,每次我都是搜肠刮肚地想些事儿来说说,而且很多时候我发消息过去的时候,能预料到她会回复什么内容。我只是不想让它冷场,我不是不善言辞吗。小丫头脾气很大,出乎意料地对我破口大骂,我都开始怀疑是不是她的QQ被盗了。我还想我是哪里招惹到她了,会发这么大火,骂这么凶。不过马上,她说因为没人骂,就骂我了,我才舒了口气,原来我没招惹她。后来她快要下的时候,告诉我为什么她最近心情不好。其实我也是这样过来的,走出校门走向社会后,总会遇到一些以前没遇到过的事儿。然后谈起以前的事,心情超级沉重。小丫头是个固执而倔强的人,幸亏我们不谈恋爱,不然肯定会为一些其实不应该成为问题的事情经常吵架吧,呵呵。我也自认为有点霸道有点顽固有点小气,我想管得别人太多了,其实我完全可以不理会。 有点累。我用我的方式解决问题,但一定要得到有些人的认可才行。我不能忍受别人曾经对我的奚落、嘲笑和无视,我不会装作若无其事地坦然接受这一切,我在乎得很。我宁可重新另外找一个新的开始,也不愿再回头,乞求同情和怜悯。我对小丫头说,我的挑剔,来自于对自己的信心。还好,VC和GCC其实都不支持可变数目的模板参数的,那天是太紧张了,看到的其实是LuaTinker里另外一种奇怪的语法。hoho~~~
z3从下班回来,突然说公司要派他去北京长驻了。是,这变化还真快!本来他只是说要去北京出差2个月的,而且之前一段时间他也尝试在他们公司附近找房子,最后还是放弃了,说那边的房子贵,这边的便宜点。我当时还高兴了一下,因为我实在不是很喜欢一起住的人换来换去的。结果现在他居然要去长驻了,而他的房子也只能转租给别人了,还好那人也是以前的同学。 生活的变数真是大啊,我还不知道明年我会在哪里呢!我一直想的赚很多很多钱,然后回家养小鸡小鸭,但是这个大前提怎么满足呢。今天回到家,小丫头在QQ上,自从她搬了家后,就很少上网了,因为离公司比较远,而且住的地方附近比较乱。叫我帮忙给弄个word文档,大概就是一个普通大一计算机课的考试要求。要求还挺多的,为了找这样合适的文字还费了点精神。幸好这方面还勉强过得去,1个小时就弄完了。小丫头把那天一起去欢乐谷照的合影传给我,呵呵,我真的越长越丑了,小时候多可爱多乖的啊,郁闷,应该去剪头发了。 白天在公司,因为上周的一时热心,惹来一个麻烦的事儿。因为条件苛刻,真的很不方便。 把案例提交上去了。 接下来几天,希望能咬紧牙,先把我的方块搞定了。 我是个很浮躁的人!就这样生活吧。
排队排了n久,每次排好长的队,就为了那几秒钟的快感。我发现我的胆子越来越小了,还不如小女孩了,晕倒! 周一之前,要把TclSuck写完,那部分Functor实现了就可以了。
10月6日 虽然回来后没有马上爬到床上好好睡一觉舒服一下,还是整到2点多才睡,结果6点多就还是醒过来了,郁闷死了!然后起来打开电脑,照例听听歌,打打方块,看看论坛。后来想想还是把那些换下的衣服洗一下吧,就简单地搓了几天,清掉肥皂泡后,凉起来。估计9点多了,就出门去了。 上了328给小家伙发了个短信,小家伙还没起床呢!到了门口再打电话,说现在不准进来,晕,我就只好无聊地看看周围的环境,看看她们屋的电表转速,是那里10个屋里转得最快的一个。 好不容易等到小家伙出来,就一起去坐地铁到东门。这一天有点怪,地铁上一路几乎没人下的,都是上的,我郁闷,站了一中,到了东门都下空了!不知道从哪个出门出来,看到有个卖肠粉的店子,就进去权当作是中饭,同时补充早餐的欠缺,呵呵。我点了个虾肠粉,小家伙是香茹牛肉肠,又一人要了一份饮料。我倒是吃得还算爽的,虾是我喜欢吃的东西,冻奶茶也是很爽,就是那种从喉咙头一直凉到胃里的感觉。小家伙居然抢着把钱付了。 之后,就一起逛到太阳百货,逛了一下午,从底楼逛到顶楼,坐了一小会儿休息了一下后,又逛回底楼。从鞋类,看到少女装,再到化妆品,还有成熟淑女装。出来后,说去茂业看看吧,结果两个人都分不清方向。在一个天桥下,小家伙看到有卖水果的,说要吃,于是一人拿着一条哈蜜瓜咬着走,走到一个并非原本想去的茂业店里去了。又从底楼逛到顶楼再回下来,小家伙看到一件线衣,就在那里试试,最后要买了,顺便补了一句,买回去不好看就找你算账,说得我战战兢兢。 出来的时候,小家伙说累死了,我只好嘲笑说她不行,逛街都没有逛得厉害。又回到闹市区,我还是想找一下那个茂业,因为本来就跟同事们说好要在那门口集合的。小家伙又想去逛那些地下商场,草草地走了圈,在卖耳环的地方,小家伙就会停下来看,最后在一个铺位上我说一对挂的很多圈套在一起的好看,很适合,老板要价35,我随口说了句20吧,老板开始还说不行,小家伙就放回去了,老板就说好吧好吧,唉,这些生意人。出来后小家伙还埋怨我,本来想喊15的,我就很委屈地说,我以前没买过这些,又不知道它的行情,我只买过×10的那种价位的。 终于,在又走错几个路口后,找到了那家茂业!从-1楼开始逛,小家伙说要买靴子,看到一个3.8折的,小家伙还是比较心动的,但后来还是没下决心买。在茂业逛了很久,小家伙也试了几次衣服,但是都没买。我给妈妈打了个电话,其实是记错了,以为是周六了,但反正是中秋节,打个电话也是应该的。开始还想等xcc过来了再打,xcc刚从杭州旅游回来,还在回家的路上就给我打电话说要来找我一起玩,我就想,到时候妈妈问我在干吗,我就说在逛街,妈妈问跟谁在逛的时候,我就可以说在和xcc一起逛。小家伙说,你就说跟个女的在一起逛!我说我妈会很严肃认真地来搞“政审”的,会要跟那女的说话,打听那女的家庭背景,学历,收入水平等等等等。结果等不及xcc来了,我就打了,妈妈问我在干吗,我说在逛街,妈妈问跟谁在在逛,我说还在等几个同事过来,要一起去吃饭玩。6点半过的时候,同事们还没来,小家伙又去看那些小玩意的店。又过了一会儿,教授给我打电话,说在茂业门口了,我就过去,看到悍超他们都在。我过去对疯丫头说,你家属呢,怎么不牵他手啊,然后她就说,你怎么不牵你家属手啊,我说我要牵你们的手的啊,哈哈。 走到对面的小肥羊的隔壁的野山菌汤锅,开菜了一会儿,xcc才赶来。大牛的mm在坐我们对面,要我介绍一下。我看看小家伙,小家伙有点语塞,说你来介绍吧。我就说,某女人啊,从路上捡来的。大牛和他mm也不多说了,呵呵。十五六个人吃了,个人感觉口感还过得去。吃过后,一群人就去本色酒吧,有两张桌,都玩起摋子来。去蹦迪的地方看了看,太多人了,我变得很想回去学一下跳舞,至少不要像下面这些人一样,全都只会这样小幅度扭动一下腰。 12点的时候,小家伙说要回去了,因为第二天还要上班。于是xcc也跟我们一起走了,xcc打算去我那里睡了。一个新手司机在那深南路上转了好久,好远的路,才到了目的地,呵呵。结果问了一下,居然第二天不用上班!看到她们屋里多了个男生,听说还是和我一级的我们学校计科的,晕,没印象。一群从同一个学校出来的人在那里聊了一会儿天,我就叫小家伙一起去我那里,顺便把和她一个屋的我的一个师妹也叫上。 4个人先打的到梅林,吃了顿海鲜大排档,然后再打回我住的地方。玩了一会儿,都5点多了,于是我和xcc到隔壁房间睡了,这房间的兄弟只住了几天就出差去了快1个月了还没回来呢,呵呵。10月7日 早上大概才8点多吧,xcc就把我吵醒了,说要去买菜,我实现困得不行,死撑到9点多,起来看电视。我的所有的东西都在我的房间里,而她们两个还睡着呢。过了一会儿,实在忍不住了,就敲门把她们叫起来。我洗漱了一下,就和xcc去菜场买菜了。 买了些排骨,精肉,葱,小白菜,番茄,鸡蛋,剩下的,就都交给她们两个全权处理了。不过我还是做了些淘米之类的简单的活,呵呵。一直到下午2点左右才全部做完,可以吃了。味道真不错,呵呵。吃完后,小家伙还把厨房、客厅的桌子柜子使劲收拾了一遍,涣然一新!心里感慨万千……(此处省略N万字心理活动描写,N≥5)我挡不住了,就跟小家伙交待了一下,去睡午觉了。一直睡到5点半,起来,小家伙们也起来了,回去了。又过了一会儿,和xcc两个人烧了一点饭,热了一下汤,把晚饭也吃了。后记: 这样的生活我还是比较向往的,就是简单的居家,然后能和一些人一起去玩。可是,大部分的时间,我们还是在忙碌于工作,为了那点点生存需求而拼命。
Category CPPOOPGPXP
Clang for Windows早已经可堪实用,官方每隔一个月或几个月会发一个编译好的snapshot外,msys2项目也提供了不是特别新的版本(目前9.0.1)可以直接通过pacman安装使用。作为一个升级控,用上Nightly Build岂不是更爽!当然这不是官方的,而是需要自己下载源代码进行编译。
英文原文:https://www.modernescpp.com/index.php/thebigfour
C++20,近十年来最具影响力的C++版本,完成了!
原文:https://www.reddit.com/r/cpp/comments/f47x4o/202002_prague_iso_c_committee_trip_report_c20_is/
前段时间开了一个微信公众号《软件开发谈》,可以通过搜索ID“softwaredevtalk”找到,也可以通过扫描文末二维码找到,主要发些与我本职工作相关的Go、C++、软件工程方面的文章。到目前为止发了十几篇文章都是罗列了些modern C++的新特性:
之前已经在Windows上用clang编译Qt程序,但当时的Qt Creator并没有好好地支持,所以需要在控制台上直接使用命令行进行编译。今天偶然发现最新的Qt Creator已经支持clang-cl套件了,试了一下效果不错。
Go语言中有defer可以在退出当前作用域时执行一个函数调用,C++中以前常用的做法是创建一个类的对象,在该类的析构函数中写入需要执行的代码。而这个对象可以创建在栈中,也可以放在std::auto_prt<>或std::unique_prt<>之类的地方,只要退出作用域就会被销毁就可以。这在网上能找到不少的讨论,比如C++之父的这段,C++ Core Guidelines中的这段,以及Cpp Reference中的这篇。
几年前也曾经试图折腾过Clang on Windows,那时候的完成度还不高,只能配合MinGW使用,而且头文件搜索路径还是源代码中硬编码的。
C++11加入的lambda表达式是一大进步,大概这样用:
公司的项目至今仍在使用Boost 1.56.0版本,最近发现Boost.uuid在Windows上居然会一直尝试去访问/dev/urandom,进而转移到系统盘根目录urandom文件,然后客户认为这会有安全隐患,需要修正。我随手看了一下Boost.uuid在1.56.0和1.64.0上的源代码,貌似确实1.56.0版并没有分系统实现,在1.64.0上为Windows系统使用平台特有的实现。于是我就建议升级Boost,然后发现这个third party的owner居然是我们组,同事开玩笑地问我能不能去为几个平台编译一下Boost,我当场就拒绝了,但回到家我还是决定折腾一下。
之前提到过我用MinGW版本的Qt遇到几个问题,现在基本解决。
很早的时候,“道祖”Andrei Alexandrescu在“道经”《Modern C++ Design》中就有个简单的小结,列举了C++(当时还是C++98)中的可调用体:
项目组有定期的share,这个活动的负责人前些天跟我来说,让我讲讲C++11的东西,我说我也不懂啊,她说可以给我多点准备时间,书可以让公司买。
这两天在Windows下折腾clang。这东东前端是支持C/C++/Objective-C/Objective-C++,后端一般是用LLVM的。在Mac OS X上貌似用得很好,可以生成OSX和iOS的app,貌似在Linux或FreeBSD上也支持得不错的样子,不过在Windows上就纠结了。
首先,clang还是依赖gcc的crt和headers的。于是在Windows上基本上是用MinGW套件的。但是同样是MinGW,不同的人都能编译出不同的东西来,版本众多,质量也不同,貌似还是MinGW官方编译的版本最为稳定,MinGW-w64的x64版本貌似就压根编译不了clang。
众多32位版本的MinGW都可以编译clang,但是,编译出来的clang貌似就是能自举了,真是遗憾,也不知道是不是我哪里弄错了,4.4.0版本是报BFD模块中有个内部错误,4.6.3版本是在链接时报错,4.7.x版本则是编译第一个文件就报命令行参数错误。
我是在msys中编译的,值得提一下的是,它每次都要做rebuild all才行,incremental build貌似是不行的。还有就是perl中的pod2html.bat在msys中是用不了的,所以在make install时都会报错的。
最后要注意,编译clang前,需要修改下llvm\tools\clang\lib\Frontend\InitHeaderSearch.cpp中MinGW的头文件搜索路径。最简单的办法是硬编码增加搜索路径,但是这样你的MinGW和clang就只能存放在固定的位置了。我看了一下clang dev去年4月的maillist中一个thread,其他他们就是没找到一个高效低成本的方案来解决这个问题。于是我就自己用了一种quick & dirty的方案。先查找clang所在目录是否有gcc.exe,没有就找PATH环境变量中有没有,再没有就试试各个分区根目录下有没有mingw目录,如果能找到gcc.exe,就运行gcc.exe -v命令,得到target和version,这样就可能得到搜索路径了。自己写了大约200行代码,粘贴到这里了。
今天彻底打酱油了,我们shared dev team也只剩下我,老大和Jason三个人了。因为晚上2点才睡,才睡了不到6个小时,于是下午就坐在办公椅上睡了近1个半小时,最后是被他们讨论一个bug的声音吵醒的,啊哈哈,老大还说让我看一下,现在只有我在这方面有经验了,我囧,我完全没经验的说,后来还是Sherman厉害啊! 再后来,就跟老大讨论了一会儿C++ singleton的实现,以及跨DLL数据引用等等。问题是有个Watson的bug,我从一次crash的call stack中发现,程序在调用_exit后,该程序中的static object应该是已经瞬间被无声息地干掉了,所谓无声息的,就是说,连它的析构函数都没被调用的。但这时嵌入的CLR还需要做一部分扫尾的工作,而恰恰是这扫尾工作又反过来调用了那个貌似已经被干掉的static object,于是程序crash了。当然这只是我的猜测,我猜测嵌入的CLR就是要生存周期长一点,于是一直在代码中试图找一下它是怎么从C++端嵌入CLR的,然后怎么用CLR的。我发现的情况貌似是这样的,先用Managed C++写了一个dll,这个dll可以在DllMain,还可以导出函数,而据我前些天才知道的知识,.NET编写的普通的DLL形式的assembly跟原本的DLL不一样,没有DllMain的。而这个DLL通过导出函数返回一个对象的指针,这个exe程序通过GetProcAddress获取导出函数,再调用这导出函数获取对象指针。这个返回的对象呢,是个CLR Bridge,也就是说,通过这个对象,可以从C++端创建CLR中的对象,调用CLR对象中的方法等等。也就是说,从代码中,我没看到Jeffray Richter在《CLR via C#》中说的那种CLR host的方法。现在我仍然在怀疑,是不是我代码没看全,但我确实之前也在整个代码目录下搜索文本,没有那几个用于host CLR的API调用。似乎有点跑题了。然后我就跟老大说了一下我发现的这些情况,略微讨论了一会儿,老大表示自己也不知道,唔,其实我也不指望他知道,只是有这么一种想跟人分享自己的发现的欲望而已。基本上,我就觉得这很可能是此bug的root cause了,但老大说可能只是个cause,而不是root cause,好吧,其实就是缺少验证而已。一个比较有说服力的验证方法是自己用C++写个小程序,然后用相同的方法调用CLR中的代码,最后能制造出同样的crash,只是我最近木有动力去做这些事而已。另外就是,即使确定了这是个root cause,简单地说来,这个root cause应该就是对象销毁的顺序不对,这是可以肯定的,但之后也不好fix,因为这个程序实在太庞大了,有很多对象,然后引用关系也很复杂,以我目前对它的了解程度,根本没能力对理顺这个关系,于是也就fix不了了。而且还有个另外的问题是,那个static object是该程序中用于实现singleton的一种方式,我觉得比较奇怪,老大说,这是为了应付多线程的情况。还有种应用多线程的singleton实现方式是在create instance时加锁,唔。关于这个话题,在前段时间看到TopLanguage group中有个讨论,提到boost中某个库中的singleton实现,貌似很干净的实现,不用锁,也不是static object,能适应多线程,囧,具体的不记得了,貌似boost中有好几个子库中都有自己的singleton的实现,得再去看看代码才行,另外好像《Modern C++ Design》里也有对多线程singleton实现的讨论,春节放假看看去。 话说,今天还看到Mono,发现除了有Mono Touch外还有Mono for Android,不过免费试用版都只能在emulator上跑,最便宜的个人版license也要399刀。不禁大骂Qt的不给力,为毛只能为Symbian和MeeGo用,Android port至今还在alpha...