闲耘.博客

巨人归来。

– 你在逃避什么?

– 我在寻求。

– 一个满怀希望的人。

– 有希望不好么?

– 希望是对那些状况不太好的人说的。

《越狱》 Fernando Sucre

富婆去夜总会找乐子,老板娘挑了几个帅小伙,富婆不满意.老板娘挑了几个壮小伙,富婆还不满意.老板问那富婆到底想要什么样的,富婆说要体力好、精力旺盛、能加班、能熬夜、随叫随到、吃苦耐劳,老板一下乐了…..张口喊:”
搞程序的,出来接客!

http://www.javafan.net/article/20051229144530549.html (原,Google搜索)

http://www.it.com.cn/f/edu/061/4/218911.htm (闲耘转自此,发此文时原文链接暂不可用。)

2006-1-4 9:22:00 文/ zhangxhsj 出处:javafan.net

此文是转帖,闲耘作了稍许修改

RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序

一个正常工作的RMI系统由下面几个部分组成:
    远程服务的接口定义
    远程服务接口的具体实现
    桩(Stub)和框架(Skeleton)文件
    一个运行远程服务的服务器
    一个RMI命名服务,它允许客户端去发现这个远程服务
    类文件的提供者(一个HTTP或者FTP服务器)
    一个需要这个远程服务的客户端程序
下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。

如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:

1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
3、 从接口实现类中生成桩(Stub)和框架(Skeleton)类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统

1、 接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:

//Calculator.java
//define the interface

import java.rmi.Remote;

public interface Calculator extends Remote {
    public long add(long a, long b)
        throws java.rmi.RemoteException;

    public long sub(long a, long b)
        throws java.rmi.RemoteException;

    public long mul(long a, long b)
        throws java.rmi.RemoteException;

    public long div(long a, long b)
        throws java.rmi.RemoteException;
}
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。

建立这个文件,把它存放在刚才的目录下,并且编译。

>javac Calculator.java

2、 接口的具体实现

下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件:

//CalculatorImpl.java
//Implementation

import java.rmi.server.UnicastRemoteObject

public class CalculatorImpl
    extends UnicastRemoteObject
    implements Calculator {

    // 这个实现必须有一个显式的构造函数,
    //并且要抛出一个RemoteException异常

    public CalculatorImpl()
    throws java.rmi.RemoteException {
        super();
    }

    public long add(long a, long b)
        throws java.rmi.RemoteException {
        return a + b;
    }

    public long sub(long a, long b)
        throws java.rmi.RemoteException {
        return a - b;
    }

    public long mul(long a, long b)
        throws java.rmi.RemoteException {
        return a * b;
    }

    public long div(long a, long b)
        throws java.rmi.RemoteException {
        return a / b;
    }
}

同样的,把这个文件保存在你的目录里然后编译他。

这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中,我们是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。

如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。

3、 桩(Stubs)和框架(Skeletons)

下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。

>rmic CalculatorImpl

在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个Calculator_stub.class文件,如果你是使用的Java2SDK,那么你还可以发现Calculator_Skel.class文件。
4、 主机服务器

远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。

//CalculatorServer.java
import java.rmi.Naming;

public class CalculatorServer {
    public CalculatorServer() {
        try {
            Calculator c = new CalculatorImpl();
            Naming.rebind(”rmi://localhost:1099/CalculatorService”, c);
        } catch (Exception e) {
            System .out.println(”Trouble: ” + e);
        }
    }

    public static void main(String args[]) {
        new CalculatorServer();
    }
}

建立这个服务器程序,然后保存到你的目录下,并且编译它。

5、 客户端

客户端源代码如下:

//CalculatorClient.java

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient {
    public static void main(String[] args) {
        try {
            Calculator c = (Calculator)
                Naming.lookup(”rmi://localhost/CalculatorService”);
            System.out.println( c.sub(4, 3) );
            System.out.println( c.add(4, 5) );
            System.out.println( c.mul(3, 6) );
            System.out.println( c.div(9, 3) );
        } catch (MalformedURLException murle) {
            System.out.println();
            System.out.println(”MalformedURLException”);
            System.out.println(murle);
        } catch (RemoteException re) {
            System.out.println();
            System .out.println(”RemoteException”);
            System.out.println(re);
        } catch (NotBoundException nbe) {
            System.out.println();
            System.out.println(”NotBoundException”);
            System.out.println(nbe);
        } catch (java.lang.ArithmeticException ae) {
            System.out.println();
            System.out.println(”java.lang.ArithmeticException”);
            System.out.println(ae);
        }
    }
}

保存这个客户端程序到你的目录下(注意这个目录是一开始建立那个,所有的我们的文件都在那个目录下),并且编译他。

6、 运行RMI系统

现在我们建立了所有运行这个简单RMI系统所需的文件,现在我们终于可以运行这个RMI系统啦!来享受吧。

我们是在命令控制台下运行这个系统的,你必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。

首先运行注册程序RMIRegistry,你必须在包含你刚写的类的那么目录下运行这个注册程序。

>rmiregistry

好,这个命令成功的话,注册程序已经开始运行了,不要管他,现在切换到另外一个控制台,在第二个控制台里,我们运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子 policy.txt :

grant {
    permission java.security.AllPermission “”, “”;
};

注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。
现在为了运行服务端,你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。

> java -Djava.security.policy=policy.txt CalculatorServer

这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台,启动我们的客户端。
为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端

 prompt> java -Djava.security.policy=policy.txt CalculatorClient

如果所有的这些都成功运行,你应该看到下面的输出:

1
9
18
3

如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。
 

闲耘注,我测试了不用 -Djava.security.policy=policy.txt 参数也执行成功,可能是我本机权限足够…

前些时候,热血来潮,想“规范”下书写Javascript的风格,其中有一条,所有的语句都必须分号结束。于是写出了如下代码:

if (true) {
// do something…
};

注意最后的分号,其实是没有必要的,浏览器解释的时候,无论在判断的大括号后是否继续有连续的代码,不要这个分号一样不会出错,像这样:

if(true){var b = true;}var s = ’string’;

if(true){var b = true;};var s = ’string’;

执行效果没有任何差别,但是有一种情况,在赋值操作时,必须在大括号后加分号,否则有连续的代码时会出错。加上分号可以避免压缩源代码时候因为这个分号的原因出错。例如:

var f = function(){};

好,加分号就加分号,但是有一点,会不会因为这个多加的分号,造成性能的影响呢,于是有了如下的测试代码:

<script language=”javascript” type=”text/javascript”>/*<![CDATA[*/

var Empty = new Object();
// 空语句
Empty.Sentence = new Object();
Empty.Sentence.counter = 100000;
Empty.Sentence.getMultSemicolonTime = function(){
var start = new Date();
for(var i = 0; i < this.counter; i++){
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
return (new Date() - start);
}
Empty.Sentence.getNoneSemicolonTime = function(){
var start = new Date();
for(var i = 0; i < this.counter; i++){}
return (new Date() - start);
}
Empty.Sentence.test = function(){
var arrMult = new Array();
var sumMult = 0;
var arrNone = new Array();
var sumNone = 0;
var counter = 10;
var sMult = ”, sNone = ”;
for(var i = 0; i< counter; i++){
var mu = this.getMultSemicolonTime()
var no = this.getNoneSemicolonTime();
sumMult += mu;
sumNone += no;
arrMult.push(mu);
arrNone.push(no);
}
for(var i = 1; i < counter; i++)
sMult += new String(arrMult[i] + ‘, ‘);

for(var i = 1; i < counter; i++)
sNone += new String(arrNone[i] + ‘, ‘);

document.write(
‘多分号:’ + sMult + ‘ = ‘ + sumMult + ‘<br />’ +
‘无分号:’ + sNone + ‘ = ‘ + sumNone
);
};
Empty.Sentence.test();

/*

Empty.Loop = new Object();
Empty.Loop.getNoneLoopTime = function(){
var start = new Date();
return (new Date() - start);
};
Empty.Loop.getEmptyLoopTime = function(){
var start = new Date();
while(true){}

};*/
/*]]>*/
</script>

经过本机测试,尽管有一些不稳定因素,但是就我的结果看来,结果应该是空语句(;)不执行,或者说执行时间为零,并不影响总体的效果,至少可以说影响相当小。

我的机器并不好,如果有朋友得出不同的结果,请联系闲耘 。不论是否相同,请把您的结果数据发一份给我,谢谢。

另,在Google Docs上发布到Blog上来的空格缩进竟然失效,郁闷。

此文是转帖。

IIS,Tomcat,Apache,Resin

1、IIS
http://www.86un.com/Article/ShowArticle.asp?ArticleID=228

Internet Information Server是允许在公共Intranet或Internet上发布信息的Web服务器

首先,Internet Information Server的缩写为(IIS)是一个World Wide Web server。Gopher server和FTP server全部包容在里面。 IIS意味着你能发布网页,并且有ASP(Active Server Pages)、JAVA、VBscript产生页面,有着一些扩展功能。IIS支持一些有趣的东西,象有编辑环境的界面(FRONTPAGE)、有全文检索功能的(INDEX SERVER)、有多媒体功能的(NET SHOW)

其次,IIS是随Windows NT Server 4.0一起提供的文件和应用程序服务器,是在Windows NT Server上建立Internet服务器的基本组件。它与Windows NT Server完全集成,允许使用Windows NT Server内置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点。

2、TOMCAT

http://www.study888.com/computer/pro/java/web/200506/85727.html

如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求。我们需要一个交互式的Web,于是便诞生了各种Web语言。如Asp,Jsp,Php等。当然,这些语言与传统的语言有着密切的联系,如Php基于C和C++语言,Jsp基于Java语言。本文所要介绍的Tomcat即是一个Jsp和Servlet的运行平台。

Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。

基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,你可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可。我们这里要提到另外一个工具Ant,Ant也是Jakarta中的一个子项目,它所实现的功能类似于Unix中的make。你需要写一个build.xml文件,然后运行Ant就可以完成xml文件中定义的工作,这个工具对于一个大的应用来说非常好,我们只需在xml中写很少的东西就可以将其编译并打包成WAR。事实上,在很多应用服务器的发布中都包含了Ant。另外, 在Jsp1.2中,可以利用标签库实现Java代码与Html文件的分离,使Jsp的维护更方便。

3、APACHE

Apache是一�N免�M的�W站伺服器,所以也不用�X…

Apache是一�N�子新首罡呔W站伺服器,是微��的三倍…

Apache是一�N最��定的�W站伺服器,效率好!

Apache是世界排名第一的Web服务器, 根据Netcraft(http://www.netsraft.co.uk/)所作的调查,世界上百分之五十以上的Web服务器在使用Apache.
1995年4月, 最早的Apache(0.6.2版)由Apache Group公布发行. Apache Group 是一个完全通过Internet进行运作的非盈利机构, 由它来决定Apache Web服务器的标准发行版中应该包含哪些内容. 准许任何人修改隐错, 提供新的特征和将它移植到新的平台上, 以及其它的工作. 当新的代码被提交给Apache Group时, 该团体审核它的具体内容, 进行测试, 如果认为满意, 该代码就会被集成到Apache的主要发行版中.
Apache 的特性:
1) 几乎可以运行在所有的计算机平台上.
2) 支持最新的HTTP/1.1协议
3) 简单而且强有力的基于文件的配置(HTTPD.CONF).
4) 支持通用网关接口(CGI)
5) 支持虚拟主机.
6) 支持HTTP认证.
7) 集成PERL.
8) 集成的代理服务器
9) 可以通过WEB浏览器监视服务器的状态, 可以自定义日志.
10) 支持服务器端包含命令(SSI).
11) 支持安全SOCKET层(SSL).
12) 具有用户会话过程的跟踪能力.
13) 支持FASTCGI
14) 支持JAVA SERVLETS.

缺点(MAYBE IT IS, MAYBE NOT):
APACHE没有为管理员提供图形用户接口(GUI), 但最近的APACHE版本已经有了GUI的支持.

4、RESIN

http://www.zhirui.com/it/2004/8-5/2875.html

Resin服务器平台介绍简介Resin提供了最快的jsp/servlets运行平台。在java和javascript的支持下,Resin可以为任务灵活选用合适的开发语言。Resin的一种先进的语言XSL(XML stylesheet language)可以使得形式和内容相分离。 如果您选用jsp平台作为internet商业站点的支持,那么速度、价格和稳定性都是要考虑到的,resin十分出色,表现更成熟,很具备商业软件的要求。而且,它是全免费的。从站点下载的就是完整版本。所以值得向您推荐! 相对于tomcat3.1,后者更象是一个正在研究的项目。目前resin可以支持sun的j2ee,而tomcat不能直接支持,而j2ee是基于java服务器端大系统的基础。但tomcat结构非常合理,而且是apache组织的产品,因此有着很好的远景。Resin1.1的特性包括:1 支持jsp1.1和在服务器端编译的javascript.2 比mod_perl,mod_php更快,比Jakarta Tomcat快3倍。您可以在Caucho的站点看到很全面的各种测试报告。3 使用servlet2.2引擎。4 自动的servlet/bean编译!5 Servlet,XSL Filtering6 支持IIS,Apache,Netscape和其它内置了HTTP/1.1的Web服务器。7 XSLT和XPath1.0引擎。8 企业级的共享软件(基于一个开放源码的协议)安装与启动:安装特别简单,只需将resin-1.1.3.zip解压缩到某个目录即可。在运行之前需要有jdk的支持。启动方式是执行:resin-1.1.3/bin/httpd (在NT)系统已经按照缺省设置启动,系统将监听8080端口。 jsp文件可放在resin-1.1.3/doc目录下;servlet可以放在resin-1.1.3/doc/web-inf/classes下面。测试 从http://localhost:8080/中可以看到resin的欢迎界面。 下载您可以在此下载最新的Resin1.1.3。大概是2.5M。当然,您也可以去 http://www.caucho.com官方站点了解详细内容并下载resin1.1.3或者1.1.2并且看一下resin的License

Apache与Tomcat的区别

APACHE是一个web服务器环境程序,启用他可以作为web服务器使用,不过只支持静态网页。如:(asp,php,cgi,jsp)等动态网页的就不行。

如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页,而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话,就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK。

整合的好处是:
如果客户端请求的是静态页面,则只需要Apache服务器响应请求;
如果客户端请求动态页面,则是Tomcat服务器响应请求;
因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销 。

http://dev2dev.bea.com.cn/techdoc/20060927885.html

《在Eclipse中构建备忘单》

链接中作者是是Eclipse 3.1中完成,并且是英文界面。
本文参照上文,在Eclipse 3.2.1中实践完成,中文界面。

Eclipse自带备忘单示例可以选择菜单”帮助->备忘单”。

 

如果备忘单仍不可见,可以选择菜单”窗口->显示视图->其他”。在”显示视图”对话框中,选择”备忘单->备忘单”,确定即可,可以拖放备忘单视图以调整备忘单的显示位置。

要创建备忘单,需要先创建备忘单项目。选择菜单”新建->项目”,在”新建”对话框中,选择”插件开发->插件项目”

 

选择下一步。在”新建插件项目”对话框中,输入项目名,并注意取消”项目设置”中的”创建Java项目”复选框,选择适当的Eclipse版本号。

2748475812.gif

下一步。输入”插件提供程序”,选择”完成”。

2748476151.gif

此时,已经我们创建了一个空的备忘单。在”包资源管理器”中我们可以看到如下资源结构:

2748471426.gif

接下来,我们需要创建一个xml文件,用来定义备忘单的内容信息。下面是一个简单的xml文件 ( cheatsheetDemo.xml ) 示例:

version=“1.0″ encoding=“UTF-8″ ?>

title=“备忘单示例标题”>

   

        备忘单示例描述

   

    title=“步骤一”>

        这是备忘单的第一步

   

    title=“步骤二”>

       

            这是备忘单的第二步

            仅仅是描述而已。

       

   

在这份示例中,文档结构很清晰明了,根元素中,只有两个子元素,分别定义备忘单的概要信息和相关步骤,其中元素可以多次重复。在元素中的元素中,限定只允许使用
这样的格式化元素。

这份xml文档可以放在项目任何位置,最简单的方法是放在根目录。

2748471806.gif

用”插件清单编辑器”打开”Myplugins/META-INF/MANIFEST.MF”,打开如下视图:

2748472173.gif

继续,我们选择”扩展”选项卡。

2748473920.gif

单击”添加”。

2748476575.gif

在”新建扩展”对话框中取消”只显示必须插件中的扩展点”,选择”org.eclipse.ui.cheatsheets.cheatSheetContent”,完成。

2748470462.gif

会弹出”新建插件依赖”对话框,选择”是”。

右键”org.eclipse.ui.cheatsheets.cheatSheetContent”,选择”新建->category”新建分组。

2748474472.gif

得到如图,注意输入分组的id和name。

2748474251.gif

右键”org.eclipse.ui.cheatsheets.cheatSheetContent”,选择”新建->cheatsheet”新建备忘单。

2748474995.gif

如图,注意输入id,name和category,这里要输入的分组category就是刚刚新建的分组id,并输入或浏览我们上面新建的xml文档到contentFile中。

2748474720.gif

最后选择”build.properties”选项卡,保证我们新建的所有xml文档都包含在项目中,如下,我在这里输入了

,\

cheatsheetDemo.xml

2748470999.gif

完成之后,全部保存,我们需要把这个插件导出为jar文件。右键”包资源管理器”中的”Myplugins”项目,选择”导出”。

在”导出”对话框中,选择”插件开发/可部署插件和段”,下一步。

2748473177.gif

2748473402.gif

2748473619.gif

这里要注意的是,选择要导出的Plugin,并在”目标”选项卡中选择导出目标目录,以及”选项”选项卡中,选中”将各个插件打包为JAR归档”,选择完成。

将导出的jar包拷贝到%eclipse_home%/plugins/目录下,重启Eclipse。然后选择菜单”帮助->备忘单”。

2752838372.gif

选择我们刚刚创建的备忘单,注意备忘单的名称和我们定义的名称之间的对应关系,如果你重启Eclipse仍然没有看到你创建的备忘单,可以退出Eclipse,并删除%eclipse_home%/configuration目录下的org.eclipse.update子目录,然后启动Eclipse。

创建好的备忘单如下所示:

2748471240.gif

好了,完成的备忘单创建和部署已经全部完成。如果你发现创建了不可用的备忘单,说明你并没有完全导出所有的xml 文档,你需要重新审视”build.properties”选项卡中内容了。

问题:由于发布备忘单需要先打成jar包,并需要重启Eclipse,有没有什么方法可以方便的修改备忘单呢?或者说怎么创建一个临时的”便条”呢?

from : http://www.zhangdi.name/2007/01/05/%e6%9c%aa%e5%91%bd%e5%90%8d.html

在工作当中,每个人都有自己的行为习惯,但有些坏习惯会成为你实现目标的障碍。下面是八种职场常见的坏习惯,虽然它们不像酗酒和吸毒具有那么明显的破坏性,但绝对会阻碍你取得事业的成功。   

一,办事拖拉。一 名信奉完美主义的美术设计师总是很晚才交上作品,但他没有意识到,准时与作品质量具有同等的重要性。在现代企业,每个人的工作往往要等到前一个人完成其分工部分后才能开始。如果你在竞争中拖拖拉拉,其他人就不再依赖你,甚至开始怨恨你、抛弃你。   

二,准备不足。你所卖的东西一定就是人家想买的吗?除非你详尽调查市场,否则那种思维只会带来失败。一根制作精良的马车皮鞭算是个工艺品,挂在居室内想必也不错,不过倘若你的顾客对马和马车没什么爱好,就别老提你的马鞭。   

三,不能坚持到底。一名相当成功的健身俱乐部经理告诉我,他不再参加管理讲座了,尽管讲座讲的东西很好,但要员工去执行新规定却很少奏效。我的看法是,如果新技术确实很重要,经理人就应当拿出足够时间来设法实现这些目标。   

四,不吸取教训。成功人士之所以成功,不在于他们比其他人犯的错误更少,而在于他们不重复过去的错误。从错误中学到的东西常比成功教我们的更多,犯了错却不吸取教训,白白放弃如此宝贵的受教育机会实在可惜。在你从错误中学习之前,你必须承认犯错,不幸的是许多人拒绝认错。   

五,有能力,无魅力。随着年龄的增长,人们更喜欢和有一定能力且平易近人的人交往,而不是那些脑瓜聪明却不可一世的人。我认识一位绝顶聪明的管理咨询师,他因为不擅人际交往而一再失败,对此他还牢骚满腹:”请根据我的成绩来评判我,别在意我的态度。我可不是那些马屁精。”他不明白,魅力是使人保持平和,而非教人溜须拍马。以他的能力和资质完全可以登上成功之舟,可是他却失之交臂。   

六,当老好人。如果你总是为了取悦他人而唯唯诺诺,最后你反而会失去人们的尊敬。当你失去他人的尊敬后,要想重新获得就很难。偶尔在与你持不同意见的人面前说不,同时保持弹性并能坚持工作,也是获得尊敬的方法。有位猎头公司管理人经常对应聘者说”不”,因为人们对拒绝的反应,最能表现出他们是否具有领导才能。   

七,不切实际的幻想。当分不清理想与现实的区别时,失败的陷阱差不多就布好了。重组公司是合理的,但一下子达到许多目标是不切实际的。洛杉矶一家文具店既在调整销售,又修改公司流程,同时还改变了退货政策。尽管这些措施都很必要,但6个月后,这家商店申请了破产。   

八,用人不当。一家五金连锁店的”好人”老板聘用了一名他认为”强硬”的首席运营官。老板最大的错误在于,把顽固不化与坚持原则混为一谈。最后,老板被迫解雇了这名运营官,但此时好几名高级职员已经离开企业。世界上确实存在着坏人。假如你给了他们发挥的机会,最后吃亏的只能是你自己。

归属感萌生创造力。

修正版

有归属感才有创造力。

原创版

如果你是等待这个奖项给自己增光,那么得不得无所谓;如果你的得奖,能够给这个奖项增光,你可以得。

                          — 王蒙

自嘲自重,笑对人生。

溪回谷转愁无处;

忽有梅花一两枝。

你的身躯很庞大,但你的生命需要的仅仅是一颗心。

                                   [美・好莱呜]利奥・罗斯顿

天空不留下鸟的痕迹,但我已飞过。

幸福的人善于忘记自己给过别人什么,却永远记得别人给过自己什么。

机遇像个小偷,来时无声无息,走时你却损失惨重。

伟大的人讨论思想,中等的人讨论事件,小人物讨论人。

                                           — 印度谚语
如果你昨天的成绩显得很了不起,说明你今天做得还不够。

                                            – 加利福尼亚州某中学教导处送给学生的一句话

古朴高低屋,
斜阳远近山。
林梢烟以带,
村外水如环。