2005年09月27日


Java性能


(来源:java编程思想)


“本附录由Joe Sharp投稿,并获得他的同意在这儿转载。请联系SharpJoe@aol.com”

Java语言特别强调准确性,但可靠的行为要以性能作为代价。这一特点反映在自动收集垃圾、严格的运行期检查、完整的字节码检查以及保守的运行期同步等等方面。对一个解释型的虚拟机来说,由于目前有大量平台可供挑选,所以进一步阻碍了性能的发挥。
“先做完它,再逐步完善。幸好需要改进的地方通常不会太多。”(Steve McConnell的《About performance》[16])
本附录的宗旨就是指导大家寻找和优化“需要完善的那一部分”。

D.1 基本方法
只有正确和完整地检测了程序后,再可着手解决性能方面的问题:
(1) 在现实环境中检测程序的性能。若符合要求,则目标达到。若不符合,则转到下一步。
(2) 寻找最致命的性能瓶颈。这也许要求一定的技巧,但所有努力都不会白费。如简单地猜测瓶颈所在,并试图进行优化,那么可能是白花时间。
(3) 运用本附录介绍的提速技术,然后返回步骤1。

为使努力不至白费,瓶颈的定位是至关重要的一环。Donald Knuth[9]曾改进过一个程序,那个程序把50%的时间都花在约4%的代码量上。在仅一个工作小时里,他修改了几行代码,使程序的执行速度倍增。此时,若将时间继续投入到剩余代码的修改上,那么只会得不偿失。Knuth在编程界有一句名言:“过早的优化是一切麻烦的根源”(Premature optimization is the root of all evil)。最明智的做法是抑制过早优化的冲动,因为那样做可能遗漏多种有用的编程技术,造成代码更难理解和操控,并需更大的精力进行维护。

D.2 寻找瓶颈
为找出最影响程序性能的瓶颈,可采取下述几种方法:

D.2.1 安插自己的测试代码
插入下述“显式”计时代码,对程序进行评测:

long start = System.currentTimeMillis();
// 要计时的运算代码放在这儿
long time = System.currentTimeMillis() – start;

利用System.out.println(),让一种不常用到的方法将累积时间打印到控制台窗口。由于一旦出错,编译器会将其忽略,所以可用一个“静态最终布尔值”(Static final boolean)打开或关闭计时,使代码能放心留在最终发行的程序里,这样任何时候都可以拿来应急。尽管还可以选用更复杂的评测手段,但若仅仅为了量度一个特定任务的执行时间,这无疑是最简便的方法。
System.currentTimeMillis()返回的时间以千分之一秒(1毫秒)为单位。然而,有些系统的时间精度低于1毫秒(如Windows PC),所以需要重复n次,再将总时间除以n,获得准确的时间。

D.2.2 JDK性能评测[2]
JDK配套提供了一个内建的评测程序,能跟踪花在每个例程上的时间,并将评测结果写入一个文件。不幸的是,JDK评测器并不稳定。它在JDK 1.1.1中能正常工作,但在后续版本中却非常不稳定。
为运行评测程序,请在调用Java解释器的未优化版本时加上-prof选项。例如:
java_g -prof myClass
或加上一个程序片(Applet):
java_g -prof sun.applet.AppletViewer applet.html
理解评测程序的输出信息并不容易。事实上,在JDK 1.0中,它居然将方法名称截短为30字符。所以可能无法区分出某些方法。然而,若您用的平台确实能支持-prof选项,那么可试试Vladimir Bulatov的“HyperPorf”[3]或者Greg White的“ProfileViewer”来解释一下结果。

D.2.3 特殊工具
如果想随时跟上性能优化工具的潮流,最好的方法就是作一些Web站点的常客。比如由Jonathan Hardwick制作的“Tools for Optimizing Java”(Java优化工具)网站:
http://www.cs.cmu.edu/~jch/java/tools.html

D.2.4 性能评测的技巧
■由于评测时要用到系统时钟,所以当时不要运行其他任何进程或应用程序,以免影响测试结果。
■如对自己的程序进行了修改,并试图(至少在开发平台上)改善它的性能,那么在修改前后应分别测试一下代码的执行时间。
■尽量在完全一致的环境中进行每一次时间测试。
■如果可能,应设计一个不依赖任何用户输入的测试,避免用户的不同反应导致结果出现误差。

D.3 提速方法
现在,关键的性能瓶颈应已隔离出来。接下来,可对其应用两种类型的优化:常规手段以及依赖Java语言。

D.3.1 常规手段
通常,一个有效的提速方法是用更现实的方式重新定义程序。例如,在《Programming Pearls》(编程拾贝)一书中[14],Bentley利用了一段小说数据描写,它可以生成速度非常快、而且非常精简的拼写检查器,从而介绍了Doug McIlroy对英语语言的表述。除此以外,与其他方法相比,更好的算法也许能带来更大的性能提升——特别是在数据集的尺寸越来越大的时候。欲了解这些常规手段的详情,请参考本附录末尾的“一般书籍”清单。

D.3.2 依赖语言的方法
为进行客观的分析,最好明确掌握各种运算的执行时间。这样一来,得到的结果可独立于当前使用的计算机——通过除以花在本地赋值上的时间,最后得到的就是“标准时间”。

运算 示例 标准时间

本地赋值 i=n; 1.0
实例赋值 this.i=n; 1.2
int增值 i++; 1.5
byte增值 b++; 2.0
short增值 s++; 2.0
float增值 f++; 2.0
double增值 d++; 2.0
空循环 while(true) n++; 2.0
三元表达式 (x<0) ?-x : x 2.2
算术调用 Math.abs(x); 2.5
数组赋值 a[0] = n; 2.7
long增值 l++; 3.5
方法调用 funct(); 5.9
throw或catch异常 try{ throw e; }或catch(e){} 320
同步方法调用 synchMehod(); 570
新建对象 new Object(); 980
新建数组 new int[10]; 3100

通过自己的系统(如我的Pentium 200 Pro,Netscape 3及JDK 1.1.5),这些相对时间向大家揭示出:新建对象和数组会造成最沉重的开销,同步会造成比较沉重的开销,而一次不同步的方法调用会造成适度的开销。参考资源[5]和[6]为大家总结了测量用程序片的Web地址,可到自己的机器上运行它们。

1. 常规修改
下面是加快Java程序关键部分执行速度的一些常规操作建议(注意对比修改前后的测试结果)。

将… 修改成… 理由

接口 抽象类(只需一个父时) 接口的多个继承会妨碍性能的优化
非本地或数组循环变量 本地循环变量 根据前表的耗时比较,一次实例整数赋值的时间是本地整数赋值时间的1.2倍,但数组赋值的时间是本地整数赋值的2.7倍
链接列表(固定尺寸) 保存丢弃的链接项目,或将列表替换成一个循环数组(大致知道尺寸) 每新建一个对象,都相当于本地赋值980次。参考“重复利用对象”(下一节)、Van Wyk[12] p.87以及Bentley[15] p.81
x/2(或2的任意次幂) X>>2(或2的任意次幂) 使用更快的硬件指令

D.3.3 特殊情况
■字串的开销:字串连接运算符+看似简单,但实际需要消耗大量系统资源。编译器可高效地连接字串,但变量字串却要求可观的处理器时间。例如,假设s和t是字串变量:
System.out.println("heading" + s + "trailer" + t);
上述语句要求新建一个StringBuffer(字串缓冲),追加自变量,然后用toString()将结果转换回一个字串。因此,无论磁盘空间还是处理器时间,都会受到严重消耗。若准备追加多个字串,则可考虑直接使用一个字串缓冲——特别是能在一个循环里重复利用它的时候。通过在每次循环里禁止新建一个字串缓冲,可节省980单位的对象创建时间(如前所述)。利用substring()以及其他字串方法,可进一步地改善性能。如果可行,字符数组的速度甚至能够更快。也要注意由于同步的关系,所以StringTokenizer会造成较大的开销。
■同步:在JDK解释器中,调用同步方法通常会比调用不同步方法慢10倍。经JIT编译器处理后,这一性能上的差距提升到50到100倍(注意前表总结的时间显示出要慢97倍)。所以要尽可能避免使用同步方法——若不能避免,方法的同步也要比代码块的同步稍快一些。
■重复利用对象:要花很长的时间来新建一个对象(根据前表总结的时间,对象的新建时间是赋值时间的980倍,而新建一个小数组的时间是赋值时间的3100倍)。因此,最明智的做法是保存和更新老对象的字段,而不是创建一个新对象。例如,不要在自己的paint()方法中新建一个Font对象。相反,应将其声明成实例对象,再初始化一次。在这以后,可在paint()里需要的时候随时进行更新。参见Bentley编著的《编程拾贝》,p.81[15]。
■异常:只有在不正常的情况下,才应放弃异常处理模块。什么才叫“不正常”呢?这通常是指程序遇到了问题,而这一般是不愿见到的,所以性能不再成为优先考虑的目标。进行优化时,将小的“try-catch”块合并到一起。由于这些块将代码分割成小的、各自独立的片断,所以会妨碍编译器进行优化。另一方面,若过份热衷于删除异常处理模块,也可能造成代码健壮程度的下降。
■散列处理:首先,Java 1.0和1.1的标准“散列表”(Hashtable)类需要造型以及特别消耗系统资源的同步处理(570单位的赋值时间)。其次,早期的JDK库不能自动决定最佳的表格尺寸。最后,散列函数应针对实际使用项(Key)的特征设计。考虑到所有这些原因,我们可特别设计一个散列类,令其与特定的应用程序配合,从而改善常规散列表的性能。注意Java 1.2集合库的散列映射(HashMap)具有更大的灵活性,而且不会自动同步。
■方法内嵌:只有在方法属于final(最终)、private(专用)或static(静态)的情况下,Java编译器才能内嵌这个方法。而且某些情况下,还要求它绝对不可以有局部变量。若代码花大量时间调用一个不含上述任何属性的方法,那么请考虑为其编写一个“final”版本。
■I/O:应尽可能使用缓冲。否则,最终也许就是一次仅输入/输出一个字节的恶果。注意JDK 1.0的I/O类采用了大量同步措施,所以若使用象readFully()这样的一个“大批量”调用,然后由自己解释数据,就可获得更佳的性能。也要注意Java 1.1的“reader”和“writer”类已针对性能进行了优化。
■造型和实例:造型会耗去2到200个单位的赋值时间。开销更大的甚至要求上溯继承(遗传)结构。其他高代价的操作会损失和恢复更低层结构的能力。
■图形:利用剪切技术,减少在repaint()中的工作量;倍增缓冲区,提高接收速度;同时利用图形压缩技术,缩短下载时间。来自JavaWorld的“Java Applets”以及来自Sun的“Performing Animation”是两个很好的教程。请记着使用最贴切的命令。例如,为根据一系列点画一个多边形,和drawLine()相比,drawPolygon()的速度要快得多。如必须画一条单像素粗细的直线,drawLine(x,y,x,y)的速度比fillRect(x,y,1,1)快。
■使用API类:尽量使用来自Java API的类,因为它们本身已针对机器的性能进行了优化。这是用Java难于达到的。比如在复制任意长度的一个数组时,arraryCopy()比使用循环的速度快得多。
■替换API类:有些时候,API类提供了比我们希望更多的功能,相应的执行时间也会增加。因此,可定做特别的版本,让它做更少的事情,但可更快地运行。例如,假定一个应用程序需要一个容器来保存大量数组。为加快执行速度,可将原来的Vector(矢量)替换成更快的动态对象数组。

1. 其他建议
■将重复的常数计算移至关键循环之外——比如计算固定长度缓冲区的buffer.length。
■static final(静态最终)常数有助于编译器优化程序。
■实现固定长度的循环。
■使用javac的优化选项:-O。它通过内嵌static,final以及private方法,从而优化编译过的代码。注意类的长度可能会增加(只对JDK 1.1而言——更早的版本也许不能执行字节查证)。新型的“Just-in-time”(JIT)编译器会动态加速代码。
■尽可能地将计数减至0——这使用了一个特殊的JVM字节码。

D.4 参考资源

D.4.1 性能工具
[1] 运行于Pentium Pro 200,Netscape 3.0,JDK 1.1.4的MicroBenchmark(参见下面的参考资源[5])
[2] Sun的Java文档页——JDK Java解释器主题:
http://java.sun.com/products/JDK/tools/win32/java.html
[3] Vladimir Bulatov的HyperProf
http://www.physics.orst.edu/~bulatov/HyperProf
[4] Greg White的ProfileViewer
http://www.inetmi.com/~gwhi/ProfileViewer/ProfileViewer.html

D.4.2 Web站点
[5] 对于Java代码的优化主题,最出色的在线参考资源是Jonathan Hardwick的“Java Optimization”网站:
http://www.cs.cmu.edu/~jch/java/optimization.html
“Java优化工具”主页:
http://www.cs.cmu.edu/~jch/java/tools.html
以及“Java Microbenchmarks”(有一个45秒钟的评测过程):
http://www.cs.cmu.edu/~jch/java/benchmarks.html

D.4.3 文章
[6] “Make Java fast:Optimize! How to get the greatest performanceout of your code through low-level optimizations in Java”(让Java更快:优化!如何通过在Java中的低级优化,使代码发挥最出色的性能)。作者:Doug Bell。网址:
http://www.javaworld.com/javaworld/jw-04-1997/jw-04-optimize.html
(含一个全面的性能评测程序片,有详尽注释)
[7] “Java Optimization Resources”(Java优化资源)
http://www.cs.cmu.edu/~jch/java/resources.html
[8] “Optimizing Java for Speed”(优化Java,提高速度):
http://www.cs.cmu.edu/~jch/java/speed.html
[9] “An Empirical Study of FORTRAN Programs”(FORTRAN程序实战解析)。作者:Donald Knuth。1971年出版。第1卷,p.105-33,“软件——实践和练习”。
[10] “Building High-Performance Applications and Servers in Java:An Experiential Study”。作者:Jimmy Nguyen,Michael Fraenkel,RichardRedpath,Binh Q. Nguyen以及Sandeep K. Singhal。IBM T.J. Watson ResearchCenter,IBM Software Solutions。
http://www.ibm.com/java/education/javahipr.html

D.4.4 Java专业书籍
[11] 《Advanced Java,Idioms,Pitfalls,Styles, and Programming Tips》。作者:Chris Laffra。Prentice Hall 1997年出版(Java 1.0)。第11章第20小节。

D.4.5 一般书籍
[12] 《Data Structures and C Programs》(数据结构和C程序)。作者:J.Van Wyk。Addison-Wesly 1998年出版。
[13] 《Writing Efficient Programs》(编写有效的程序)。作者:Jon Bentley。Prentice Hall 1982年出版。特别参考p.110和p.145-151。
[14] 《More Programming Pearls》(编程拾贝第二版)。作者:JonBentley。“Association for Computing Machinery”,1998年2月。
[15] 《Programming Pearls》(编程拾贝)。作者:Jone Bentley。Addison-Wesley 1989年出版。第2部分强调了常规的性能改善问题。 [16] 《Code Complete:A Practical Handbook of Software Construction》(完整代码索引:实用软件开发手册)。作者:Steve McConnell。Microsoft出版社1993年出版,第9章。
[17] 《Object-Oriented System Development》(面向对象系统的开发)。作者:Champeaux,Lea和Faure。第25章。
[18] 《The Art of Programming》(编程艺术)。作者:Donald Knuth。第1卷“基本算法第3版”;第3卷“排序和搜索第2版”。Addison-Wesley出版。这是有关程序算法的一本百科全书。
[19] 《Algorithms in C:Fundammentals,Data Structures, Sorting,Searching》(C算法:基础、数据结构、排序、搜索)第3版。作者:RobertSedgewick。Addison-Wesley 1997年出版。作者是Knuth的学生。这是专门讨论几种语言的七个版本之一。对算法进行了深入浅出的解释。


Java测试规范


(by Huihoo.com Allen)

1、未使用(死)代码

。存在未使用的私有静态字段

。带有不必要的修饰符的借口

。目前没有使用的私有字段

。未使用的变量

。无需的参数

。显示导入的java.lang包

。目前没有使用的私有方法

2、编码标准

。一行语句中声明了多种类型的变量

。物理位置不在一起的同名小组成员 。

。从一个抽象类库中的构造器调用的抽象方法

。包括大量case语句的switch语句

。除了第一个之外的main()函数

。直接弹出的Exception类库

。catch语句中Exception或者RuntimeException

。直接弹出的Error

。没有在接口中定义的常量

。长整数应该使用‘L’代替小写字母‘l’

3、初始化

。没有显式初始化的静态字段

。没有显式初始化每个数据成员的构造器

。编译代码中可能的漏洞

。存在错误的case的switch语句

。程序体为空的for语句

。程序体为空的if语句

。需要重载的方法

。应该使用等号代替==

。程序体为空的else语句

。强制转换为较低精度的主要数据类型

。在switch子句中的文本标识

。if条件中的变量赋值

。缺少default子句中的switch语句

。存在嵌套赋值

。比较浮点数

。循环控制变量在循环内部被突然改变

。方法参数名称和类成员名称冲突

。可能与字符串串联混淆的+操作符

4、面向对象编程

。继承的静态成员函数被隐藏

。可能嵌套过深的类库

。继承的实例变量被隐藏

。被重载private方法

。内部的类库不可见或外部的类库不相关

。某个实列变量为public或在package中

。没有在一开始列出的public或package方法和数据

。不是abstract或实现比较通常的接口

。命名惯例

。一个类名称不符合标准

。一个接口名称不符合标准

。一个列外名称不符合标准

。一种方法名称不符合标准

。一个静态字段名称不符合标准

。一个静态方法名称不符合标准

。一种方法参数名称不符合标准

。一个实列字段不符合标准

。一个本地变量名称不符合标准

。一个最终静态字段中包含小写字母

。一个返回布尔值的方法使用"is"或者"has"前缀

。一个接口成员字段包含小写字母

。使用一个非惯例的变量名称

5、优化

。一个finally模块中存在未关闭的流

。使用一个for循环代替System.arrarycopy()拷贝数组

。存在没有必要的instanceof

。存在没有必要的强制变量类型转换

。可以使用一个缩写的赋值语句

。常量字符串使用StringBuffer代替String

。循环条件过于复杂

。取反操作符使用过于频繁

6、回收

。finalize()没有调用super.finally()

。最终方法的最后模块没有调用super.finalize()

。finalize()被显示调用

。在将主要类型转换成String时,使用了不必要的临时变量

。在应该使用long[]的位置使用了Date[]

7、javadoc注释

。误用了Javadoc标签

。Javadoc和普通注释之间区分不明显

8、线程

。使用synchronized,降低了性能

9、全局静态分析

。过度访问package-private字段

。过度访问package-private方法

。过度访问package-private类库

。过度访问public/protected字段

。过度访问public/protected方法

。过度访问public/protected类库

。没有使用全局package-private字段

。没有使用全局package-private方法

。没有使用全局package-private类库

。没有使用全局public/protected字段

。没有使用全局public/protected方法

。没有使用全局public/protected类库

10、企业版java beans(EJB)

。bean类库没有定义成为public

。bean类库被错误定义成为abstract

。bean类库被错误定义成为final

。bean类库实现一个ejbCreate()方法

。bean类库错误定义finalize方法

。ejbCreate()访问控制符没有定义成为public

。SessionBean中的ejbCreate()没有返回void

。定位方法的修饰符没有定义成为public

。定位方法的返回类型不是一个主键,也不是主键的类集

。ejbPostCreate()有一个非public的访问控制修饰符

。ejbPostCreate()没有返回类型void

11、杂项

。成员字段隐藏在成员方法中

。循环记数器无法递增

。for循环中没有包含布尔条件

。存在的clone()方法没有调用super.clone()

。for语句缺少代码模块

。方法参数得到赋值

2005年09月26日

 

我在编写HelloWorld程序时通过了编译,在运行时却出错,请哪位大牛指点指点^_^

程序:

class HelloWorld
{
    public static void main(String [] args)
    {
        System.out.println("Hello World!");
    }
}

操作界面:

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\stenverson>e:

E:\>javac Java\Myprojects\Welcome\HelloWorld.java

E:\>java  Java\Myprojects\Welcome\HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: Java\Myprojects\Welco
me\HelloWorld

解决办法:

  1. E:\>javac Java\Myprojects\Welcome\HelloWorld.java,这句话是没问题的,可以这么编译,或者这么写也可以:
    E:\>javac Java/Myprojects/Welcome/HelloWorld.java
  2. E:\>java  Java\Myprojects\Welcome\HelloWorld,这句是不对的,因为java解释器将Java\Myprojects\Welcome\HelloWorld当作一个类名而不是路径+类名,同样Java/Myprojects/Welcome/HelloWorld也是不行的
  3. 要运行,可以自己指定classpath:
    E:\>java -cp Java/Myprojects/Welcome/ HelloWorld,这样就可以了,其中路径用反斜杠或斜杠都是可以的,比如
    E:\>java -cp Java/Myprojects\Welcome\ HelloWorld,这样混合使用都是可以的
  4. 如果不这样手动设置classpath,可以指定class所属包,在代码中添加如下语句:
    package Java.Myprojects.Welcome; // 添加包定义

    class HelloWorld
    {
        public static void main(String [] args)
        {
            System.out.println("Hello World!");
        }
    }
    编译运行:

    E:\>javac Java\Myprojects\Welcome\HelloWorld.java

    E:\>java  Java\Myprojects\Welcome\HelloWorld,这样还是会出错,因为java解释器把Java\Myprojects\Welcome\HelloWorld当作类名了,此时不能使用反斜杠,而应该使用斜杠:
    E:\>java Java/Myprojects/Welcome/HelloWorld,这样就没有问题了,但使用包用如下方法更保险:
    E:\>java Java.Myprojects.Welcome.HelloWorld,this is OK!
    在下面5中可以看到,还有其它两种可行方法。

  5. 一般情况,不使用包定义的时候,切换到生成的.class文件目录运行java即可;
    如果使用了包的话,需要到包起始目录或者指定classpath:
    E:\Java\Myprojects\Welcome\> java -cp E:\ Java.Myprojects.Welcome.HelloWorld,this is OK!
    或者:
    E:\Java\Myprojects\Welcome\> java -cp E:\ Java/Myprojects/Welcome/HelloWorld,this is OK too!
  6. 总之,在java命令执行的时候不能有反斜杠\,使用包的时候可以有斜杠/,但最好用“.”,一般情况可以通知指定类寻找路径来解决java.lang.NoClassDefFoundError问题。
  7. 以上为Windows XP + j2sdk1.4.2_09和jdk1.5.0_04上测试结果。在linux下,由于java的平台无关性,测试有相同的结果。
  8. 注意的是反斜杠会当作类名字的一部分,指定classpath的时候"/"、"\"可以混用

 

2005年06月26日

明天就要去被关起来实习了,封闭式的。

换种新的生活

wave all!

2005年06月21日

行走社会的100条忠告


   1.所有的困苦都是有用意的-这是老天爷在磨练你,为了把重任交给你
  2.毛遂自荐,好处多多-让别人看到你,知道你的存在,知道你的能力
  3.千万别入错行-人情有牵绊,恩怨的纠葛,转行可不是那幺容易的呀
  4.别轻易转行-转行的风险很林,若无大决心,大魄力,最好不要轻率为之
  5.不只为了糊口,还要有抱负-你要想:在这个行业中,我要成为什幺样的人
  6.不要独享荣耀-独享荣耀,有天就会独吞苦果
  7.用耐心把冷板凳坐热-冷板凳都坐过了,还有什幺好怕的呢
  8.留一点空间给你的主管-当主管也需要安全感
  9.摸鱼 小心摸到螃蟹!-摸鱼会成为你在社会上行走的负载
  10.不要有<怀才不遇>的想法-怀才不遇多半是自己造成的
  11.天下没有<好赚>的钱-先从小钱开始赚吧
  12.当你遇到魔鬼型的主管-接受他的磨练吧
  13.勿当众辱骂你的主管-那会让你无路可走,结果只有走路一途
  14.向不同的行业的人吸收新知识-记住要用请教的态度
  15.犯错,就诚实的认错-狡辩,诿过只会害了你自己
  16.用<吃亏就是占便宜>的心态做事做人-它可累积你的工作经验,充实你

的作事的能力,扩张你的人际网络
  17.以失败为师-与其在失败中记取教训,不如从别人有失败中检取教训
  18.勿在失意者面前谈论你的得意-这会对你的人际关系造成伤害
  19.别轻勿<守时>这件事-守时是对别人的一种尊重
  20.精诚所至,金石为开-你的真心成意会在对方的感动中激起你的同情和

不忍
  21.朋友要分<等级>-这是为了保护自己免受伤害
  22.用<时间>来看人-时间是让对方不自觉的检验师
  23.用<打听>来看人-把获得的信息汇集起来,就可以了解这个人
  24.用<投其所好>来看人-他会不知不觉地把假面具掀掉
  25.建立一个<朋友档案>-以免人到用时方恨少
  26.扩大交友的圈子-主动出击,勿等别人上门来
  27.保持交朋友的弹性-敌人也可以变朋友
  28.交会<修理>你的朋友-这种朋友正是你人生的导师
  29.好朋友要<保持距离>-这样的友谊才能长久
  30.小心突然升高热度有友情-不推不迎,冷眼以观,礼上往来
  31.以<勤>补能力不足-勤将使你自然发亮,为人注意
  32.把一天变成四十八小时-让每一分每一秒都发挥最高的效益
  33.为自己拼几枚<勋章>-建立地位,声望,让别人尊敬你,礼遇你
  34.碰到困难,决不轻言退却-要把困难当成对自己的试练
  35.作老二,不要作老大-老大没当好,会变成老三老四
  36.勿在工作上被人看轻-别混日子,别看轻职份,别混水摸鱼
  37.钱追人,人追健康-有了健康,还怕赚不到钱
  38.勿吝于提 后进-他们会成支持你的力量
  39.中规中矩,赢得尊重-赢得尊重,也赢得信赖
  40.适度的<自抬身价>-在就业市场里,人也是一种商品
  41.用<物质利>换取<人情利>-物质利是一时的,人情利是长远的
  42.把敬业变成习惯-短期来看是为了雇主,长期来看是为了自己
  43.寻找一位<衣食父母>-他可省下你的摸索的碰撞
  44.运用<累积法>壮大资产-不求快,不求多,不中断
  45.找一位对手来跟-跟住他,并且超越他
  46.全力以赴,迎接工作上的种种<测试>-不要把突来的状况当成是整你
  47.忍一时,争千秋-形势比人强时,就要忍
  48.套用别人的成功模式-别人的成功模式是一种指引,让你有方向可循
  49.把自己当成老板或主管-在工作中见习,培养当老板或主管的格局和能


  50.勿满足于眼前的小小成就-你要问自己,我这辈子只有这样吗
  51.尽快成为你那一行的专家-只要下功夫,很快就办得到
  52.与其你死我活,不如你活我也活-这就是双赢,是良性竞争
  53.以<播种>的心情来经营人际关系-越早播种越好
  54.也以<播种>的心情来经营事业-不播种,就不会有收获
  55.跌倒了,<一定>要爬起来-不爬起来,别人会看不起你,你也会失去机会
  56.不要为失败找借口-应该面对失败,找出失败的原因来
  57.改变环境,或是改变自己-与其改变环境,不如改善自己
  58.拉长战线,避免主力对决-人生没有几场主力战好打
  59.不要打没有把握的仗-人生是经不起浪费的
  60.把反省自己当成每日的功课-因为你不是完美的,会说错话,也会做错事
  61.碰到低潮,自己鼓励自己-千万别乞求,依靠别人来鼓励你
  62.借用别人的智能来作事-你要了解,人的智能是有限的
  63.时时要有危机意识-别以为你命好运也好
  64.主角配伯都能演,台上台下都自在-这是面对现实人生,能屈能伸的弹性
  65.做事切勿<率性而为>-率性而为只会害了你自己
  66.事越烦,越要耐烦-天底下没有不烦的事
  67.控制自己的情绪-别让别人以为你还没长大
  68.做乌龟,不要做兔子-有兔子资质的人最容易骄傲
  69.先做小事,先赚小钱-这是为了累积坐大事赚大钱的条件
  70.别让过去的失败绑住你的手脚-环境会变,人会成长,再度出击,可能就

成功了
  71.像蟑螂一样地活着-人如果有蟑螂韧性,还有什幺日子不能过呢
  72.稳扎稳打,可攻可守-没抓在手里的成功都是不算的
  73.靠实力,不要靠派系-派系不是永远的,实力才是你一生最好的依靠
  74.自己发光,不要等别人不磨光-每个人都为自己,谁有空,有心好好去了

解你呢
  75.逢山开路,遇水架桥-过了桥,上了山,常会有一片新的天地
  76.永远跑在部属的前面-权力领导,情义领导都不如才能领导
  77.<新官上任三把火>有必要-告诉别人:我来了
  78.巧用<致命的吸引力>-男人温柔,女人撒娇
  79.正视你的弱点,躲避别人的陷井-光明正大,脚注踏实地,不痴心妄想,便

可避免踏入陷阱
  80.只要五毛钱,不要一块钱-拿一块钱的机会只的一次
  81.放下身段,路越走越宽-身段只会把你绑起来
  82.话别说得太满-好容纳一些意外,以免下不了台
  83.了解中国人的处世风格-重视人情,表里不一,形式主义
  84.善用<见面三分情>的中国人心理-你尊重对方,对方也会尊重你
  85.多赞美别人-不用花钱,又可使人快乐,何乐而不为
  86.尊重别人的<领土范围>-别因为疏忽而引起不心要的麻烦
  87.勿轻易吐露你的失意-以免被人认为软弱无能
  88.人际关系是:有(舍)才有(得)-主动出击,先去满足对方的自我
  89.别忽略(面子问题)-不给面子的行为最易引起是非
  90.你要小心应对的几种人-并不是每个人都是好人
  91.你态度要有所保留的几种人-完全信任,你便会受到伤害
  92.妥善自理和(小人)的关系-不依附小人,也不得罪小人
  93.最好不要挡人财路-与其挡人财路,不如自己另辟财路
  94.以低姿态化解别人的嫉妒-嫉妒是一把烈火,会毁灭一个人
  95.做人做事不心面面俱到-因为总有人会不满意你
  96.认识并运用人性中的自私-不必在意别人的自私,应好好应对这些自私
  97.顺着毛摸,他就听你的-脾气再大,城府再深,主观再强的人也吃不消这


  98.以积极的作为推动(否极泰来)-保持存在,发挥耐心,累稷能力
  99.以戒慎的心情延缓(盛极而衰)的时间-很多失败都是在盛时种下的
  100.时到,花自然便开-你只要努力就对了,什幺时候花才盛开那是老天爷

的事

2005年06月20日

上周微软公司在奥伦多市召开了2005年技术大会,在会议上宣布将在即将推出的服务包中将个人邮箱的存储容量从16GB增加到75GB,这对Exchange Server 2003 Standard Edition的用户来说,无疑是一个好消息。
  Exchange Server 2003 SP2服务包预计将在今年下半年推出。它还包括一个最新的智能信息过滤器(Intelligent Message Filter),还支持发送人ID和2005年技术大会上提出的增强灵活性。微软公司表示将在Exchange 12中提高标准版邮箱容量。这款主要的信息平台预计将在2006年推出。

  标准版Exchange Server是唯一一款有流量限制的服务器软件,主要由中小型企业用户使用。Pro Exchange公司是位于亚特兰大州的一家专营信息和Active Directory产品的服务商,公司总裁兼首席执行官Steve Bryant说:“当邮箱大小不什么重要时,微软公司决定了邮箱的容量限制。”“但是如今垃圾邮件和病毒泛滥,16GB的容量已经满足不了实际需要了。”

  利用检查存储内容的办法进行人为限制

  来自马萨诸塞州剑桥市Forrester Research调查公司的分析员Erica Rugullies介绍说,为了避免邮箱容量设置不当,很多公司都对个人邮箱设置了配额,一般都在50MB到100MB之间。她说:“那些使用标准版Exchange Server的小型企业可能需要这项新功能。”

  那些公司通过限制用户邮箱容量来保证整体信息存储处于受检测状态下。Fender Musical Instruments Corp公司的企业综合设计师David Quine称:“对我们来说,因为我们没有更多的磁盘空间,因此我们将邮箱容量限制为500MB。”“如果它们都拥有75GB的容量,那么我就不得不处理许多别的问题。”

  微软公司Exchange Server产品公司的副总裁David Thompson在技术大会上全面概况了Exchange 12的开发计划。这个计划在今年一月份被首次提出讨论过。微软公司针对Exchange做了许多改进,包括支持64位信息,独特的信息发送系统,与附加政策兼容,满足Windows Server System Common Engineering标准要求以及改良过的日历计时功能等等。

  Thompson表示Exchange 12将继续支持公众文件夹,预计在秋季推出的服务包还将包括许多文件管理功能、基于浏览器的客户端支持功能、优化搜索功能、内容改动的自动通知功能等,并且它会与OFFICE办公软件整合在一起。

  微软公司一直在建议使用公众文件夹的用户应该去调查一下与SharePoint协作的新程序软件。微软公司称将从Exchange 13开始逐步撤除公众文件夹,目前Exchange 13平台还仅仅处于早期构思阶段。但是,按照微软公司目前的产品使用期限来看,在2006年推出Exchange 12以后,用户们还可以使用10年公众文件夹。

===============
新闻来源:MSNBC
翻译整理:Catfish

Foxit PDF Reader是一款小巧、快速、干净的免费PDF阅读软件。可以完美替代Adobe Reader。它只有一个单一的可执行文件,不要任何安装过程,下载后解压缩至任意目录即可使用,释放后仅2.23M。

为了使Foxit PDF Reader更好地支持中文字符显示用户可以下载只有1.8M的东亚语言支持文件FPDFCJK.BIN,放到程序所在目录即可。
下载地址:

http://www.foxitsoftware.com/pdf/pdfrd.zip

东亚语言支持:

http://www.foxitsoftware.com/pdf/fpdfcjk.bin

截图如下:

http://www.foxitsoftware.com/pdf/pdfreader_screen.jpg

2005年06月19日

一个复杂一点,可以控制的方法,其它地方可以不用改。

<OBJECT id="wmpSmooth" height="46" width="178" classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6">    

// mp3文件地址
<PARAM NAME="URL" VALUE="http://202.206.30.221/wangye/xiyuan/xiuxianyule/yinyue/017.mp3 ">

     <PARAM NAME="rate" VALUE="1">
     <PARAM NAME="balance" VALUE="0">
     <PARAM NAME="currentPosition" VALUE="0">
     <PARAM NAME="defaultFrame" VALUE="">

// 播放次数
     <PARAM NAME="playCount" VALUE="999">

// 自动播放
     <PARAM NAME="autoStart" VALUE="-1">
     <PARAM NAME="currentMarker" VALUE="0">
     <PARAM NAME="invokeURLs" VALUE="-1">
     <PARAM NAME="baseURL" VALUE="">
     <PARAM NAME="volume" VALUE="50">
     <PARAM NAME="mute" VALUE="0">
     <PARAM NAME="uiMode" VALUE="mini">
     <PARAM NAME="stretchToFit" VALUE="0">
     <PARAM NAME="windowlessVideo" VALUE="0">
     <PARAM NAME="enabled" VALUE="-1">
     <PARAM NAME="enableContextMenu" VALUE="0">
     <PARAM NAME="fullScreen" VALUE="0">
     <PARAM NAME="SAMIStyle" VALUE="">
     <PARAM NAME="SAMILang" VALUE="">
     <PARAM NAME="SAMIFilename" VALUE="">
     <PARAM NAME="captioningID" VALUE="">
     <PARAM NAME="enableErrorDialogs" VALUE="0">
     <PARAM NAME="_cx" VALUE="3969">
     <PARAM NAME="_cy" VALUE="1217">
    </OBJECT>

<OBJECT id="wmpSmooth" height="46" width="178" classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6">                                                             <PARAM NAME="URL" VALUE="http://202.206.30.221/wangye/xiyuan/xiuxianyule/yinyue/017.mp3 ">
     <PARAM NAME="rate" VALUE="1">
     <PARAM NAME="balance" VALUE="0">
     <PARAM NAME="currentPosition" VALUE="0">
     <PARAM NAME="defaultFrame" VALUE="">
     <PARAM NAME="playCount" VALUE="999">
     <PARAM NAME="autoStart" VALUE="-1">
     <PARAM NAME="currentMarker" VALUE="0">
     <PARAM NAME="invokeURLs" VALUE="-1">
     <PARAM NAME="baseURL" VALUE="">
     <PARAM NAME="volume" VALUE="50">
     <PARAM NAME="mute" VALUE="0">
     <PARAM NAME="uiMode" VALUE="mini">
     <PARAM NAME="stretchToFit" VALUE="0">
     <PARAM NAME="windowlessVideo" VALUE="0">
     <PARAM NAME="enabled" VALUE="-1">
     <PARAM NAME="enableContextMenu" VALUE="0">
     <PARAM NAME="fullScreen" VALUE="0">
     <PARAM NAME="SAMIStyle" VALUE="">
     <PARAM NAME="SAMILang" VALUE="">
     <PARAM NAME="SAMIFilename" VALUE="">
     <PARAM NAME="captioningID" VALUE="">
     <PARAM NAME="enableErrorDialogs" VALUE="0">
     <PARAM NAME="_cx" VALUE="3969">
     <PARAM NAME="_cy" VALUE="1217">
    </OBJECT>

2005年06月18日

http://dl.pconline.com.cn/html/1/7/dlid=3917&dltypeid=1&pn=0&linkPage=1.html

http://dlc.pconline.com.cn/filedown.jsp?id=64148&dltypeid=1

金山词霸2006预览版:

1、收录日文词典-《新日汉大辞典》、《实用汉日辞典》,多语言界面;中文简体、中文繁体、英文、日文;
2、自动更新系统 实时扩充修补词库
3、Smart查词引擎:模糊听音查词,模糊查词,全文检索
4、换肤随心所欲,更多界面风格,随意更换
5、即时通讯工具,线上客服沟通无限,发现问题可通过“金山加加”在线客服及时反馈
6、经典功能,屏幕取词,纯正美音,真人发音,英汉双重解释便于理解学习
7、海量词典,收录《美国传统词典》最新版(第四版),修订词条10000余条,新增5000余条电脑、医学等专业词汇。


使用平台:Windows 98/ME/
  2000/XP/2003
软件大小:97.0M
界面语言:简体中文/英文
  繁体中文/日文

下载地址
请选择下载服务器:
上海电信1   上海电信2  河北网通



下载说明:
  • 使用金山词霸2006预览版需要注册“金山通行证”并通过验证。
  • 金山词霸2006预览版内含《简明英汉汉英词典》及《实用汉日词典》等八本经典词典,用户可体验中日/中英互译、在线升级等功能。
  • 为保证您可及时获得金山公司提供的各种信息及服务,请您在联网状态下使用金山词霸2006预览版。否则只能使用《简明英汉词典》及《简明汉英词典》。
  • 体验活动结束后,如果您没有及时付费购买,那么只能使用预览版中的《简明英汉词典》、《简明汉英词典》。
  • 本活动解释权归北京金山软件有限公司所有。

google   ·中英文字典

   这项中(英)文单词翻译服务是由DrEye译典通网站所提供的,其查询格式为:“fy+中(英)文单词”(实际操作时,请勿输入+号和“”号)。例如在Google搜索框中输入fy innocent后,Google就会在搜索结果页面的最上方显示出“innocent的中文翻译”链接,点击它,你就能查到该单词的中文意思了。另外,假如我们要翻译“无辜”这个词语的话,那只要输入fy 无辜 这样的格式就行了,Google会直接显示其所对应的英文单词,点下方的“Dr.eye线上字典”链接,保证你还能查到更多的内容。

   ·天气查询

   其查询格式为:“tq+城市名称”,例如输入 tq 北京,再点击搜索结果页面上方的“北京天气预报”链接后,你就能在t7online网站上查询到北京今后3天内的天气状况了。

   ·查询邮编或长途区号

   虽然现在网络已非常发达,但偶尔也难免要写封信,打个电话,这时此项功能就能帮上忙了。查询格式为:“yb+城市名称”或“qh+城市名称”,借助此命令,我们还可以输入相应的邮编或长途区号,反向查询到城市名称。不过,经过笔者的试用,发现Google所收录的邮编和长途区号的信息还十分不完整,有待于补充改进。

   ·股票查询

   其查询格式为:“gp+股票名称或代码”,如:gp 宝钢股份 或gp 600019,其数据是由新浪财经提供的。

   ·查询手机号码归属地

   直接输入移动或联通的手机号码后,通过相应链接,你就能知道该号码的所属省份、所属城市和手机卡类型等信息,十分方便。