2009年8月9日星期日

感触

最近真是忙的无话可说,这里也很久没来了。 昨天发现一些很有感触的话语。本来想发到饭否上的,没想到饭否被和谐了。。。

那就发这里了。

有时转变不一定成功 但有时 转变已经是一个新的开始

再niuB的肖邦也弹不出老子的悲伤

怀才就像怀孕,时间久了才能让人看出来

唯女人与英语难过也,唯老婆与工作难找也

你以为我会眼睁睁看你死去么,我会闭上眼的

您认识的人越多,就越喜欢动物

再讨厌别人,再看透世界,再悲观,您对几个人好,总还是会被几个人关心和接受的。
这就是人类社会,陷阱虽多,等价交换的关怀也不是没有。
最起码,不是一个没有。

还有一个程序员上看到的笑话:

一个人在一个升空的热气球上探险旅游,后来发现迷路了,不知道他所在的位置,他将热气球下降了一些高度,找到了地面上的一个人。

  气球上的人(简称气球人)再将热气球降低了一点,大声的对地面上的那个人喊(简称地面人):“对不起,能不能告诉我,我在哪儿?”


  地面人拿出一把卷尺,目测了一阵子,然后回答道:“你现在离地面高30英尺的地方。



  气球人说:“你一定是位程序员。”

  “是啊,我是啊,你怎么知道的?”地面人反问道。

  气球人说:“因为你的答案在技术上是正确的,但是实际上一点用都没有。”

  “我知道你一定是管理人员,”地面人回应着。

  “为什么?”
  地面人回答道:“因为:你不知道你在哪里或者打算去哪里,但你却希望我给你提供帮助,就像现在的情形一样,但你却认为这是我的错。”

        不在于讽刺领导者,而在于提醒自己无论出于管理者还是被领导者,到要意识到对方的难处,去找到最为合适的解决方案。

2009年7月12日星期日

vs2005发布网页端口不一致

最近由于将来工作需要,开始看看asp.net。先上手写个hello world,发布试试。没想到一上来就遇到莫名的问题了。

症状是这样的:

IE地址栏里面显示的端口号和桌面任务栏右下角“ASP.NET Development Server”的端口不一致,而把IE地址栏的端口号改成“ASP.NET Development Server”显示的端口号,结果网页就能出来。

很是奇怪,问了平时工作就做asp的同学,他也没碰到过。后来发现网上有人列出了方法,一试果然可行。

在这里记录下,备忘吧。

解决方法:引用原文如下:“是 否安装了NOD32 3.0以上版本?或者还有其它什么防火墙类软件?如果你是安装NOD32 3.0的,按照以下方法做: 依次进入NOD32的高级设置(F5),Web访问保护,HTTP,Web浏览器,会看到一个程序列表你的devenv.exe应该在其中,双击前面的勾 (相当于去掉选中状态),确定退出,停止一切运行的ASP.NET Development Server,在VS中打开并重新编译运行你的Web程序”。

试了这个方法,可行,在此记录。

2009年6月11日星期四

java jDom异常: Content is not allowed in prolog

先交代下前提:xml文件为UTF-8

以前在php开发是碰到过类似的事情,不过当时通过记事本打开后删除文件头部的空格就行了。但是今天在javaEE开发中用jDom时,却不能解决,为了解决这个问题,所以现在才能睡,为了不忘记现在这里记录下然后睡觉。

现象:
SAXBuilder builder = new SAXBuilder();
Document doc = null;
Reader in = new StringReader(xmlPath);
在 doc = builder.build(in);时,抛出错误:
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.

原因:
XML文件使用utf-8编码,在文件开始处含有不可解释的字符,该字符串称为BOM。使用软件UltraEdit打开xml文件,转到十六进制编辑,可以发现开始处为FFEF,就是这个字符引起了异常。

解决方法:

可以使用UltraEdit把utf-8转为ascii(在写xml文件时,使用UltraEdit软件编辑,记事本或其他xml软件默认是使用utf-8保存,在UltraEdit软件配置中可以设置默认保存为ascii)。
以上是网上普遍解决方法,然而我尝试后依然没法解决,最后使用FileInputStream in = new FileInputStream(xmlPath);代替Reader类,程序正常运行。

可以参考:
http://happyhou.blog.sohu.com/84258111.html

引用:http://blog.chinaunix.net/u2/65478/showart_1929128.html

2009年5月19日星期二

『转』如何看懂Java混淆后的反编译代码

转这篇文章 也不用说我想干什么了。。。

作者:dozb

一般情况下Java应用的开发者为了保护代码不被别人抄袭,在生成class文件的时候都java文件进行了混淆,这种class文件用反编译工具得到的结果很难看懂,并且不能进行编译。本文从研究的角度,浅析如何读懂这种反编译过来的文件。

例子一:赋值
反编译过来的代码如下:
Node node;
Node node1 = _$3.getChildNodes().item(0);
node1;
node1;
JVM INSTR swap ;
node;
getChildNodes();
0;
item();
getChildNodes();
0;
item();
getNodeValue();
String s;
s;
原始语句:
Node node;
Node node1 = currDocument.getChildNodes().item(0);
node = node1;
String s = node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
注解:
JVM INSTR swap ; //赋值语句
练习:
String s1;
String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
s8;
s8;
JVM INSTR swap ;
s1;
10;
Integer.parseInt();
int i;
i;


例子二:不带参数创建对象
反编译过来的代码如下:
JVM INSTR new #244 ;
JVM INSTR dup ;
JVM INSTR swap ;
CrossTable();
CrossTable crosstable;
crosstable;

原始语句:
CrossTable crosstable = new CrossTable();
注解:
练习:
JVM INSTR new #246 ;
JVM INSTR dup ;
JVM INSTR swap ;
Database();
Object obj;
obj;

例子三:带参数创建对象
反编译过来的代码如下:
JVM INSTR new #262 ;
JVM INSTR dup ;
JVM INSTR swap ;
String.valueOf(s2);
StringBuffer();
s.substring(j, i);
append();
s6;
append();
toString();
s2;

原始语句:
s2 = (new StringBuffer(String.valueOf(s2))).append(s.substring(j, i)).append(s6).toString();
注解:
此语句实际上是:s2 += s.substring(j, i) + s6;
练习:

例子四:for循环
反编译过来的代码如下:
int k = 0;
goto _L4
_L8:
...
k++;
_L4:
if(k < as.length) goto _L8; else goto _L7

原始语句:
for(int k=0;k < as.length;k++)
{
...
}
注解:

例子五:while循环
反编译过来的代码如下:
String s1 = "";
goto _L1
_L3:
JVM INSTR new #262 ;
JVM INSTR dup ;
JVM INSTR swap ;
String.valueOf(s1);
StringBuffer();
_$2(resultset, s, l);
append();
toString();
s1;
_L1:
if(resultset.next()) goto _L3; else goto _L2

原始语句:
String s1 = "";
while(resultset.next())
{
s1 = s1 + resultSetToString(resultset, s, l);

}


原文:http://dozb.bokee.com/2774482.html

2009年5月17日星期日

【转】多核危机:Scala vs Erlang

近来在博客上关于Scala与Erlang之间的争论越来越热。未来注定是多核的世界,问题在于如何去解决多核的危机。Scala和Erlang是两门渴望成为其解决方案的语言,但它们也有些许的不同。那么它们所采取的方式各有什么利弊呢?

引入问题

摩尔定律已经改变了。我们不再获得和以前一样的时钟频率增长,取而代之,我们得到了更多的(CPU)核心。今天,也许你的笔记本都已经是双核的了。

为了利用多核的特性,应用程序需要支持并发。如果你的客户买了一台八核的机器,要向他们解释清楚正常情况下应用程序只会用到12%的CPU能力将是一件费时费力的事,即便该机器是为该应用量身定制的。

在未来,情况可能变得更糟。你的顺序执行代码不仅不会跑得更快,甚至有可能实际上跑得更慢。其原因在于,你获得越多的核心,由于功耗和散热的影响,每个核心就会更慢。几年之后,英特尔就会给我们带来32核的CPU,按这种趋势,在我们不知不觉之中数千核的CPU就会出现。但每个核心都会比现在的核心慢很多。

并发代码

一个显见的解决途径就是编写(或重写)软件以支持并发。最常见的方式莫过于使用线程,但大多数开发者都认为基于线程的应用编写起来特别的困难。死锁,饿死以及竞争条件对大多数并发开发者来说都是太熟悉的概念了。Erlang和Scala都大大减轻了这种痛苦。

语言概览

Scala常被看作是下一个主要的JVM语言。它结合了面向对象编程的范式和函数式编程的范式,与Java相比有着更简洁的语法,它是静态类型的,有着跟Java一样或者有时候更快的运行速度。有太多的理由值得去认真探索一下Scala。

Erlang是一门为健壮性而生的语言,由于它的设计,它自然又是一门有着极好伸缩性的语言。它比Java历史更早,但却常被看作引领未来并发的语言。它是一门动态类型的函数式语言,有着一些非凡的系统正常运行时间的成功例子。

争论核心

那么Scala与Erlang争论的到底是什么呢?说到底,就是性能表现与伸缩能力,但这争论也包括了其它像风格,语言特性以及库支持等等。这场争论开始于Ted Neward有一次无心的给出了他对几种语言的看法,并称“[Erlang]在其自己解释器上运行事实上[是]很差的”。

Steve Vinoski与Ted于是展开了几轮争论,但这一讨论很快转移到了更多的博客上,争论的焦点也转变成了Scala与Erlang之间那些有趣的差异和共同点。我们将总结每个有意思的论点并给出每种语言的利弊,并表达对一些问题的各种不同看法。

可靠性

Steve Vinoski就Ted所发表的帖子进行了回应,给出了他对于“Erlang在其自己解释器上运行”的感受:

事实上,Erlang在其自己解释器上运行得,很好很强大;如若不然,不可能有如此好的可靠性,它将只是又一个面向并发的有趣但却无用的语言实验而已。

Steve谈到这个问题,就算一个语言本身可靠,它所依赖的基础也必须可靠才行。因为Erlang从骨子里就是为可靠性而设计的,从而支持并发,所以它不会受到一些并发性常见问题的影响,这主要是底层库包在并发环境下运行很好。

另一方面,Scala是站在JVM之上的,所以一个重要卖点在于可潜在地使用所有现成的Java代码。然而,大部分的Java代码并非专为并发而设计的,使用Scala代码时要将此考虑进去。

轻量级进程

要运行大规模并发应用,你需要大量的并行执行。这可以通过几种方式达到。使用线程是一种常见的方式,使用进程又是另一种。其区别之处在于,线程与其它线程之间共享内存,而进程是相互独立的。这意味着线程需要像互斥信号这样的锁机制,防止两个线程在同一时间对同一内存进行操作,但进程不会受此问题影响,相反是使用一些消息传递机制来跟其它的进程间通信。但进程在性能和内存方面的代价是昂贵的,这正是人们就算知道基于线程的并发是一种极复杂的编程模型也宁愿选择它的原因。

Steve Vinoski这样写到:

提供互不共享的轻量级进程架构将使得大规模并发能力变得十分容易,但这并不意味着一旦你设计好了,剩下的就只是编程的工作那么简单。

Erlang采取了这样的并发方式。一个Erlang进程是非常轻量化的,Erlang应用常常拥有成千上万的线程甚至更多。

Scala通过基于事件的Actor从另一方面达到了同样的效果。Yariv Sadan解释说:

Scala有两种类型的Actor:基于线程或是基于事件。基于线程的Actor在重量级的OS线程内部执行。它们从不相互阻塞,但每个VM上可伸缩的Actor不会多于几千个。基于事件的Actor是简单的对象。它们是十分轻量化的,并且,像Erlang进程一样,因此它们可以在一台现代的机器上数以百万计的产生。

Yariv解释到,尽管如此,这里面也还是有一些区别的:

与Erlang进程的区别之处在于,每个OS线程内部,基于事件的Actor是顺序执行的并且使用没有强占式调度算法。这使得一个基于事件的Actor可能在很长一段时间内阻塞其OS线程(甚至是无限的)。

不可变性

Erlang是一门函数式语言。这意味着其数据是不可变的,像Java的String一样,并且没有副作用带来的风险。对数据的任意操作会产生一个该数据新的修改后的版本,但原数据仍然不变。在谈到健壮性的时候,不可变性是其需要高度注意的一个因素,因为没有代码可以无意间修改其它代码依赖的数据,但从并发的观点来看,不可变性也是一个十分重要的特性。如果数据不可变,其被两个并行执行路径更改的风险就不存在,因为没有办法改变它且不需要保持同步,所以数据可以被拷贝到其它机器上。

因为Scala构建在JVM之上,结合了面向对象和函数式方法的特点,它不具备像纯函数式语言的不可变性的保证。然而,在Yariv日志的评论部分,Yariv和David Pollack就这两门语言之间的差别展开了一场有趣的讨论。David,Scala Web框架Lift的作者,给出了他对于不可变性的看法:

不可变性 —— Erlang强制了这一点,而且你几乎无法绕过它。但是,与强制一个单一类型相比,你可以用Scala神奇强大的类型系统的剩余部分去交换。我在进行Scala Actor编码时使用不可变数据,而让Scala的类型系统负责其它类型。
Yariv问到:

只发送不可变类型难道不是一个重大限制吗?这意味着,例如,你不能从Hibernate装载一个简单的bean并将它发送给其它Actor。
David回答到:

我曾基于Scala的Actor构建个多个生产系统。实际上对于不可变性问题并没有多少工作需要处理。你只需要将你的相关类(消息)定义为不可变的,其它的就不用管了。

类型系统

Erlang是动态类型的,而Scala是静态类型的并且相比Java有着更强的类型系统。然而,与Java相比最大的一个区别是Scala可以类型推断。这意味着你可以省掉大部分的类型注解,使得代码更加干净而编译器照样会做所有的检查。

关于动态与静态系统之间孰是孰非的争论看来永远也不会停止,但Erlang和Scala之间却有着显而易见的区别。

尾递归或是循环

Yariv又提到:

函数式编程与递归从来都是形影不离的。实际上离开了尾递归你很难写出有用的Erlang程序,那是因为Erlang没有循环——它对一切都使用递归(这在我看来是一件好事 :))。
这显然使得Erlang与Scala产生了很大差别。Scala提供了很多更传统的迭代,但David Pollack并没看出在这种环境下尾递归有什么优势:

尾递归——对基于事件的Actor来说根本不是什么问题。
如此说来,这仅仅有关你的偏爱和风格罢了。

热交换代码

由于Erlang是为可靠性而生的,热交换代码(运行时替换代码)是其内建的天性。

JVM对热交换代码有所支持。类可以被改变,但由于其静态的类型系统,其方法签名是不可改变的——只有其内容可以改变。虽然有第三方工具致力于此,也有框架(提倡以一种使运行时更方便交换类的编程风格书写代码),但就算运行在JVM上,如何进行交换仍是取决于你的Scala Actor是如何构建的。Jonas Bonér就此给出了一个详尽的例子。

总结

Scala和Erlang都是致力于解决多核危机的语言。它们来自不同的背景和年代,因此对待某些问题的方式也不尽相同,然而在许多方面它们的共识大于分歧,至少在并发性上如此。

Erlang已经有着数十年的历史,并且已经在许多关键的真实系统中证明了自己。其不足之处在于它有一点像一个孤岛,最近的多语言编程的趋势似乎对Erlang社区影响不大。

另一方面,Scala是同一类型应用的新生儿。一些真实应用即将诞生,并且一些公司将未来押在了上面。Scala相对Erlang的最大优势在于,它运行在JVM之上并且可以利用所有现成Java代码、框架和许多工具。话虽如此,这种强大的能力也要求了更大的责任,因为大部分Java代码不可能自动适应Scala的Actor模型。

对于主流语言无法帮开发者解决的压力越来越大的问题,两种语言都对提供了相似的解决途径。希望你在读完这篇争论总结之后,能更清楚哪种语言更适合你的特殊要求,并对其深入了解。

未来是多核的。Scala和Erlang将会越来越流行。

查看英文原文:The multicore crises: Scala vs. Erlang

原文:http://tech.sina.com.cn/s/2008-07-09/0952725490.shtml

2009年5月7日星期四

【转】MIDlet的生命周期的深入理解及游戏死机问题

今天在查加密算法是无疑中看到的。虽然开发j2me的时候,我都这么做的。只是没考虑过不这么做的问题。这样做只是习惯,觉得这样写比较舒服,呵呵。今天看到这篇文章发现原来还能防止这些,转来学习下。

首先在你运行一个程序的时候,JAM会调用该midlet的构造函数来生成midlet的对象,然后被jam置于Paused状态。一旦jam认为这个midlet对象可以执行时,jam就会调用startApp()方法,并将此midlet置于Active状态。startApp()方法由于在系统来电、或者退回到系统菜单返回时会被再次调用,所以这里只可以放初始化一次的代码。或者你把初始化一次的代码放到midlet的构造函数中。例如:



public class Midlet extends MIDlet{

Display display = null;

MyCanvas can;

public Midelt(){

display = Display.getDisplay(this);

can = new MyCanvas();

}

public void startApp(){

display.setCurrent(can);//如果把can = new MyCanvas()放到这里,再来电返回时就会出问题。

}

}

或者

public class Midlet extends MIDlet{

Display display = null;

MyCanvas can;

public Midelt(){

}

public void startApp(){

if(display ==null){

display = Display.getDisplay(this);

can = new MyCanvas();

}//此处只会被运行1次,这样就不会出错

display.setCurrent(can);//这句按理放到这里最合适,你想显示那个canvas就放哪个!

}

}


在startApp()中,你调用display.setCurrent(can)的时候,首先运行的是showNotify(),接着运行paint()函数一次,如果有线程的话,此时run()方法开始运行。一般在run()方法里一般这么写。此时的run()是可以处理异步事件的,也就是你来电话的时候,这里run()还是运行的。不过他不会paint()什么东西,即使它里面有repaint(),这点放心。

public void run(){

while(flag){//flag是boolean型变量

try{

Thread.sleep(50);//时间自己设啦。

}catch(Exception e){}

repaint();

}

}


哇~~来电话了,或者你退到系统菜单。如nokia s60的手机。

hideNotify()首先会被调用,接着pauseApp()再被调用。


这么快,打完了,返回时:先调用showNotify(),接着调用paint()函数一次,最后才是调用startApp()函数。

关于run()和paint()也可以使用display.callSerially(this)语句。这个以后有时间了再说。


明白了生命周期,再来看死机问题。我说的死机问题,多是来电话返回时死机。其实只要找到了问题,一切就变的很简单。

为什么死机,归根结底还是程序问题。好像是废话。哈~~

Graphics mg;//定义的全局参数


paint(Graphics g){

mg = g;//有的程序这样写,if(mg ==null){mg =g:}这样对于n7610系列就会出错。

mg.drawString();

switch(case){

case GAME_MUNE:

drawA();

break;


case PLAY:

drawB();

break;

default:

break;

}

}

/*下面的画图函数一定要放到paint()函数里调用,不要在别的地方调用,如run()里面,上面说过,程序暂停之后返回,会先paint()一次,如果在别的地方调用就会出现问题。*/

public void drawA(){

mg.drawString();

}

public void drawB(){

mg.drawString();

}

按照上面的写法一般不会出现死机问题。当然,你也可以不定义全局的mg,可以把g单独传到各个画图子函数中。如,

paint(Graphics g){

g.drawString();

switch(case){

case GAME_MUNE:

drawA(g);

break;


case PLAY:

drawB(g);

break;

default:

break;

}

}

public void drawA(Graphics mg){

mg.drawString();

}

public void drawB(Graphics mg){

mg.drawString();

}

原帖:http://azi.javaeye.com/blog/194478

2009年4月25日星期六

【转】女大学生日记一则(令人震撼)

今天无意在某个学长的博客中看到这篇文章,是蛮早前的了。“令人震撼”这四个字是学长的标题。看完后,把我震撼了么,只是有点感觉。换作以前的我一定感慨良多,现在只是觉得很现实。觉得替这位老人难过,仅此而已。

原文如下:

我只是一个学生,无权无势,但却做梦也没有想到,居然有人向我下跪。 
    那是数天前的一个中午,我刚从双安商场的美食城出来,走上人行天桥,凛冽的寒风在我暴露的皮肤上肆虐不已。突然看见前面有一满头银发的老妪不停地向人打躬作揖,而路人纷纷掩鼻而走。估计又是一个乞丐,我正在这么想着。这时,老者却向我走来。我摸了摸口袋中的硬币,心想也许又是一个骗子。我几乎都能猜到她会说些什么,无非是来京访亲,找不到人了,好些天没有吃饭了等引人入套的话。我做好了用几个钢崩将她打发的准备,不料老人却用地道的河南话对我说,「同志,海淀区司法援助中心怎么走?」喔,原来只是问路,我笑了笑,感觉自己有点神经过敏。「对不起,我也不知道」,我感到有些不好意思,但自己确实不知那个援助中心在哪。老人朝我点了点头,又向旁边一个路人询问,但对方却并未理睬这个貌似乞丐的老人。我禁不住又打量了一下老人,她估摸60多岁,带着数个破破烂烂的编织袋和一个古老的黑色旅行袋,袋子旁还用玻璃绳子栓着一个破水杯。又是一个上访者,一个不知被多少个部门像中国足球一样被人踢来踢去而始终踢不进门的上访者,我心里一阵难受,对老人说,「您别急,我帮您打电话问一问」。我用手机给查号台打了电话,在现代科技的帮助下,很快问到了援助中心的地址--某某路某号。这时老人突然扑通给我跪下,泣不成声地对我说:「你是个好人」。天啊,仅仅是问个路,一个六旬开外的老人居然向我下跪。
    我的眼睛有点湿润,慌忙把老人扶起。她只是一个劲地对我说你是个好人,你是个好人。我给她指了指援助中心的方向,告诉她该怎么坐车。老人从贴身的内衣中小心翼翼地掏出个皱巴巴的信封,颤巍巍的记下了地址。我本想迅速撤离这个让人压抑的天桥,可又觉得即使指明方向、地址,对于这个对北京人生地不熟的老人来说,要想找到那个连我都不易找到的援助中心无疑是大海捞针。于是我决定带她去,不料就为这她再次向我下跪,我措手不及,只能一手提起了她那像垃圾一样的编织袋,一手把她扶起。
    在去往目的地的出租车上,老人告诉我,她是河南南阳人,今天早上刚到北京,为了找援助中心,已经徒步走了4个多小时。她问了问我的身份,当我告诉她我还是学生时,她又一次哭了,哽咽的说到:「如果不是家里穷的话,我那儿子现在也是大学生,也就不会遭这个罪了。」原来他的儿子是油漆工,两年前来京打工。一天深夜,她儿子骑着自行车,带着铁桶和毛笔正往家赶,突然被几个巡逻的警察二话不说地抓了起来。没有申辩、没有审判、似乎没有任何程序,孩子就被关进了监房。过了20多天,事情总算是弄清了,孩子的清白也得到了证明,但他的手指却由于不知名的原因掉了几个,而且精神彻底崩溃,成了疯子。想像一下吧,一个来北京寻求希望、身心健康的年青人,在毫无过错的情况下,莫名其妙地深陷囹圄,没有任何反抗、任何辩解的机会,最终成了一个废人。
    「法律面前人人平等」在这个事实面前是何等地苍白,一个打工者,仅仅因为穿着寒碜就会被怀疑为嫌疑份子,而那些开着大奔、西装革履却暗地里坐着违法勾当的「款爷」们就能理所当然地避免这样的「天灾人祸」,甚至还会备受尊敬。难道我们的法律中有「以衣着和相貌」这样的定罪原则吗?「人生而自由,却无往不在枷锁之中。」我感到了人类的渺小,感到了法律的悲哀,「相信法律吧」,这就是我,一个研读法律近10年的人对她唯一能说的话,一句苍白得近乎虚伪的话。
 到了援助中心,我执意要陪她上去,但老人对我鞠了鞠躬,说已经很感谢我了,让我不要上去,她说我还年轻,不要介入这种可能影响将来前途的事情。
 我走了,想着老人的话,突然感觉自己是多么的卑微,多么的懦弱,感到自己曾经奋笔疾书的有关法律精神的探讨是多么的可笑,多么的幼稚。
 深夜,我又想起了这位老人,不知在这寒冷的冬夜里,她栖息何处?

2009年4月21日星期二

oracle 收购 sun 是福是祸 是挑战

刚才才看到这条消息,确实晚了点,这么震撼的消息现在才知道惭愧。

当时传ibm收购sun,网上议论纷纷。当谈判破裂时,很多分析师说是收购失败是sun的损失,也有说是ibm的损失等等。我当时没有觉得什么损失不损失的。大家维持原状有什么损不损失的。现在oracle又是用现金收购了sun。一方面可见oracle这几年来收购的野心,另一方面可见到现在可谈损不损失的问题了。

无疑对于ibm来说是损失了。现在oracle借助sun的软硬件技术,将成为IBM在数据中心领域的一个强大竞争对手,新公司可以销售包括硬件、操作系统和架构软件在内的完整企业产品组合,而在以前只有IBM才能够提供如此完整的产品和服务。

很多人说java前途光明。我不觉得。现在oracle形成了高端java企业开发一条龙,可以说有垄断之势。对于以前同是以java作为开发语言的ibm,sap等大公司对java有所忌惮。如何处理好两者之间的关系,就看oracle的操作了。作为java的开发者现在感觉就像是我为鱼肉的感觉。

对于oracle来说,sun的硬件部分的合并,让他不再是一家软件公司了,而变成了系统厂商。这也就让从前合伙的戴尔和惠普,有所忌惮了。对于oracle来说当然是扩张的好事。但对于从事这方面的开发人员来说,可选性变小了。更本不是件好事。

我一直觉得当时ibm收购失败是件好事,没有什么损不损失的。sun处于中间位置,达到平衡。所有的厂商以java技术而不用过多担心。现在格局被打破了,我对java的将来感到担心。

我对mysql也情有独钟,小巧轻便。现在mysql真是尴尬,所有的猜测都取决于oracle的决策了。mysql实在不行就去试试PostgreSQL。但是java的前提,我很在意。java确实有很多缺点,但是真是一门好语言啊。真不想因此而减少了他的应用范围。

是福是祸 都是挑战。接下来举世瞩目oracle的决策吧。希望都是明智的。但愿。。。。

2009年4月14日星期二

一切就是那么的命中注定

今天在线上碰到了男人,问他最近境况。后得知现在在一家国企混着,等世嘉的下次面试。
呵呵,将兴趣变成了自己的工作到还真是不错。后来聊着聊着,聊到了面试第一轮的一道题。
写个一个通用的y=Asin(ax+b)+c的解法..要时间复杂越短越好。
他问我的时候,我一下子懵了下。好久没有接触高等数学了(惭愧)。依稀记得以前有什么公式可以通解。但要我立马不翻书,可真是不行了。男人说:...你们都是往这里想的.桃子也是...
。。。。我哪里想错了么?男人说:我就说把y=sinx的值按照精度要求预先存在数组中。
哈哈哈哈哈,用空间换时间么。桃子说他肯定错,我不觉得。至少别人让他面试到现在是不假的事实。我也觉得不错的方法。第一,你的算法再怎么牛,能达到系统预设的sin求解不是件容易的事情。第二:现在的要求是自己写一个要求时间复杂越短越好,当然是用空间去换时间了。我和桃子都一上来就走入误区了。
我很好奇,他当时怎么会突发如此想法的。我想正常人大多会和我和桃子的想法一样,想一个算法来解。男人说反正我看到过别人这么说.就觉得不至于不可行。
是的,也许不是他当时的突发奇想。但是平时的积累就是财富。你平时无意中捡起来的某些东西,也许暂时没用,但是总有用处的一天。一切就是这么命中注定。

2009年4月2日星期四

不要一辈子靠技术生存

来源:世界经理人
  我现在是自己做,但我此前有多年在从事软件开发工作,当回过头来想一想自己,觉得特别想对那些初学JAVA/DOT。NET技术的朋友说点心里话,希望你们能从我们的体会中,多少受点启发(也许我说的不好,你不赞同但看在我真心的份上别扔砖头啊).

一、 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事 市场开发,跑腿的人,没有前途。

  不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)

  更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。

  也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。

  比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给他换个地方,他马上会成为一个勤奋且出众的人。)

二、在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。

  有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。

  朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。

  如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)

三、你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。

  如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。

  创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。

[小结]

  基于上面的讨论,我奉劝那些学习技术的朋友,千万不要拿科举考试样的心态去学习技术,对技术的学习几近的痴迷,想掌握所有所有的技术,以让自己成为技术领域的权威和专家,以在必要的时候或是心里不畅快的时候到网上对着菜鸟说自己是前辈。

  技术仅仅是一个工具,是你在人生一个阶段生存的工具,你可以一辈子喜欢他,但最好不要一辈子靠它生存。

  掌握技术的唯一目的就是拿它找工作(如果你不想把技术当作你第二生命的话),就是干活。所以你在学习的时候千万不要去做那些所谓的技术习题或是研究那些帽泡算法,最大数算法了,什么叫干活?

  就是做一个东西让别人用,别人用了,可以提高他们的工作效率,想象吧,你做1万道技术习题有什么用?只会让人觉得酸腐,还是在学习的时候,多培养些自己务实的态度吧,比如研究一下当地市场目前有哪些软件公司用人,自己离他们的要求到底有多远,自己具体应该怎么做才可以达到他们的要求。等你分析完这些,你就会发现,找工作成功,技术的贡献率其实并没有你原来想象的那么高。

  不管你是学习技术为了找工作还是创业,你都要对技术本身有个清醒的认识,在中国不会出现BILL GATES,因为,中国目前还不是十分的尊重技术人才,还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。(如果你不理解,一种可能是你目前仅仅从事过技术工作,你的朋友圈子里技术类的朋友占了大多数,一种可能是你还没有工作,但喜欢读比尔。盖茨的传记)。

2009年4月1日星期三

不得不记录下 关于s60虚拟机文件保存地点

最近在做手机的开发,基于j2me。刚开始起步,发现没遇到过什么问题。配置,测试,几个简单的入门demo。都很顺利。
由于这次手机开发是针对流媒体在线播放的,rms好像是最好个解决。但我想第一步调通播放已下载文件。所以就像先找下虚拟机内部创建文件的保存地址。sun的虚拟机很好找,搜索下就有了。接下来是塞班的s60,这个让我好找啊,以至于到现在还没睡觉。
当然第一步是在s60内部创建一个文件,然搜索下相关文件夹。奇怪的是没有找到。但后我想是不是改变文件名了,所以就文件河,全电脑监控。这下更加惊讶的事情发生了,没有相关操作!!!
是在困惑下,网上找也没找到相关回答。实在是纳闷,而且测试文件是否存在是,所创建的文件是存在的,并没有随文件突出而删除。
本人修行不够啊,实在是无法理解。后来在网上看到一篇关于塞班系统配置的,就猜想尝试下加点参数进去制定下虚拟机的e盘。epoc.ini中
_EPOC_DRIVE_D \epoc32\winscw\d
_EPOC_DRIVE_E \epoc32\winscw\e
莫名的发现指定后文件就在指定文件夹下生成了。实在无语。对于手机开发还真是菜鸟阶段啊。本来感觉j2me,比起j2ee简单多了,可以说比j2se,在编程上还简单。现在发现j2me的难点所在,就是不同机型的熟识程度。
做了三天的j2me开发,发现很有意思,你j2ee开发快多了。
如此奇怪的事情,不得不记录下。 让像我一样刚开始j2me开发的菜鸟,少走点弯路吧。累了睡觉去了。
唉,因为这件事,今天的三份报告都来不及赶了。。。。。

2009年3月24日星期二

【转】了解ruby的优点与不足

在目前的主流web开发技术例如J2EE,ASP.net,PHP,Python,Ruby当中,基于Ruby语言的rails框架是做网站开发速度最快 的工具了,可以达到J2EE框架开发速度的5-10倍,并且程序代码量也只有使用J2EE框架开发的1/5以下。因此使用Ruby来开发JavaEye网 站,能够把网站的开发周期缩短5倍左右,也就是说,如果用Java开发JavaEye网站需要5个月时间的话,那么使用Ruby仅仅1个月就够了。另外由于代码量的大幅度减少,网站整个的维护工作量也大大降低。因为使用Ruby带来的开发和维护上面 的好处实在是很诱人,能够几倍幅度的降低我们的网站开发周期和维护成本,那何乐而不为呢?
目前Ruby在国内应用很稀少,也找不到什么可以借鉴的经验.不过对于本来就是资深的开发人员,又运营高端技术社区来说,这些都不是什么障碍,Ruby无论如何,还是比Java要简单,只要适合我们,什么技术都可以拿来用,对于高水平的开发人员来说,用什么编程语言都一样,精通Java的去搞Ruby,完全没有什么障碍。
从目前的状况来说,Ruby还挑战不了Java的地位,从可以预见的将来,Ruby也不太会取代Java的地位。这是因为:

1) Java能够成为应用软件开发的主流,是有很多因素综合作用导致的,而且也有一个历史机遇的问题。当应用软件开发方式从C/S转向B/S的时候,Java 抓住了历史机遇,造就了目前全球大多数应用软件厂商都基于Java开发软件这样一个既成事实,Java的整个全球商业价值太高了,优势太大。并且从 Java自身的语法角度来说,也比较适合目前软件外包产业的大规模分工协作。此外Java并没有固步自封,在开源社区和商业厂商双重强力推动下,Java 自身仍然在快速的进步,生命力很顽强。

2)Ruby目前只是在web开发领域比Java有很强的开发效率的优势,但并没有Java那么齐全的产品线,从基础软件到Web应用软件,从桌面到嵌入式开发,无所不包。

3) Java是主流的工业级别的编程语言,就单个程序员个体的编程效率来说,远远不如Ruby,但是很多软件公司,特别是软件外包往往是几十人,上百人大规模 团队协作开发,甚至异地大规模协作,在这种情况下,个体的编程效率并不重要,重要的是团队之间协作和模块独立分割以及组合,Java能够很好的满足这种软 件开发模式的要求。但是Ruby很显然并不适合这种软件开发模式,Ruby更加适合小规模团队(一般少于10人),采用敏捷开发方式,高效率的开发软件。

但是Ruby取代不了Java,并不意味着Ruby就不值得去使用。特别是对于开发团队规模比较小,对软件开发速度有比较高要求的情况来说,Ruby肯定是更好的选择

Ruby的优势主要有:

1) Ruby是一种动态面向对象语言,具有很多强大的面向对象的高级特性,例如open class(对象的类别可以在程序运行期被动态的改变),duck typing(由对象行为决定对象类型),meta programming(元编程),block和closure(块和闭包)等等,可以轻松创造出来Java语言很难实现的功能,因此可以极大提高编程效 率,减少代码量。

2) Ruby更加贴近英语的自然语言,描述和表达能力很好,语法扩展能力很强,因此被用来作为DSL(领域专用语言),例如Ruby的构建工具rake就是一种DSL。而Java则不具备这样的能力,从而不得不借助使用XML来描述各种配置信息。

3) 基于Ruby语言的rails框架,除了充分利用了Ruby语言强大的语法能力之外,rails框架自身也有很多理念非常领先的创新性技术,例如简化的 ORM框架ActiveRecord,Database Migration,以及支持REST特性的URL Route等等。在这些方面,Java的主流框架在技术创新能力上被远远甩到了后面。

4) 除了技术因素之外,基于rails框架来开发web应用,最大的优势就是开发速度快,一般认为达到使用Java的5-10倍速度,另外代码量很少,这是Ruby吸引很多开发人员的主要原因

5) 使用Ruby on rails开发web应用,其入门门槛和学习成本要远低于使用Java,一个基础扎实的程序员通过一个月学习就可以熟练使用rails开发,但是学习三个月,都未必能够熟练运用主流Java框架来开发。
Ruby的不足:

1)从技术角度来说,Ruby解析器的性能比较差,远低于Java的JVM。不过对于Web应用来说,这个缺点没有什么影响:因为Web应用的瓶颈往往出现在数据库访问上面。另外Ruby的VM将可能在2007年底推出,届时ruby性能会有一个很大的改观。

2)相对比Java丰富的各种第三方类库来说,Ruby的第三方类库显得非常缺乏,而且不成熟,特别是针对企业应用的各种第三方类库支持,空白点很多。这是目前制约Ruby在企业应用普及的最大障碍之一。相信随着时间的推移和Ruby的普及,将会有所改善。

3)Ruby,特别是用rails开发的web应用在Windows操作系统上面得到的支持还很不够,传统上都是部署在Unix/Linux操作系统上的。Windows目前来说只能作为开发环境,而不能作为生产运行环境。
综上所述,我们不难看出Java和Ruby不是两个相互对立的开发语言,对于Ruby和Java谁更具有优势的讨论意义已经不大,首先从Java本身 来讲,,Java有其自己的优势,并且 Java将会继续处于顶峰,并在企业应用上保持良好的表现,这一点毋庸置疑,并且已经得到了市场的证明。

另外, Ruby有极强的文本处理能力,与Perl不分伯仲,同时,Ruby的语法简单,还有异常处理以及迭代器等构造使编程变得简单明了,这也正是我们所期待的下一代编程语言。

如果单从某一种语言的角度来看,我们似乎并不能看出什么,但是如果站在更高的位置,从不同的角度全面的看待问题,我们不难发现,二者将会求同存异,各自发挥自己的特长,从而使我们能构建出更加强大的应用程序。

Sun 收购JRuby的同时,Charles Nutter JRuby 的核心开发者之一, Thomas Enobo也加入了Sun。这似乎能够让我们把Ruby和Java联系在一起,Sun公司如果能够在JVM上做充足的投入,更好地支持动态语言, 拥抱新的事物,依托Sun公司的强大实力和其自身独特的优点,Ruby必将会有巨大的市场,同时,Ruby也需要一个过渡期,在市场中得到验证,让更多的 人去使用它,但就目前来讲Ruby已经从暗流涌动,开始扬帆远行!

值得思考的问题

今天查资料的时候看到一篇女程序员写的奋斗史,字字艰辛。其实我想不管男女都差不多,这行的饭还真不是好吃的。现在并不后悔进入这行,只是心中产生了一个疑问:到底是我在玩电脑,还是电脑在玩我?
这个问题在脑中产生后,发现真难回答。很无奈,又是还真觉得自己被电脑所牵制。干这行要学得太多太多,跟新的速度永远比自己掌握得快。无时无刻不在学习,不在提醒自己不学就会落后很多。每天几乎都是对着电脑,娱乐在这,学习在这,又是吃饭也对着他。每天重复着打开电脑开始一天的生活,关掉电脑就是合眼睡觉。
这行确实不适合女性,也不适合男性。

到底是我在玩电脑,还是电脑在玩我????

2009年2月24日星期二

架构基础

常常嘴上挂这个架构,还喋喋不休。静下心来,想想到底什么是架构?等的基础问题,有时真能把自己问晕。
今天在查rest资料的时候,看到一篇文章,觉得写得不错。

一个软件架构是一个软件系统在其某个阶段运行时(run-time)所有元素的抽
象。一个系统可能由很多层抽象和很多个操作阶段组成,每个抽象和操作阶段都
有自己的软件架构。

软件架构的核心是抽象原则:通过封装来隐藏系统的一些细节,从而更好地识别和支持系统的属性

现代软件架构的核心是:组件、连接器、数据。组件是在运行时执行某种功能的软件单元。这样的例子有程序、对象、进程、过滤器。
软件架构(software architecture)是软件系统在运行时的抽象,而软件结构(software structure)则是静态源代码的属性.将软件架构和源代码结构分离开来是为了更好的关注软件运行时的特性,这些特性不依赖于一个特定的组件实现.

设计文档是运行时系统的一部分?系统运行起来后,设计文档在软件架构中不扮演任何角色。大楼的图纸烧毁了,但是大楼还在。

对于基于网络的应用而言,数据元素在系统中的位置和移动常常是系统行为唯一至
关重要的决定因素.

组件

一个组件是软件指令和内部状态的一个抽象单元,通过其接口提供对于数据的转
换。软件组件就是拥有接口、其接口形式对外表现或者展示的一个具有一定独立功能的软件单元。软件组件必须拥有接口,否则不能成为组件,或者这样的组件是没有任何用处的。



组件是软件指令和内部状态的一个抽象单元,通过其接口提供对于数据的转换。转换的例子包括从二级存储将数据加载到内存、执行一些运算、转换为另外一种格式、使用其他数据来封装等等。每个组件的行为是架构的一部分,能够被其他组件观察到(observed)或看到(discerned)换句话说,组件应该由它为其他组件提供的接口和服务来定义,而不第1章软件架构12由它在接口之后的实现来定义。Parnas 将此定义为其他架构元素能够对该组件作出的一组假设。



连接器



一个连接器是对于组件之间的通讯、协调或者合作进行仲裁的一种抽象机制。

连接器的例子包括共享的表述、远程过程调用、消息传递协议和数据流。

连接器通过将数据元素从它的一个接口转移(transferring)到另一个接口而不改变数据,来支持组件之间的通信。在其内部,一个连接器可以包含一个由组件组成的子系统,为了转移的目的对数据进行某种转换、执行转移、然后做相反的转换并交付与原始数据相同的结果。



传输数据应该是链接器最重要的任务。包括客户有意义的实体数据、组件交互的交互协议数据。对于数据传输方向的选择和目的数据方向的不同,连接器可以对接受的数据进行不同的转换。这个转换应该由连接器内部的组件来完成。



数据



数据是组件通过一个连接器接收或发送的信息元素。数据的例子包括字节序列、消息、编码过的参数、以及序列化过的对象,但是不包括那些永久驻留或隐藏在组件中的信息。

在软件架构中,数据其实是一种流动的消息。在基于网络结构的设计中,数据是最重要的概念。你要选择两种模式:是在远程直接连接组件进行交互,还是将组件传递到本地在本地空间中进行交互。

架构属性
架构属性的例子包括了可以由系统获得的功能属性和非功能属性,例如:进化的相对容易程度、组件的可重用性、效率、动态扩展能力;这些常常被称作品质属性(quality attributes])

属性是由架构中的一组约束所导致的.架构设计的目标是创建一个包含一组架构属性的架构,这些架构属性形成了系统需求的一个超集。不同架构属性的相对重要性取决于想要得到的系统本身的特性。

架构风格
一种架构风格是一组协作的架构约束,这些约束限制了架构元素的角色和功能,
以及在任何一个遵循该风格的架构中允许存在的元素之间的关系。

风格是一种用来对架构进行分类和定义它们的公共特征的机制。每一种风格都为组件的交互提供了一种抽象,并且通过忽略架构中其余部分的偶然性细节,来捕获一种交互模式(pattern of interation)的本质特征

明确地说,一种架构风格决定了在此风格的实例中能够使用的组件和连接器的词汇表,以及一组如何能够将它们组合在一起的约束。一种特定的架构可能是由多种架构风格组成的。同样地,能够通过将多种基本风格组合为单个的协作风格来形成一种混合风格。

一些架构风格常常被描述为适合于所有形式的软件的“银弹”式解决方案。然而,一个好的设计师应该选择一种与正在解决的特定问题最为匹配的风格。

为一个基于网络的应用选择正确的架构风格必须要理解该问题领域,因此需要了解应用的通信需求,知道不同的架构风格和它们所导致的特殊问题,并且有能力根据基于网络的通信的特性来预测每种交互风格的敏感度。

在传统的建筑架构中,风格的真正来源是一组应用在设计上的约束,达到或复制一种特定的风格应该是设计者的最低的目标。由于将一组已命名的约束称作一种风格,使得对公共约束的特征进行沟通变得更加容易,我们将架构风格用作一种进行抽象的方法,而不是代表一种个性化的设计。

模式和模式语言

模式是关于一种重要的和重复出现的系统构造.一种模式或由多种模式集成在一起的模式语言能够被看作是实现对象之间的一组预期交互的方法。换句话说,一种模式通过遵循一种固定的设计和实现选择(implementation choices)路径,定义了一个解决问题的过程。

模式包含了一种通用并且重复出现的应用的实现的细节。

Alexander还理解到:事件的模式不能脱离于发生这些事件的空间。Alexander的设计哲学是,识别出目标文化(target culture)中公共的生活模式(pattern of life),确定哪些架构约束对于以下目的是必需的,即,对可以使期望的模式自然地产生的特定空间加以区分。这些模式存在于多个层次的抽象和所有的规模中。



一种架构风格,作为一组协作的约束,应用于一个设计空间,以求促使一个系统出现所期望的架构属性。通过应用一种风格,一个架构师是在区分不同的软件设计空间,希望结果更好地匹配应用中所固有的一些必需满足的先决条件.


软件设计模式比架构风格更加倾向于面向特定的问题.模式倾向于是架构风格中的建造块(Building block).



一种架构描述语言(ADL)是一种为明确说明软件系统的概念架构和对这些概念架构建模提供功能的语言,至少包括以下部分:组件、组件接口、连接器、以及架构配置。

转自:http://blog.sina.com.cn/s/blog_4671e657010009uh.html

2009年2月21日星期六

Linux windows之争

前阶段cb上贴出了05年清华大学在读博士的文章。之前有所耳闻,是一个完全否定windows的人士。

我一直认为linux和windows更本不存在好坏之分,针对的对象完全不同。没有什么可以比较的。看看2万字,也懒得看了。后来刘和我说,虽然偏激但还是值得一看。so,静下心来,慢慢的读下来,是的不得不承认,他对于linux的认识和理解,被windows的理念惯坏的观点一点没错。在对于的他的工作,他的生活理念,linux是最好的选择。没有什么好反驳的,同样作为一个计算机的工作者,只能感到惭愧。没能站在他的高度,没能接触到他那样的工作难度,所以也不说什么吃不到葡萄说太酸的事。值得向他学习,但是我也不会改变自己的观点。

下面转一下那篇文章,提醒自己尽可能的向他的层次努力试试吧

尽管我们已经不习惯看长篇大论, 但我还是要说, 这是一篇值得你从头读到尾的长篇文章.
2005年9月22日,清华在读博士生王垠在水木社区BLOG上发表了《清华梦的粉碎--写给清华大学的退学申请》明确要求退学, 引起社会各界广泛争论. 他创作的长篇文章《完全用Linux工作》, 洋洋两万多字, 从不同角度居高临下的阐述了他眼中Linux完全优越于Windows的各种理由, 这篇文章并不简单的是一篇论述"Windows能做的事Linux都能做"这样的文章, 通篇洋溢着一个彻底批判 Windows 平台基础的计算机哲学, 计算机应用和计算机教育体系的人的万丈豪情, 尽管可能偏激, 也不乏详细的推理论述. 今天我们重温本文, 一方面也是因为CB上喜爱和推广Linux的人士很多, 有时也会爆发小规模论战, 我们希望能通过对本文的研究与讨论, 来窥测国内部分Linux推广者的心态, 同时为大家提供更宽广的讨论空间.

我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所有的工作。

GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务,打游戏,那么你不需要了解下面这些了。

我不是一个狂热的自由软件份子,虽然我很喜欢自由软件。这篇文章也不是用来推行自由软件运动的,虽然我觉得自由软件运动是非常好的。

这篇文章也不是用来比较 Linux 和 Windows 内核效率,文件系统,网络服务的。我现在是作为一个用户而不是一个开发者来说话的,我们的讨论是基于操作,应用层面的。是为了告诉大学里还不了解,或者不理解 UNIX 的科学工作者和大学生,UNIX 比 Windows 更适合用于科学研究工作,请大家理解 UNIX 的工作方式,不要用 Windows 的标准来要求 Linux,而要用一个科学工作者的标准来要求自己,用UNIX 的思想来武装自己。

我显然是反对在大学,特别是理工科专业推广 Windows 的。我也反对在对"娃娃"们的计算机启蒙教育中使用 Windows。因为 Windows 不论从技术上,经济上,思想风格上都是与我们培养高科技人才的目标格格不入的。Windows 的流行属于历史遗留问题,爷爷一级的人当然已经不可救药,但是我们不应该让下一代继续走上歧途。

UNIX 不是计算机专家的专利

当我建议一些非计算机专业的人用 Linux 的时候,很多人说:"UNIX 是计算机系的人用的,我们不能理解。" "UNIX 是男孩用的,我们女孩不用。"

但是其实世界上的大多数科学家和工程师几乎用的都是 UNIX 作为他们的电脑工具。就因为它简单,可靠,稳定,强大,有趣。甚至很多时候 UNIX 就是唯一的选择。

你说:"我们都会用 UNIX 的话,你们计算机专业的人还用来干什么?" 很容幸的告诉你,计算机专业的有一部分人就是专门为你们提供这样强大而方便的计算机工具的。如果他们制造的工具只有自己会用的话,那这个工具还有什么用?

理解 GNU/Linux 不要用 Windows 的标准来要求 Linux。

由于GNU/Linux这个词太长,下面如果没有特别指明,"Linux"就是指GNU/Linux"。

在这个年代,恐怕没有人需要我来介绍 Linux 是什么了吧?如果你觉得"Linux 只不过是跟 DOS 差不多的东西",那请问问你旁边的 Linux 用户,Linux 到底是什么?

那为什么我还要写一篇这样的文章?因为,我发现还有很多人不不理解 Linux 和 UNIX,虽然他们也在用它,但是他们有时会问:"为什么 Linux 不能像 Windows 那样 ……?","怎么Redhat Linux不能 mount NTFS 分区!","Linux 下用什么整理硬盘?","什么时候OpenOffice才能完全兼容Word文件啊?","现在还有什么Windows能干的事情Linux干不了的? "……

他们有40G的硬盘,却只为 Linux 分配了2G空间,有时还抱怨"这个东西怎么占这么多硬盘!" 似乎 Windows 该占用大部分硬盘。他们把重要的数据装在Windows的分区,似乎信不过Linux。他们总是到处寻找新奇的,好看的GUI程序,对命令行的东西一概不屑一顾。他们对Drag&Drop,菜单配置,自动升级非常感兴趣。他们如果找到一个很像 Windows 程序的 Linux 程序,一定会很高兴的说:"哈哈!Linux 也能……了!"如果Linux在某种测试中胜过Windows,他们会高兴得跳起来。他们没有办法用Linux 解决问题的时候,甚至用Wine来运行Windows程序。有时实在没办法,只好重起到Windows,或者干脆省得麻烦,在 Windows 下装一个 VMWare 虚拟一个 Linux 玩。

你如果出现了上面的情况,说明你的思想受到了 Windows 的某种潜移默化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的 UNIX 思想。你支持 Linux,你喜欢 Linux,你能从中感觉到快乐,这非常好。你现在只需要明白的是:Linux 从来就不是一个玩具,它是天才UNIX的后代。UNIX 是自晶体管发明以来最伟大的发明,它从诞生那一天开始就比 Windows 的设计出色。

你要体会什么叫做"设计",一个糟糕的设计并不是到后来缝缝补补就可以变好的,而一个出色的设计,不但可以以不变应万变,而且可以影响到后来者。一个出色的设计配上一个出色的实现,那就是非常出色的发明。Linux 就是这样的一个出色的发明。Linux 并不需要追赶 Windows,也不需要打垮微软。它的最终目标是改变整个计算机世界,还人们自由,给人们乐趣和方便。

Unix 是简单的,你不需要成为一个天才也能理解这种简单。

UNIX 的设计者 Dennis Ritchie 说:"Unix is simple. It just takes a genius to understand its simplicity." 但是我不这么认为,因为我不是一个天才,但是我却勇敢的把 Windows 完全删除掉,遇到不明白的事情的时候努力用 UNIX 的方式去解决,而不是寻求 Windows 的帮助。现在我体会到了 UNIX 的思想和好处,我可以用比 Windows 高效几倍的效率工作。因为我相信这样的信念:"Windows 能办到的事 Linux 一定能办到,而且办的更好。"

这小节开头的话应该改成:"Unix 是简单的,你不需要成为一个天才或是计算机专家。但是在这个冲斥着 Windows 错误观念的世界,你需要信念和勇气才能理解它的简单。" 我下面就告诉你一些我理解到的东西。首先,你要知道的是微软在国际科学领域是根本没有地位的。

微软的地位

微软的名声在欧洲和美国的大学里,特别是在计算机系里之坏,大家可能有所耳闻。我认识的 MIT,Stanford 的教授,贝尔实验室的专家,甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里,微软只是一个没有真技术,专靠在落后国家商业宣传和垄断经营的小公司。这个"小"并不是说它人少,钱少,而是说它先进技术少。

我上次和王益合作写了一个算法演示程序,那个算法是贝尔实验室一位科学家Steven Fortune很天才的发明,为了程序能够被身边大多数人使用,我们选择了 VC+MFC 作为平台。我在分析算法时还得到 Fortune 很热情的鼓励,寄给我一份资料,还多次回信耐心的给我讲解了很多细节。但是程序完成之后,我把样品发给 Fortune,他回信说:"对不起。我机器上没有 MFC。" 话说的很客气,但是我已经感觉到了他对 Windows的不屑。然后我把 MFC 静态编译进程序再发给他,他就没有再回信了。他显然不是瞧不起我,而是确实有难处。

你能感觉到这位科学家对微软和 Windows 是什么态度了吧?不是反感,而是他心里根本没有 Windows 这个东西!微软在高科技领域没有发展,那么它怎么生存呢?到发展中国家去发展一下,他们的人民还对电脑一无所知,我说不定甚至可以打入大学的计算机系呢。我送他们软件,我捐钱盖大楼,我出钱找图灵奖获得者来演讲,让他们觉得我们都是科学家!

好了,现在全国的大学包括清华,几乎所有人机器必装盗版 Win2000,Office XP,学校的选课系统是非IE不能正确浏览,论文用 Word 编辑,演示用ppt做,email 的通知附件是 doc 文件,你不用 Word 打不开,连 863 项目都用 VC 写程序了。我很久以前就看到一份报纸说,"微软为什么不严厉打击盗版?" 这篇文章说,微软非但不打击中国的盗版行为,而且有放任之趋势。放长线吊大鱼,"以后我要你们加倍的来还我!" 确实如此,它的目的快实现了。

Windows 笼罩下的中国计算机教育

说句丢脸的话,比尔盖茨很久以前是我的偶像……

在中国,比尔盖茨被很多人奉为神圣,"少年电脑天才",甚至有的人提到他的名字就做出"抱拳对天"的姿势。很多人谈到微软的"新技术","高科技" 都是眉飞色舞。各种"VC编程圣经","深入了解 Visual C++"之类的书,在开头几页都会出现非常肉麻的字眼,"在那团团的混沌中,一个开天辟地的精灵,Windows 1.0,诞生了……"

微软的软件被这么多人盗用,那么人们是怎样使用这些盗版程序的呢?先看看电脑培训班,教的都是一些 DOS 命令,打字,Windows 基本操作,Word 文档处理,PowerPoint,高级班可能有 Excel,Access…… 参加各种微软认证考试,MCSE,MSDE 的人络绎不绝。考试辅导班都贴出了"280元,考过为止"之类的字样。考试参考资料更是昂贵,有些电脑书店整整两书架都是"Microsoft Press"的东西。我有个同学参加认证考试,每门考试都要200多元。而且你一次考不过可以再考,又要交钱。他后来还津津乐道跟我说,看我,花了 XXXX(一个四位数)元考过了微软认证,得到一张比尔盖茨亲笔签名的证书和价值6000元的 Windows XP 内部发行版。

"电脑要从娃娃抓起",我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后,他们首先就会装一个盗版的 Windows,然后买来盗版的游戏开始玩。如果哪个孩子会用 Delphi 编程序,那可不得了。报社记者,电视台争相报导,说,某某学校的初中生某某,在别人都还在玩电脑游戏这种"初级阶段"的时候就已经用 Delphi 写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像!

我刚进入大学计算机系时还不懂得什么是操作系统,因为我以前只用过"中华学习机"。看到新入学的同学们各个谈论的都是 "Windows 95","VC"…… 我简直觉得我落后了好几十年一样,整个一土人,根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下:"你们天天谈论的瘟95是什么啊?"答: "win95就是一个操作系统,跟DOS是一类。""朵死是什么?" "你连DOS都不知道是什么?别在计算机系混了。" 学校上课当然不讲VC编程之类的东西,但是上 Pascal 的老师有一次就说:"嗨,我们学校真是落后。现在别人都用 C, C++,甚至 VC 了,我们还在讲 Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的,只好自学了。" 于是,有些同学很多时候上课都捧着一本很重的"Windows 编程大全"之类的书,根本没有听课。吃饭时就念念有词的跟我说,"代码的优化是无止境的","匈牙利命名法真是伟大的发明" …… 这就是中国很多大学计算机系的情况。

感觉到无知了?这不是偶然的,而是微软长久以来埋下的伏笔。它要让无知的大家都把它奉为神圣,它要让支持UNIX,Xwindow的人一旦说 UNIX 好,Xwindow 好的时候,都被一群人围着说教:"这个 Windows 也能做到","你对 Windows 有偏见","微软才是主流啊","你敢瞧不起 win2k?",".NET 就是世界潮流","微软的毕竟是新技术","有钱就是有技术"…… 甚至在一番论战比较后败下来还是要说:"Windows 性能差点,但是易用性强","Windows 是老百姓用的,要求别那么","微软那么有钱,以后想超过 UNIX 还不容易吗?"……

发达国家的计算机教育

我前段时间在 USENET 发文问有关 Scheme 语言的问题时,认识了一位丹麦人。他解决了我所有的问题,并且建议我阅读一些很"深奥"的有关程序语言语法,文法的书,他告诉我很多网站可以学习 LISP,Scheme,人工智能,算法。他叫我看 Jonathan Rees 的论文 "Syntactic Closures"。他还打包给我寄过来一份 MIT 的 "How to Design Programs"。他说他在自己的 PC 机上装的是 Linux,他用 Emacs 编辑,运行Scheme 程序。他对 Emacs 的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个 Scheme 解释器。这对于我来说是望尘末及了。

他是那么的不厌其烦,我的每一个问题他都详细的回答。我有时都觉得过于详细了,怎么这么耐心啊?我觉得他似乎是我的高中老师。他是什么样的人呢?我好奇的打听了他的情况。原来,他是丹麦一所普通高中的计算机老师。

他说他在高中里讲授程序设计和算法,计算机语言文法。他说用 Scheme,他的学生不用再为内存泄漏等程序语言本身的问题而烦恼,而专注于问题和算法本身。有利于培养学生解决问题的能力,特别是用计算机解决数学问题的能力。

天哪!为什么欧洲出现那么多数学家,几何学家?你看看别人重视的是什么!我们的计算机教育如果继续这样下去,只会沿着弯路越走越远!

微软和它的朋友们的如意算盘

下面来看看微软的收入是怎么来的。首先,Windows 98系列操作系统,一个就是 100多美元,每次升级又是几乎同样的价钱。Windows NT 还要贵几倍,而且有用户数目限制,5个用户的,10个用户的…… 以后如果要增加用户数目还要按比例付钱。

花了如此多钱买来的操作系统就能用了吗?它竟然连压缩程序都没有提供!你装上Windows 之后一般第一件事就是去下载一个 WinZip 吧,"只要 29 美元"。Windows会中病毒啊,马上花 70 美元买一个 Norton AntiVirus 吧。还有黑客呢?再买一个Norton Internet Security 好了,100 美元。系统需要优化,磁盘需要整理,买一个Norton System Works 是你最佳的解决方案,100美元。

可是你现在还是不能干正事啊!你想要一个 Word, PowerPoint?那就买一套 Office XP 吧,一起买便宜些,$459.90。

那些程序不会用啊!那些菜单怎么设置,到底有什么功能啊?看"帮助"也学不会。买本书看看吧,我推荐"Special Edition Using Microsoft Office XP",不贵,$27.99。这本书里面大部分是屏幕抓图,还是买一本旧的比较划算,$17.85。

你如果只是当个秘书,上面的差不多还凑合了。可是你有更高的追求,你想成为 Windows程序员。首先买一个 Visual Studio.NET 吧,要不然怎么编译程序。$494.95。

为了紧跟微软动向,世界潮流,不能不注册个 MSDN 什么的吧?这个贵一点,不过物有所值啊,$2,799。

嗯,你现在已经是上层阶级,白领人士了。你现在可以像这样"自由"的,"安全"的生活了。

为什么要反对使用 Windows

很多人都说不应该完全否定 Window,Windows 也有它的长处。不应该骂微软。

对。 Windows 容易操作,适合普通用户。如果微软把它自己定位在 P&G,Philips 那样的地位,能够给我们的百姓提供周到的,完善的,价廉物美的服务。那我肯定是很喜欢它的。但是从上面的种种情况说明,微软是一个野心极大的国际垄断组织!它的产品没有一个是不出问题的:Windows 不稳定,容易中病毒,而微软不为大家免费提供杀毒软件。我就是要让你们花钱买我的朋友 Symantec 的杀毒软件,谁叫你们已经上了我的贼船?这叫什么售后服务啊!

你买来微软的程序,安装的时候一般都有一个协议,说:" 由于微软的程序造成你的数据损坏或丢失,微软概不负责。" 我想很多人肯定觉得这个不合理,不想按那个 "I accept"。但是你的软件买都买来了,钱都花了,现在一按 "I decline",安装程序马上就会退出。你只好被迫点击了 "I accept"!这不是不平等条约吗?

我已经目睹了好几个朋友的文档被 Microsoft Word 损坏,有的是编辑了十多天的30多页的论文,有的是费了很大工夫做出来的个人简历,那个朋友为此失去了到自己向往的P&G 工作的机会。就在他要投简历的前一个晚上,就在那一瞬间…… 不知道他痛哭的时候有没有想起要投诉微软,可是谁叫我们用的都是盗版呢,况且你还点击了 "I accept"。

微软仗势已经占有大部分PC市场,制定不符合国际标准的"微软的标准",以不合理的方式压制其它公司的软件,这个问题已经在美国司法部闹了很久了。他甚至在 Windows系列操作系统中放置能够通过网络泄漏用户信息的代码,以至于 Windows 刚进入澳大利亚时被澳大利亚政府禁止使用。

有些人说:"微软毕竟开创了一个历史,造就了今天的 IT 行业。" 但是,如果没有微软,我们今天早就用上非常稳定,非常可靠,非常方便,非常"傻瓜"的软件了!微软是阻挡信息技术发展的罪魁祸首。

微软的程序的工作方式(注意,我只是说操作方式,病毒的事情另外算)确实适合于一般家庭,上上网,发发邮件,打打游戏都不错。可是微软却要把自己包装成什么 "高科技"企业,要在世界各地设置"研究院",在大学计算机系赠送不适合用于科研的 Windows产品,甚至出钱请图灵奖得主来中国畅谈"二十一世纪的计算",还在大会上宣传自己的 .NET 技术。非要把别人认为自己是科学的,自己是领导世界高科技的。但是呢?它什么高科技也没有。欧洲,美国,哪一个关键部门在用微软的东西?NASA? DOE? CERN?你仔细想一想,微软的程序对人类到底有什么重大作用?

什么是 Windows 能干而 Linux 干不了的事情?---
"Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。"

有个朋友看我半年没有用 Windows,有时就会问我:"你只用 Linux,有没有发现有些Windows 能处理的事情 Linux 干不了?"---
我回答说:"Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。"

Windows 能做的有益的事情 Linux 都能做---
Windows 下的某些功能确实是我们需要的,那么 Linux 的开发者们和用户也需要这种功能,他们就会去实现这种功能,而且比 Windows 的方式好得多。由于大多数科学家,工程师用的都是 Linux 或者某种商业 UNIX, 所以几乎所有商业的科学工程程序,比如Matlab, Mathematica, AutoCAD, Candence的,Synopsys的,Avant! 的……全都是先有UNIX 的版本(包括Linux),然后再考虑移植给 Windows,甚至根本不移植给Windows,因为 Windows 的机器一般没有足够的能力运行这样的程序。你不要以为只有 Windows 才有 PSpice, UNIX 的 HSpice 要好得多,而且可以运行在大型主机上。当然它们不是免费的,但是它们值那个价钱。

但是 Windows 下有些东西在 Linux 下没有很相似的,或者你找到很多类似的,但是它们每一个比起 Windows 的那个程序都要差很多,那么原因有两种可能性:

有一个完全类似的程序,但是由于它乍一看不漂亮,被你忽略了。而其它程序虽然看起来很漂亮,但是它们是一些初学编程的人写的。现在由于 Gtk, Qt 的诞生,Linux 下开发图形界面程序极其简单,很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去,永远也找不到你满意的。当然也有一流的程序用 Gtk 和 Qt,比如 GVIM 就可以用 Gtk 作为图形界面,我还知道 Synopsys 一些程序用了 Qt。

我曾经也犯过这样的错误,从外表区分一切。结果优秀的 FVWM, lftp, Mutt, wget 都被我忽略过。当我找回它们的时候,我是那么的羞愧不已,它们现在都是我的朋友 我第一次看到 FVWM 觉得它只不过是一个有很厚很难看边框的东西。可是现在,我的同学看到 FVWM 都说:"哇!真漂亮。"

有另一种完全不同的方式可以达到相同的目的,甚至更好。

很多人很关心 Open Office, Star Office, AbiWord, ... 他们多么盼望有一天某一个Linux 程序能够完全兼容的打开一个复杂的 doc 文档。但是你永远也不可能有那一天。为什么呢?因为微软为了占有市场,必定不会让其它系统的程序能够完全兼容它的文档格式。它一定会不断变化 doc 文档的内部结构,隐藏一些秘密,让其它公司的程序打开 doc 文档时总是有某种问题,从而你必需购买 Microsoft Office 和 Windows。

你应该想一下,那么多的高智商的大学教授,科学家,学生,他们用的都是 Linux 或者其它类型的 UNIX,他们没有 Word 可用,怎么处理文档呢?这么多年没有一个像Open Office 的程序出现,难道大家没有办法写文档吗?

显然不是这样。你看看那些高水平的学术杂志,论文,那些大学教授的网页,那些漂亮的幻灯片,它们是什么做的?原来 UNIX 用户早就有非常方便的 troff, LaTeX, SGML等东西可以处理文档,而且它们比起 Word 都要高明的多。Word 显然被这些大拿忽略了,以至于很久以来没有人想在 Linux 下开发一个类似 Word 的程序,除非某些公司想抢微软的饭碗。

很多人留着 Windows 在硬盘上的原因无非是为了用 Word 和 PowerPoint。我见过一个教授,他的 Windows 笔记本电脑上除了 PowerPoint 什么都没有。有一天演示的时候,他指着堆乱字符说:"对不起,这是一个公式……怎么每次都是这样……" 其实有比PowerPoint 好几百倍的东西可以制造幻灯片,你可以用最简单的方法制造世界一流效果的论文和幻灯片。你待会儿可以看看我的TeX网页,你就会知道为什么我可以完全离开 Windows。

Windows 能做的那些没用的事情 Linux 永远做不好

电脑游戏
有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确,Linux 下虽然也有少量的游戏,比如 Quake。但是它没有 Counter Strike, 没有 Star Craft, ……

并不是说电脑游戏不该玩,但是应该适可而止。电脑是用来处理事务,帮助你学习,解决问题的工具,而不是一个玩具!整天沉迷于电脑游戏中,而不出去感觉外面的世界,你会变得越来越冷酷,越来越缺乏人情味。你与真实的世界越来越远。

你可以在 CS 里杀人,你可以在 Tomb Raider 里探险,你甚至可以在 Tony Hawk's Pro Skaters 里滑板…… 但是 It's not real!你虽然有很高的"反恐技巧",但是遇到歹徒的时候,你是那么的怯懦;你虽然控制 Laura 伸手敏捷,但是你打篮球的时候怎么总是被人断球?你虽然可以轻易的在 THPS 里作出一个 "360 kickflip to hangten grind to fakie",但是你踩在自己的滑板上的时候还不会 ollie!

说回来,如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比 Windows + PC 更好的游戏方式。Sony 的 PlayStation2, SEGA 的 DreamCast, Nintendo 的 N64,Namco的街机……每一个都比 Windows 游戏精彩,每一个都有如此高的3D性能,以至于Pentium4, Itanium + GForce4 都无法与它们比美!

Linux 的用户们都是关心解决世界的关键问题的份子,他们哪里有时间用自己的机器来玩游戏啊?他们每天用Linux高效的做完自己的工作就到阳光下享受自然去了。要玩游戏也是玩一些类似推箱子,贪吃蛇之类的智力小游戏。所以,你知道为什么 Linux 几乎没有游戏了吧?

"整理硬盘,优化系统"

这是一个非常有意思的话题,仅次于有关"病毒"的话题。相信很多 Windows 用户都有整理硬盘的经历。在很多 Windows 用户眼里,"硬盘用久了,会出现碎片,速度会减慢,需要一个程序来整理,整理硬盘的时候不要做其它工作",这好像是天经地义的事情。

我也曾经津津有味的看着 Norton Defrag 一点一点的把我的硬盘排序,调整,用图形的方式显示出来,然后报告100% 没有碎片。你的硬盘现在已经达到最佳状态。" 我现在才发觉我那时是多么的幼稚。

Linux 和 UNIX 用户似乎从来没有"整理硬盘"这种说法呢?你觉得很奇怪吗?如果你觉得很奇怪,那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白,UNIX 的大型主机很多必须是一天24小时,一年365又1/4天不停运转的,要是每个星期都要整理一次硬盘,在整理的时候几乎不能干任何事情,那是绝对行不通的!

Linux 机器根本不用整理硬盘,这就是为什么没有看到过 Linux 用户整理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS 高明得多的文件系统,它们不但可以对文件设置权限,实施完全的保护,而且可以"越用越整齐","越用碎片越少"!你应该把文件大部分放在 Linux 的分区,而不是 Windows 分区,因为它比 Windows分区可靠得多。

还有更滑稽的事情就是有很多"Norton System Doctor","Windows 优化大师","超级兔仔注册表魔法" 之类的程序存在,而且价格昂贵。似乎一个操作系统本来应该有很多问题,需要别的厂商做程序来"优化"它,而且为了得到优化,你需要付钱!这些问题 Linux 根本就没有,所以不需要什么优化。Linux 内核本身就是高度优化的。

IDE

有些人在抱怨为什么 Linux 没有一个良好的 IDE 开发环境。Linux 现在已经有一些IDE 了,但是总是有很多问题。你是不是正在寻找,正在期望 Linux 某一天可以有一个VC那样的开发环境?你有没有发现你正在进入微软给你设下的怪圈?你为什么一定要用 IDE?你说:"IDE 开发迅速,调试方便,适合大型程序……" 那说明微软的程序在你脑子里已经比较根深蒂固,你需要好好清醒一下了,看看我来告诉你。

高明的 UNIX 程序员不用 IDE,IDE 从来就是给初级 Windows 程序员用的。

你看看大型的 UNIX 程序,包括 Linux 内核,各种网络服务程序,Xwindow 程序在内,哪一个是 IDE 搞出来的?我们实验室的 EDA 程序也没有一个是 IDE 弄的,我还知道Candence, Synopsys,Mentor 的高性能的图形界面 EDA 程序也都不是 IDE 写的。你信不信,微软的人在写 Windows 本身的时候也根本不用 IDE。微软内部程序员最喜欢的编辑器其实是 VIM,用 VIM 的微软程序员上次向乌干达的可怜儿童捐助了1000多美元,这是值得称赞的。

有一次某杂志采访一些出名的 Linux 内核程序员,包括 Linus 在内,没有一个人用IDE,有的人用 VIM,有的用 Emacs,只有 Linus 说"GNU Emacs is evil",但是其实他用的是一种跟 Emacs 有同样键绑定功能的 MicroEmacs。大家都是用编辑器编辑了程序文件,然后用 make 这样的自动工具调用 gcc 编译器完成编译工作的。甚至高级的 Windows 程序员也不用 IDE,他们可以从命令行调用 cl,nmake 来编译自己的程序。虽然这样的 Windows 程序员很少,但是他们却是最了解 Windows,最高明的Windows 程序员。

为什么 UNIX 程序员不用 IDE?明白了这个道理你就能体会到 UNIX 的设计思想了。首先,一个 IDE 集成了编辑器,编译器,汇编器,调试器,跟踪器…… 这个编辑器功能肯定比不上 VIM 或 Emacs,编译器比不上 GCC,汇编器比不上 as,调试器比不上 gdb,ddd, 跟踪器比不上 strace, ltrace, truss。你得到的是一套整合的低能的程序。如果你对调试器的功能不满意,你只好换用另外一套 IDE,但是这套 IDE 的热键,菜单,编辑器功能,按钮…… 跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境,而不能保持原来的某些东西。

而在 UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序,你在 VIM 里可以调用GNU make,make 可以调用 gcc, ld, ... make 的出错信息可以被 VIM 捕获,VIM 能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而不是 gcc。你如果觉得 gdb 跟踪变量时比较麻烦,你可以用 ddd 来显示各种数据结构之间的关系。你还可以在 Emacs 里调用 gdb,那样就可以同步显示源代码了。而且 VIM 和 Emacs 还可以编辑很多其它东西,比如信件,LaTeX 文档,HTML,配置文件…… 你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin 都可以在内部使用 VIM,这样就更方便了。实际上 make 在其它方面还能帮你很多忙,我的每一个比较大型的 LaTeX文档都是用 make 维护的。

Linux 能干的高精尖的事情 Windows 都干不了

当然有很多事情是Linux/UNIX的专利了。因为 Windows 只能装在 PC 机上,好像以前也有 Alpha 可以使用 Windows NT,但是就是没见到有人用。PC 机的能力是很低的,像我们编程序处理 NP-Hard 问题的人,用 Windows 的机器显然速度不够,而且有时一个问题算上几天甚至几个星期,Windows 机器是以"死机"著称的,我们怎么能放心?所以几乎所有科学计算程序,EDA 程序,高性能图像处理程序都不是 Windows 的。他们有时也会移植一些给 Windows,但是常常降低那些程序的能力。你比较过 Windows 版本的 Mathematica 和 Linux 的有什么区别吗?

IBM 制造的最大的并行计算机有 8000 多个处理器,Windows 不可能有能力管理这么多处理器,它用的是什么操作系统?答案是 Linux。

《泰坦尼克号》电影里的三维动画,那么细腻逼真,Windows机器能做出来吗?不行。那也是 Linux 机器做的。

民航总局用来训练地情人员的虚拟现实训练设备,Windows 当然无能为力。那都是商业的 IRIX 机器。

UNIX 是最早支持 TCP/IP 网络协议的系统。它上面有很多可以互相协作的网络服务程序,它们经过多年的使用和修订,已经达到比较完善的程度。而就在1997年,微软的比尔盖茨还在扬言:"Internet 是没有前途的。" 微软的这个"远见卓识"大家应该都已见识,它后来加上的网络服务程序IIS漏洞之多,让公安部都频频发出警报,大家也是见识了的。

其实你知道了,Windows 没有一样有用的事情能比 UNIX 干的更好。

Linux 干不了的有用的事情 Windows 照样干不了
当然 Linux 不是万能的。它也有不能干的事情,电脑也有干不了的事情。但是 Linux干不了的事情,Windows 肯定也干不了。这些事情就是我们需要探索,需要努力的事情了。在你探索的过程中,Linux 必定是你的好伙伴。

不要把Linux和Xwindow掩盖起来!不要把我们的用户当成傻瓜。

什么?你早就知道 Windows 是垃圾?噢!你怎么不早说呢!害我废话这么多。嘿嘿。

"好了。你知道 Windows 是垃圾,你现在用什么"

"Linux + Xwindow"

"那我问你,Xwindow 是什么样的?"

"不就是跟 Windows 差不多吗?只不过 'Start' 按钮比较方,而且上面不是一个Windows 标志,而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我喜欢!"

"你知道什么是'根窗口'吗?"

"不知道。从来没听说过呢?"

"根窗口就是遮盖整个屏幕的那个最大的窗口。"

"哪儿有什么窗口啊!我没有看到呢?"

你发现了问题吗?这些 Linux 用户说是在用 Linux 和 Xwindow,但是他们对 Linux和 Xwindow 几乎完全不了解。很多人用了那么久 Xwindow 都不知道根窗口是什么东西,不知道其实按钮也是窗口,不知道窗口管理器和其它程序有什么关系,大家都以为窗口上面的按钮是程序自己放上去的,不知道窗口? quot;class name","resource name"是什么东西。他们也不知道 .Xdefaults 是用来干什么的。特别是他们很多人都不知道 Xwindow 的字体是如何命名的,什么是 fontset,有了一个新的字体也不知道怎么安装。

他们被遮在 Linux 之上的一层一层的包装迷惑了,他们等待有图形界面的工具来帮助完成一切事情,他们认为 Linux 跟 Windows 一样,只是麻烦一点。他们知道 Linux内核很好,但是他们感觉不到 Linux 和 Xwindow 在操作层面的天生的先进性,随后不久就把 Linux 完全删除掉了。你发现没有,要用户理解 UNIX 和 Xwindow 的操作层面的先进性,才是留住用户的最好办法。如果用户体会不到操作时的方便和高效,内核再好他们也不会理会。

但是用摹仿 Windows 的作法来吸引用户,永远会失败的。因为 Linux 如果摹仿Windows那一套低效率的方式,那么 Linux 的这套"低效率方式"永远比不上Windows 的那一套"低效率方式"。那么用户就会说:"这个 Linux,没有一样比的上 Windows。"

Linux 天生就是继承了 UNIX 的高效的工作方式,为什么我们要把它掩盖起来?我们为什么只告诉用户 KDE 的菜单怎么用?我们为什么不能像早期的 Xwindow 书籍那样第一节就告诉用户什么是 X server, 什么是 X client,什么是 Window Manager, 什么是根窗口。第二章就告诉用户窗口有哪些属性,什么是 classname, resource name, hint,怎样使用 .Xdefaults, xrdb ……

在这里我又不得不说一下那些 Linux 的发行公司和写书的人,他们把 Linux 和Xwindow 包装起来,却没有从基本上告诉用户 Xwindow 的工作原理。很多书籍讲授的层次就是在Gnome, KDE 的菜单操作的层次,靠大量抓图来占篇幅,"繁荣"Linux 书籍市场。

现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水平的象征。在这"图形化","可视化" 的年代,你如果还在用 troff, LaTeX 写文档,你还在用VIM 自己编辑 HTML,用 Mutt 处理邮件,你还在用文本模式的 gdb 调试程序,你还在用Xlib 写程序, 你还在用 tin 上 USENET,你还在自己写 Makefile,写机器代码,你还在玩 Clossal Cave 这样的字符模式冒险游戏,那你就是老古董。

其实这种思想是错误的。虽然你是一个坚决的 Linux 支持者,但是你的思想是 Windows的思想。你认为图形界面,菜单,按钮就可以解决一切问题,就可以给你高效方便。你还是没能摆脱微软给你的潜移默化的东西。你其实离不开 Windows 那样的环境,你迟早会删掉自己的 Linux。

GUI vs. CLI
做一个坚定不移的"两面派"

大家看到这个标题是不是热血沸腾?两派大虾都可以围攻我了:

GUI派用户:"哇!我一看你这小子就是 CLI 的。要不然自己写什么 Makefile?用什么Mutt?"

CLI派用户:"切~ 你还用 X!高手都不用 X。你是 GUI 那边的。"

可怜的我:"555~~ 你们都不要我~~ GUI 和 CLI 就那么水火不容吗?"

计算机界这样的门派之分还很多。很有特点的就是 CLI 和 GUI 了。CLI (Command LIne)的狂热份子声称永远不用 X。我上次在实验室看到一个同学用一个 SecureCRT 登录到Sun 机器,然后用一个 vanilla vi 编辑程序,我建议他启动一个 GVIM 过来显示在Exceed 上可以有语法加亮。但是他坚决反对,说:"高手不用X。你想想,要是我在一个很慢的网络连接怎么用 X?而且好多服务器没有装 X 程序。"

但是我们实验室的网速可够快,Windows 机器都有 Exceed 啊,而且 Sun 机器有全套X 客户程序包括 GVIM。他说他是 CLI 的坚决拥护者,但是他却在用 Windows,他后来打开了好几个 SecureCRT,每次从文本框输入地址,用户名和密码,从下拉菜单选择"SSH2",然后点击"Connnect"。他还不断的夸SecureCRT 是"网络管理员投票选出的最受欢迎的登录方式"。老天,SecureCRT 本身就是个 GUI 啊,他其实没有明白Xwindow 的好处。

你说我是 GUI 的?我虽然很少在 console 下工作。但是我对 bash, VIM 很熟悉,我可以让 bash 按照我的键绑定方式来工作。我可以在 rxvt 里使用 Mutt 来收发 email。我的每个桌面上都常常堆放着一打不同大小的 rxvt。我用 VIM 编辑 LaTeX。我自己写Makefile 来维护 LaTeX 文档。我有时用 mpg321 来放 mp3。我上BBS用的我自己写的expect 脚本。 好了,CLI 派的朋友可以收我做盟友了

你说我是 CLI 的老古董?我的 FVWM 被我配置为可以"手写操作",我只要画一个"r"就可以启动 rxvt,我只要画一个 "U" 就可以启动 GVIM,…… 我用 GVIM 语法加亮模式编辑程序,我用 Mozilla 浏览网页,…… GUI 派的现在好像认我做朋友了

好了。CLI 派的朋友,虽然我很喜欢命令行,但是我有时在屏幕上左右画一下就可以执行:

Module FvwmConsole -terminal rxvt -geometry 45x5-0+0 -bg gold -fg midnightblue -fn "-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*"
你是不是现在又想把我逐出师门?

GUI 派的朋友,虽然我很喜欢窗口。但是我可以在 FvwmConsole 里输入:

All (rxvt) MoveToDesk
把我所有的 rxvt 移动到我现在工作的桌面。"这家伙,怎么这么快就叛变了!"

其实何必分什么 GUI 和 CLI,UNIX 和 Xwindow 都是工业标准,它们从设计那天开始就有非常灵活的用法,各个程序,不管是 GUI 还是命令行的都可以互相协作。UNIX 和X 是一家,何必搞的那么偏激,非此即彼?你从我上面的行为可以看出 GUI 和 CLI的模糊界线吗?我就是坚定不移的"两面派"。

UNIX 是简单的--
"我相信简单就是最好,如果太复杂,我是不能理解的。" -Seymour Cray

很多第一次用 Linux 的人会惊奇的发现,Linux 的程序居然不"安装"就可以运行,程序拷贝到随便那个目录都可以用,而不是一定要占用你第一个分区的空间。程序的设置只是一些简简单单的文本文件。你根本不需要什么"注册表修改器" 就可以改变系统的设置。这就叫做简单,但是简单就是美。虽然这只是 UNIX 简单性的一个肤浅的认识,你已经体会到了某些东西。

但是简单并不意味着功能弱,并不意味着落后。相反,简单意味着强大,意味着生命力。

我不会再继续阐述我理解到的"UNIX 的简单",因为这个需要自己去体会。

UNIX 是永恒的
有人说:"Plan9 会取代 UNIX,Mach 会取代 Linux 内核。"

但是你如果是一个深入体会了 UNIX 的人,你就会知道:UNIX 的思想是永恒的,不管时过境迁,Plan9 是否代替 UNIX,UNIX 的灵魂都会在 Plan9 身上现形!

我为同一个设备写过 Linux 内核和 Windows VxD 驱动程序。写 Linux 驱动程序时,我对 UNIX 设计的完美的一致性,远见性所折服。UNIX 用同样界面的 read(), write()系统调用就可以对不同的对象:普通文件,设备文件,管道,管道文件,socket,……进行统一的读写操作。我跟本不需要写一个测试用的应用程序就可以对我的设备驱动进行测试,因为 cat, cp, dd, 它们也使用了同样的 read(), write(),设备和普通文件在应用程序眼里没有区别。在那个还没有 Smalltalk, 没有 C++ 的年代,UNIX 的设计者已经使用了所谓的 "面向对象方法"。对,C 语言也可以实现面向对象。

UNIX的系统调用几十年都没有很大变化,这非但不是顽固,不进步的象征,反而是UNIX 的远见卓识的体现!这就跟 TeX程序几十年都不变的情况差不多。这些才是真正的永恒的 master piece!你应该改变所有软件都必需从 0.1, 1.0, 1.1, 1.2, 2.0, ..., 3.0, 3.1,95, 98, 2000, XP, ... 不断升级的想法。

Windows 就不同了,它在最开头只是一个 DOS之上的图形包装而已。后来为了兼容以前的糟糕设计,不得不加上很多累赘。我写VxD 驱动程序的时候就深有体会,Windows 95 程序对设备的操作只有用DeviceIoControl,我不得不写了两个应用程序来对设备驱动进行测试。Windows内核的不一致性和隐密性使我非常恼火。不过 Windows WDM驱动程序现在也有了 ReadFile, WriteFile,…… 那说明什么?那说明Windows 在向 UNIX 学习,或者有可能是某个 UNIX设计人员在微软打了几天临工,顺手加了几个UNIX的东西进去。这样做是没有用的,Windows从一开始就是非常糟糕的设计,它的历史的包袱太沉重了,缝缝补补有什么用?它只能永远的被UNIX 甩在身后!

UNIX 是强大的
让聪明人干任何他们想干的事情。

UNIX 的一个特点就是非常高的灵活性,Xwindow也具有这种灵活性。这种灵活性体现在哪里呢?

UNIX 的程序一般都有很多参数,不管你现在用的着用不着,总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如GNU bash, 通常缺省的命令行输入方式是 Emacs 方式,但是只要我编辑一个.inputrc 文件,就可以把它变成 vi的输入方式,而且我还可以自己绑定键序列到某些操作。我可以用 shopt来设置它的很多特点,比如是否进行通配符扩展,是否可以把一个变量当作一个目录来cd,是否可以自动纠正某些明显的目录名打字错误……

UNIX程序设计的思想是提供给用户“机制”,而不限制用户制定“政策”。这是一个重要的尊重用户的作法。

我们再来看看 Xwindow。Xwindow是一个出色的设计,它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序,也可以显示别的机器上的X程序,而它们都遵守你的窗口管理器的统一指挥,它们之间可以方便的传送剪贴版数据,各种事件…… 比如有时我的 XFree86 上会出现四个不同机器上的XTerm,两个不同机器上的 GVIM,…… 它们统一受本机上的 FVWM指挥。

Xwindow 程序都具有很多很多命令行参数和 resource参数。你可以随意的在命令行或者 .Xdefaults文件设置所有的颜色,字体,尺寸…… 而且如果你用 xrdb 把 .Xdefaults导入到根窗口,那么其它机器上没有经过配置的同样的程序,显示到你的机器上的时候也会遵守同样的外观规定。

Xwindow 的窗口具有 Property,也就是一些可以自己定义的共享数据(原子)。正是因为这些 Property的存在,使得 Xwindow 具有无比强大的生命力。X的窗口管理器和其它客户程序之间并没有统一的协议,但是后来出现了ICCCM(客户程序间通信规范),这个规范就是通过 property定义的。现在又有人定义了一套“扩展的窗口协议(EWM Hints)”,使得Xwindow 可以具有某些 Windows 的特征,比如一个工具条程序可以告
诉窗口管理器:“这个屏幕下面被我占据了24个像素的空间,你最大化程序的时候不要越过这个界线。”

一个强大的窗口管理程序比如FVWM,它收到这样的提示时,可以答应工具条程序的这个要求,也可以不答应。一切选择的权力在于谁?当然是用户了!

你想想,是不是有些 Windows 程序常常弹出一个窗口要你选择 "Yes orNo"?你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严?你是一个人,一个智慧的生物,怎能受到一个程序如此的待遇?

还有就是很多 Windows程序把人当成傻瓜,而它是“智能程序”。比如,有一个程序就是喜欢把你的每句话第一个字母都变成大写,我不说它是谁了,你遇到的时候就知道了。

如果连“一句话开头一个字母要大写”这么明显的问题都需要程序帮你纠正的话,人脑还用来干什么?况且如果你故意想要不大写的话,那就更麻烦了,我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。

只有符号才能完全操纵计算机

我们来说说很多初学 Linux 的用户。虽然他们在用 Linux,但是他们打心眼儿里是觉得 Windows 的工作方式好,他们希望 Linux 有一天能"像Windows那样"。你说:"我鼠标一点,我菜单一拉,...... 就可以完成我的操作。" 但是我要告诉你:"Linux 从来没有摹仿 Windows,将来也不会。Linux 从诞生之日起,它的工作方式就比 Windows 的先进。Linux 属于能勇敢面对符号的人。只有符号才能完全操纵计算机。"

看看优秀的 UNIX 程序,XFree86, FVWM, VIM, Emacs, proftpd, Mutt, wget,tin, ... 没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置?难道它们的设计者就那么低能,连个图形配置界面也写不出来?

当然不是。因为图形界面配置方式的能力是极其有限的,而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话,如果你想达到配 置文件的效果,你需要成百上千的菜单,checkbox, radio button, ... 到时候你根本没办法找到你需要修改的地方了!而各个程序的配置文件的语法都有很多相似之处,一般就是一些命令,设置一些变量,参数,...... 一旦用会了一个,其它的也就容易理解了。如果你用惯了 awk, sed, Perl,你会觉得那才是真正的自动化啊。

鼠标虽然是很好的工具,但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思,它毕竟只有3个按钮。看看我的MetaPost页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标,但是却不能完全依赖它。

各个小程序的完美配合

这就是UNIX最重要的特点了,它就是UNIX设计的思想。让每个程序只具有一项专门的能力,然后让它们合作。Xwindow也继承了这种好传统。

这恐怕就是Windows和其它操作系统望尘莫及的地方了。UNIX 程序设计之统一,配合之完美,真使我难以置信!shell, grep, find, awk, sed, make, Perl,Emacs, vi, tin, Mutt, ... 它们是那么的具有一致性!你一旦学会了 sed 的正则表达式,其它程序基本上都能用了。你一旦学会了 vi 和 VIM, 你会发现它的操作是那么的有规律性,似乎vi的设计者在几十年前就已经设计好了 VIM 在今天的完美而统一的操作方式!而且vi的操作还体现在 Mutt, tin 等很多程序中。你甚至可以把 bash 设置为 vi 的输入方式来输入命令行,我就是这么做的。一个程序可以调用另外一个程序来得到数据,可以把数据交给它处理后返回来,可以在自己的窗口里"嵌入"另外一个程序。

在 Windows 和其它非 UNIX 操作系统中,这种合作是非常困难的。我曾经在Windows 下使用 Perl来进行一些自动工作。但是 Windows 的文件操作,管道是如此的不稳定,程序之间基本不能合作。你别想在 Visual Studio 窗口里面嵌入UltraEdit 编辑器,你别想用一个 expect 脚本来控制 telnet 到水木清华BBS,这就是为什么 helloooo 诞生在 Linux 而不是 Windows。我曾经试图从Windows + Exceed + SecureCRT ssh 登录到 Sun 机器,然后通过 ssh 的隧道(X11 tunnel)把 X 程序传到 Exceed 上运行,但是搞了两天都没有成功!而在Linux 下这个事情根本就是不用怎么配置的,OpenSSH 和 XFree86 本来就是完美结合,只要打开 ssh 的 "forward X11" 选项就什么都搞定了。

Windows 的程序都是大而全,大而杂,所有的电子邮件程序都需要自己提供编辑器,自己发送和收取邮件,自己显示邮件的附件。每一个BBS程序都提供自己的 Virtual Terminal, 自己的通讯代码。每一个 IDE 都自己提供编辑器,编译器,汇编器,调试器。人们为了使用一种新的程序,需要适应所有这些它提供的界面,而不能使用自己喜欢的编辑器的键绑定,菜单组织...... 不能 DIY!

你要知道,最高级的电脑是定做的,自己想要什么什么CPU,什么主板,多少内存,什么硬盘,键盘,鼠标,显示器都是自己选择的。最高级的滑板,自己想要什么牌子的版面,什么牌子的沙,什么桥,什么轮子,什么轴承,也都是自己选的。最高级的乒乓球拍,木板,胶皮,海绵,胶水都是可以自己选择...... 而用Windows 程序,你得到的是大杂烩,就像你去买"品牌机",只有那么几种配置,而且附带很多你不需要的软件和服务;就像你去买组装好的滑板,你想要大一点的轮子和窄一点的板子,但是你没有这种选择余地!Windo ws 程序就相当于最廉价,最次的滑板。但是它却会花你更多的钱,因为一旦一个部件坏了,或者你不喜欢了,你不能另外找一个好的换掉它,你必需重新买全套配件!

而 UNIX 和 Xwindow 就是高档的"组装货"。比如我用 Mutt 的时候,我可以用VIM 也可以用 pico 来编辑邮件,我可以用 ImageMagick 也可以用 xv 来显示附件里的图片,我可以用 lynx 把 HTML 附件转成文本嵌入窗口中,我也可以把HTML 附件交给 Mozilla 图形显示。我可以让 GnuPG 帮我把邮件进行数字签名和加密,我也可以用其它 PGP 程序。我想让 Postfix 而不是 sendmail 帮我发出邮件,我想让 fetchmail 帮我收邮件,转发给 postfix,然后被我自己写的Perl过滤器处理...... 这一切我都可以办到!我可以选择我最喜欢的专门的程序来完成专门的工作,然后把它们结合在一起,我也可以分别得到它们的好处。

结论

我写这么多的目的是什么?我希望喜欢 Linux 的朋友,完全清除微软和Windows 灌输在你脑子里的谬论,别再相信它们所谓的"新技术",别再追赶Windows,因为追赶 Windows =倒退。马克思有一个思想很重要,"新生事物并不一定是在最近出现的。" UNIX,Xwindow, TeX 虽然都比 Windows 先出现,但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化,什么才是真正的自动化。

勇敢的拿起像 bash, FVWM, VIM, Emacs, Mutt, lftp ...... 这样强大的程序,不要再埋怨"Linux 为什么不能像 Windows 那样",不要再浪费时间试用这样那样的程序,不要再忙着升级。是你需要改变而不是 Linux 和 UNIX,Linux 现在就可以成为你的好朋友。你需要认识它,了解它,信任它,才能完全的靠它来高效的工作,省出时间来处理世界上更加值得处理的事情。

2009年2月20日星期五

关于捆绑ie

总是时不时的看见某家浏览器公司,某个谁站出来说微软捆绑ie是垄断等等。

然后就会看到一群人在那里吵的不可开交,多半开始吵的原因的是扯到win和linux了。

win捆绑ie,让ie一家独大。这点也许确实是让ie占很大市场的主因。但是要是你自己做的浏览器确实很好,好过ie,而且在宣传上做的也不错话,你还会只有那么点市场份额么。桌面上难道多了个ie图标,就说明大家都会用ie么。我个人认为,与其花精力在状告微软上不如,把精力话在市场推广,和自身发展上。firefox一度占有率上升,就取决与推广。

其实由于专业的原因,现在几个主流的浏览器都装着。用下来日常opera,确实最让人觉得舒服。但是由于网站支持的问题,有时还要切换到ie上。opera是个非常优秀的浏览器,但为什么市场份额,这么低呢?永远孤芳自赏,这是不行的。推广力度不够。

网站是否兼容其实是相互的,某个浏览器市场份额大了,当然制作网站时,就会相对应的兼顾。(抱怨下,制作网页让每个浏览器都支持,真不是件容易的事情,ie6,ie7,ff,safari,opera,chrome哪个程序员会这么有空,一个一个测试,调整的。其实很希望能有浏览器一统天下,当然flex,silverlight,javafx也将是解决办法,扯远了=。= |||)

现在设想,微软答应不捆绑,会出现什么情况呢。大多人会处于习惯装完win后安装ie,或在安装的时候有ie选项打上钩。不改变任何问题。所以说与其期望微软放弃捆绑ie,不如大力宣传自己,努力体改自己产品的竞争力。

mixi.jp:使用开源软件搭建的可扩展SNS网站

Mixi目前是日本排名第三的网站,全球排名42,主要提供SNS服务:日记,群组,站内消息,评论,相册等等,是日本最大的SNS网站。Mixi从2003年12月份开始开发,由现在它的CTO - Batara Kesuma一个人焊,焊了四个月,在2004年2月份开始上线运行。两个月后就注册了1w用户,日访问量60wPV。在随后的一年里,用户增长到了21w,第二年,增长到了200w。到今年四月份已经增长到370w注册用户,并且还在以每天1.5w人的注册量增长。这些用户中70%是活跃用户(活跃用户:三天内至少登录一次的用户),平均每个用户每周在线时间为将近3个半小时。

下面我们来看它的技术架构。Mixi采用开源软件作为架构的基础:Linux 2.6,Apache 2.0,MySQL,Perl 5.8,memcached,Squid等等。到目前为止已经有100多台MySQL数据库服务器,并且在以每月10多台的速度增长。Mixi的数据库连接方式采用的是每次查询都进行连接,而不是持久连接。数据库大多数是以InnoDB方式运行。Mixi解决扩展问题主要依赖于对数据库的切分。
首先进行垂直切分,按照表的内容将不同的表划分到不同的数据库中。然后是水平切分,根据用户的ID将不同用户的内容再划分的不同的数据库中,这是比较通常的做法,也很管用。划分的关键还是在于应用中的实现,需要将操作封装在在数据层,而尽量不影响业务层。当然完全不改变逻辑层也不可能,这时候最能检验以前的设计是否到位,如果以前设计的不错,那创建连接的时候传个表名,用户ID进去差不多就解决问题了,而以前如果sql代码到处飞,或者数据层封装的不太好的话那就累了。
这样做了以后并不能从根本上解决问题,尤其是对于像mixi这种SNS网站,页面上往往需要引用大量的用户信息,好友信息,图片,文章信息,跨表,跨库操作相当多。这个时候就需要发挥memcached的作用了,用大内存把这些不变的数据全都缓存起来,而当修改时就通知cache过期,这样应用层基本上就可以解决大部分问题了,只会有很小一部分请求穿透应用层,用到数据库。Mixi的经验是平均每个页面的加载时间在0.02秒左右(当然根据页面大小情况不尽相似),可以说明这种做法是行之有效的。Mixi一共在32台机器上有缓存服务器,每个Cache Server 2G内存,这些Cache Server与App Server装在一起。因为Cache Server对CPU消耗不大,而有了Cache Server的支援,App Server对内存要求也不是太高,所以可以和平共处,更有效的利用资源。

这篇文章由于转载太多,根本找不到原作者 若作者看见 可与我联系加上引用链接

2009年2月19日星期四

【转】SNS网站LinkedIn的Java架构技术

在JavaOne 2008的会议上,著名社交网站LinkedIn的开发者做了2个关于LinkedIn网站的架构技术的演讲
可以看一下LinkedIn网站的基本情况:
1.2千2百万用户
2.每个月4百万独立用户访问
3.每天4千万page view
4.每天2百万搜索流量
5.每天25万邀请发送
6.每天1百万的回答提交
7.每天2百万的email消息发送



这是一个世界顶尖级别流量的网站了,看看LinkedIn的系统架构:

* 操作系统:Solaris (running on Sun x86 platform and Sparc)

* 应用服务器:Tomcat and Jetty as application servers

* 数据库:Oracle and MySQL as DBs

* 没有ORM,直接用JDBC No ORM (such as Hibernate); th** use straight JDBC

* 用ActiveMQ在发送JMS. (It’s partitioned by type of messages. Backed by MySQL.)

* 用lucene做搜索Lucene as a foundation for search

* Spring做逻辑架构Spring as glue



下面是随着流量增加,LinkedIn的架构演化:

2003-2005

1。一个整体的web程序,

2。一个核心数据库,

3。在Cloud中缓存所有network图,Cloud是用来做缓存的独立server。

4。用lucene做搜索,也跑在Cloud中。

2006年

1。复制另外一个数据库,减少直接load核心数据库,另外一个server来管理非只读数据库的数据更新。

2。把搜索从Cloud中移出来,单独一个server跑搜索

3。增加Databus数据总线来更新数据,这是通过分布式更新的核心组件,任何组件都需要Databus

2008年

1。WebApp不再任何事情都它自己做,把业务逻辑分成很多部分,通过server群来做。WebApp仍然提供用户界面给用户,但是,通过server群来管理用户资料,小组等等。

2。每个服务有自己的域数据库

3。新的架构允许其他应用链接LinkedIn,比如增加的招聘和广告业务。



The Cloud

1。Cloud是整个架构最重要的部分,整个LinkedIn的网络图都缓存在Cloud里面

2。Cloud大小:22M nodes, 120M edges

3。需要12GB RAM

4。在生产环境要跑40个实例

5。从硬盘重建Cloud一个实例需要8个小时

6。Cloud通过databus实时更新

7。关闭时持久化到硬盘

8。缓存通过C++实现,用JNI调用,LinkedIn选择C++而不是Java有两个原因:

1)尽可能的减少RAM的使用

2)垃圾收集暂停会杀死整个系统,LinkedIn用了最新的GC程序,也就是就是说java的的垃圾搜集性能不太好

9。将所有东西放在缓存里面是一种限制,但是LinkedIn指出,分割业务图将更麻烦

10。Sun提供了2TB的RAM




Communication Architecture交流架构包括:

Communication Service

Communication Service是用来提供永久信息的,比如收件箱里面的消息和email

1。整个系统通过JMS异步通讯

2。客户端用JMS发送消息

3。消息通过路径服务器来到达相应的邮箱或者直接放到email进程中

4。消息发送:同时使用Pull主动寻求信息(如用户需要信息)和Push发送信息(如发email)

5。使用Spring和LinkedIn专业Spring插件完成,使用HTTP-RPC

Scaling Techniques

1。通过功能来划分:发送,接受,文档等。

2。通过类别来划分:用户信箱,访问者信箱等

3。等级划分:用户ID等级,Email等级等

4。所有的操作都是异步的。

原文地址http://www.liyingfei.com/read.php/9.htm

2009年2月17日星期二

感谢金融危机 破窗原理

这次的金融危机,甚是可怕,每天都能看见网上看的某某知名企业裁员多少人。哪个国家的哪项经济指标同比下降了多少等等。

但我也看到了很多因为这次金融危机的破窗原理,加大加快开发创造的现象。

windows7 明显提快了上线的速度。照常理来说这样肯定会影响到vista的销量,但是确实提前了上线的时间。
另外看现在的智能手机业,真可谓是百家争鸣,百花齐放了。

很多原本不做手机行业的如acer,华为,也都加入了进来。当然得感谢iphone的先驱作用和google的Android的推出。现在智能手机的迅猛发展,将可以带动手机软件的市场。外加上3g的推广,那手机上网网速的枷锁也将解除,那是手机网站,sns,等的网点,软件,又将是一块新天地。外加上云的推广,手机软件业不可小觑。

这次金融危机,进一步让世界认识,中国的重要性,以及中国在世界的地位。

金融危机的危害可以想象,危机也是机遇。笑对危机者,将立于不败之地。

2009年2月15日星期日

【转】BlazeDS與LCDS功能比較

很多人關心BlazeDS 與LCDS(LiveCycle Data Services ES)主要差異在哪?BlazeDS是Opensource,也就是說免費讓你使用,LCDS是Adobe需付費的方案,什麼情況下會需要使用LCDS呢?這是國外朋友給的比較表,我祗是稍微中文化一下,想清楚得知BlazeDS的Spec可以到這裡http://opensource.adobe.com/wiki/display/blazeds/Features

而LCDS的功能列表可以從這裡看,http://www.adobe.com/products/livecycle/dataservices/features.html

先給一個觀念,原本程式人員動輒要寫到上千行的程式,而且效能還不見得管用情況下,不管你是用哪種Server,Server在處理這任務是大大減輕許多。




转自:http://forum.j2eemx.com/blaze-ds-livecycle-data-services/1633-blazeds-lcds.html

【转】先长地下的28米

非洲草原上有一种尖毛草,是那里长得最高的茅草,可它的生长过程却极为特别,在最初的半年里,它几乎是草原上最矮的草,只有一寸高,但半年后雨水一旦到来时,却像施了魔法一样,三五天后,便有一米六至两米的高度。原来,在前六个月里,尖毛草不是不长,而是一直在长根部,雨季前,它虽然露头一寸,但却扎根地下超过28米。



在不少人的价值观中,长上边的那一节儿,是出头露脸,算长了,长在下边的多少节都是“盘根错节”,长也白长。


当今的人们巴不得自己就是花圃里的玫瑰,我哪天怒放,你哪天就是情人节。借助园丁的勤劳早开花,借力名人的助推早上市,借用市场的效应早成交,一举成功,一夜成名。人人都知道要想出名快,演一部戏不如做一次“访谈”,谱十首曲子不如自己唱一首歌,半辈子忠贞的美德,不如一次“劈腿”。如今是写作的不如讲课的,讲课的不如剪彩的,剪彩的不如“带色”的。


可这样闹哄哄的“成长”到底能长多高呢?无论是一个人的成长,还是一个地方的文化建设,都不能只要地面以上的高度,而忘了扎根地下的28米。 (摘自《文汇报》 作者 阮直)

这篇文章其实不用多说什么,一目了然。转帖在次,用来自勉。

2009年2月14日星期六

【转】Web搜索引擎原理和技术

主要的三个功能模块:网页搜集、预处理、查询服务

基本要求:在一个可以接受的时间内返回一个和该用户查询匹配的网页信息列表,列表的每一条目至少包含三个元素--标题、网址链接、摘要

网页搜集
网页搜集的两种方式:定期搜集,增量搜集

一种搜集方式是将Web上的网页集合看成是一个有向图,搜集过程从给定起始URL集合S开始,沿着网页中的链接,按照先深、先宽或者某种别的策略遍历,不停的从S中移除URL,下载相应的网页,解析出网页中的超链接URL,看是否已经被访问过,将未访问过的那些URL加入集合S
整个过程可以形象地想象为一个蜘蛛spider在蜘蛛网Web上爬行crawl

另一种可能的方式是在第一次全面网页搜集后,系统维护相应的URL集合S,往后的搜集直接基于这个集合。没搜到一个网页,如果它发生变化并含有新的URL,则将它们对应的网页也抓回来,并将这些新URL也放到集合S中;如果S中某个URL对应的网页不存在了,则将它从S中删除

还有一种方式是让网站拥有者主动向搜索引擎提交它们的网址,系统在一定时间内定向向那些网站派出“蜘蛛”程序,扫描该网站的所有网页并将有关信息存入数据库中

预处理
1,关键词的提取
作为预处理阶段的一个基本任务就是提取出网页源文件的内容部分所含的关键词
对于中文来说,就是要根据一个词典E,用一个所谓的“切词软件”,从网页文字中切出E所含的词语来
这样,一个网页主要就由一组词来近似代表了,p={t1,t2,...,tn}
要去掉诸如“的”,“在”等没有内容指示意义的词,称为“停用词”stop word
一篇网页有效的词语数量大约在200个左右

2,重复或转载网页的消除
网页的重复率平均大约为4

3,链接分析
词频TF、文档频率DF之类的统计量能在一定程度上指示词语在一篇文档中的相对重要性
h1可能比h4的内容重要
还可以利用链接信息来提取关键词

4,网页重要程度的计算
被引用多的就是重要的,引用这个概念恰好可以通过HTML超链在网页之间体现得非常好,Google创立核心技术的PageRank就是这种思路的成功体现

查询服务
1,查询方式和匹配
根据查询的短语分词q{t1,t2,...tm},然后按各词查询结果取交集

2,结果排序
词频越大则该文档排在越前面
文档频率越大,则该词用于文档排序的作用越小

另一个指标就是文档重要性PageRank

3,文档摘要
两个问题:
1)网页的写作通常不规范,文字比较随意,因此从语言理解的角度难以做好
2)复杂的语言理解算法耗时太多,不适应搜索引擎要高效处理海量网页信息的需求

搜索引擎生产摘要的简便方式:
1)静态方式,独立于查询,按照某种规则,事先在预处理阶段从网页内容提取出一些文字,如截取网页正文开头512字节(对应256个汉字)
2)动态摘要,在响应查询的时候,根据查询词在文档中的位置,提取出周围的文字来,在显示时将查询词标亮。这是目前大多数搜索引擎采用的方式。为了保证查询的效率,需要在预处理阶段分词的时候记住每个关键词在文档中出现的位置

搜索引擎体系结构:


转自:http://hideto.javaeye.com/blog/288742

2009年1月23日星期五

IT人保持健康的必备法宝

在以计算机维生的人越来越多了,但你知道吗!天天坐在计算机前面想要维系健康,又要与岁月硬撑可不容易,循环不良的坐姿,三不五时的熬夜,若再加上没有吃对食物,时间久了身体可是会向您抗议的! 


必喝的汤: 
绿豆薏仁汤 
  绿豆可以清热解毒、利尿消肿,薏仁则可以健脾止泻,轻身益气,对于经常需要熬夜工作者或是心烦气躁、口干舌燥、便秘、长青春痘时,除了多吃蔬菜水果与补充水份外,把绿豆薏仁汤当点心食用,对于消暑除烦非常有帮助。 

必喝的茶: 
绿茶 
  绿茶是近几年来最为人所津津乐道的养生饮品,因为其中含强效的抗氧化剂儿茶酚以及维他命C,不但可以清除体内的自由基,还能使副肾皮质分泌出对抗紧张压力的荷尔蒙,当然绿茶中所含的少量咖啡因也可以刺激中枢神经,提振精神。最好在白天饮用以免影响睡眠。 

必须用的液体    
眼药水 
这个要常备,因为我们这种职业长期盯着屏幕,眨眼的次数会明显减少,这样会使眼睛很干涩,严重的会得眼睛干涩症(那个就真的要用药来治了!),所以大家要经常提醒自己,不要老是等着电脑,可以看看办公室的花花草草,当然也可以看看美女,哈哈 眼药水牌子也比较多,什么珍视明、Visine之类(日本的牌子效果好像比较好,我也是听别人说的,有抵制日货的兄弟可不要骂我,就事论事)的都可以,一般大药房都有卖。 

必须用的家居产品 
靠垫 
之所以说靠垫也是IT人所必需的装备是因为它可以有效保护我们的脊椎,我们这样的程序员由于工作原因需要长期坐在,如果不加个靠垫的话,坐得时间长了,脊椎会很疲劳,如果坐姿不好,容易造成脊椎变形,靠垫的作用是帮助脊椎保持笔直,同时承担一部分压力,从而让脊椎更加轻松些。一个靠垫的价格也就30左右,大家都知道这年头看病比啥都贵,这点小钱还是值得花的。当然靠垫的样式更多了,有卡通的、油画、动物等,看你自己的喜好了。尺寸也会有所不同,30*30cm、40*40cm、50*50cm,当然也有些特大的定制尺寸,就是比较少点。 

必须用的护肤产品 
防辐射护肤品 
市面上类似的挺多,好像鱼目混杂。多数是不知名的牌子。有印象的只是“爱雾”,“雪芙妮”,“亚顿水印”(这个好像是假冒国外的),相比这几款产品,爱雾比较方便,是套喷雾。最主要是其珍稀成分特别好:天山雪莲和红景天提取液。成分本身的抗辐射能力很好,而且相比其他产品有权威检测报告的数据支持。 

必须吃的保健品 
21金维他 
 [成分] 维生素A、维生素D、维生素E、维生素B1、维生素B2、维生素B6、维生素B12、维生素C、烟酰胺、泛酸钙、重酒石酸胆碱、肌醇、铁、碘、铜、锰、锌、磷酸氢钙、镁、钾、L-赖氨酸盐 
维生素和矿物质均为维持机体正常代谢和身体健康必不可少的重要物质。特别是维生素C对长期电脑工作的人特别好。 

必须常吃的瓜果蔬菜 
IT人平时用眼最辛苦。 

健眼的食物有各种动物肝脏、红枣、牛奶、奶油、小米、胡萝卜、青菜、菠菜、大白菜、番茄、黄花菜、空心菜、枸杞子和各种新鲜水果。

在javaeye上看到的 转来提醒自己