zheng's profile大猫鱼类加工厂PhotosBlogListsMore Tools Help

Blog


    October 06

    一本软件工程的好书

    不敢独享,拿出来给大家一起看。

    作者你就委屈一下吧,窃书不能算偷是不是~

    林锐:《软件工程方法》

    只有98页,写得相当地好。如果你大学学了软件工程但是还不会做,那就说明你白学了。看了这本书,你可能会觉得茅塞顿开,原来是这样的啊,看来以前的软件工程没白学,还是有用的。


    October 05

    我们公司做什么

    有人反映,还是没弄明白我们公司到底是做什么的。说白了,我们的产品很类似于.net。Qt是一个夸平台的类库,提供统一的界面,统一的接口,无论是unix, windows, mac osx,都不用修改,直接可以编译。相比之下.net的跨平台就弱一些,只能在windows上跑,不过.net的优势是它能够跨几种语言,虽然也都是微软自己的语言。Qt只支持C++,但是,因为C++太经典了,大多数高级应用都是用它开发的,所以这也不是一个大的缺点。而Qtopia是Qt在手机和PDA上面的移植,目前只能支持Linux Embedded。对应的产品是.net compact,它要比Qtopia成熟很多,而且应用也广得多,因为现在Linux手机还不够流行,而Qtopia也刚刚处于进入市场的前期阶段。

    Qt里面包罗万象,十几年的积累,从简单的QObject,到线程,复杂的数据库接口,OpenGL,所有能用到的东西几乎都给你包装好了。不过说实话,没有.net用起来那么方便自然,C++的繁琐语法和可怜的开发环境让Qt吃了不少亏。而为了跨平台,也不得不牺牲很多功能。

    总地来说,Qt/Qtopia还是太过简单的,这不符合Unix程序员的风格。Unix程序员都是大牛,要么只写命令行程序,要么从Object开始写 Canvas然后写Button这样写GUI,还一定要加入Plugin和ActionScript,而且与平台无关的特性也阻碍了大牛们展示他们对系统 的轻车熟路,所以,Qt在Unix上还是一个大玩具。

    其实真正需要跨平台的应用并不多。Qt的老家在Unix上,对windows的支持没有那么好,设置也比较复杂。我想大多数在windows里使用Qt的人,是为了给自己一条后路,万一哪天微软真的垮台了,也能很容易地成为一个Linux GUI程序员。
    September 26

    重新看C++

    这本书以前是看过的,可能是第二版,不过后来嫌太厚,又觉着里头的东西很没劲,就扔一边儿了。现在拣起来,发现真有意思。这本书就是C++ Premier。

    此书号称C++的圣经,自然有它的过人之处。最主要的特点就是全,几乎所有C++内容都有,简单的一笔带过,复杂的高级的技术详细阐述。就这样,中文版还是有1000多页,我跳着看一天也就看了50页左右,因为每页都是精华,没句话都话里有话,是为好书也。

    看了书才知道自己志大才疏,做了这么多年的C++,有的时候该用私有还是保护都弄不清楚,随便写个操作符重载都编译不过去。这些底层的东西已经被华丽的界面和IDE掩盖太多年了,而要更上一层楼,这些东西是无论如何也绕不过去的,越往高处走,就越接近机器,这是普遍规律。

    打算重新恶补一下我的C++了,不能继续被IDE愚弄了,我现在算是明白为什么用vi才叫程序员了,因为只有用vi的人才会控制机器,而不是让机器牵着鼻子走。

    附上这本C++ Bible的中文版(4.6MB),愿早日有更多的程序员可以读懂它:

    http://www.vrcat.com/cppp.pdf

    转贴,这哥们说的真好

    这儿不适合贴带代码的段落,自己去csdn看吧。

    改变自己编程中的思维方法(知难行易)
       转载来自:robertb9527
       原文出处:http://dev.csdn.net/article/44/44786.shtm
    September 25

    真正的程序长什么样儿

    最近一直都在琢磨,我自己的开发风格是不是有点弱。

    按理来说,咱也算是开发过大中型软件的人,不算高手也算个快手,但是真刹下心来看看牛人写的代码,觉着自己差得还远。以前总觉着牛人写的东西不好懂,太繁琐,过于小心谨慎,现在越来越觉着自个儿错了,人家那叫稳健。一直都做小项目,培养了一身的匠气,总是想办法把一个东西做得小巧精致,还以精自居,以快自得。这是典型的日本人做法。这可以把一个小东西做得尽善尽美,无可挑剔,但是当你要重用的时候,可能就傻眼了。

    面对真正的软件开发,这其实是一种陋习。真正的系统工程要讲究两个字:传承。大型软件绝对不是几个人灵光一闪就可以一蹴而就的,一定要踏踏实实地从需求开始,考虑到各种需要和限制,设计出一个可以经久不衰的框架,然后慢慢在其上增添,继承,演化。如果一个软件能用,它其实只是成功了一小半,当它可以重用的时候,才是真正成功的软件,而如果它的框架恰好能够包容新的技术和观念,那就是相当成功的软件。设计成功的软件需要多么强的前瞻力和创造性,不言而喻。

    如果你设计了一个系统,当需要升级的时候,发现还不如重新写一个新的,那就彻底失败了。我所知道的很多国内的软件公司都是这样,从不吝惜抛弃以前的代码,总是周旋于新的系统之上。这样虽然很舒服,但绝不是一个好的方案。新开发的系统来不及除错,就已经过了生存期。正确的做法应该是开发一套良好设计的、拥有最低功能的系统,然后不断升级,同时修改原有的错误,保证每加入一行代码,都是正确而且有用的,这样最后才能拥有一套健壮的,柔软的软件。如果一开始就贪多求快,开发出来的东西将会是不可修改当然也不可重用的。

    我在国外看到许多Dos下的程序,现在还在用,版本已经到了十几,这决不是国内软件公司可以想象的。然而,这些程序工作得非常好,没有错误,虽然界面不好看,至少满足了商用的基本需求。如果我是个生意人,我也怕我的Windows XP会中毒,会崩溃,如果能选择,也许我也会选择用经过时间考验的Dos软件。

    做好的软件就好比盖高楼,每天盖一座平房,盖得就是再漂亮,也不过是一两层高而已,要盖万丈高楼必须从底层开始就有个翔实的计划。盖第一层的时候就得考虑到第99层,这叫大家风范。

    一句话,软件开发不是系列剧而是连续剧,不可能每一集都从头再来,说白了还是那两个字,传承。


    September 20

    C/C++究竟还有什么用

    其实这个问题我思考了很久了,最近总算想出了个初步的结果,写在这里抛砖引玉。

    根据我的知识能接触到的范围(有很多语言我还是听过没用过),我把目前流行的高级语言按语法大概分为三个大类,C,SH,Basic。C下面有C++, Java, C#, 等等,SH下面有Perl, python, Ruby, PHP等,Basic就只有VB/VBA和ASP,也许Matlab也可以算,不过估计不久之后可能也会像Pascal系那样慢慢被取代掉。当然里面最火的还是C系的语言,据我估计,以后的竞争可能也就在这个系列里展开。

    即使对于C语系下面的集中语言,对于不同的应用,也有不同的优势。C看起来似乎已经要被C++完全取代了,但是事实上,一些高性能计算和对效率要求特别高的低级程序里,C甚至汇编还是必不可少的。C++编译器再优化也还是有一层面向对象的壳儿,而C可以针对某一范围优化到非常接近汇编的效率等级。

    Java在若干年内一直被C++程序员称为玩具,但是最近的发展让人瞩目。Java的类库积累已经基本完成,可扩展性和多能性已经可以和C++有一拼了。但是Java有一个硬伤是无法治愈的,那就是效率。对于普通应用的性能要求来说,Java只能说勉强够用,稍微苛刻一点,就玩不转了。甚至对于稍微复杂的桌面图形应用,Java都慢得无法接受。虚拟机的设计是这种问题的根源,但是如果丢弃了虚拟机编译成本地代码,Java就成了C++,而且还面临另一个两难选择:是否使用非通用的系统调用?使用,则失去移植的能力,不使用,性能还是打很大折扣。这是Java设计上的东西,也是Java这么多年一直没能打败C++的原因。微软是很会审时度势的商业机构,看到了Java为了兼容付出的庞大代价,打死也不肯把.Net移植到Unix上,要是真移植过去也没什么意思,谁会喜欢一个在Unix上慢得跟Java一样的C#?

    硬件平台是不同的,操作系统也是不同的,强求天下大同的的代价太巨大了。计算机还没有,也许也不会发展到计算资源远远充裕过应用程序的时代,充分利用计算资源仍然是今后几十年软件开发的主题,快速开发的突破口在人工智能,而不是在简单的统一和简化人类使用的开发工具。尽管C++难度很高,容易出错,开发速度慢,管理维护困难,类库版本众多,兼容性差,但是性能上的一俊已经遮掉了这百丑。从C89到C99,C++进步有限。C++不是不想进步,而是在再三权衡之后,发现目前发展的方向并不正确,因此,选择了以不变应万变。

    以后的大型软件,应该还是C++的天下。而其中对性能要求苛刻的部分,可能还会用C或者ASM来写。C/C++应该还是一个真正的程序员必修的内容。

    June 30

    整整三个礼拜啊,我终于出关了

    这三个礼拜一直都在看msdn,好不容易囫囵吞枣地把.net framework看了一遍,这还是把,现在心里算有个谱了,闹了半天就这么点事儿,微软的人还真能写~
     
    差不多俩月,连看书看msdn带做程序,基本算把.net 2.0和C#拿下了,回头琢磨琢磨,好像没学会啥,这不就是Java么,带了一个好看的IDE。
     
    不过我也真佩服微软,一样的东西,SUN做起来生涩难懂曲高和寡,微软就能把它做成卡拉OK。凭良心说,.net比Java还是有相当飞跃的,从效率上看,它的虚拟机也要远远胜过Java的。尤其是.net 2.0里头对界面的包装,让人眼前一亮啊,虽然有些东西其实设计得比MFC还繁琐,用VS开发还是可以接受的。数据结构虽然弱了点儿,但有多少人做程序会真正去用到数据结构呢?真正有这个需要的人,也未必看得上包装好的东西。虽然C#已经太像Java了,但是微软还是怕不能俘虏更多Java用户,开发了一个J#,甚至做了一个工具,可以让你把Java程序转换成C#,稍作改动就能运行起来。我有点开始为Java的前程担心了,眼看着越来越臃肿bug成堆的JDK,免费和通用带来的好处可能已经被低效繁琐抵偿了。要是真出了UNIX .NET FRAMEWORK,说不定就成了压死Java的最后一根稻草。
     
    .net framework的确很强,包装得也相当完美,只是对异步的支持还有空间,可能还没想好怎样包装最好吧,也许是用户不那么多,不愿意费那个力气。对XML和分布计算的支持看得出花了很大力气,但是,说实话并不那么好用。为了保持和标准的兼容,放弃了很多东西。其实在我看来,分布式计算很少有真正必须跨平台并且使用多种语言实现的,开发一种简单易用的在微软产品之间兼容的解决方案也许更适合大多数人的口味。慢慢的,简单的有效的东西就成了标准,复杂的标准就成了学术和历史。
     
    接下来,打算开发几套想了很久的东西。
     
    之一是琢磨了很久的一套办公助手软件族,之二就是一套用于WEB开发兼容多种script的IDE。
     
    NetMonitor发现了一堆bug,手里还有工程没做完,很忙,很忙。
     
    May 12

    调试完毕,NetMonitor正式Release~

    终于搞定了,顺利修改了帮助文件,Beta1现在开始Release,请列位朋友下载试用~
    发现问题请回复本贴,我会尽快修改。
    文件大小:约5M(我已经尽量减肥了,但是MFC7的链接库实在是太大了,好在下这么一次,以后应该就不用重复下了)
    占用资源:内存约2M,CPU约小于2%,平均小于1%(我的是Celeron 2.6G)
     
    至今为止,NetMonitor已经在我的电脑上连续运行了5天4夜,一切正常。
     
     
    Powered by VRCAT.COM
     
    软件功能介绍:
     
    NetMonitor可以实时检测你某一块网卡的网络流量,通过任务栏图标和窗口曲线表示出来,让你随时了解网络带宽的使用情况。它并能统计此网卡上的总流量,以便你掌握你所使用的总上传下载配额。软件安装后随系统一起启动,后台运行。
     
    以后还将加入更多辅助功能,如自动关机,流量分析,资源监测等。
     
    本软件和xp任务管理器中网络监视程序的区别:
     
    1. 必须承认本软件目前某些功能不如任务管理器完善。
    2. 本软件可以自动运行,后台监视网络流量,而你不太可能整天开着任务管理器
    3. 本软件可以实时显示网络通信速度,并可设标尺大小,任务管理器最小化到任务栏后,只能显示cpu占用情况,无法显示网络相关的信息。
    4. 本软件可以把每次使用的数据自动存盘,下次接着计数,这样到月底你就可以查看和统计自己的流量数据,以后还将提供更加详尽的统计功能。任务管理器不能存盘,统计更无从谈起。
    5. 本软件其实就是为了弥补任务管理器的某些缺点制作的,所以功能肯定会有一大部分是重叠的。
     
    关于不是绿色软件:
     
    安装程序是用微软的安装项目生成的,为了照顾所有的用户,把可能需要的链接库都带上了。对于有了mfc7.1以上和unicode库以及MSC Runtime 7.1的用户,只需要下载可执行文件就可以用了,大约只有124kb。帮助文件有373kb,但是没有帮助文件一样可以正常运行。
     
    感谢大家对本软件的关心和提问,您的问题就是我改进的方向,呵呵
    尤其多谢摩人,哈哈哈哈
    May 09

    Net Monitor一直没能Release

    软件基本已经完成了,帮助都做好了,但是还没法Release,主要的原因是碰上了资源泄露。运行一阵子就说无法获取所需资源,估计是DC或者Bitmap,Icon之类的没有正常释放,十有八九是DC。但是仔细看过所有的DC代码,都释放得很好,申请和释放都是成对的,也没有用错DeleteDC和ReleaseDC,返回的也都是true,可就是运行的时候出错。只有一个办法了,那就是万能调试法,屏蔽代码。最后差不多确定泄露点就在动态生成图标的地方,下一步就得一行一行地排查了。
     
    我把所有的函数加上出错处理,发现出问题以后,先是DC无法分配,然后是Bitmap无法分配。于是我把重点放在了排查DC和CBitmap的释放上。
     
    这是一次非常艰难的调试,因为资源泄露发生在数万次操作之后,不可能跟踪,只能尽量把速度设快,每秒几百次,也要几分钟后才会出错。查来查去,发现我对资源的释放完全正确,没有任何问题。最后锁定在CImageList.ExtractIcon函数上,因为如果屏蔽了它,问题就不存在了。后来我又发现不对,好像替换成LoadIcon还是存在问题。我觉得有点不对劲了,如果是函数内部的问题,不应该这么疯狂,有问题我也应该差不多查出来了,难道是调用它的上一级函数的问题?我去看看,上一级直接调用了这个GenIcon函数,把返回的HICON送给TraynotifyIcon结构,会不会是这里的问题?姑且修改一下,生成另外一个HICON对象,使用后再DestroyIcon销毁,哎呀我的妈呀,错误消失了!虽然如此,我还是一知半解的,分析了半天,可能是因为HICON句柄被trayicon抓住,所以函数无法正常释放它,所以造成了icon资源的泄露,因为icon是等同于bitmap的,所以引起了Bitmap资源的耗尽,进一步引起了DC的耗尽,所以才会表现为无法分配DC和CBitmap。这个错误还真是隐藏的够深。
     
    函数里面出错,错误却在函数的调用者,这是我有史以来碰到的最难调试的错误之一了,看来我的C++和Windows底子还不扎实。
     
    这个故事同时告诉我们,你的领导犯了错误,有可能背黑锅的是你啊~
     
    April 12

    又一次重新审视OO

    感觉好像不认识,这玩意儿还真他妈的博大精深~
    March 17

    不写程序脑子会锈

    很久不写程序,人的逻辑思维就差了,而且经常会丢三落四,记忆缓冲区越来越小。
    为了训练大脑,同时方便大家监视自己的网络运行情况,我写了一个小工具,用来显示当前网络连接的上传下载速度和总流量。现在程序已经写的差不多了,过两天release。
    这是一个小截图,里面左上角第一个就是我的程序,主窗口平时是隐藏的,点这个图标就会弹出。蓝色和红色分别代表上传和下传的速度,数字是总速度。
    December 30

    闲来无事,写个好玩的拖拉机

    手痒,加上上一阵子想玩升级,到处找遍了,也找不到一个能炒地皮找朋友外加打5副牌的拖拉机程序,一气之下自己写一个。
     
    动手了才发现其实并不简单。
     
    先试图盗窃联想牌拖拉机的图片资源,发现加了外壳,找解壳的程序,未遂。幸亏后来找到了一个没壳的版本,轻松用resource extractor盗窃成功,避免了自己画牌的麻烦。其实要真是自己画,可能还更快一点儿,可咱就是享受这偷的乐趣,自己画的不如偷来的香。
     
    接着就开始写拖拉机的逻辑。奶奶的,这升级看似简单,其实规矩倍儿复杂。光是一张牌比大小就得判断是不是主牌,是不是定主,一个系列的。想要完美定义还真得做一复杂系统的数学模型描述。想想符号数学的一批定义和运算我就要吐了,我决定多写几百行if then了。
     
    我定义了俩类,一个CCard,一个CCardSet。CCard重载了><==操作符,因为单张牌比较简单又常用。另外还有两个初始化和判断是不是主牌的函数。CCardSet要复杂一些,有判断花色,主牌,增加删除单张的函数,还有比较大小的函数。本来也设计成操作符重载的,后来仔细想起来,不对啊,其实比较两组牌是与第一个出牌的人的模式有关的,所以这个比较应该是一个三元运算,不能用二元的<>==简单表示。于是定义了一个普通的三元比较函数Beat,根据第一个出牌者的模式来比较两组牌的大小。比较大小的函数写完,逻辑基本上就有框架了。
     
    说起来简单,其实比较函数非常复杂。因为升级的牌组里面存在二义性,同一组牌,可能有很多种解释。出牌的人必须给出相应的解释,这样后面的比较才能进行下去。另外,两组牌按同一模式比较也可能存在多种解释方式,唯一的解决方案是做一个大回溯算法,把所有的解释都过滤一遍,然后找最强的一组作为答案。这个回溯算法可以说是多副牌升级的逻辑核心。目前我还停留在这个算法的设计阶段,估计能做出来,但是得花些功夫。
     
    做到这,我突然想到,我不应该着急开发图形界面。逻辑和界面应该是弱连接的,这样能大大方便将来的移植和修改。比如将来我开发了一套三维的图形界面,直接套用到逻辑上岂不美哉?测试的时候用命令行敲就成了,图形界面花唿六哨的,没什么技术含量,谁做不行啊。不过图形界面和逻辑的接口还没怎么考虑好,用Com/DCom或者是Webservice其实都成。
     
    展望一下未来给自己打打气。我这拖拉机做成,应该至少能支持100台以上的npc,或者是100个以上通过direct play连接的用户同时玩100副牌以上。支持炒地皮,找朋友,以及其他我还不知道的变态玩法。支持图形界面的二次开发。
     
    按照规矩,还得给自己点提醒儿免得头脑过热。逻辑开发成功只是第一步,人工智能的制作才是重头戏和难点。根据概率预测的模型虽然简单,但是效果未见得会好,加上心理分析分类也许能强一点,不过也未必好到哪里去。如能采用类似于象棋那样的穷举探索预测,可能会有比较好的效果,但是效率可能又是一个问题,毕竟人类的直觉是模拟不来的。
    December 20

    VC自己写类的一些高级技巧

    最近开始捡c++了,很多荒废了多年的小技巧都重现在眼前,让我觉得熟悉又伤感。赶紧记下来,免得以后一捡再捡。
     
    1. operator重载必须声明为friend才比较方便,否则相当麻烦
    2. static变量一定要在filescope内初始化才可以,在相应的cpp文件内初始化可以避免重复include引起的lnk2005错误
    September 14

    好久没有开发软件了

    今天找到一个不错的题目,规划规划,看看能不能打发一两个月的时间,顺便赚点儿小钱
    July 01

    琢磨着一场编辑的革命

    越是研究,我就越觉着这个latex不是个东西。
    Latex的语法实在是太不规范了,这是我今天写latex2xml和xml2latex这个东西时候的一个强烈感受。为了照顾写作者的习惯和方便,latex彻底放弃了正规的表达方式,掺杂了无数种作为自然语言看来都歧义百出的命令。我现在算明白了,为什么miktex一个安装包要400多兆那么大,可能大部分的空间都用来兼容那些例外和冗余了。
    花了20分钟,琢磨出来一个转latex到xml的规则。Latex大部分命令的特点,就是有头没尾,也就是说省略了关闭标志。如果找到并添加了关闭标志,转换就是一个顺理成章的事了。所以,转换的关键就是发现关闭标志的位置。但是,latex存在多重命令的嵌套,而且嵌套关系非常复杂。也就是说,latex的命令是存在优先级的。为了正确处理嵌套,命令的优先级必须首先被定义。定义了优先级以后,就可以用一个递归的程序来处理所有的问题了。有了优先级,关闭标志的位置就可以用一条简单的规则来描述:一个标志被关闭,当且仅当在它后面遇到一个优先级不低于它的同类标志,或者达到文件末尾。
    然而,latex的设计者并不是像我想的这么聪明。如前所说,大部分命令是有头没尾的,少数命令却能够颠覆这个规则。比如\begin{} \end{}对,这个用来描述环境的,就是一个例外。这使得latex跨越了简单脚本语言和复杂语言的界限。一个为了机器处理方便而定义的语言,最终变成和自然语言一样复杂的命令串,人也看不懂,机器也难解析。为了这些有头有尾的命令,我思考了很久,最终没什么好的主意,只能为它们添加一批例外,并设置特殊的优先级处理方式。
    后来我想着想着眼睛突然一亮。我一直忽略了一个问题,就是为什么latex的用户这么少。Latex绝对是好东西,用过的人都说好,但是上手的确不是那么容易。这么复杂而杂乱无章的命令和八股实在是latex的痼疾之一,也许是最大的问题所在。那么,为什么我们不能定义一种替代latex命令的script,把这种script定位在用户和底层之间,就好像c于用户和汇编之间一样。这种语言可以遵循非常漂亮的语法,可以定义非常容易理解和使用的宏,可以兼容方便的图形界面,可以做任何我们喜欢做的事情。这种语言可以简单地是翻译成xml的latex,当然也可以是一种非常高级接近用户但对用户透明的表述。它甚至可以对开发者都透明,我们不需要能看懂它,也不需要直接修改它,我们可以在图形界面上完成一切。
    说来说去,这不成了word了么,哈哈,我可不想做那么复杂的东西。不过有时间有精力的话,这个东西还是可以尝试一下的,也许它能改变编辑和出版的面貌呢。
    June 22

    Latex语法分析器

    Latex编辑器的关键字高亮部分原来是从网上找得一个小示例,我改了一下,让它支持多种颜色的标注。但是后来我发现,这个程序有根本的问题,只能按照空格分隔的自然单词来标注,无法识别语法。我想了很久,这个东西修改很麻烦,效果未必好,干脆推翻重起炉灶。

    翻出大学时候学的天书课编译原理从头看,真是跟佛经一样高深莫测,有限自动机,闭包……我都想不起当年考试怎么混过去的了,呵呵。看着看着,突然想起latex的语法好像没这么复杂,杀鸡何必用牛刀?不如自己先写一个小的语法分析器看看。

    Latex说白了只有一种命令,用递归正则表达式描述出来就是

    id=([a-z,A-Z,0-9,_]);
    command=\id(({,[)(id,command)*(},]))*;

    这么简单的命令格式,用编译器的语法分析程序费力不讨好。当然,Latex通过组合的方式也组成很多复杂的命令,例如\begin{}环境等等。这些可以看作命令组成的微程序。

    我写了一个扩展JTextPane的类,增加了一个方法,做语法分析,把缺省文档对象里头的字按照识别出来的类别相应着色。写了一个下午,内核写成了,递归的,还算顺利。晚上刷完碗回来继续,把内核移植到GUI里头,费了点周折,除了几个小bug。效果还不错,\section{abc \bold{kkk} def}被染得花花绿绿的,真好看。

    另外,我还有一个隐忧,Latex里面存在歧义现象。也就是说,Latex这种语言定义得并不好,不是一种严格的语言。二义性的存在方便了设计者,对编辑器和编译器就是一个严重的挑战。不知道latex编译程序是怎么写的,不会是一个命令一个命令定义的吧,那可是搞电子工程的人常干的活儿。

    写这个工具的时候,突然强烈地感觉理解了一个词,那就是progressive。西方人科学领先,可能很大程度上就是仰仗这种精神,可持续发展,点滴积累,吸取经验,继承前人的成果,既有激情也有毅力和耐心,这可能是我们中国人比较缺少的精神吧。

    下一步就是文档的xml串行化,还有树形表示,这可不是个轻活儿,真期待啊,呵呵。

    June 20

    好久没管理了,都长草了

    毕业在即,忙一些乱七八糟的事儿,都懒得上来锄草了。

    现在总算闲下来一段儿了,做点喜欢做的事儿,玩玩游戏聊聊天,焊几块板子编几个程序,有空无聊了还做做research什么的。

    有一个长久以来的心愿,就是给做research的同仁们写点什么,因为research实在不是一件轻松愉快的事儿。现在有空了,写个Latex的编辑器,用来替换收钱的那个winedt和sci word。不敢保证我将来不收钱,尽量别收学生的钱就好了,学生不容易啊。主要原因是现在的软件做得都不怎么样,功能差价格高,不能夸平台。我第一期的目标就是做个简单实用的小工具,嵌在miktex环境里,提供大体完整的所见即所得编辑环境和编译方便。全用标准的Java API写,保证在有Java虚拟机的地方都能运行。大体的规划已经做好了,为了不让自己望而生畏,简单写了一两页纸,但我也知道,随便一句话可能都需要几十个夜晚的辛苦劳动来实现。这两天搭了一个框框,顺便看了几十个小时的Java Reference,因为Java我本来就不怎么熟,又好几年没怎么动过了。花了一两个晚上把界面设计出来了,能高亮关键字提示输入的编辑器类也写出来了,Java就是方便啊。不过后头还有大量的工作要做,可能又要熬夜了。辛苦我不怕,有兴趣自然有乐趣,有乐趣再苦也觉着甜。

    另外还有一个项目等着我做。是一个好朋友委托我的,做一个类似于数据挖掘的应用,用于研究中国古代音韵与现代音韵的区别。简单地说,就是用电脑研究古代人怎么说话。以前我给她做过一个软件,功能比较简单,现在人家要升级版了。专业知识我不懂很多,我只知道怎么写软件。据说古代人说话的口音就跟现在的江西口音很像,一般人儿听不懂。怎么研究出来的我不知道,反正我就知道里头有我一小份功劳。我还琢磨着有空把这个东西做大,彻底用机器来代替人的研究,那可就从根本上改变了中国古文研究的面貌了。

    买回来的那个LM380还没动呢,没时间。小刚还跟我说,有空研究研究近无线给他的公司开发两个产品什么的。也不知道整天哪有那么多事儿。还有我的AVR,花200多块买了块实验板,现在也是毛都没做过,还有堆积如山的仿真模型,玩的东西真多啊,时间真少啊。另外,我也该出去运动运动了,否则身上的肉越来越多。时间怎么这么不够用啊?