阿飞 的个人资料N-Life照片日志列表 工具 帮助
2006/10/9

我的第N重性格

其实,我想说,每个人都有N重性格,这个道理是简单的,因为你至少有你的父亲和母亲,你至少得从他们那边继承一些特性过来,当然,这个继承是多重继承。不只是你的父亲母亲,你还会受到不少影响,比如你搞IT,那么你也会从IT这类人里继承一些东西过来。
扯远了,其实我想说的是我的第N重性格。
我这个人,我可以慷慨到极致,也可以吝啬到极点,我可以随时对某样东西充满激情,也可以顷之对它消极到极点。
我是个复杂的个体,也是个简单的个体。复杂到有多重的性格,简单到当我的外在被一层一层剥下来,我只剩下最原始的我。我只是一个有点梦想有点想法有点IDEA有点懒的一个人。这个世界蕴含的复杂性和简单性也许就在于世界也是具有着多重的性格,多重的命运。
我喜欢冒险的生活,我喜欢安逸的环境,我向往于闹事之中,也向往隐居深山。这一些其实都源自自己的多重性格。
白天可以在办公室里一本正经,晚上却可以在疯狂的追逐尽情的放纵。  
其实这世界是如此的压抑,以至于我们如果没有多重的性格,这生活岂不很无趣。
 我想我已坦白,这就是我,那亲爱的朋友,你呢?
2006/4/16

关于数学

在《数学:确定性的丧失》,作者在第十三章数学的孤立谈到纯粹数学和应用数学的一场有趣的论战。里面提及数学为了抽象而抽象,因为解决现实问题的无能而只能为了数学而数学。数学越来越脱离现实,数学甚至被孤立。
纯粹数学家们这样反驳:傅立叶(实用派者)确实认为数学的主要目标是公众的利益和对自然现象的解释;但像他这样的科学家应该知道自然科学的唯一目标是人类精神之荣耀,而且依此为据,数论问题和一个关于行星系的问题同等重要。(雅可比)
 
大体上来讲,我是个实用主义者,我认为数学是工具。计算机也是工具,数学是更基础的工具。
马克思说,人和动物的最大区别就是人会使用工具。而我说,牛人和非牛人的最大区别是牛人更会使用工具。这里使用工具的意思延拓至借助外力。当然这不包括大师,大师是创造工具。
所以在这点上我偏向应用数学家们。
 
相对来讲,应用数学家更受重视。冯·诺依曼这个伟大的数学家,物理学家,计算机科学家,经济学家在哪个领域被提及最多呢?在第一台计算机ENIAC的设计中。
 
烦琐的论证是纯粹数学家干的事。在这点上我佩服傅立叶。
 
基于以上的想法,所以在数学里最重要的证明中我经常偷点懒,比如如果证明某个东西在几何或者在其他方面上是显然的,或者在我直觉上认为自明的,我通常很少花精力研究它。因为我觉得显然和自明实在也是很有效的一个工具。
 
但我竟然还对纯理论的东西感兴趣。即使他看起来似乎一点价值都没有。
 
这大抵是因为我懒,和因为上面所说的因为人类精神的荣耀。
 
在我看来,通晓递归论,lambda演算等纯计算理论对理解计算机有极大的帮助。与其苦思冥想于茫茫黑夜中辗转反侧不得求解,不如于书中探寻大师的成果。理论指导是最省事的方法。世界是无尽变化,我想只有纯粹没有太多背景的理论才可以一劳永逸,而一劳永逸是懒人追求的目标。
 
 
 
PS:以上是我去年看《数学:确定性的丧失》写的。贴出来一是表明自己身份,我是学数学的。二是整理整理东西,估计以后工作后不大会去看这些东西了。
2006/4/12

主题作者的错误

  各位想想是如何关闭窗口的。
  相信各位最大化或还原都是双击标题栏。而关闭窗口呢?
  我是这样关闭窗口的:如果是最大化时,则鼠标飞速甩到右上角,然后点击,OK,关掉了,因为Windows关闭按钮的hotspot(热点)则包括了最右上角,即包括最右上角的一个像素。
  而如果鼠标慢慢移动到关闭按钮,难免要分出些精力去看看是否有点中关闭按钮,这样,操作速度就慢很多了,须知屏幕上最容易到达的地方就是屏幕边缘四个顶点。
  如果处在还原状态窗口时,则有时用任务栏关闭,通过关闭按钮直接关闭,有时候甚至先最大化之后关闭。
  Microsoft的所有主题都有这个特性,这无疑提高了操作速度,而有些主题却弱智的很,hotsopt竟然不在最右上角。如Piosx,这是多么愚蠢的设计啊。
  特别的,Linux下的很多主题都是如此,在KDE的自带主题中几乎只有如KSTEP等少数几个主题没有出现这个问题,其他的主题都有这个问题。

  主题作者的错误2是任务栏。有的主题把任务栏抬高了很多,这样子,鼠标要通过任务栏点选窗口的时候,不得不上移一点,而如果设计成任务栏的hotspot包括最下面的。则点选时则可以只查看标题栏鼠标大概位置,这样切换窗口会快很多。
  Linux桌面有一个优点就是Linux桌面有极大的可配置性,在windows下不知各位是如何最小化桌面的,是鼠标慢慢移到任务栏的显示桌面按钮按住Windows徽标键+D。在Linux下,无论是KDE或者是Gnome都可以调整显示桌面按钮,使之置于屏幕最右下角,这样子最小化所有窗口时就像关闭一个窗口一样方便了。
  
(主题指桌面主题,本文首发于先锋
2006/3/23

现在的大学教育不就是一种消费吗?

  现在的大学教育不就是一种消费吗?
 
  在一个贫困家庭中父母亲省吃俭用却不能供孩子上大学这样的例子在农村真是举不胜举。大学教育对中国大多数家庭来说是一个大消费。
 
  并且这种消费不止体现在大学门槛上面,还体现在大学生活上面。

  有一次我竟然对一个人说:考入大学吧,好好的享受大学生活吧。想不到在我的观念中,大学竟只是用来享受的,大学是社会的度假村。大学生活就像在消费一般。

  或许这样说偏激了点,生活原本就要追求质量。
  但是终于为自己碌碌无为而羞耻。但之后又如何呢?也总是重归沉默,重归堕落。
  我的大学生活就像在消费。
 
  但是,现在的问题是,大学教育本来不该是一种消费却成为了一种消费。而按照GCD的话说,大学教育是为了培养建设社会主义的高级人才的。本着人人平等的原则,大学教育不该让老百姓消费不起的。
  大学教育既然成了一种消费,从而,教育成为了一个产业也就合理了。
 
  一想到这件事我就害怕,如果有一天教育只有有钱人才能消费的起,老百姓已消费不起甚至不敢消费这个基本的受教育的权利,那这个世界将是何等的世界。
2006/1/17

Why Learning Lisp

我也加入了鼓吹Lisp一族当中了。
 
大概学数学的都应该学习一下Lisp语言,用来作为进入计算机科学殿堂的引子。

Lisp更多的是作为一种科学家使用的语言,而不是技术的语言。这或许是他在工业中使用相对较少的原因之一。
 
它是一种追求数学美的人使用的语言。它有类似于数学公理的框架。它由若干个最简单的操作公理构成整个体系,并且简单优雅的实现了自举。当然,根据哥德尔定理,这个体系必有不完全性,其所不能的便是不可计算的,或者说非lambda可定义函数,例如图灵停机问题。
 
Lisp有简单高效的数据结构。它可以非常好的处理符号数据。体现了计算机在数值计算之外的能力。
 
古怪简单的语法,产生强大灵活的能力。在Lisp里,我们几乎不需要进行词法分析。我们工作在抽象语法树上。Lisp宏提供了可怕强大能力。
 
函数式的编程,无赋值的程序设计,更容易验证正确性的程序。一等公民的函数产生高阶函数强大灵活的抽象能力。
 
lambda演算机和图灵机的等价性在各自的典型代表Lisp和C中彻底的体现出来了。
 
它是Python,Javascript等语言的基础之一。将有助于深入了解Python和Javascript。
 
学习它将会带来了更宽广的计算机世界。我们将会知道可以实现比线程机制更为强大的continuous,这个不一样的函数调用机制,闭包,自动的存储管理,延迟计算,尾递归的自动优化。我们甚至会知道lambda演算,可计算理论,甚至PI演算,prolog式的逻辑程序设计。
 
 
2005/12/31

改变 碎片

我终于看到了雪,却终于没登上泰山。
好多诺言没有实现,生活却依旧得过。
回来前那一晚,我终于酩酊大醉。


我开始下决心学习计算机,
数学渐渐开始离我而去。


逍遥爱情来了又去,矛盾开始为爱情而矛盾
我却依然单身一人。

我的她再可爱
只能爱着我的未来
我忘不了你
你却浑然不觉


五虚终于决定考研,考会计!
或许真的不适合数学。
是教育的失败或是人生的失败呢?


2005年我莫名其妙竟成了博客,Web换上新装现在已经是2.0。
BBS开始实名,Wiki再次被封,网站开始备案。
网站越来越多,技术越来越好,网络却越来越无聊。

世界不断的改变改变
我的心思却不愿离开从前
时间不停的走远走远
我的记忆却停在
却停在那2005年


中国风开始流行,英文歌依然还是RAP
只有流行没有音乐
或许依然没变

十一月里我依然把专辑反反复复听了四五十遍
却似乎却少了份感动

我没成为理想中的那个人真的很抱歉
我想我上辈子是欠人家钱下辈子被人家欠
这辈子最好努力一点


天才就怕不够天才
坏又不够坏
天天都想离开
却不知到那里才能换骨脱胎

在今年大概是在讲王垠

 

非典幸亏没危及到这里,禽流感却悄悄来临。
白血病和过劳死发生在眼前,我才感慨生命可叹。

学生生涯终于捱到最后一个段落,我终于找到工作。
属于我们的精彩,或许明年将会开始。


始于飞行者开头终于战争之王,
或许我会越来越狂。

我终于没有实名,我终于开始博客,
我终于开始写程序,我终于又立下新的目标。

世界不停地改变,改变。唯一不变的,就是改变。

链接:改变1995

2005/12/14

程序的自输出

近来偶尔翻看mit的《计算理论导引》,
在讲递归时有提到,程序自输出自己的方法。
其中有一种方法如下:

请输出以下语句两遍,并将第二个句子加上引号。
“请输出以下语句两遍,并将第二个句子加上引号。”
 
闲来无事,用C语言实现之。
思路类似上面方法。
 
char* s="请输出上面语句两遍,并作一些处理。"
请输出上面语句两遍,并作一些处理。

由于在c语言字符串内不能直接写引号。故所有输出该改为putchar输出。
程序代码如下:

char s="int main(){putchar(99);putchar(104);putchar(97);putchar(114);putchar(42);putchar(32);putchar(115);putchar(61);putchar(34);printf(s);putchar(34);putchar(59);putchar(10);printf(s);putchar(10);return 0;}";

int main(){putchar(99);putchar(104);putchar(97);putchar(114);putchar(42);putchar(32);putchar(115);putchar(61);putchar(34);printf(s);putchar(34);putchar(59);putchar(10);printf(s);putchar(10);return 0;}


也可以用define宏定义实现。
在Java也可以类似实现.
 
2000年的国际混乱C程序大赛有这样一个程序:
            #define/**/X
          char*d="X0[!4cM,!"
           "4cK`*!4cJc(!4cHg&!4c$j"
         "8f'!&~]9e)!'|:d+!)rAc-!*m*"
       ":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!"
      "+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c"
      ")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+"
     "d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)"
    "d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E"
       "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)"
       "f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b"
       "+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4"
       "!2)c9e2!9b;e1!8b>e/!     7cAd-!5fAe+!7fBe(!"
      "8hBd&!:iAd$![7S,Q0!1     bF 7!1b?'_6!1c,8b4"
      "!2b*a,*d3!2n4f2!${4    f.      '!%y4e5!&f%"
     "d-^-d7!4c+b)d9!4c-a    'd        :!/i('`&d"
     ";!+l'a+d<!)l*b(d=!'   m-        a  &d>!&d'"
    "`0_&c?!$dAc@!$cBc@!$   b         <    ^&d$`"
    ":!$d9_&l++^$!%f3a'    n1        _       $ !&"
   "f/c(o/_%!(f+c)q*c     %!         *       f &d+"
   "f$s&!-n,d)n(!0i-     c-         k)       !  3d"
   "/b0h*!H`7a,![7*     i]          5        4   71"
  "[=ohr&o*t*q*`*d      *v         *r         ;  02"
  "7*~=h./}tcrsth      &t          :          r   9b"
 "].,b-725-.t--//      #r         [           <   t8-"
 "752793?  <.~;b      ].t--+r     /           #    53"
 "7-r[/9~X  .v90      <6/<.v;-52/={            k   goh"
 "./}q;   u  vto     hr  `.i*$engt$            $    ,b"
 ";$/     =t ;v;     6     =`it.`;7=`          :    ,b-"
 "725    = / o`.    .d       ;b]`--[/+       55/     }o"
 "`.d   :   - ?5    /           }o`.'     v/i]q      - "
 "-[;   5  2  =`  it            .        o;53-       . "
 "v96   <7 /      =o            :            d        =o"
 "--/i  ]q--      [;           h.            /        = "
 "i]q--[  ;v      9h           ./            <        - "
 "52={cj   u      c&`          i   t       . o        ; "
 "?4=o:d=         o--          /  i        ]q         - "
 "-[;54={  cj     uc&          i]q          -          -"
 "[;76=i]q[;6     =vsr        u.i           /          ={"
 "=),BihY_gha     ,)\0        "             ,          o [
  3217];int i,   r,w,f        ,              b        ,x ,
  p;n(){return   r  <X        X               X       X  X
  768?d[X(143+   X  r++       +               *d      )  %
   768]:r>2659   ?  59:       (                x      =  d
   [(r++-768)%   X  947      +             768]       ) ?
   x^(p?6:0):(p  =   34      X            X           X )
   ;}s(){for(x=  n   ();     (           x^           ( p
  ?6:0))==32;x=  n    ()     )   ;return x            ; }
  void/**/main X      ()     {           r           =  p
  =0;w=sprintf  (X     X     X         X X           X o
  ,"char*d=");  for          (    f=1;f <            * d
  +143;)if(33-(  b=d         [      f++ X           ]  )
  ){if(b<93){if   X(!        p          )             o
   [w++]=34;for    X(i       =         35             +
    (p?0:1);i<b;    i++      )         o
    [w++]=s();o[     w++               ]
     =p?s():34;}     else              X
       {for(i=92;     i<b;            i
    ++)o[w++]=     32;}           }
         else o     [w++          ]
             =10;o        [
               w]=0      ;
                puts(o);}
    
编译这段代码,运行
将输出重定向到一个*.c文件
然后编译这个*.c文件,再运行,再重定向…………
如此往复三次,构成一循环。
2005/11/22

google的blog search

  在搜索论坛方面一直是搜索引擎的弱势。一是由于论坛的实时性,二是由于论坛的不统一性,各个论坛结构数据不大相同。

  由于普通网页是非结构化的。由于非结构化性,搜索难度增大了很多,搜索的东西一般只能简单的依据网页文字,而网页文字缺乏结构描述,语意不明确,搜索效果差强人意。
 
  而在搜索blog则可以简单的进行,这一切是由于RSS,tag的引入。RSS是个xml文件,正是这个xml把blog结构化起来了。于是搜索方便了,不再受各种混乱数据的干扰了,而blog的tag技术则使语意更加明确了。如此,搜索的准确性无疑会大大增加。
 
  google blog search更新速度很快的,发表一篇文章几分钟之后便可以搜索得到了。这是它的很大的一个特点。通常google的网页搜索更新较慢,需要几天时间甚至更长,视各个网站而定。这样子找最新东西便不能依靠搜索引擎。而通过搜索Blog则可以很快的搜索到最新的结果。从这点也可以看出blog的潜力巨大。
 
  另外blog一般都是由个人维护的,信息的有用性则会有较大提高。
 
  google blog serach的缺点是搜索范围较为狭窄,很多国内的blog站点都没有收录进搜索范围。
 
2005/11/21

威廉博士的威廉古堡

威廉博士说:我的家是全世界最美丽的地方。

因为,厦门是全世界最美丽的城市。厦门大学是厦门最美丽的地方,而我的家是厦门大学最美丽的地方。
 
其间还有一问:你为什么选择中国定居
威廉博士说:Because chinese food is too expensive.
2005/11/20

Why interface

想一想为什么要用接口,找几个理由
 
1,使用接口抽象,使用模式,更好的复用,更扁平化的设计,实现面向接口编程。
 
2,替代C的h文件,虽说可以通过类直接发布,但接口功能更抽象,可以封装的更好。
 
3,用于webservice的功能以向外发布。
 
4,测试用mock,或者说更容易实现动态代理。
 
5, 部分代替多重继承。
 
以后有什么理由继续补充。。。

冠捷这公司

收到冠捷的offer,心里其实还是挺爽的,毕竟是第一个offer。
可惜,向同学打听了一下,竟然如此:(以下为部分聊天记录)

 含霜 23:49:22
试用期是3个月,本科1000,
转正后估计1500~1800
一般签3年  
含霜 23:49:44
这是新的消息!
阿飞 23:51:13
那我还去个屁啊
好郁闷啊。。。。。
 
含霜 23:51:52
⊙绝世封尘⊙ 23:52:07
住房你不住公司,补贴给你75元每月,住了就没这75元
⊙绝世封尘⊙ 23:52:12
签约2-3年,一般都是3年
转正后估计1500~1800包括奖金,刚进去就差不多就这样,具体我也不是很清楚 
阿飞 23:56:35
ok,谢谢你了
含霜 23:57:31
感觉如何?去不?
阿飞 23:57:45
我觉得我是个民工了。
 
含霜 23:58:43
据说食堂不错,本科一顿饭2.8元,
含霜 23:58:51
专科2.3
含霜 23:59:01
本科跟领导一起吃
阿飞 23:59:11
本科跟领导一起吃 ,这个那个人一直跟我说,呵呵,印象深刻
 
含霜 23:59:25
专科和民工一起吃。没地方坐,站着吃
阿飞 23:59:50
太离谱了把
  
含霜 00:00:32
专科喝清汤
含霜 00:00:43
本科有另外的汤

 
说到这里,我只能用无语来形容了。
工资低是台资企业的通病了,想不到等级制度竟还如此之森严。连最后仅存的去学好技术,三年走人的愿望都破灭了。
2005/11/8

meebo研究(1) 快速聊天响应的实现

meebo是一个支持msn,yahoo,gtalk,aim的Web聊天系统。其通讯系统、用户界面做的非常棒,支持IE,Firefox,Opear。相比其他web聊天系统,他有一个大优点就是快速响应,你发给好友一个消息,或者好友发给你一个消息,几乎都能马上响应。

meebo采用了XMLHTTP技术实现无刷新通讯。当客户端发送一个消息的时候,立即用XMLHTTP技术发送给服务端。这样便实现了发送消息的立即响应。
 
但如何保证接受消息的立即响应呢,即好友聊天消息快速到达客户端。
meebo采用了如下方法:
客户端登录后马上通过XMLHTTP发送消息A给服务器端。该消息文本是没有任何意义,但可以验证客户端是否在线。服务器端接到该消息后,查看是否有新的消息(如有好友消息,身份验证信息等)。
 1、 如果有,立即返回,即把该新消息应答客户端,然后关掉连接。客户端处理好消息后再次发送消息A
 2、如果没有,服务器端不立即返回,而是wait(30s)即等待30s,保持连接30秒。在这30s中,如果有新消息
   1 如果是客户端的新消息(例如,客户端发送消息给某个好友),维持不变。
   2 如果有好友的新消息,则该连接立即返回客户端,(可用notify实现)然后服务端关闭该连。   
      客户端收到消息后处理,然后继续发送消息A。
   3 不管是否有消息,30s后该连接立即返回。
(注意Servlet执行完毕即会自动关闭该连接)
然后如此反复。
 
 
以下是一个DEMO
test.html
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="0">
<script type="text/javascript" language="javascript" src="ajax.js"></script>
</head>
<body onload="talktoServer()">
<h2>Message</h2>
<div id='MessageDiv'>
OK Let us go.......
</div>
</body>
</html>
 
ajax.js
 
function talktoServer(){
 var req = newXMLHttpRequest();
 //register the callback handler function
   var callbackHandler = getReadyStateHandler(req, responseXmlHandler);
   req.onreadystatechange = callbackHandler;//设置回调函数
   req.open("POST", "test", true);
   req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   //get the value from the text input element and send it to server
   req.send(null);
}
function newXMLHttpRequest() {
 var xmlreq = false;
 if (window.XMLHttpRequest) {
  xmlreq = new XMLHttpRequest();
 } else if (window.ActiveXObject) {
      // Try ActiveX
  try {
   xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e1) {
   // first method failed
   try {
    xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
   } catch (e2) {
     // both methods failed
   }
  }
  }
    return xmlreq;
}
//回调函数
function getReadyStateHandler(req, responseXmlHandler) {
 return function () {
 if (req.readyState == 4) {
  if (req.status == 200) {
          responseXmlHandler(req.responseText);
  } else {
   var hellomsg = document.getElementById("MessageDiv");
   hellomsg.innerHTML = "ERROR: "+ req.status;
        }
     }
  }
}
function responseXmlHandler(str){
  mDiv = document.getElementById("MessageDiv");
  divtext = mDiv.innerHTML;
  mDiv.innerHTML = divtext +'<br/>' +str
  talktoServer() //反复调用该函数
}
 
 
web.xml部分内容如下
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>demo.Test</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
 
 
Test.java如下(主servlet):
package demo;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Test extends HttpServlet {
 private static final long serialVersionUID = 1L;

 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/xml");
  response.setHeader("Cache-Control", "no-cache");
  Object lock=getLockFromSession(request);
  synchronized (lock) {
   try {
    lock.wait(10000);
    response.getWriter().print(
      new Date().toString() + "  A Message Come."+request.getSession(true).getId());
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  doGet(request, response);
 }
 private Object getLockFromSession(HttpServletRequest req) {
  HttpSession session = req.getSession(true);
  Object lock = session.getAttribute("lock");
  if (lock == null) {
   lock = new Object();
   ReceiveThread receiveThread = new ReceiveThread(req.getSession(true));
   receiveThread.start();
   session.setAttribute("lock", lock);
  }
  return lock;
 }
 
 
}
 
 
ReceiveThread 如下,负责发送测试消息
package demo;
import javax.servlet.http.HttpSession;
public class ReceiveThread extends Thread {
 HttpSession httpSession;
 public ReceiveThread(HttpSession httpSession) {
  this.httpSession = httpSession;
 }
 public void run() {
  Object lock = httpSession.getAttribute("lock");
  while (true) {
   if (Math.random() > 0.5) {
    synchronized (lock) {
     lock.notify();
    }
   }
   try {
    sleep(3000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
}
2005/11/7

开源降低了门槛 开源的弱势 开源的原因

在我看来,开源有一个很大的优点就是开源降低了门槛。
 
Eclipse的出现,IDE门槛降低了很多,几下捣鼓,一个支持语法高亮,代码折叠,代码自动完成的IDE就出来了(其插件机制是一部分原因,但更重要的是其采用的开源协议)。Firefox的出现,浏览器门槛降低了,Linux等一大帮开源操作系统的出现,操作系统的门槛降低了。像最近频繁出现的一大堆国产操作系统,基本都是拿国外的操作系统改修改。如果从底层去开始开发的话,我相信至少要潜心开发几年。而且效果可能还差强人意。而现在,只是在一大堆开源产品面前修改一下,一个操作系统就成型了,还可以美名其曰不重复发明轮子。其他的还有永中Office之于OpenOffice,Redflag之于RedHat等等。希望开源不要成为某些人吹牛、炫耀成绩的资本。
 
开源的弱势:
 
Unix/Linux上面的很多软件都有Windows的版本(实在不行用cygwin),而很多Windows版本专有的软件却很少在Unix/Linux出现,而只有wine之类的软件去模拟。这其中一个原因便是Unix/Linux上面的很多软件都是开源的,有了源代码就容易移植多了。这也成了一个现象,Windows下的软件比Unix/Linux丰富。这或许就是开源的尴尬之一:竞争者容易快速复制你的产品的特性。相信如果Windows开源的话,没过几天,完全兼容Windows,并且比Windows更好,有更多特性的操作系统马上就会出现。这或许是很多大公司不愿开源的最重要的原因。
 
开源的原因:总结了一下,如今开源一般有如下原因
 
1 基于自由共享的梦想,如Linux操作系统,GNU的产品。
2 不得不开源,由于采用了GPL等协议的代码不得不开源。
3 新的软件工程方法,一种新的方法论,开源可以得到很多的帮助,源代码可以得到更好的质量保证。
5 代码安全性等。软件的品质保证最本质的保证就是代码级的保证,如Windows的有选择的开源。
6 吸引眼球,开源是一个潮流,开源自然能吸引更多眼球,如JBoss。
2005/11/1

惊艳·逆鳞

 
逆鳞,是一个人身上的弱点,其他人士不能碰的,因为这回伤害到这个人。
 
正如贝多芬命运交响曲前奏的敲门声,逆鳞的第一句重磅投了下来。“这生命,对每个人都不公平”,
绝对让你震撼,心脏跳动。

主人公被人触了逆鳞,生命在按响尖叫。

然后开头的一段rap,人生,本来就是一场即兴
如果生命 对每个人 都不公平 也没道理
那就让我 败者孤寂 继续前进 直到光明 
 
“永远患疾 发出声音 让他们安静不敢相信 继续前进
他们畏惧 睁大眼睛  他们躲避 难道放弃 暂时聆听 我的声音”
霸气立现
 
我生命再怎么粗糙,我都要活的很骄傲
这一句让人热血沸腾
 
中间出现了关于自尊的rap:
我说自尊那,看起来或许可笑 但它至少支着我,试着不让我颠倒
这句着实有意思,这首歌的哲理性也体现于此。
 
中间出现一段独奏,歌曲得到舒缓,就像找到一个避风的港湾,然而随着鼓点声开始,新的风暴马上就来临。生命是永远不公平也没道理的,所以还得继续前进。
 
编曲延续了以父之名的华丽,中间大量运用古典弦乐协奏,有种气势淋漓,山雨欲来的气势,歌曲显得尤为饱满,尤其是结尾的桥段是标准的古典曲式,听这首歌就像去听了一场交响音乐会。
2005/10/27

华硕这公司

  华硕公司得两次宣讲会我都去过了,坦白的讲内容很精彩。

  第一次去是许佑嘉先生演讲,许佑嘉先生是华硕电脑中国业务事业群总经理。许先生是个很有趣的人,讲话很幽默,是那种自嘲性的幽默,并且经常借助他那优点滑稽的体形(身材较矮,略胖)来开玩笑,一点不顾自己的身份,这一点使我印象深刻。这使我想起了我高中的语文老师。他也是经常透过形体动作使我们更能体会其中之奥妙。

  在大学里听过的演讲也不少吧,只有许先生的那次演讲却使我记忆深刻,感受到了台湾人的幽默与真诚。

  第二场是华硕中国客服总监游世芳先生作演讲。游先生客服出身,他对人的心理研究的很透彻,做客服不可谓不资深。整场宣讲会基本都是他在主导,我们被他牵着走。

  两次的宣讲会讲的内容都差不多,首先讲他们公司业绩多牛,然后讲他们公司理念,这一块讲的著时详细,末后还有奖品相送。

  我一直觉得华硕的宣讲是一个很高明的方式。讲产品业绩是他讲其全球第一,他讲其未来规划,而且来还精确的量化了,让人看得到摸的着。讲公司理念时又可以说是循循诱导,还辅以现场实例。让人禁不住热血沸腾。而相比之前的美的公司的宣讲会主要讲的只是并不诱人的公司福利, 孰高孰低,一判便知。

  台资企业的工资并不高,华硕也一样。所以华硕避开这些东西,而主讲它的公司理念,而且反而显得更加大气。

  讲公司理念时用动物做比喻,如长山蛇,常山蛇,藏山蛇论,巨狮论,松鼠、大雁、海狸论形象而生动,华硕用这些东西推销其共好理论,推销其公司理念,很成功,我也觉得华硕确实是家优秀的公司。

  另外,台湾公司来大陆办厂的本质是他们看中了中国大陆廉价的劳动力,很少有是因为对家乡的一份热爱。因为“商人重利轻别离”。从阶级本质上分析,这是马克思的方法。

 

以下左图为许佑嘉先生,右图为游世芳先生

2005/10/20

开始认识到Hibernate的作用了

前几天传出innoDb被Oracle公司收购,而正是innoDb技术使MySQL具备事务管理,高性能等特征。
innoDb之前是以GPL协议发布的。不过如果Oracle宣布不在开发innoDb了,MySQL后续版本倒是挺危险的。
 
我开始重视Hibernate了,以前觉得写SQL使很爽的一件事情,现在SQL技术还算成熟,针对某一数据库的语言如果结合其开发环境来说也是挺方便的,所以一直没打算深入了解Hibernate。
 
用Hibernate很容易实现RMDB的切换,比如从Oracle切换倒DB2,所要改的知识几个配置文件而已。从而实现数据库系统和程序的解藕。
 
传统写SQL有一个缺点,要提到SQL性能的话就要设置很多参数,而得到这些参数没有一定的经验使较难的,使用Hibernate可以把这些事情较给Hibernate去干,我们就可以省下很多事。使用Hibernate可以以不变应万变。
 
Hibernate就像一个SQL容器,他帮我们托管SQL语句,自动帮我们生成SQL语句,我们不用管具体SQL语句如何写,我们要做的只是在上面写个映射文件而已,然后还可以用Hibernate提供的Hql这样的面向对象的查询语言。把关系数据库系统通过Hibernat这个OR-Mapping OO起来。这样修改维护都很方便。

谈谈夜曲--哀调的华丽

Jay迟到的专辑终于有声音了。《十一月的萧邦》Jay的最新专辑将在11月1日发行,现在有电台版的《夜曲》和一小片段的《珊瑚海》可听。
 
哀情歌给人的感觉总是苦的,如Jay的借口,搁浅,安静。然而夜曲不同,一如Jay的出人意料,夜曲亦如是。这次的哀歌是轻快的,带有忧郁的轻快,带有忧郁的轻快却又凄美华丽。虽少了世界末日的颓废,却是一样震撼。听这首歌就像作了一场华丽的梦,在梦中你经历了一场华丽爱情,虽然结局悲惨,但却轰轰烈烈。
 
钢琴表现力确实非同一般。开头一段钢琴几个音符便带入气氛,rap一段随着钢琴声逐渐显现。文山的文字的唯美画面全面铺出。进入主歌后,Jay开始以自己的浅吟低唱铸造这首歌的气氛。深情而又凄美。最后结束干净利落,哀情而不伤情。
 
 文山的词:文山的词为我们编织一个美丽的梦。这首词中,哪一句最让你感动呢,是老去后还爱你,是为你弹奏一曲萧邦的乐曲,还是我给的思念很小心呢?
 
Jay的曲:引用别人曾说过的一句话:我屏住呼吸不停旋转,我看到淡雅的旋律象雾气一样笼罩身体,一圈一圈沿着灵魂的轴线向外扩散。而我,只能沉醉于音乐中不能自拔。
 
编曲:这次的编曲是谁的杰作呢,是钟兴民还是洪敬尧或者是杰伦自己呢?我猜是洪敬尧。夜曲编曲没有以父之名极尽华丽之能事,没有三年二班吸引耳朵,只有淡雅的钢琴和打击乐器声,营造出了凄美的气氛。编曲配上词曲便造就了夜曲。
2005/10/4

《如何求解问题-现代启发式方法》很有意思的可以训练数学思维的书

最近看一本书,数学的:《如何求解问题-现代启发式方法》,里面的用到的知识不会太专业,也不会很难,适合对数学有兴趣的看看。
里面有一些很有趣的题目,出乎意料,却情理之中。
 
其中有一道是这样的:
人过桥的问题:A一分钟过桥,B二分钟过桥,C五分钟过桥,D十分钟过桥,桥只能承受两个人的重量,并且桥中间有洞,要有灯光以避免掉进洞里。现在问题是,只有一盏油灯,如何安排,使得过桥时间最短。
这是一道很有趣的题目。书上给出的示范性的解答是AB一起过桥,然后A提着油灯返回,然后AC一起过桥,然后A返回,最后AD一起过桥,总共花费2+1+5+1+10=19分钟。
有更好的方案:AB过桥,A返回,CD过桥,B返回,AB过桥,总共花费2+1+10+2+2=17分钟
 
这个答案是最好的答案吗?如果你的答案是是的话,那么你陷入了局部最优,最好的答案是A当苦力来回背他们过桥。只要来回5趟,共花费5分钟。

乱弹ASM/C/C++/Java/C#效率

效率主要有执行效率和开发效率两个方面。
 
这几种语言的开发效率普遍是这样认为的:Java≈C#>C++>C>ASM.
 
C#,Java的开发效率高的主要原因是因为二者本质上都是解释型语言,而不是编译型语言。解释性语言可以利用很多解释型语言专有的特性,如自动垃圾收集,虚拟机提供的一些特殊的功能,比如反射等。以此加快开发速度。第二个原因是二者都是较彻底的面向对象的语言,而面向对象在开发大型系统时结构更清晰,更容易开发,更容易维护。
 
C++也是一门面向对象的语言,不过考虑到执行效率和为了保持和C的兼容性,造成语言的难学难用难以控制,而造成开发难度较大。
 
C是较底层的开发语言,是面向过程的一门语言,较适合于底层开发。ASM也是底层开发,只在对效率严格追求时或用C实现有困难时使用,其开发效率是最低的,但是执行效率最高。
 
不过这只是一般情况,实际情况经常是开发难度经常是有人决定的,一个蹩脚的Java程序员决不可能比高明的C程序员开发效率高。
 
关于执行效率普遍是这样认为的ASM>C>C++>C#>Java。
 
首先应该明确以下几点原则:
1、执行效率主要取决于算法的设计,因为一个好的算法通常是几个数量级的增加执行效率,远远大于由于语言不同带来的效率差别。
2、执行效率还主要取决了系统的构架,系统的设计。一个好的设计可以充分利用系统的资源,可以充分利用语言的优点。
 
 
程序运行时所有的语言最终都是要转化成为机器指令。机器语言和ASM是一一对应的,所以ASM编写的程序可以达到最快的运行效率。然而和C相比,因为现在的编译器优化已经提高很大,一个普通的ASM程序员的编写出来的程序的执行效率未必一定比C的高。
C++在设计时就充分考虑到了执行效率,设计的时候抠点,编程的时候小心点,你写出来的程序执行效率并不会比C慢。
Java和C#本质上时解释型语言,中间隔着一层虚拟机,执行时要通过虚拟机这一层,故执行效率一般比不上C/C++。
 
关于C++和Java/C#的执行效率比较:上面说了C++的执行效率比Java快,不过如果在普通情况下编写程序也未必,这是因为:
1、虚拟机使用了复杂的算法可以提高效率,而C++程序编写时一般不会使用如此复杂的算法。比如好的垃圾收集算法,如Java/C#是成批垃圾收集的等。上面说了,算法才可以极大的提高执行效率,所以两个水平相同的程序执行效率并不会相差很大。Java/C#未必比C++/C慢。
2、现在Java/C#执行都是通过一种即时编译(JIT)方式执行,执行时动态编译成本地代码,所以在运行期间Java的程序不会比C/C++的慢。并且动态编译时可以充分利用硬件的特点优化编译,从而可以获得比C++编译码时更快的执行码。
 
值得一提的是C#各个方面其实和Java几乎一样,不过C#基于的(CLR)中间语言运行环境设计时更充分的考虑了执行效率,底层设计比JVM更为复杂,执行效率更高,并且CLR有把一部分中间语言运行库(CIL)预先编译成本地代码从而更快的提高了执行效率。Java在这一方面做的不足。当然因为C#是Java的改良,所以可以借鉴Java的优点,回避和弥补Java的缺点。
 
最后总结一句话,效率是由人决定的。
 
(下图为以前读过的一本书)
2005/9/19

为什么学Java(2)

偶尔会有人问我,是学C#还是学Java呢?我会说Java,因为经常是这样子的,C#高手一定是Java高手,C#工作对方甚至可能需要你有Java经验。
 
Microsoft做得东西一向以简单易用著称,但或许这对开发人员不是件好事,经常上讨论Microsoft技术的论坛,论坛上经常会有人发问这个控件怎么用啊,有什么好的控件啊之类的,而上一些讨论Java技术的论坛,论坛上的人问题就不一样,架构,设计,模式总是Java版块的热点。
 
因为你太易用了,我学C#我就知道Visual Studio.net,什么?命令行界面编译,对不起,我不知道,我只要知道摆放几个控件就行了。
 
这样就容易造成误导开发人员。虽然组件化编程是未来的趋势之一,未来我们编程必将想堆积木一样。但是有一点很重要,通常过分的易用经常会造成开发人员的不求甚解,只知表面而不知其理,结果是沦为只会找控件的低级程序员。在这里我奉劝各位开发人员一句话,不求甚解是思维大害。
 
而反观Java,不知道各位Java beginner编出第一个Hello World用了多少时间,编出第一个窗口程序用了多少时间。要编hello world之前,首先我们要下JDK(一般人是这样的),然后设置classpath,然后javac,最后java HelloWorld,要使一个程序能够运行,我们需要知道classpath,我们需要package,我们需要static,main等等。而C# beginner编写hello world的时候只是在visual studio写上Console.WriteLine就OK了(一般是这样)。而用Java要开发一个窗口程序,你需要会继承,你需要知道AWT,或SWing,而C#呢,建一个WinForm,拖拉几个控件,轻松又方便。
 
轻松方便当然是好事,但是或许任何优点都要付出代价,我记得当时,我在用C#编出了几个小游戏之后还不知道继承这个东西。
 
C#太依赖微软了,以至大家一想到C#就马上想起微软。而基本上也就微软在搞C#。所以大家就等着微软的动作,微软出什么了,大家就做什么,大家相互讨论的也只是微软的东西,基本上都是如何使用。所以大家都忙着找控件。反观Java方面则是百花齐放。Sun,IBM,Oracle,Bea等等都在搞Java,还有不知道多少的开源社区。既然要自己从头做起,所以就要有框架。框架是Java阵营的一大特色,凡事都要讲框架。框架要设计,所以要有设计模式。Java是面向对象的设计里最自然的使用设计模式的语言。
 
 
Java的现存问题:
 
就像我前面所说的,任何优点都要付出点代价。Java太开放了,所以混乱,就像Unix一样,版本众多,竞争激烈,然后自相残杀,最后元气大伤。同样的WebMVC,就有Struts,就有Spring MVC,市场混乱,直接导致的后果就是学习成本提高,且无所适从。而还有Apache要推出的自己的JavaJDK,只会使Java世界更加混乱,甚至最后可能分裂,因为Java缺乏一个像Microsoft一样的统一的中央集权来管理Java,而JCP只是管理语言方面的。