随笔 - 59, 文章 - 4, 评论 - 184, 引用 - 7
数据加载中……

2006年1月17日

一切都在变

blog也搬迁了:http://blog.sina.com.cn/liuwendao

来武汉快三年了,留在北京的最后一件物件-电吉它,也被我拿到武汉来了

我们这么混,能成功吗?
立帖为证

posted @ 2007-09-16 23:21 fisher 阅读(1422) | 评论 (0)编辑 收藏

来自苏联的笑话

  军事演习区,一位妇女驾车在大桥前被一名军官拦住:“对不起,公民,您现在不能过去。”“为什么?”“这座桥在一小时前被炸毁了。”“您能告诉我这究竟是怎么回事吗?”“很抱歉,不行。我本人已于2小时前阵亡。”
  
  
  伊万看电视,是勃在演讲。伊万觉得无聊,换了一个,还是勃在演讲,又换一个,还是他。伊万一连拨了几十个台,最后累了,准备关电视。这时候电视画面变成一个KGB,怒气冲冲地叫:“你再敢换?再敢换?再换判你10年大牢!”
  
  
  某日苏联举行国庆**,沿着大街开来了炮兵、机械化步兵、坦克、自行火炮、战术导弹、战略核导弹,破坏力一个比一个大;队列末尾却是两个带公文包的矮子。在看台上勃列日涅夫惊讶地说:“这两个人破坏力比核导弹还大!他们是什么人?”
  KGB头子说:“不是我的人。”
  国防部长说:“没见过他们。”
  苏联总理说:“他们是国家计委的...”
  
  
  戈尔巴乔夫视察农场,看到猪儿乖乖,一时兴起站在猪中间照了张像。
  待到报纸准备发表时,编辑为照片的标题犯了难??
  “戈尔巴乔夫同志和猪在一起”不好。
  “猪和戈尔巴乔夫同志在一起”也不好。
  报纸出版后,照片下的说明文字是??
  “左起第三位是戈尔巴乔夫同志”
  
  
  勃列日涅夫和美国总统卡特在瑞士开会,休息时间两个人很无聊,就开始比谁的保膘更忠诚。卡特先来,他把自己的报膘叫进来,推开窗(外面是20层楼)说:“约翰,从这里跳下去!”
  约翰哭着说:“你着么能这样呢,总统先生,我还有老婆孩子呐。”
  卡特被感动了,流着泪说是自己不对,叫约翰走了,然后抡到勃列日涅夫,他也大声叫自己的保膘伊万。
  “伊万,从这里跳下去!”
  伊万二话不说就要往下跳,卡特一把抱住他说:“你疯了?跳下去会死的!”
  伊万一边挣扎着要跳下去一边说:“放开我,混蛋,我还有老婆孩子呐。”
  
  
  早年莫斯科修地铁,工程师将方案上报斯大林审批。不久,方案发下来,上面有斯大林的签字。
  细心的工程师发现图纸上多了一个圆型的茶杯印,于是莫斯科地铁就多了一条环形线。
  
  
  斯大林肃反时期的苏联。一位内务人民委员部审判员结束一天的审判工作,回到办公室,突然一个人大笑起来。对面办公桌的同事奇怪的问道:“有什么好笑的事吗?”“是啊,”审判员用手帕擦着笑出来的眼泪:“一个很好笑的笑话……”“哦?说来听听?”“你疯了吗?!我刚判了说这笑话的家伙五年苦役!”
  
  
  苏联30年代肃反扩大化时期。内务人民委员部的一间牢房里关了三个人,彼此间谈起坐牢的原因。
  第一个人说,我因为反对了党书记彼得罗夫;
  第二个人说,我因为支持了彼得罗夫;
  第三个人说,我就是彼得罗夫。
  
  
  戈尔巴乔夫和他的司机开着车在路上,戈尔巴乔夫突发异想,说:让开!我来开。一个老警察和一个新警察在路上值勤,见一辆车歪歪扭扭的开得疯快,老警察就对新警察说:去!好好收拾一下。新警察将车拦住之后,又没趣没趣地回来了。老警察问:怎么?里面是谁?新警察回答说:我也不知道里面是谁,反正给他开车的是戈尔巴乔夫。
  
  
  美国外交代表团到苏联访问,苏联接待官员陪他们参观“建设的伟大成就”,并且得意的说:“到了下一个五年计划,每个苏联家庭都可以拥有一架私人飞机!”美国人惊讶的问:“ 他们要飞机干什么呢?”苏联官员说:“当然有用啊……譬如你在莫斯科听说列宁格勒开始供应面包了,你可以马上开着飞机赶去排上队。”
  
  
  一位公民打电话到基辅电台问主持人:“共产主义到底是艺术还是科学?” 主持人说:“我也不清楚,但我肯定不是科学” “为什么?” “如果是科学的话,他们应该拿狗做试验。”
  
  
  斯大林在大会上引经据典地说:“马克思和列宁说1+1=2,而托洛茨基和布哈林说1+1不等于3。是托洛茨基和布哈林说的对呢?还是马克思和列宁说得对呢?”下面听众一脸疑惑,“毫无疑问,是马克思和列宁说的对!”底下热烈鼓掌,“托洛茨基和布哈林是帝国主义派来的间谍,说1+1不等于3的人罪不容赦……”
  
  
  列宁快去世了,叫赶快把继承人斯大林召进克里姆林宫来,临终有几句话要嘱托。“不瞒你说,我还有一个隐忧啊,斯大林。”“说吧,亲爱的伊里奇。”斯大林专心地听着。“那就是,人们会跟你走吗?不知你想过了没有?”“他们一定会跟我走的。”斯大林强调说,“一定会!” “但愿如此。”列宁说,“我只是担心,万一他们不跟你走,你怎么办?”“没问题!”斯大林答道:“那他们就得跟你走!”
  
  
  集体农庄庄员伊万在河里捉到一条大鱼,高兴的回到家里和老婆说:“看,我们有炸鱼吃了!”
  “没有油啊。”
  “那就煮!”
  “没锅。”
  “烤鱼!”
  “没柴。”
  伊万气死了,走到河边把鱼扔了回去。那鱼在水里划了一个半圆,上身出水,举起右鳍激动地高呼:“斯大林万岁!”
  
  
  “瑞典能否建立共产主义”?
  “不能。”
  “为何?”
  “列宁同志说了:共产主义不在山那边。”
  
  
  一个苏联KGB特工和一个美国CIA特工互相吹嘘各自的机构是如何的杰出。
  那个KGB特工首先发言说,“我们拥有你们美国过去15年里所有导弹发射的详细数据。”
  CIA特工说:“这不算什么。我们CIA掌握着你们苏联未来15年里所有当选的中央委员名单。”
  
  
  一艘航行在大海上的轮船快要沉了,船长叫乘客赶紧跳海,但他喊了半天没有一个人跳,一个社会学家说我来喊,他去喊过之后所有的人都跳下海去了。船长觉得奇怪,问他是怎么喊的,社会学家回答说:我对法国人说这样跳下去很浪漫,我对西班牙人说这样跳下去很潇洒,我对英国人说这样跳下去是一种体育运动,我对美国人说这样跳下去有利可图,我对苏联人说这样跳下去是革命行动。
  
  
  在苏联的一趟公交车,一个男的非常谦恭地问站在他身旁的另一个男的:“同志,请问您是克格勃吗?”
  那人答道:“不是。”
  又问:“那您有没有亲戚或朋友是克格勃呢?”
  答:“没有。”
  还问:“那您是否跟克格勃有些交往或联系?”
  答:“没有,你要干嘛啊!”
  该男生气地说:“干嘛,他妈的,你踩着我的脚了!”
  
  
  赫鲁晓夫作报告,批判斯大林。忽然,有人从台下递了个纸条,写道:当他做坏事的时候,你在哪里?赫鲁晓夫一看这个条子,大声怒喝道:“是谁写的,给我站出来。”台下雅雀无声,没有人站出来。赫鲁晓夫接着说道:“同志们,我当时就和你们现在一样,你们知道我当时为什么不敢站出来了吧”
  
  
  勃列日涅夫:同志们,美国人登上了月球,我们不能再等了,党决定让你们上太阳。
  宇航员:总书记同志,我们会被烧死的。
  勃列日涅夫:没关系,同志们,党都替你们想好了,你们晚上去。
  
  
  电影《这里的黎明静悄悄》试映时,由于其中有部分裸体镜头,因此主管电影审核的官员曾试图把这部电影禁演,幸亏勃列日涅夫内部观看时感动得热泪盈眶,这部优秀的电影才有幸与观众见面,成为世界电影史上不朽的篇章。而另一部电影由于其中有主人公走到教堂时跪地痛哭的镜头,被电影审核官员认为是宣扬宗教而准备勒令裁掉这部分内容,恰恰勃列日涅夫看到这里时动了感情,因此这个镜头得以幸存下来。
  
  
  当年的捷克斯洛伐克政府中,设立了一个“海军部”,结果,苏联老大哥就对捷克人说:你们是内陆国家,设什么海军部?
  捷克人回答说:那你们不是也设了文化部吗?

posted @ 2007-01-20 15:15 fisher 阅读(2154) | 评论 (0)编辑 收藏

[调查]国内有多少人使用MINA?

最近看到越来越多的人使用mina,甚至在线下也碰到合作公司的库中使用MINA,出于好奇,尝试一下用自己的blog做一下调查,访问本blog的兄弟,如果您使用MINA作为自己的通讯基础件,请留言介绍一下自己

posted @ 2006-12-27 13:00 fisher 阅读(4467) | 评论 (20)编辑 收藏

随想

软件开发的世界里充满了不理解,客户不理解软件是怎样开发的、经理不理解开发人员、开发人员不理解指挥者。

问题在于软件开发惊人的困难,造成很少有开发人员能够说出软件自始至终是怎样开发的,并能够对这个过程中会遇到的不同选择所隐含的结果表现出适度的理解。

在软件开发人员还很年轻的时候(十几岁或二十出头),他们通常集中精力学习和使用技术,称自己为perl程序员、Linux专家、EJB开发人员、.NET开发人员等。对他们来说技术是最重要的事情。因为技术在不断的变化,年轻的程序员倾向于大致学习一个技术,在一到两个项目中使用,然后重新开始学习新技术或者是学习以前使用过的技术的最新发展。这里的问题是,他们一遍又一遍的重复的学习的不过是同样的低层次基本技能的不同风味。

幸运的是,很多开发人员在经过了几轮技术学习之后逐渐意识到:一旦用COBOLJavaC#等语言为事务控制编写过代码,就会开始认识到基本的、本质的东西是不变的。不同环境下的数据库访问、用户界面设计等领域也是同样的情况。不久以后,开发人员逐渐认识到无论具体的技术怎样,很多基础性的东西是保持不变的,这些基础性的东西有的在学校里讲过,有的没有。
这种认识经常发生在开发人员接近三十岁或刚过三十岁的时候,通常是人们开始稳定下来,结婚、买房的时候。这是比较幸运的情况,因为上面提到的这些新的个人需求意味着他们不可能再投入大量的时间去学习新的技术,他们需要用这些时间和家庭成员在一起。突然的,高层次的角色如项目负责人、项目经理、(非敏捷的)建模人员等对他们变得非常有吸引力,因为这些角色不需要持续花费大量的时间和精力去学习新技术。于是,等到开发人员开始真正学到技艺的时候,他们已经处于离开开发人员角色的转变过程中了。所幸的是,新的“小年轻”不断的跟上来,这个过程在不断的循环重复。最终的结果是:大部分最活跃的正在开发软件的人通常不是最称职的做这件事的人,而他们自己甚至还不知道。

posted @ 2006-07-24 11:31 fisher 阅读(2217) | 评论 (6)编辑 收藏

今天学会一个新名词 - Troll

来自pythoncn的maillist,呵呵,挺有意思
-------------
像Chris Qie <longroad1999@gmail.com>这样的在公共论坛用侮辱性言语挑起骂战并从中获取某种不知名快感的人,在Usenet文化中有一个名称:

  • Troll

  • Troll作动词是钓鱼的意思,指那些人发表某种言论后等待别人的攻击性回复,从而获得快感。Troll还有一个意思是斯堪的纳维亚神话中一种长相丑陋、爱恶作 剧、令人讨厌的巨人,和那些找骂的人有相似之处,因此也被引申过来形容那些 人,做名词使用。回troll的贴则被称为feed the trolls,即给trolls喂食。
  • Trolls有很多种,像Chris Qie只是其中一种,即使用种族歧视性语言激怒别人,好让别人回帖骂他。comp.lang.python上著名的troll: Xah Lee则是长年在各个 script语言讨论组上交叉张贴无关内容或用错误百出的话语对某种语言或者文化进 行攻击。但无论那种troll,他们的目的都是一样的:想通过怪诞的举动引起别人 的注意。这是一种病态心理,是一种未成熟,类似小孩“人来疯”似的举动。
  • Trolls的存在对公共空间是破坏性的。它们的post会引起很多人回帖,甚至会有情绪激动者采用谩骂的方式回敬,这些人被称为trollhunter。这些行为正中trolls 的下怀,使他们获得被骂的快乐,从而更加积极的trolling。而且即使 trollhunter的动机是好的,也会给论坛带来不好影响,使其他用户接收到大量无 关信息和攻击性信息,成为受害者。公共空间的和谐性被破坏。
  • Trolls最愿意看到别人回他的贴,无论是正儿八经指出他的错误还是义愤填膺的对他谩骂。对一个troll来说,最能让他感到沮丧的则是没有人理他。而我们,正是 应该让他们沮丧,失去trolling的动力。
  • 对待trolls的方法,一方面要靠大家自觉,克制自己回帖的冲动,不给他们喂食。

另一方面,在邮件列表这种有管理员的公共空间,可以向管理员提出封禁trolls的 提案。

  • 下图是我从c.l.python上Keith Thompson对Xah Lee的trolling行为提醒公众的帖子中拷贝过来的图片(请使用等宽字体观看)
        +-------------------+             .:\:\:/:/:.
       |   PLEASE DO NOT   |            :.:\:\:/:/:.:
       |  FEED THE TROLLS  |           :=.' -   - '.=:
       |                   |           '=(\ 9   9 /)='
       |   Thank you,      |              (  (_)  )
       |       Management  |              /`-vvv-'\
       +-------------------+             /         \
               |  |        @@@          / /|,,,,,|\ \
               |  |        @@@         /_//  /^\  \\_\
 @x@@x@        |  |         |/         WW(  (   )  )WW
 \||||/        |  |        \|           __\,,\ /,,/__
  \||/         |  |         |      jgs (______Y______)
/\/\/\/\/\/\/\/\//\/\\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  • 历年python-cn 各种列表著名 Troll 案例:

    1. 051106-RE:python的无奈

      唉,没想到这里乡下贱农(的贱崽)还真不少,
      说城市人酒囊饭袋是农村人聊以自慰的一点点资本,
      就象美国黑人在奥运会夺得金牌时获得的快乐一样,
      我就是酒囊饭袋怎么样?
      可惜就是你爸在田间地头为我流汗流泪的劳作养活的我,
      哈哈?心理不平衡了?谁让你爹是农民!
      还"龙村",真够恶心的,一辈子你都是低贱的乡下人 ,
      低贱!哈哈!就是血染你家老母老爹,然后发迹的,你能怎样?HOHO~
      
      -- 是标准的运用城市差异来挑起回复的实例,在中国这样的发展中国家尤其奏效
  • 060112-RE:Web开发有必要选Python(或者是ruby)么?        

  •              -- 开始,仅仅是比较典型的"是否最优"探讨,后来立即转向人身攻击,是经典的通过技术争论引发回复的实例

posted @ 2006-06-13 10:27 fisher 阅读(13564) | 评论 (9)编辑 收藏

程序员的进化——从学生到首席执行官(转)


/*-------------------------------------------

  程序员的进化——从学生到首席执行官

翻译 2002 王咏刚
http://www.contextfree.net/
转译自 Omri's Computer Humor Page
http://www.cs.bgu.ac.il/~omri/Humor/
-------------------------------------------*/


--------------------------------------------------------------------------------
中学阶段

      10 PRINT "HELLO WORLD"
      20 END
--------------------------------------------------------------------------------
大学一年级

      program Hello(input, output)
        begin
        writeln('Hello World')
        end.
--------------------------------------------------------------------------------
大学高年级

      (defun hello
        (print
        (cons 'Hello (list 'World))))
--------------------------------------------------------------------------------
初级程序员

      #include <stdio.h>
      void main(void)
      {
        char *message[] = {"Hello ", "World"};
        int i;

        for(i = 0; i < 2; ++i)
        printf("%s", message
);
        printf("\n");
      }
--------------------------------------------------------------------------------
编程老鸟

      #include <iostream.h>
      #include <string.h>

      class string
      {
      private:
        int size;
        char *ptr;

      public:
        string() : size(0), ptr(new char('\0')) {}

        string(const string &s) : size(s.size)
        {
        ptr = new char[size + 1];
        strcpy(ptr, s.ptr);
        }

        ~string()
        {
        delete [] ptr;
        }

        friend ostream &operator <<(ostream &, const string &);
        string &operator=(const char *);
      };

      ostream &operator<<(ostream &stream, const string &s)
      {
        return(stream << s.ptr);
      }

      string &string::operator=(const char *chrs)
      {
        if (this != &chrs)
        {
        delete [] ptr;
        size = strlen(chrs);
        ptr = new char[size + 1];
        strcpy(ptr, chrs);
        }
        return(*this);
      }

      int main()
      {
        string str;

        str = "Hello World";
        cout << str << end

        return(0);
      }
--------------------------------------------------------------------------------
编程高手

      [
      uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
      ]
      library LHello
      {
        // bring in the master library
        importlib("actimp.tlb");
        importlib("actexp.tlb");

        // bring in my interfaces
        #include "pshlo.idl"

        [
        uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
        ]
        cotype THello
      {
      interface IHello;
      interface IPersistFile;
      };
      };

      [
      exe,
      uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
      ]
      module CHelloLib
      {

        // some code related header files
        importheader(<windows.h>);
        importheader(<ole2.h>);
        importheader(<except.hxx>);
        importheader("pshlo.h");
        importheader("shlo.hxx");
        importheader("mycls.hxx");

        // needed typelibs
        importlib("actimp.tlb");
        importlib("actexp.tlb");
        importlib("thlo.tlb");

        [
        uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
        aggregatable
        ]
        coclass CHello
      {
      cotype THello;
      };
      };

      #include "ipfix.hxx"

      extern HANDLE hEvent;

      class CHello : public CHelloBase
      {
      public:
        IPFIX(CLSID_CHello);

        CHello(IUnknown *pUnk);
        ~CHello();

        HRESULT __stdcall PrintSz(LPWSTR pwszString);

      private:
        static int cObjRef;
      };

      #include <windows.h>
      #include <ole2.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include "thlo.h"
      #include "pshlo.h"
      #include "shlo.hxx"
      #include "mycls.hxx"

      int CHello::cObjRef = 0;

      CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
      {
        cObjRef++;
        return;
      }

      HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
      {
        printf("%ws\n", pwszString);
        return(ResultFromScode(S_OK));
      }

      CHello::~CHello(void)
      {

      // when the object count goes to zero, stop the server
      cObjRef--;
      if( cObjRef == 0 )
        PulseEvent(hEvent);

      return;
      }

      #include <windows.h>
      #include <ole2.h>
      #include "pshlo.h"
      #include "shlo.hxx"
      #include "mycls.hxx"

      HANDLE hEvent;

      int _cdecl main(
      int argc,
      char * argv[]
      ) {
      ULONG ulRef;
      DWORD dwRegistration;
      CHelloCF *pCF = new CHelloCF();

      hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

      // Initialize the OLE libraries
      CoInitializeEx(NULL, COINIT_MULTITHREADED);

      CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
        REGCLS_MULTIPLEUSE, &dwRegistration);

      // wait on an event to stop
      WaitForSingleObject(hEvent, INFINITE);

      // revoke and release the class object
      CoRevokeClassObject(dwRegistration);
      ulRef = pCF->Release();

      // Tell OLE we are going away.
      CoUninitialize();

      return(0);
      }

      extern CLSID CLSID_CHello;
      extern UUID LIBID_CHelloLib;

      CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
        0x2573F891,
        0xCFEE,
        0x101A,
        { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
      };

      UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
        0x2573F890,
        0xCFEE,
        0x101A,
        { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
      };

      #include <windows.h>
      #include <ole2.h>
      #include <stdlib.h>
      #include <string.h>
      #include <stdio.h>
      #include "pshlo.h"
      #include "shlo.hxx"
      #include "clsid.h"

      int _cdecl main(
      int argc,
      char * argv[]
      ) {
      HRESULT hRslt;
      IHello     *pHello;
      ULONG ulCnt;
      IMoniker * pmk;
      WCHAR wcsT[_MAX_PATH];
      WCHAR wcsPath[2 * _MAX_PATH];

      // get object path
      wcsPath[0] = '\0';
      wcsT[0] = '\0';
      if( argc > 1) {
        mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
        wcsupr(wcsPath);
        }
      else {
        fprintf(stderr, "Object path must be specified\n");
        return(1);
        }

      // get print string
      if(argc > 2)
        mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
      else
        wcscpy(wcsT, L"Hello World");

      printf("Linking to object %ws\n", wcsPath);
      printf("Text String %ws\n", wcsT);

      // Initialize the OLE libraries
      hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

      if(SUCCEEDED(hRslt)) {

        hRslt = CreateFileMoniker(wcsPath, &pmk);
        if(SUCCEEDED(hRslt))
      hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

        if(SUCCEEDED(hRslt)) {

      // print a string out
      pHello->PrintSz(wcsT);

      Sleep(2000);
      ulCnt = pHello->Release();
      }
        else
      printf("Failure to connect, status: %lx", hRslt);

        // Tell OLE we are going away.
        CoUninitialize();
        }

      return(0);
      }
--------------------------------------------------------------------------------
黑客初阶

      #!/usr/local/bin/perl
      $msg="Hello, world.\n";
      if ($#ARGV >= 0) {
        while(defined($arg=shift(@ARGV))) {
        $outfilename = $arg;
        open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n";
        print (FILE $msg);
        close(FILE) || die "Can't close $arg: $!\n";
        }
      } else {
        print ($msg);
      }
      1;
--------------------------------------------------------------------------------
黑客有成

      #include <stdio.h>
      #define S "Hello, World\n"
      main(){exit(printf(S) == strlen(S) ? 0 : 1);}
--------------------------------------------------------------------------------
黑客高手

      % cc -o a.out ~/src/misc/hw/hw.c
      % a.out
--------------------------------------------------------------------------------
黑客大虾

      % cat
      Hello, world.
      ^D
--------------------------------------------------------------------------------
初级经理

      10 PRINT "HELLO WORLD"
      20 END
--------------------------------------------------------------------------------
中级经理

      mail -s "Hello, world." bob@b12
      Bob, could you please write me a program that prints "Hello, world."?
      I need it by tomorrow.
      ^D
--------------------------------------------------------------------------------
高级经理

      % zmail jim
      I need a "Hello, world." program by this afternoon.
--------------------------------------------------------------------------------
首席执行官

      % letter
      letter: Command not found.
      % mail
      To: ^X ^F ^C
      % help mail
      help: Command not found.
      % damn!
      !: Event unrecognized
      % logout
--------------------------------------------------------------------------------

posted @ 2006-05-18 17:14 fisher 阅读(1038) | 评论 (0)编辑 收藏

Hello World的196种写法

还记得孔乙己说:茴香豆的‘茴’字有四种写法吗?现在我们的知识份子已经进步了,看看Hello World的196种写法:)

http://man.lupaworld.com/content/develop/hello/HelloWorld.shtml

posted @ 2006-05-18 16:58 fisher 阅读(854) | 评论 (0)编辑 收藏

趴在窗户上看长江

下午写完设计,趴在武汉办公室的窗户上看风景,天气好的时候,左面长江右边东湖都可以看到,其实想想在武汉出差也挺不错的,呵呵

posted @ 2006-05-17 18:03 fisher 阅读(574) | 评论 (0)编辑 收藏

关于人.....

彼得·德鲁克在他的《卓有成效的管理者 》当中,阐述了知识工作者管理的秘诀,那就是知识工作者的工作效率来自于对其工作的有效性以及他的工作是否有所成就。这本1966年出版的管理学书籍经过近50年的时间,反而越发显得适应潮流。
而卓有成效的知识工作管理者现在显得比过去任何时候都要短缺,也比现时任何人才都要短缺。在现时这个信息爆炸,案例丰富的年代,战略眼光与部署格局对于一个企业人才不再如此重要,对于企业战略,任何有管理常识、了解企业实情的人大都可以分析得很到位,关键是要找到合适的人去实施。知道什么样的人合适,以及找到这个合适的人,成为企业家最需要做的事情。而成为那个合适的人,则成为草根阶层走入舞台中央的必备能力。

附一篇来自经济观察报刘军的《笨蛋,最重要的是人!
---------------------------------

      2005年10月8日管理大师彼得·德鲁克曾经讲过一个他和《时代》《财富》等杂志的出版人亨利·鲁斯交往的故事。鲁斯有个很好的新杂志方案——试图创办“从美国人思考角度出发”的高格调文化杂志,他去向德鲁克求教。德鲁克分析了一番说,“这份企划案很棒,不过晚了50年。”接着,他对鲁斯说出了最重要的话:“此外,《时代》的人也无法胜任。我猜,你想鼓励一些外面的作家来为这本杂志执笔,并以一般大众为读者群。但是你的专长却是叫自己手下人搞定,因此大有不同。” 
      鲁斯回答说,“我来向你请教,正因为我猜想你会这么说。”他因而放弃了这个计划,因为他深知人的重要性。经过十多年的西方管理教育和知识传播,中国企业管理者已经熟知战略的理性分析,与重视人比起来更重视事,另外先建立制度、而不是依靠人的观念也被广泛接受。不过,我却逐渐感觉到,在这些问题上我们可能有点矫枉过正,对于知识型工作、对于管理,或许人更重要,是应该优先考虑的。 
      9月底,索尼新任CEO、美国人霍华德·斯特林格(Howard Stringer)宣布索尼的战略调整计划:全球裁员一万人,缩减工厂数目,出售1200亿日元的不动产与股票等非核心资产,对消费电子业务进行架构调整、将权力集中到这一业务的最高主管手中。在过去五年中,索尼逐渐失去消费电子霸主地位,业绩很不理想,这背后的根本原因正是这些战略调整所触及的问题。对于这一点,大概稍微有点管理常识的人都知道,我想索尼前CEO出井伸之自然了然于心,他之下的索尼高管也清楚。不过,大概只有霍华德·斯特林格、索尼历史上第一个外国人CEO、这个日本文化的局外人才能推行上述改革。 
     战略,有管理常识、了解企业实情的人大都可以分析得很到位,但真正去做,就需要“合适的人”。我一直相信,选择霍华德·斯特林格作为继任者,是出井伸之的最重要的决策,体现这个亚洲最优秀的商业领袖的领导才能。卡洛斯·戈恩已经因成功在日产汽车(Nissan)实现大逆转而成为全球最知名的管理者之一,他当初所做的关闭工厂与裁员、破除日本式企业联盟等措施,都是众所周知的弊端,但惟有他这个合适的人才能推动变革。斯特林格和戈恩都是在这种情境下最合适的人,只是恰巧他们都是外国人。 
      Google、微软和李开复之间的纷争一直没有停息的迹象。在这个过程中李开复把自己再次塑造成了最优秀的技术专家形象,但如果相信这一点,我们就错误理解了Google的智慧。如果要一流的中文搜索研发人才,Google的最佳人选绝对不是李开复,而可能是李彦宏。如果它的战略诉求点是这个,它可以百度买下,从而得到李彦宏。但是,Google在中国,需要的哪里是什么技术专家、研发中心?现在Google中国战略要的合适的人是据称是“技术专家”的李开复,但他在公众心目中的号召力和政府公关能力才是Google所看重的。 
      我们也可以循同样的视角来看待雅虎和阿里巴巴之间的联姻。这一次是把雅虎中国的业务交道马云手中去让他照料,因为对于谁了解中国市场和能够帮助雅虎发现中国市场潜力这个问题,马云是最佳答案。雅虎在中国的最近两次战略行动目标都首先是为了“人”。上一次是雅虎在中国收购3721,反而让其老板周鸿一担任中国区总裁,从而让雅虎中国从跨国公司在华分支机构这样的角色变成勇猛的中国本土企业。但在经历一段发展时期之后,雅虎中国就需要更合适的人。我们可以认为,这是雅虎、阿里巴巴联姻的主要原因之一。 
      先建立制度、体系,而不是“因人设事”这样的观点被广泛接受,可是,我们忘记了这个观念背后的工业化背景:所有人的都被当成了可替换的零件,所以制度体系最重要。但是,对于知识型工作来说,特别是非重复的创造性工作,每个人的工作方式、结果都截然不同。 
      我们所设计的制度体系,在当前的人员安排下也似乎运转正常。但是,由于这些人是无法替换的,人走了,看似精妙的体系也就出现出现问题了。这个时候,是去做不可能完成的任务:寻找适合制度体系的一摸一样的人?还是更改体系?或者看得更远点,在现在的情境下,我们根本就不该把制度体系的重要性神话到这种程度?针对知识型工作的讨论,和上文对最高管理者的讨论并非没有联系,因为在我看来,管理工作是最重要的、最具创造性的知识工作。 
      吉姆·柯林斯在《从优秀到卓越》说卓越公司是“先人后事”:这些公司的主管不是先确定目的地(先有方向、愿景、战略),然后才把人们引向那里;他们首先让合适的人上车(不合适的人自然请下车),然后才决定去向何处。他所说的虽是方向、远景,但大体上和制度是同一类型的事物。我们都应该了解,合适的人更重要,那些看似严密的战略分析和完善的制度体系有时候会变成令人难以忍受的障碍,因为它们和“合适的人”可能是完全矛盾的,这些人通常都难以放到一个既定的模子中去。 

posted @ 2006-04-25 23:19 fisher 阅读(1020) | 评论 (0)编辑 收藏

webwork2.2.2的dtd解析问题(感谢飞云小侠)

今天将webwork2.2.1更换成webwork2.2.2,出现了一个奇怪的异常,每次启动后,都会报出:
org.xml.sax.SAXParseException: Element type "global-exception-mappings" must be declared.
com.opensymphony.xwork.config.ConfigurationException: Caught exception 
while loading file xwork.xml
    with nested exception 
org.xml.sax.SAXParseException: Element type 
"global-exception-mappings" must be declared.
如果将xwork.xml中的global-exception-mappings注释掉便好

头疼了几个小时解决不了,不得不求助飞云小侠
飞云小侠一出手果然不同,马上定位了问题所在
就是这句:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">

原来虽然几次升级webwork.jar,但是xwork.xml的DTD解析还是用的原来的DTD,顶多就是改了DTD的地址,也就是将这句
 "http://www.opensymphony.com/xwork/xwork-1.1.dtd">
改为这样
 "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">

而实际上解析DTD是靠的前面那句
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" >
原来一直是
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" >
于是就出现了上面的问题
多谢飞云小侠的帮助^_^

posted @ 2006-04-21 15:07 fisher 阅读(1249) | 评论 (0)编辑 收藏

重读温博格

自工作以来,我就养成了睡前读书的习惯,这一年在武汉,实在买不到一些好书,每次回北京总要带很多书过来,最近再次面临回京购书的局面,在回京之前总不能闲着,于是从去年看过的书中乱翻,以第一感觉来决定自己最想重读那本书,结果选中了温博格的《成为技术领导者-解决问题的有机方法》
两年前,当一位同窗好友集齐全套的温博格系列的时候,我曾很不屑的说他:一个人写那么多书,质量显然没保证,买他作甚?现在看来,当时确是井底之蛙了,温博格的书中少有瑕疵,尤其是后期作品,读来总是让人意犹未尽。
过去的几年里,我看过很多书,无论是早期GOF的设计模式,Martin Fowler的企业架构系列,还是Rod的J2EE开发厚厚的两卷本,甚至我最喜欢的POSA系列,虽然都会给人技术方面成长的感觉,但最好情况下也只是让我感觉到技艺的变化。
而管理方面的书籍,则大多走入两个极端,要么是学院式的分析解构,要么是江湖术士式的技巧集合。就像过去我曾很喜欢DEBORAH G. ANCONA的那本组织行为学和曾士强的中国式管理,但现在看来,DEBORAH关注组织多过于关注团队,而曾士强则过于强调中国人的心理情结,实用归实用,但可能不太适合技术人员的口味,读他的书让人感觉有些厚黑,让我常常想到一句俗语:人老精,鬼老灵。

而温博格的写作方式,如同Ken在英文版序中所说,会引起大量的思考,对温博格的文字的思考,思考对温博格文字的思考,以及对自身思考的思考....通过温博格的书,让我体会到的事是,读书,有时候是为了实用,而的有时候,则纯粹是为了过瘾。
本书中温博格的MOI模型,实际上不是一个行为指导手册,而是带来了更加宏观和可思考的空间,让你对自己在团队中的行为更加有目的性,也更加有效。我仍然记得两年前,上述同窗好友在某技术论坛发表的一篇名为《任务分解和任务分配》的帖子,现在看来,在该贴中提出的Effective Communication仍然太过于关注技术视角了,而现在,我则更加注重人文关怀,包括对技术架构。这一点,在本书第十章得到了精彩的阐述。

下面的内容,来自于本书第三章摘录

各种各样的想法是解决问题的核心,没有想法就不可能找到解决方案,但想法太多又会杂乱无章,领导者需要对想法的交流进行有效的管理。以下是领导者常用的12种典型的管理想法交流的方法以及点评。
    >  为团队提供一个聪明的想法。尽管这是最显而易见的领导者行为,而且有时新的想法的确会起到关键性作用,但事实上真正全新的想法是非常罕见的。比发掘一个新的聪明想法更重要的是创建一个合适的环境,是能够解决问题的想法一旦提出就能被大家意识到。
    >  鼓励和借鉴有用的旧想法。尽管有些领导者不愿意承认,但他们实际上是根深蒂固的模仿者。最优秀的领导者不仅承认这一点,而且将其视为一门艺术而精心培育。
    >  认真完善团队成员提出的想法。大部分解决问题型领导者在完善一个想法上花费的时间比提出这个想法多上百倍的精力。
    >  放弃自己的想法并支持团队采纳的想法,但只有当每个成员都充分了解你的想法时才予以放弃。放弃或保留你的想法是相当简单的,难的是要做到理智和公正。
    >  尽管时间压力很大,仍然不要吝啬花时间听其他人解释他们的想法。迫于时间压力,大部分想法没有经过充分理解就被否决了,事实上,其中一些想法可以为我们节省的时间是花在了解错误想法上时间的上百倍。
    >  检验别人提出的想法。在任何给定的环境中,绝大部分的想法都是没用的,但到底哪些才是有用的呢?领导者要做的就是分析和检验这些想法。
    >  为了保持想法的交流,不要轻易否定团队成员的想法。尽管检验这些想法是非常重要的,但几乎没有什么想法会危险到使我们来不及重新考虑一下我们的第一反应,就必须立刻否定。
    >  如果你不得不否定一个想法,那么一定要明确,你所否定的只是这个想法,而不是提出这个想法的人。解决问题型领导者一直清楚地知道,并不是所有的想法对每个问题都有帮助,但他们更知道,团队中的每一个成员都是有用的。
    >  在给出你的想法之前要先对它进行检验。没有人可以聪明到提出所有建设性的想法,而一个喋喋不休地发表自己未经仔细考虑的想法的人却能有效地阻止其他人给出自己的想法。
    >  当时间和人力吃紧时,不要再考虑新的想法而应该专注于现有的想法。
    >  鼓励团队成员放弃以前曾经成功过,但并不适用于现在情况的想法。
    >  如果一个已被否定的想法对问题的其他部分有价值,就应该重新采纳它。其实没有绝对不好的想法,之所以“不好”只是因为它们出现在不适当的地点或时间。

posted @ 2006-03-18 06:44 fisher 阅读(1326) | 评论 (1)编辑 收藏

欢迎加入“osgi观察者”googlegroup

去年年底,osgi R4发布,eclipse建立equinox项目,标志着以osgi为核心的组件管理模型正式进入使用阶段,鉴于今年年初jsr291的推出,osgi正式走向java世界的前端,遂建立osgi观察者group,希望能同所有关心和喜爱osgi的国内技术人员共同进步。

加入osgi观察者:

Google Groups Subscribe to osgi观察者
Email:
Browse Archives at groups.google.com

posted @ 2006-03-06 13:37 fisher 阅读(1008) | 评论 (1)编辑 收藏

善待自己每一天

最近的忙碌加上精神压力,让我患上了胃病,每天吃完饭都会难受好一阵子,给自己学医的儿时好友打电话,被劝之:“人生苦短,要学会善待自己每一天”。遂发此文为戒。

附一篇BJUG中Tin发的文章《白天纽约黑夜巴黎》
-------------------------------
白天纽约黑夜巴黎
-------------------------------
【王文华/文】

我在赶些什么?我耗尽青春用尽全力,拼命追求身外之物,结果我真的比别人有钱、有名吗?更重要的,我真的因此而快乐吗?远方有广阔的地平线,为何我还在原地摇过时的呼拉圈?

纽约和巴黎,代表了我人生的两个面向。纽约是白天,巴黎是黑夜。纽约是前半生,巴黎是下半场。

三十五岁之前,我认定纽约是世上最棒的城市。我在加州念研究所,毕业后迫不及待地去纽约工作。一做五年,快乐似神仙。我爱纽约的原因跟很多人一样:她是二十世纪以来世界文化的中心。丰富、方便。靠着地铁和出租车,你可以穿越时间,前后各跑数百年。人类最新和最旧、最好和最坏的东西,纽约都看得见。

所以在纽约时,我把握每分每秒去体会。白天,我在金融机构做事,一天十小时。晚上下了班,去NYU学电影,一坐四小时。在那二十多岁的年纪,忙碌是唯一有意义的生活方式。活着,就是要把自己榨干,把自己居住的城市,内外翻转过来。

这种想法并不是到纽约才有的。其实从小开始,台湾人就过着纽约生活。纽约生活,充满新教徒的打拚精神和资本主义的求胜意志。相信人要借着不断努力,克服万难、打败竞争。活着的目的,是更大、更多、更富裕、更有名。权力与财富,是纽约人的两个上帝。而能帮你走进天堂的鞋,就是事业、事业、事业。

在这种弱肉强食的生活方式,为了保持领先,每个人都在赶时间、抢资源。进了电梯,明明已经按了楼层的钮,那灯也亮了,偏偏还要再按几下,彷佛这样就可以快一点。出了公司,明明已经下班了,却还要不停讲手机,摇控每一个环节。在纽约,为达目的,可以不择手段,甚至赶尽杀绝。在纽约,没有坏人,只有失败者。

台湾,是不是也变成这样?

每一件事,都变成工作。上班当然是工作,下班后的应酬也是工作。有人谈恋爱是在工作,甚至到酒店喝酒、KTV狂欢,脸上都杀气腾腾,准备拚个你死我活。

我曾热烈拥抱这种生活,并着迷于这种因为烧烤成功而冒出的焦虑。这种焦虑让我坐在椅子边缘,以便迅速地跳起来闪躲明枪暗箭。这种警觉性让我练就了酒量和胆量、抗压性和厚脸皮。但也养成了偏执和倔强、优越感和势利眼。在纽约时我深信:能在这里活下来的,都是可敬的对手。黯然离开的,统统是输家。人生任何事,绝对要坚持到底。半途而废的,必定有隐疾。在这不睡的城市,每天我醒来,带着人定胜天的活力,跟着法兰克辛纳屈唱〈纽约?纽约〉:「如果你能在纽约成功,你可以在任何地方成功!」是的,在纽约,现代的罗马竞技场,我要和别人,以及自己,比出高低。

这套想法,在我三十五岁以后,慢慢改变。

第一件动摇我想法的,是父亲的过世。我父亲一生奉公守法、与人为善。毫无不良嗜好,身体健康地像城堡。七十二岁时,他得了癌症、引发中风,经历了所有的痛苦和羞辱。他一生辛勤工作、努力存钱、坚信现在的苦可以换得更好的明天。我们也相信一分耕耘、一分收获,用在纽约拚事业的精神照顾他。但两年的治疗兵败如山倒,最后他还是走了。父亲逝世的那天,我的价值系统崩溃了。我一路走来引以为傲的「纽约精神」,没想到这么脆弱。

不止在病床,也在职场。当我在企业越爬越高,才发现「资本主义」在职场中也未必灵验。上过班的都知道,很少公司真的是「开放市场」、「公平竞争」。大部分的同事都觉得你不是朋友、就是敌人。职场上伟大的,未必会成功。成功的,有时很渺小。很多人一辈子为公司鞠躬尽瘁,最后得到一支纪念笔。那些卷款潜逃的,反而变成传奇。

慢慢的,我体会到:世上有一种比「善有善报、恶有恶报」更高、更复杂的公平。人生有另一种比「功成名就」更幽微、更持久的乐趣。那是冲冲冲的美式资本主义,所无法解释的。

我能在哪里找到那种公平和乐趣呢?我想过西藏、不丹、非洲、纽西兰。然后,我注意到法国。

住纽约时,法国是嘲讽的对象。身为经济、科技、和军事强权的美国,谈起法国总是忍不住调侃一番。法国是没落的贵族,值得崇拜的人都已作古。法国人傲慢,高税率让每个人都很慵懒。动不动就罢工,连酒庄主人都要走上街头。

搬回台湾后,普罗旺斯、托斯卡尼突然流行。我看了弗朗西斯?梅思的《美丽的托斯卡尼》,其中一句话打动了我:「在加州,时间像呼拉圈。我扭个不停,却停在原地。在托斯卡尼,我可以在地中海的阳光下,提着一篮李子,逍遥地走一整天。」

是啊!我在赶些什么?我耗尽青春用尽全力,拚命追求身外之物,结果我真的比别人有钱、有名吗?更重要的,我真的因此而快乐吗?远方有广阔的地平线,为何我还在原地摇过时的呼拉圈?

当我重新学习法国,我发现法国和美国代表两种截然不同的生活方式。美国人追求人定胜天,凡事要逆流而上。法国人讲究和平共存,凡事顺势而为。纽约有很多一百层的摩天大楼,巴黎的房子都是三百年的古迹。纽约不断创新,巴黎永远有怀旧的气息。巴黎人在咖啡厅聊天,纽约人在咖啡厅用计算机。纽约有人潮,巴黎有味道。纽约有钞票,巴黎有蛋糕。

不论是政府或个人,法国人都把精神投注在食、衣、住、行等「身内之物」。就让美国去做老大哥吧。要征服太空、要打伊拉克、要调高利率、要发明新科技,都随他去。法国人甘愿偏安大西洋,抽烟、喝酒、看足球、搞时尚。当美国人忙出了胃溃疡,法国人又吃了一罐鹅肝酱。

讲到吃,法国有三百种起司、光是波尔多就有五十七个酒的产区。晚上六点朝咖啡厅门口一坐,一杯红酒就可以聊三个小时。九点再去吃晚餐,一直吃到隔天凌晨。他们在吃上所花的时间,跟我们上班时数一样。但讽刺的是:他们没有「All
You Can Eat」。

吃很重要,但也要会挑时间,朋友介绍我去试一家法国餐厅,提醒我他们礼拜二、四晚上休息。「为什么?」我问。他说:「因为主厨要回家看足球。」

聪明的主厨懂法律。法国法律规定一周工作最多三十五小时,大部分的人一年有五周的假期。而美国人把加班当作自己有价值的表示,度假时还拿着手机回E-mail。法国人比美国人会玩。每年六月的巴黎音乐节,从午后到深夜,几百场露天音乐会在各处同时举行,人多到地铁都暂停收费。每年十月的「白夜」,平日入夜就打烊的店面,彻夜营业到清晨七点。每年夏天,巴黎市政府在塞纳-马恩省河右岸布置了三段、总长一.八公里的人工海滩。细砂、吊床、躺椅、棕榈树,自然海滩有的景致这里都有,让没有钱去海边度假的民众,也可以享受到海滩风光。

当然,法国这么深厚的文化,不可能只从吃喝玩乐而来。美国人读书,为了考证照。法国人读书,为了搞情调。每年十月的读书节,大城市的火车站内,民众轮流上台朗诵诗句。书店营业到天明,整晚有现场演奏的乐曲。「美食书展」选在铜臭味最重的证券交易所举办。小镇书展的书直接「长」在树上,读者必须爬到树上,把书摘下来品尝。

一直跟着美国走的台湾人,会心动吗?

我心动了。十一月我到巴黎,一位法国朋友来接待我。临走前我问他:「明天你要干嘛?」

「我要去银行。」

「然后呢?」我问。

「我不懂你的意思......」

对我来说,「去银行」是吃完午饭后跑去办的小事。对法国人来说,这是他一天全部的行程。法国人总是专心而缓慢的,每天把一件小事做好。

这样的生活,对美国或台湾人来说,实在是太颓废了。的确也是。法国失业率接近10%,高税率让雇主宁愿打烊休息,免得帮员工缴税。巴黎闹区纸醉金迷,但郊区的少数民族却没有工作机会。这些都是黑暗面,但对于每日被强光烤焦的台湾人,阴暗也许提供了喘息空间。生命的终点都一样,有钱人的丧礼只是比较多人上香。不断的追赶只是提前冲向谢幕,为什么不把时间花在慢慢为生命暖场?你不需要一辈子鞠躬尽瘁、死而后已。你可以偶尔伸伸懒腰、安步当车。

我从巴黎回来,台北并没有改变。关了两周的手机再度响起,一通电话找不到我的人会连续狂call十通。和朋友见面,他很关心地问我:「好了,你现在工作也辞了、欧洲也去了,接下来有什么projects?」

「Projects」?多么纽约的字眼。

我真想说:「好好生活,不就是人生最大的project?」但我知道在熙来攘往的台北街头,在不到四十岁的年纪,这样说太矫情了。况且,我今天之所以有钱有闲享受法式生活,不也正因为我曾在美式生活中得到很多利益?我仍热爱工作、热爱纽约,但已不用像二十岁时一样亦步亦趋、寸步不离。

所以我说:「我还是会早起,白天努力写作。但到了晚上,我想关掉手机。」

世界少了我,其实无所谓。但我少了我,还剩什么?

他笑一笑:「你这是用纽约来过白天,用巴黎来过黑夜。」

唉,他讲得真好!这应该是一个完美的妥协吧。也许有一天,我能创造自己的「白夜」,让白天和黑夜融合在一起。但我还没到那个境界。

「明天星期一,你要干嘛?」他问。

「我要去银行。」

「然后呢?」

我张大眼睛,停顿了一下。

「然后呢?」他追问。

「然后我会摩拳擦掌,认真地写一篇文章。」


我们是不是也应该学一学法国人呢?提高些生活质量,注意身体。

posted @ 2006-02-28 11:04 fisher 阅读(988) | 评论 (4)编辑 收藏

MINA vs. QuickServer

很久没更新blog了,实在太忙,今天看到有朋友在我去年的blog《MINA is a good framwork 》中回复提到比较一下MNA和QuickServer,遂写一篇小文:

First for all, QuickServer is licensed as LGPL, and MINA as ASL

从我个人角度而言,去年看过QuickServer的源码,我在项目中采用的每一个框架或类库都会做综合评价,通常不会是一个原因导致我采用或没有采用某个库或框架,具体最后没有采用QuickServer的原因忘记了,但是当时给我的总体感觉是,QuickServer虽然很方便,但不会让我在架构上得到新的好处。而它最大的优点则是,支持JDK1.3(如果没记错的话),另外就是License的问题

下面看一看来自TrusinLee的评论:

Thank for the information about another network application framework.  I found a few differences:

* QuickServer supports blocking mode.  (MINA supports only non-blocking mode, but you can make your operation block at your will.)
* QuickServer provides GUI-based admin.  (MINA doesn't have one yet, but will have full JMX support soon, which is a standard.)
* QuickServer uses java.util.logging.  (MINA uses SLF4J, which is a safe replacement of commons-logging.)
* QuickServer uses its own XML settings.  (MINA provides Spring framework integration instead.)
* QuickServer can specify maximum number of clients allowed.  (MINA can do this using a filter, but not implemented by default.  Of course, this will be implemented as an overload prevention filter.)
* QuickServer team has one crew.  (MINA has three crews.)
* QuickServer project started in 2003.  (MINA started in 2005.)
* QuickServer has a difference event handler interface from MINA.  (You'll have to compare it by yourself.  IMHO, MINA has one simple enough handler which covers all QuickServer provides.)
* QuickServer doesn't support UDP at all.  (MINA does)
* QuickServer doesn't support client-side API at all.  (MINA does)
* QuickServer integrated authentication and text protocol in its core.  (MINA didn't and they are considered as a cross-cutting concern that a filter should take care of.  IMHO, MINA is more extensible here.)


至于对MINA更详细的介绍,可以看看我去年翻译的MINA的Tutorial

MinaTutorialInChinese

MINA的应用,在MINA的Testimonials中有两个项目:
开源Flash server:red5
http://ludonet.leonardo.it/的game server
还有,就是MINA所在的项目,Apache的LDAP

posted @ 2006-02-24 21:58 fisher 阅读(6199) | 评论 (18)编辑 收藏

一个SWT Application如何转职成为RCP Appliactioin

昨天david问到如何将旧的swt应用转成一个RCP应用,昨晚胃疼难忍,于是草草说了一下,就早早上床休息了,早上起来又想起这件事情,遂在这里说一下思路
下面说一下我的思路
(注:以下观点未经证实,请自行斟酌使用)

一个旧的SWT应用,应该都是有一个main函数里初始化一些UI组件,然后run一个事件循环

在RCP中,由于是基于Eclipse的插件体系,也就是说,使用我前面那篇文章发布的RCP Application,是可以直接发布成Eclipse插件的
所以,对于UI组件的控制也要遵循Eclipse的插件体系的代码要求,看看Hello RCP模板中的几个类:ApplicationActionBarAdvisor、ApplicationWorkbenchAdvisor、ApplicationWorkbenchWindowAdvisor以及RCPPlugin,想起了什么?对,OSGI

我们只要将原swt的main函数中初始化的ui组件,放入到这几个Advisor中进行初始化

将下拉菜单项的ui组件的初始化工作放入到ApplicationActionBarAdvisor的如下方法:

    protected void makeActions(IWorkbenchWindow window) {
    }



    
protected void fillMenuBar(IMenuManager menuBar) {
    }


将其他UI组件初始化工作放入到ApplicationWorkbenchWindowAdvisor的如下方法:

    public void preWindowOpen() {

        IWorkbenchWindowConfigurer configurer 
= getWindowConfigurer();

        configurer.setInitialSize(
new Point(400300));

        configurer.setShowCoolBar(
false);

        configurer.setShowStatusLine(
false);

        configurer.setTitle(
"Hello RCP");

    }


至于ApplicationWorkbenchAdvisor这个类,我想你一定想起了Eclipse中的Workbench概念
在这里,可以定义当这个RCP作为plugin的时候的Worbench的透视图的一些属性。

-----------------------------------

最后,基于Eclipse3.1的product方式的RCP程序将获得同Eclipse相同的插件体系支持
也就是说:你的应用本身就是基于Eclipse Platform的,这样,你的程序也可以接受插件插入了(如果你设计的好的话^_^)
另外,还有其他很多好处,比如在线升级功能的自动绑定啊,帮助功能的使用啊等等
想一想,你的程序将既能作为单独的程序运行,又能作为Eclipse的插件运行,而且还跨平台,think about it...
So....try it now, you will get more

posted @ 2006-01-17 11:02 fisher 阅读(1721) | 评论 (0)编辑 收藏