• 发现自己好久没在这里写blog,就连以前每年年底或者年初写总结计划的惯例都没实施,呵呵。

    去年在家soho的时候,也写了不少文章和笔记,不过都是放在自己机器的wiki上的,也一直没有放到internet上。今年复出上班后,确实也有不少东西可以放在blog上,但是也都放在公司内部的个人space上了。

    总体来讲,2008过得不错,做了几件对家人和我来说都很重要的事情,希望2009能在工作上有更大的突破。 

    工作越来越忙,家里的事情也不少,以后写blog的机会少得可怜。 哈哈。

  • 2008-12-01

    TAO tips - [工作学习]

    最近,在做corba相关的东东,用到了jacorb,tao,此处把tao的几个要点记下来。 

    1,编译问题: ACE+TAO-5.6.5不支持用vc6编译的,如果仅有vc6的环境,建议使用ACE-5.5+TAO-1.5。btw,看来vc6是末路黄花了,想当年vc6是多么的让多少人向往呀,现在已经被eclipse, vs2008, 甚至source insight代替。

    2,TAO编译好后,里面最主要的lib都在%ACE_ROOT%\lib下,idl编译器tao_idl.exe在%TAO_ROOT%\bin下,主要服务比如Naming_Service与Notify_Service都是在%TAO_ROOT%\orbsvcs下,可以分别编译各自工程,编译好后都在各自工程的release下。

  • 2008-11-26

    时间很可怕 - [工作学习]

    最近因为工作关系,我需要使用c++编写一些代码。这下可好,不用不知道,一用吓一跳,放下3年多的c/c++,现在自己竟然有不知如何下笔的感觉。

    安装完老土的vc6后准备先熟悉熟悉环境,发现竟然自己对c/c++的感觉全无,虽然之前我有4年左右的c/c++编程经验,但连很简单的东西都忘记了。时间真的是太可怕了,可以让人如此快速地忘掉一些东西。

  • 仁仁是个超级火车迷,他迷上火车至今大约半年了。刚开始他喜欢上火车的时候,我们以为他只是和以前喜欢玩其他玩具一样,兴趣不会超过一个星期,但现在我们完全错了。

    仁仁痴迷火车是全方面,有时候让人都有点觉得不可思议了,呵呵。他在家的时候口嘴上说的总是“火车”,“火车头”,“铁轨”,“地铁”之类,让人捧腹大笑;然后就是拿着火车玩具在家玩,地上、桌上、凳子上都能玩好久。

  • 最近在学习和使用corba做一些开发。虽然corba已经经历了数十年,但对于我来说还是一片空白。
    在做数据集成,尤其是电信行业中,corba应用非常广泛。最近我做的一个项目就是要为电信软件集成提供服务,通常为第三方提供开放接口的方式很多,比如corba,JMX,XML,web service等。一般电信运营商会要求你优先实现corba的接口。
  • IBM Rational Conference was held in Shanghai 4 Sep. 

    Yesterday I participated in the IBM Rational Software Development Conference China 2008.

     

    Someone said IBM was like in the music industry more and more. Of course it is a joke, haha.

    The celebration was started with dancing and Jazz.

     

    Go with the fashion of collaboration computing, IBM released the Jazz, a new collaboration platform for integrating work across the phases of development lifecycle....

  • Although Beijing Olympic Games is over,I still enjoy the great meeting.
    I haven't updated my blog for 3 months because I am busy in my degree thesis.
    My classmates asked me to develop a multi-media application several days ago.
    It is ver...
  • 因为自己之前很少开发web应用程序,对web技术了解也不多,比较落伍,为了充实自己,最近在学习web方面的一些技术,比如rest、flex,感觉现在的web技术比起几年前真的差别很大。
    为了学习flex,下载了flex builder3,真的很惊喜,IDE竟然就是基于eclipse的,用起来极其顺畅,看来adobe的策略很是高明,即省事又较少初学者的学习曲线。
    flex是一种RIA技术,在构建交互性强的web非常棒,在最近的调查中,ajax/js依然占据了90%以上的市场,flex和silverlight占据了不到10%的份额,虽然份额不大,但RIA应该是web发展的一个重要方向,不然ms不会死命推silverlight。
    现在在市场上,貌似flex学习气氛比较火,不过典型案例确实少了点,大部分网站都是用了少量的flex。其实flex的应用范围还是挺广泛的,比如做视频在线播放(不知道土豆、youtube是否用了?)、在线office、在线游戏等等。
    flex比起java applet来说,有很多优势,比如说最终以flash格式来发布(也可以直接在AIR中运行),基本上每个浏览器都会支持,而浏览器对jre的支持却很有限,而且UI界面比awt,swing好看、丰富得多,最重要的是flex里面支持根据internet的通信方式,比如http,rest...。当然,applet使用java开发,基本没有学习曲线,这点是flex无法比拟的,看着applet逐渐没落,flex应该可以大展拳脚。
    flex builder3真的是一个很强大的flex IDE,通过它学习flex变得很容易。本来我对flex的规矩一点都不懂,通过一个例子,马上感觉flex真的不错。
    首先,actionscript比较强大,支持非常多的UIcomponent,编程方式和java非常相似,支持package,class,继承,重载,而且可以在flex里面debug,要知道一个技术如果不容易debug,将是一件多么痛苦的事呀,ajax大概就是如此吧,呵呵。
    flex里面内置了很多class,可以方便使用,由于其编程方式和java基本一样,一些在java中的编程经验很容易复制到flex,比如design pattern等等。
    在flex builder3里面画一个界面,非常容易,只要把Component拖进来,然后设置一些属性,通过代码加入一些事件处理,一切就ok了,比起java里的繁琐的layout来说简单多了。
    flex本身确实很强大,除此以外,还有不少框架,比如cairngorm就是flex客户端的mvc框架,这些对于大型应用,框架是非常有效的,对规范编码、后期的维护都有较大的优势。

    即然flex有这么多优势,那么怎么应用到我们的产品中了?
    在tsm版本中,其实登陆界面就是flex典范,topomap似乎不好用,因为我们使用了java的ui库,只能通过applet来实现了,但愿以后会有更多个人、公司提供一个丰富的flex UI 库。

    学习之路很长,就慢慢学习吧,呵呵。
  • 2008-05-09

    Digester - [工作学习]

    Apache Jakarta common里面的一部分。最早是从struts发展过来的,历史不多讲,网上介绍的多的是。它的主要功能就是能简化xml到对象映射。
    以前,我们将xml中的信息读出,然后赋给对象,一般要通过SAX等来实现。实际上,这样操作起来很麻烦,而且每个不同的xml,可能你需要写不同的解析代码,扩展性不好。而且处理嵌套层次关系时非常复杂。
    Digester能做到的就是帮助我们简化这些操作,将xml中的数据直接读取并映射到你定义好的java object中,而且这些对象间的嵌套层次关系也能轻松处理。

    只需要在里面设置好一些属性和RuleSet,然后调用parse即能返回这个xml文件对应的根对象。
    其内部的实现,实际上通过注册的一些RuleSet,按照strategy pattern来对xml中的不同元素按不同的规则做匹配和转换,最后生成对象实例。
  • 最近突然想了解一下日本战国-幕府时代的历史,没细看,只大致了解了一下概况。
    日本战国大约有130多年,跨越14xx-16xx,战国之后然后就是幕府时代,接着就是明治维新了。
    幕府历史中最重要的就是德川家康,提起德川家康,一定会与织田信长和丰臣秀吉二人关联在一起。

    关于战国,现在倒是有很多游戏来自战国题材,中国青少年了解日本历史大概也是通过游戏吧,太让人伤心了。
    武士道精神大概源于此吧。

    日本二战后,在屈辱下得到了快速发展,大概也来自于德川家康的精神吧,日本的忍术大概也是如此吧。
    这与中国的刘邦似乎比较相近,与中国提倡的主流精神有些差别,呵呵。所以,中国就是中国,日本永远是日本。中华文明是几千年积累的结果,现在的日美文化侵略是难以撼动中国人道德观的。
  • 仁仁2岁了,也到了上幼儿园的年龄(仁爸妈好像都没上过幼儿园,呵呵),上周算是仁仁去幼儿园的第一周吧,总的说来表现还好,一天比一天有进步。
    本说好上上周就去的,但是一直下雨,就拖着到上周天气变好才去,没办法,仁仁喜欢在室外玩耍,下雨天憋着不出门实在是件很难受的事。
    第一天到幼儿园,抱着外公就是不愿意下来,直到陪他玩了一会才愿意,呵呵。经过一周的适应,现在仁仁进步多了,不过他内心还是不愿意去幼儿园的,因为家里更加自由。
    小孩也挺有意思的,好像很懂大人的心思。平日如果要到幼儿园去,他就睡觉拖到8点才起来,一到周末不用去幼儿园他就6点起床,一点不浪费自己玩耍的时间。
  • 新版本的开发进行得如火如荼,整个版本的周期预计10个月,有11个左右的研发人员参与开发,到目前为止应该说已经可以看到产品的轮廓了。在整个开发过程中,团队不断磨合,不断摸索,对需求管理、开发流程等不断改进,虽然还存在不少问题,但大家对一些基本准则基本认同。在这个阶段,我们着重强调了code review、单元测试、反思改进。
    对于code review,以前也进行过,但没有形成系统,时断时续,成为开发中的鸡肋。这次使用过程中,有不少体会。
    1,必须有编码规范,版本管理规范,这些convention需要在大家认可的基础上不断完善。“不以规矩,无以成方圆”,有了规矩,就需要强力执行。
    2,尽量用自动化工具,定期生成报告,减轻大家工作量,提高生产率。我们使用的是eclipse集成开发环境,里面有很多实用的插件,subversion、checkstyle、jupiter、ant、cruise control都是一些很好用的工具,当然,工具需要按照团队的实际去设置哪些该屏蔽掉,这个过程需要有互动、不断调整的过程。比如说checkstyle缺省的规则会报无数warning,严重打击大家的积极性。
    3,code review中对提出的一些有代表性的问题,需要提出并加入到编码规范中。
    4,对于code review的时间安排,个人觉得不宜太频繁,最好能固定下来review的周期。我们最早是每周一天,每次2人讲解代码、设计思路,然后大家各自在下周花半天去code review,并统一在下周的一天进行这些意见的总结并安排下一轮的讲解,这样花费的时间太长,大家抱怨真正开发的时间太少,没办法完成自己的任务,后来马上调整,每2周进行一次,每次只安排半天进行讲解和review总结,这样就需要在总结前把所有问题在总结会前都分类、统计出来,及时公布在wiki上,节省大家的时间。总结会后需要有人对这些问题进行跟踪,避免只提问题,不修复问题。
    5,要有制度保证每人都去认真的做了review。Review不是为了让大家完成一项任务,而是为了让团队相互间理解代码、改进代码和设计,同时取长补短。如果没有养成一个习惯,刚开始实行起来是很难得,大家会有不少抱怨,有的人提得少,有的人干脆不提,有的人胡乱提,这都会挫伤提得多的人的积极性,需要及时提出。
    单元测试能有效提高生产率和产品质量,它是一种白盒测试,一般有开发人员自己进行,可以说是产品测试的第一道关卡,如果没有良好的单元测试,质量是无法保证的,即使被测试人员发现了,后期也只能做一些fix bug的工作。真所谓软件不是改出来的,而是做出来的。
    单元测试的内容其实很难界定,一般来说可以有功能测试、性能测试。对于功能测试,在用例上又可以细分很多粒度,一般在java应用里面都使用junit。本次开发过程中,我们强调需要对重要的类必须编写测试用例,而且有专人去检查用例,使用ant定期生成报告。听起来是件令人兴奋的事,但执行起来问题很多。首先大家对单元测试认识不够,对哪些类需要测试、哪些类具备可测试性存在分歧;同时有人抱怨编写太多的测试代码花费了太多精力;而且有些代码重构后,测试代码并没有同步;ant生成的报告,有时大家并没有理睬。虽然事先做了很多准备和约定,并不断改进,但单元测试真正成为武器还有相当一段路要走。
    开发了几个月,有得有失,所以需要选择合适的时机刹车进行反思改进,倾听团队的声音,对代码的问题、工作安排、流程上的问题、设计的建议都需要集思广益。避免开快车最后团队士气不高,产品进度和质量失控。
    产品还在开发中,我们还在……
  • 呵呵,店主还是很用心的,虽然商品不多,但都是用心挑选的,呵呵。
    欢迎大家访问:http://shop35395530.taobao.com

    那一树花开,名字很好听,好像来自于徐志摩《人间四月天》里的吧。

    呵呵。
  • 2008-02-14

    新年新气象 - [我的生活]

    新年新气象,2008年有很多愿望,但不能太贪,在此希望大家身体健康、开开心心,仁仁更乖些,更聪明,更健康,茁壮成长。

    这个春节没回成湖南,特想儿子和父母,呵呵,等过几天,回趟家看望你们。
    虽然哲人说人生不是规划出来的,但我每年总归都要计划一番,年终总结一下,周末在家好好想想,:-)

  • 今年过年没有回湖南,除夕又见老大,风采依旧,最重要的是未来大嫂和我们一起共进晚餐,呵呵,祝福他们一路幸福。
    去年下半年,老大的team509经营得非常不错,我也非常佩服他们的钻研精神和勇气,更佩服他们的个人能力,希望他们的梦想能早日成真,能够在安全界为中国人争一份光,这年头执着、有能力的人一定能成功。
    在这里,再次推荐一下team509:http://www.team509.com
  • 差不多半个月不能用,很郁闷,也许是挪窝的时候了。
    真不知道yourblog.org是怎么想的,竟然能够让一个网站维护上那么久。

    老实说,这个blog存在的不足还是很多的,比如无法将自己的blog导出成pdf或者word,或者提供一个导出自己所有blog的功能。这样备份也比较方便,据我所知,很多wiki软件可以做到这点。



  • 这一阵,湖南一直大雪,昨天打电话给妈妈,得到一个更坏的消息,在我家生活了近11年的狗狗阿宝去了,更可恶的是被坏人毒死的,真是伤心至极,要知道,阿宝已经成为我家的一部分,它乖巧、聪明、漂亮、忠实、通人性,自从来到我家就非常讨人喜欢。老实说,在阿宝来我家之前,我家是很讨厌狗的,我觉得猫比狗可爱多了,但后来发现自己完全错了。11年前,它们漂亮的六兄弟姐妹出生后,它们的妈妈就去了,叔叔把它带到我家的第一天,想不到已经那么久了,那时弟弟也才十岁而已。
    睹物思人,虽然它只是一个小动物,但没有了它,生活中总觉得不习惯,时间长了,感情愈深,尤其是我爸妈,他们两人在老家,一定很孤单,过了年一定要家里再养一条狗狗。
    希望以后这样的事情不要再发生,强烈鄙视那些坏人。
  • 又下雪了,这个冬天也许大家听到这句话都起茧了,这可是在50年难遇的大雪纷飞的冬天。湖南的下雪冰冻天已经持续20来天了,我父母说他们也是小时候才遇到这样冷的冬天,看来仁仁也赶上了这趟车,哈哈。
    临近春节,大家都躁动起来,没票的着急,有票的也着急,可这又能怪谁了。只是希望每个人都平平安安度过这个春节。
  • 2008-01-30

    quartz介绍 - [工作学习]

    quartz源代码的14个例子非常好,建议分析,执行一下。把log4j.xml拷贝到src/java即可。

    CronTrigger也可以指定一个Job类。 0/15表示每15x执行一次

    Scheduler.start()执行之后,任务才会被真正调度。

    同一Job(fullName相同的job)的JobDataMap是共享的。(example4)

    round的job,如果上一个job还没有执行结束,就需要跳过。需要从JobDataMap中获取一个状态标志isRunning,运行结束设为Idle并存入JobDataMap中。这样的一个问题是必须多过一轮才能执行到。(这样是否可以容忍了?)参考example5的实现。 haha,仔细看完example5之后,原来没那么复杂,quartz已经做得很好了,只要将job实现StatefulJob接口即可,而不是原来的Job接口,哈哈。

    job fullname的规范:group1.job1
    trigger fullname的规则:group1.trigger1
    groupname=Task类型
    jobname=j+task类名+job启动时间
    triggername=t+task类名+job启动时间

    如果一个job执行过程中发生异常,那么我们是否可以控制这种异常了?答:可以。quartz提供对job.execute执行过程中发生异常的继续处理流程,可以通过JobExecutionException来进行控制,比如: JobExecutionException e2 = new JobExecutionException(e); e2.refireImmediately(); //重新执行一次 e2.setUnscheduleAllTriggers(true); //让所有触发器都取消调度


    如果一个定时轮询的任务,运行了一段时间,你想终止正在调度的任务,但是又不取消这个任务(仅仅终止本次调度,不影响后续的调度),此时该怎么实现?难道要自己写代码检测吗?答:不用。quartz提供了完全解决方案,你可以通过实现InterruptableJob即可。参考example7.


    如何实现一个每年,每月,每天的任务调度? 答:容易,quartz提供了一系列的Calendar来加入到Scheduler的调度日历中即可。

    任务结束后,让和让他回调一个Listener?答:容易,quartz提供了JobListener,在Scheduler上建立Listener,然后将Listener与Job关联,即能实现事件回调。这样可以做很多任务的关联,比如Job1执行结束后,然后将Job2放入调度器中。参考example9.

    quartz的更高级特性:可持久化;当scheduler负载过大有些job可能没有被调度到,此时可以设置setRequestsRecovery来让其可以再被调度。能远程调度、EJB、和jboss等app server集成;支持cluster。基于优先级进行调度。

    quartz与concurrent各自的优势:自己稍微看了一下,比较一下各自特点,不一定正确,哈哈。 quartz优势:对调度等封装得非常好,目前应用的非常广泛,成熟;但因为封装的缘故,你本身对内部的线程控制手段较少(不过可以通过listener做些处理,呵呵)。 concurrent优势:concurrent本身是jdk标准,jdk1.5才支持,支持丰富的并发处理能力,对调度要自己写很多的代码,不过concurrent本身也提供了对schedule的强大支持,而且对并发性能应该比quartz有优势,并支持Future等流行的线程通信方式。
  • 2008-01-13

    介绍confluene - [工作学习]

    confluence与jira一样,同样出于Atlassian公司之手,jira有的优点它同样具备,呵呵。
    它可以作为一款wiki知识库系统、blog系统等,有如下特点:
    提供了丰富的排版格式库,比如贴图,贴代码,画表格…,太多了,呵呵,这一点是最吸引人的地方,目前很多主流的blog都没有他丰富。
    其他特点就不说了。
    通过它可以让团队的知识得到最大化的共享,你可以建立每个人的blog、每日工作日志、学习心得、产品需求、项目进度、产品用户手册、团队活动、意见征求、样板代码…可以做的太多了,通过这样做,团队的每一个细节都是透明的,项目进度和质量自然也就能得到保障,团队气氛也能更加活跃。
  • 2008-01-13

    介绍jira - [工作学习]

    jira是Atlassian公司出品的一款bug、任务管理的商业软件,其他bug跟踪管理软件怎么样,我不太了解,但我感觉jira在易用性,可扩展性上都非常不错,一个新手基本上不需要培训就能上手。
    Web应用的系统,这与bugzilla等相同,它是基于Java实现的,可以安装在各种不同的操作平台下。
    简单易用,而且扩展性非常强,这一点是本人认为该软件的最亮点。
    规范的workflow,使用了OSWorkFlow作为工作流的引擎。
    可对bug,feature,task等进行跟踪管理,而且能够与subversion进行关联。
  • 2008-01-13

    任务与沟通 - [工作学习]

    项目管理最忌讳的是:给下级下达的任务没有明确的输出和期限。
    很多领导寄托于下级能够充分理解领导的思路,岂知每个人的理解力和技术能力是有很大差异的,领导想到的未必下级能想到,下级有疑惑的地方也未必能及时主动和上级沟通,尤其是程序员大都比较内向,最后就是领导把任务分配下去后不闻不问,下级也闷头做事,最后到了领导突然想起来的时候一问才发现结果差之千里。
    在一个团队里面,要听到反对意见其实很难。
    对于领导来说,最可恶的是下级有问题不说,有困难也憋着,到了最后一刻才说,往往延误产品的交付期。
    对于下级来说,最郁闷的是领导让做一件事情,可是什么也没说清楚,也没说要什么时候完成,最后就只能等着被训。
    沟通能力应该是现代人最重要的能力之一,道理大家都明白,但要做起来却非常难。
  • 2008-01-13

    代码重构 - [工作学习]

    上周五中午修改产品的一个bug时,突然发现任务栏中有多个ping进程,占用了大量的CPU,导致有时候系统运行会较慢。
    关于这个问题,实际上以前自己早就发现,也想过要做一些改进,最终都因为时间原因(大部分都是托词)或者其他原因,一直拖着没有进行改进。
    其实,很多问题就是这样,程序员的忍耐能力往往比用户要强,不到万不得已是很难自觉去改进的,尽管去改一个问题也许并不需要花太多的时间,而改进后的效果往往是非常明显的,最终都因为各种借口而没有去付诸行动。
    就拿这个问题,花3个小时,我将原来的代码重构了一遍,通过重构,代码更加清晰,性能也提高很多,最重要的是再也不需要起大量的外部进程了。联想到元旦前重构一个模块也是如此,该模块是一个实习生编写的,现在已经离开公司,代码里面滥用了线程同步和缓存,导致缓存查询很慢,同步快过多导致代码的可维护性可伸缩性都不好,最终重构下来,并没有使用太多技巧就搞定,运行效果很不错。
    代码重构,并不一定要在里面使用很多的编程技巧,使用过多的设计模式,也许你只是改了个变量名,加了行注释,将一个大函数分拆成几个小函数,也许带来的效果就大不一样,重构最重要的是要让代码更清晰简洁,降低维护成本,在代码变得清晰的时候,实际上做性能优化就更容易,更能发现隐藏很深的bug。
    写代码不可能一下子就写得完美,也不可能一下子就完全设计到位,为了让我们的代码更加有效、优雅,程序员需要坚持持续重构,从小处到大处,不要非积累到一定的量之后才进行,“只争朝夕”是我们的一个信念。
    程序员不愿意重构的一个原因可能是因为担心重构后的代码导致不能满足旧的需求,或者带来新的bug,如何避免这一问题了?我觉得最重要的是我们需要做好单元测试,并维护好一套随时可执行的测试用例,这也许就是敏捷开发中对测试驱动开发的一个驱动力吧。
    那在一个团队中,如何让每个人都养成这种习惯了,要让大家都发扬主观能动性其实很难,我想一靠规矩,二靠氛围。规矩就是通过编码规范,并辅以定期的code review,让大家严格要求自己;氛围就是不断地将一些重构思想在团队中进行相互学习交流、渗透,大家一起提高。code review和重构不是让大家对自己或别人写的代码进行挑刺,而是为了真正提高代码质量,提升产品层次,所以一定要贯彻到底。
    做任何事情都是如此,如果你想到了,别磨蹭了,立即去做吧,“只争朝夕”让你比别人更早一步成功。
  • 最近想找一个wiki软件,这样即使不上网,在笔记本上也可以写blog或者wiki,将自己的一点思路及时记录下来,以免火花错误。
    有几个需求最好能满足:
    开放源代码,java实现,web展示。
    能贴图片、代码、表格,有比较丰富的排版格式。
    文章可以转化为pdf。
    同时支持mysql或者文件存储。
    能批量备份、导出。

    有哪位达人知道符合要求的软件,可以在comments中给回复,本人不胜感激。
  • 呵呵,明天亮宝结婚,猛贺一下,虽不能到场,但祝福一个都不能少。
  • Tree不是jdk中自带的标准数据结构,但是这个数据结构经常用到。
    tree有很多种,比如典型有二叉树,红黑树等,jdk中TreeSet,TreeMap有部分实现,大家看一下代码便能搞清楚里面到底做了哪些工作。

    最近的工作需要用到tree,不是简单的二叉树,而是每个节点下可能有n个子节点的树,这些子节点存放的元素还有一定的顺序,实现的tree最终还必须是一个Collection。
    虽然思路不复杂,要写好还真不容易。
    首先,tree是递归的,我们需要实现的类较多,包括Node,Collection,Iterator等。Node需要包含自身存储的对象,而且包含父亲,儿子,兄弟,本身是个递归结构。递归起来就要求思路必须清楚,调试要仔细,不然很容易出错。
    其次,Iterator必须能实现前序,中序等各种遍历方式,一般来说,至少实现一种吧,呵呵。
    再次,要实现addNode,removeNode,findNode等一系列操作接口,逻辑比List要复杂得多,尤其是每个节点还要排序,查找的时候需要使用二分法。

    总算完成,也参考了KSS library的实现,这个库写得还可以,写出来的人java和数据结构基础不错。
    通过实现tree,程序的可扩展性好了很多,原来实现使用了大量的if else语句,根据不同的条件来选择响应,现在每个节点都存储一个callback类,快速匹配到就call了,哈哈。

    后记:
    大家可以参考《Java数据结构和算法中文第二版》
    最近2米国教授大肆批评当前计算机教育把java作为入门语言,而且很多人工作中也只用java,导致目前的程序员对很多基础,底层的东西了解甚少,本人甚是认同,如果不了解c,我觉得也很难写出优美高效的程序。毕竟c能够让你更了解程序是如何运行的,如果能了解一些汇编,就更好了,C++/Java都不适合作为第一个入门的语言。
    当然,java是非常强大的。
  • 1,ClassLoader的关键
    我的目的就是实现一个java版本的plugin机制,能够动态从非classpath的文件目录加载class文件,从而提高程序的可扩展性。
    比如:我们目前支持cisco,huawei等设备的信息获取,未来我们需要支持juniper等,那么在我们编写好juniper的信息获取程序文件后,只需要将juniper的class文件放在单独的目录,或者单独jar,而不用管这个jar、目录是否在之前设置的classpath中。
    以前,在c程序中,都是通过dll/so的方式加载的,非常方便的,现在发现java的ClassLoader更加强大,呵呵。

    载入一个class到内存,比如从网络,jar,zip,加密的文件等等
    public Class<?> loadClass(String name) throws ClassNotFoundException
    默认的处理:
    如果已经加载过,则直接返回;
    否则,如果有父classloader,则让父classloader进行加载,没有父就让Bootstrap进行加载;如果都加载失败,则调用自身这个ClassLoader的findClass方法。
    所以覆写findClass是关键。

    protected Class<?> findClass(String name) throws ClassNotFoundException
    系统默认的ClassLoader的实现:直接抛异常,这就让你的子类必须实现这个类。呵呵

    所以,如果要实现自己的ClassLoader,则findClass是关键。
    这个可以参考java api中的ClassLoader说明。

    2,如何编写一个ClassLoader
    最简单的就是写一个findClass即可,比如我现在要写一个plugin式的应用,所有监控任务都在d:\temp下,我采用动态加载的方式加载这些任务,这些任务的class文件并没有配置在我们的启动classpath中,这就需要我们自己写一个classloader将这些class加载进来。
    findClass很简单:
    就是先将文件名解析成路径名(.换成/)。
    然后从文件系统中读取这个class文件,存为byte[]
    然后调用父类的defineClass方法。

    MyClassLoader.java
  • 上周回了趟湖南,回家前口腔溃疡,吃东西都是个问题,到了湖南后发现嘴唇又干,莫非是水土不服,不应该呀,以前都好好的,而且我在家乡生活了快20年。就说这个口腔溃疡吧,不知为什么,我隔上一段时间就会折腾上一次,书上说缺维C,就连仁仁也经常口腔溃疡,真是麻烦,你说一个一岁多的小孩怎么能承受这种痛楚,他一得上就烦躁得不行,喜欢用手指去抠,结果就是越高越糟,最后必须去医院打针才好些。

    仁仁越来越大了,脾气也不小,除了小孩天生的可爱,他还有一份倔强。
    南方的冬天虽然不然北方温度低,但有时候照样让人冷得不敢出门,最近就是如此,虽然每天有太阳照面。
    仁仁最近晚上一点不安份,有时睡到半夜就从被子里面钻出来想睡在被子上面,把他抱到被子里面他还不依,这样反复几次,不感冒才怪,而且他妈妈也跟着感冒,真希望他们俩能早日康复。不过,即使感冒,他依然如故,每天能量无限,忙碌不已,大人们都很佩服他的敬业精神。
  • 最近上海又新开了几条地铁线,对老百姓来说,新开地铁出行更方便了,房价更贵了,但是还有一个副作用就是上班时间更挤了,时间更长了。
    为什么?因为人更多了,每站都会多停一会,把地铁里的人急得要死,每个人脾气都很不好,呵呵,可以理解。
    看来,以后不指望造更多地铁了。
  • 请小孩保护好你的眼睛。
    请长期面对电脑的同学们保护好你的眼睛。

    希望大家视力都不要继续下降,也希望仁仁的眼睛没大的问题。