Monday, November 12, 2007

天声人語(2007年11月12日)



ふりがなついている文書ですが、直接にコピーできないので、画像としてアップロードしています。検索エンジンに対しては友好ではない、しかし、便利ですから、仕方ないわよ!

※実は半年前に天声人語の文書を貼り付けました、そのとき、自分でふりがなと翻訳をやっていたので、時間がたくさんかかりました。毎日4時間の時間は保障できないので、続けられなくなる。

天声人語 2007年11月12日

文章の翻訳はやりたいですけど、しかし、時間があまりないわ! そのままにしろう!

Thursday, November 8, 2007

杭州荣膺最具幸福感城市榜首



CCTV.com-杭州荣膺最具幸福感城市榜首 宁波台州榜上有名

[View this article which also posted in MSN space]

不管CCTV这次报道是否存在掺水成分,不管这个评奖的含金量,以我在杭州2年的生活经历来说,杭州是我到过的有限的几个地方中,生活最惬意的地方。

初到杭州,橘子开车带我转了西湖风景区,当时就被杨公堤迷上了。如此的林荫大道,如此的起伏跌宕,如此山水秀色,杭州就是我要来的地方了。后来工作以后,经常需要坐527路公交车到城里兜一圈,恰好527就是沿着钱江一桥->虎跑->杨公堤->浙大一线跑动,每次坐车,不论是有座位还是没有座位,总能在窗外的景色中找到一丝宁静,一份安详,以至于我有的时候来回做527就为了体验这份感觉。

后来去九溪爬山,穿过五云峰,行走在山间的茶园中,眺望着六合塔,钱江一桥,看看龙井山,看看梅家坞,仿佛行走在云间,五座山峰连绵不绝,果然不愧五云峰的大名。从五云峰可以走到很多的地方,比如可以去龙井山,还可以去满觉陇,杨梅岭等等。还可以晃悠到茅家埠,这是一个美的让人窒息的小地方。茅家埠里没有九寨那种奇山异水,也没有江南小镇那种古色古香,但是当你置身于茅家埠的时候,你会觉得这里很漂亮,就像世外桃源一样。事实上,这里圈起来了西湖的一小部分,周围用高大的水杉包围着,旁边是两个赫赫有名的地方,一个叫做西湖国宾馆,一个叫做杭州花圃。在茅家埠,经常可以看到训练中的皮划艇,如同一只银箭划过水面,另外还可以看见一对又一对的新郎新娘在这里留下永恒的记忆,由此可见茅家埠在杭州人心中的地位。

走过杨公堤,可以经过空军疗养院,丁家山风景区,同时到达苏堤的南端。这里是另外一个小桃源,太子湾公园。这里几乎就是一个婚礼的大院,因为美丽的景色让每一对新人都想和太子湾一起分享。从太子湾出来,就可以向雷锋塔进军了,沿途的风景吸引了几乎每一个到杭州来的游客,这里甚至有专用的临时红绿灯,就是为了照顾高峰时间,穿越马路的游客。

雷锋塔是一个传奇故事的寄托,这里流传着翻修雷峰塔的时候真的跑出来一条小白蛇的传说,你可以不上去,但是你不可以不来这里看看它。雷锋塔的东边就是南山路,这条路名被用来标识杭州的小资生活,只要是和小资靠边的,都将南山路作为生活中不可或缺的一部分。这里有中国美院,有Porsche,有Ferrari,有酒吧,有英式下午茶,有日本料理,有印度咖喱,有韩国饭店,有两岸咖啡。你可以从早上7点起床,在体验了柳浪闻莺的绝美景色后,在一茶一坐享用早点,然后在中国美院的周围探索字画珍品,在天度享用印度午餐,然后去和Porsche的老板唠嗑,顺便品尝一下Ferrari上面的英式下午茶,然后在小瀛洲上和杭州人一边品尝龙井茶,一边搓两圈麻将,在傍晚时分,踏上菲乐的大门,品尝一下番茄湖蟹,别有一番味道。晚膳过后,该是娱乐时间了,不论是震耳欲聋的Disco还是慢摇吧,总有适合你的酒吧在南山路上等你。路上的路灯将夜晚渲染的暧昧万分,小资的你可以将暧昧持续到凌晨2点。

离开柳浪闻莺不远,就是湖滨路了,这里集中着Hyatt大酒店,Omiga,Armani,还有Starbucks, Häagen-Dazs,还有音乐喷泉。坐在喷泉的边上,让细细的水珠随着音乐轻抚着脸庞,望着远处宝俶山上的灯光,你会在不知不觉中沉醉。

湖滨路连接着断桥残雪,沿着西湖这条起伏的腰身,就可以到达传说中的断桥了,那里可是白娘子和许仙的相逢之处哦。无论你选择走白堤,还是选择走北山路,你都可以荡漾在这片充满了浓郁古典味道的爱情圣地了。苏堤在适当的地方再次连接了北山路和太子湾公园。北山路就仿佛是王家卫导演镜头里那某个巷子,配上一点缠绵的音乐,这里是让你心情浓郁起来的一个地方。

因为有了西湖,杭州城里的景色糅合了现代奔放,但是却不像上海那样张扬;因为有了西湖,杭州的生活紧张之余还有轻松和惬意;因为有了西湖,杭州市当之无愧的全球最佳人居城市,因为有了西湖,杭州当选最具幸福感的城市榜首,我想也是当之无愧的吧。

Thursday, November 1, 2007

How to control HTML element when it got focused

Today, a little bit difficult problem was resolved. The original question is like this:



  • Give a page which mainly contains 2 DIV areas and both have a table element inside it. Each of the DIV tag are set to hidden scroll bar, and these 2 tables are exactly have the same setting(cellspacing, cellpadding, etc. ), so that's making these 2 tables looks like an excel file which have a freezeed  bar.

  • There are many select boxes and check boxes in these 2 tables, and each element has a tab index value assigned, so that, tab key will navigate element between 2 tables.

  • There is another div element to control the scrolling status and make them scroll at the same time and scroll to same place.(by capture onScroll event.)

  • The problems is when you navigate tab from element to element , the synchronize scroll will be failed.


I tried a lot of ways, and finally find out, the problem lies on the default focus properties deal by Browser itself, and the browser takes control of how to show the element no matter how you set its position properties. And as most of the web programmer will do, we choose to use onfocus event, and can not get the right thing done.


The way to resolve this problem is using another different event : onbeforeactivate


Here is the demo file, you can download it and try it yourself. May be you have a better way to resolve this problem, please let me know: tonny.xu[a]gmail.com


[Download the demo page which works well]


[Download the demo page which doesn't work as we thought]

Thursday, October 25, 2007

How to import Maven Project to Eclipse with "pom.xml"

Struts 2.0.9 bundle shipped with a sample named show-case, if you want to use it in your Eclipse Europa, you need to add a Maven plugin for Eclipse Europa. Please visit this page:

After installed this plugin, you can read a project which shipped with pom.xml, but not normally build.xml. Please follow the steps:

  • Menu<File> ⇒ <Import...> ⇒ General[Maven 2 Project] ⇒ [Select the pom.xml File]

It will really cost you some time, maybe you can drink 2 cups+ coffee before you get your maven project work in your Eclipse. Have Fun.

Besides, because I installed some server adapters before I install Maven 2 Plugin, I had to reinstall Europa before I can use Maven plugin. So, I got a basic rule for eclipse user: Only install the plugin when you need it!

And moreover, the project you imported from Maven to Europa, you need to tweak a lot of configurations, and I suggest you just configure it manual than use Maven plugin.

The most simplest way to use Ant build file. ^_^

Why I can not find the Glassfish server adapter in my company's computer?(First post after I came to Japan)

Today, I was preparing the development environment for the new coming project, after installed Eclipse Europa and Glassfish, I need to combine these 2 things together so that I can continue my job.

As usual, I clicked the link below, but this time, I can not find the Glassfish server adapter.

(Click the "Download additional server adapters")008

(Though you can see that I have added GlassFish server adapter, but I will show you where is wrong.)

After I clicked the link, it automatically searching and installing available server adapters for me. My company has a proxy server which is opened on port 8080 and can both serve HTTP and HTTPS, so I setup the proxy server for Eclipse, and I found Geronimo very fast, but, BUT, I can not find this god damn GlassFish server adapter!!

WHY? I have checked the GlassFish project home page, and they said, Europa will search GlassFish's web site for the latest available plugin automatically, but why it don't show itself to my Europa??? and at the same time, BEA's server adapter is also missing from the available list.

Then I want to take a deep look into the Eclipse to find out whether those GlassFish guys really put their Web site URL to Europa, but to tell the truth, it's not a easy work. I can not find out where they configure the necessary URL to search for. Then after I wasted few time to redo it again, Finally, Suddenly, I found out why!

BECAUSE Some sites used a SSL connection for their god damn update URL, and I didn't configured to use proxy for SSL connection! While others are all using simply HTTP connection!

009

DAMN IT!

So, next time, don't forget to set up your SSL connection proxy!

Thursday, August 16, 2007

OutOfMemory:PermGen Space异常的处理和分析



Java程序员没有遇到过OutOfMemory简直就是不可能的事情!

可见在Java的世界中,太多的不确定因素导致Java运行程序直接崩溃,直接抛出OutOfMemory异常,而一旦遇到了这个问题,调查起来就非常的困难。在JDK 5.0以前,OutOfMemory只有这么一句话: java.lang.OutOfMemory Exception...基本上无从下手,无从分析。从JDK 5.0以后对OutOfMemory增加了许多的详细说明,为这个异常的分析提供了很大的便利。

这次遇到的问题就是会抛出OutOfMemory:PermGen Space的异常,这个异常非常有意思,根据【此文章】的描述,这是一个Sun JVM的bug,从2003年开始,一只到现在都没有解决。而且提出来的解决方案是使用JRockit。Bug产生的原因已经找到,就是因为JVM在分配PermGen Space的时候出现了PermGen Space不足的情况,默认情况下 PermGen的大小为64M,在不换用JRockit的情况下,可以在启动JVM的时候添加一个参数: -XX: MaxPermSize= 128m| 256m| 512m。

那么究竟什么是PermGen呢?

PermGen 原来是指Permanent Generation,本身是在Java的垃圾收集机制(GC)中产生的一个概念。Java的垃圾收集机制最早只是遍历所有的对象,如果发现某个对象没有被引用,则回收,这是在早期的Java 1.0和Java 1.1的时候的GC规则。慢慢的,这样一种“愚蠢的”GC算法成为了JVM性能的瓶颈,在拥有大量数据的Java应用程序中,GC的算法被高度强化,于是各种各样高效的JVM GC算法被发展了起来。从J2SE也就是Java 1.2开始,JVM引入了多种GC算法,其中一种用的非常多的就是Generational Collection,中文也叫做“分代收集法”。

分代收集法摈弃了对所有对象的遍历,而是采用一些经验属性去避免额外的工作(While naive garbage collection examines every live object in the heap, generational collection exploits several empirically observed properties of most applications to avoid extra work)。其中导入了一个非常关键的概念:infant mortality (幼儿死亡率),这表示越是新生成的变量或者对象,越容易被收集。下面一张图表示了对象的生命周期,横轴表示的是测试到对象的生命周期,纵轴表示在一个指定的生命周期上被回收的对象数量。

Histogram of lifetime

可以看到,在使用了分代收集法以后,年轻一代的对象被收集的比例最高。并且在内存中的对象会按照不同的“年龄”来划分,当一个年龄段的对象满了以后,在这个年龄段上就会发生垃圾收集,从最年轻的一代开始,一直到“永生代”,在内存中,所有的对象可以划分为很多代,最后的一代“永生代”就是“Permanent Generation”,这里就是直接引出“Permanent Generation”概念的地方。具体可以参考下图:



根据前面所说的情况,在分代垃圾收集的情况下会产生Permanent Generation的概念,而这个分代垃圾收集法是并行收集和并发收集的基础,所以Permanent Generation会一直存在,那么这个Permanent Generation究竟是做什么用的呢?这里保存了JVM中所有对象的类信息,包括类的元数据,还有方法描述等等,所以这一代内存垃圾收集算法是不一样的,在Java大程序的情况下,尤其是J2EE 或者说Java EE的大型应用程序上,Permanent Generation的大小会直接限定能载入类的数量和大小。

【解决办法】就是设定JVM启动的时候参数,可以如下设置:
java -XX: PermSize=64m -XX: MaxPermSize=128m

另外PermSize 和MaxPermSize如果设置为相同还可以在一定程度上提高性能,因为,PermSize在不断的变化中会需要转移其中的数据。如果固定了以后,则可以减少每次扩大PermSize带来的性能损失。

更多的请参考 【Java官方站点】

另外,还可以在Java启动的时候添加下面的参数来看GC的运行情况:
Java -verbosegc

(完)

Monday, August 13, 2007

My Dear Waiting

Thanks to xiayuan, thank u to make this wonderful flash album for waiting and thus I have chance to view so many lovely pictures.

2 view lovely waiting's historical growth, click me.

Saturday, August 11, 2007

Part II: How to use JConsole



接着前一篇Blog,现在JConsole已经可以启动了。而且JMX的配置方面也整理了一下。JConsole的具体使用界面上,有以下这样的一些截图:

连接上远端的JVM以后可以通过JConsole看到如下截图:



图1:“概述"界面



图2:“内存"界面



图3:“线程"界面



图4:“类"界面



图5:“VM 摘要"界面



图6:“MBean"界面

前面的5个标签页,主要通过图表的方式,将JVM的运行状况用图表的方式表示出来,可以看到内存,CPU,线程,类的概况,以及各个方面的详细图表情况,这样的图表方式可以非常方便的看到系统运行时的压力以及瓶颈在哪里。

第六张标签页显示了MBean的情况,MBean是JMX体系下的一种JavaBean,可以通过MBean所提供的方法,获取某个具体对象的运行情况,甚至可以得到一些对象的Dump数据。MBean非常的多,使用方法也比较麻烦,具体请参看下面的文章:Overview of Monitoring and Management.

(完)

Friday, August 10, 2007

Part I: How to use JConsole



JConsole是一个JDK中提供的JVM监视与管理的工具,主要是通过JMX来提供监视与管理。

默认情况下,JVM是不启动JMX服务,并提供被监视与被管理的能力的,必须在启动Java程序之前,在Java [opt] [app]中指定JMX的服务。JConsole提供本地和远程的两种监管方式,远程又可以分为直接监视,另外一种是通过JMX的服务器来管理。

根据目前我的需要,我举一个很简单的远程监管例子。因为JConsole本身也要耗费一定的资源,所以用远程方式是比较推荐的。

首先启动JConsole:



(因为在日文系统中,所以显示的为日文)

选择下面的Remote Access,输入host:portNumb的格式,另外输入用户名和密码,用户名和密码存储在<JAVA_HOME>/lib/management目录下,将jmxremote.password.template 复制为management.jmxremote.password(如果需要可以将文件的只读属性打开)。注意:这个文件是放在JRE的lib目录下。修改过以后的内容大致如下:
######################################
# File permissions of the jmxremote.password file
######################################
# ...

monitorRole 333
controlRole 333

另外,默认情况下,SSL是被打开的,需要在被监视的机器上生成相应的SSL证书。在Java中可以使用keytool来生成,具体步骤如下:

  • 在命令行输入 keytool -genkey

  • 其次输入 keytool -certreq 来生成一个签名过的证书

  • 将证书导入 keytool -import

    1. KeyTool具体的用法参考下面两个链接: (Solaris and Linux) (Windows).

    2. 以上第一个命令会产生一个.keystore的文件,保存在c:\documents and setting\<username>\.keystore




其中第三条将需要你将第二步生成的CSR文件提交给VeriSign这样公司验证,然后返回给你一个可以使用CER证书,然后在Import,我们主要目的是为了体验JConsole,所以这一步我们就略过。所以我们设定不使用SSL,具体设置如下:
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

注意:这两行将使用非认证,非SSL的情况,在真实的服务器上要小心,很容易留下漏洞的。

在Windows系统下,如果你将Tomcat安装为服务模式,则可以在右下角Tray 图标中点击配置Tomcat,可以在例如下图的属性中配置,非常的简单:



如果不使用Windows系统,则需要在Catalina.bat中改写Java运行的参数。

改完了Tomcat的配置,启动Tomcat。

在远程机器上点击JConsole的连接即可。JConsole的具体使用以及分析下次继续。

-------------------------------------------------------
JMX 的配置主要在Java程序启动的时候使用,这里重新整理了一下,更加清晰易懂一些:

方法1: 最简单的方式:不用密码,不用SSL
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=<define a random port>

方法2: 使用密码,不用SSL
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access

$CATALINA_BASE/conf/目录下添加jmxremote.password文件,并添加下面两行:

monitorRole <Your password>
controlRole <Your password>

$CATALINA_BASE/conf/目录下添加jmxremote.access文件,并添加下面两行:

monitorRole readOnly
controlRole readWrite

这两种方法是最简单的,并且第二种方法具有一定的安全性。具体可以参考Tomcat的文档:Monitoring

Thursday, August 9, 2007

Java的性能调校



以前做Java的项目,基本上不会遇到对性能进行调校的事情,但是最近遇到了一个比较严重的问题。具体情况不便详细说,但是大致情况如下:

  • Server: Intel Xeon Duo 2 *2

  • Memory: 4G

  • Disk: 3500G

  • JDK: 1.5.0_02

  • Web Server: Tomcat 5.5.19

  • Application: Some kind of OpenSource Project A which contains about 27M's package.


在Tomcat中配置了虚拟主机,运行了4份A的独立版本。运行起来以后,内存占用3G左右,在安装第5份的时候出现OutOfMemory的异常,由此引发了JVM性能调校的课题。

首先找到了一片比较浅显的文档:

其中提到了性能调校的几个要点:

  • 在所有对JVM的调校进行之前,先做以下的检查:

    1. 是否使用了最新的Java Release?

    2. Java是否更新到了最新的update?

    3. OS的补丁是否已经更新到最新?

    4. OS中是否还跑着其他许多不需要的应用程序?



  • 其次对JVM进行以下的调校:

    1. 是否使用了Server HotSpot?

    2. 有没有使用并行GC?(ParallelGC)

    3. 初始化堆内存(heap size)大小是多少?推荐使用物理内存的1/64

    4. 最大堆内存(heap size)是多少?推荐使用物理内存的1/4



  • 调校之前一定要准确的收集系统的运行情况数据并进行分析

    1. 可以参考使用JVM的管理与监视相关文档




在这样的指导下。我准备对我的系统做以下的操作步骤:

  • 使用JConsole观察Tomcat中JVM的使用情况,并进行分析

  • 使用jvmstat观察并进行分析

  • 在Tomcat的运行参数中添加 -Xprof 参数,进行Profiling


在Java tuning white paper中直接提到了一些GC调整的方式,在使用了ParallelGC以后,系统的运行确实能提高不少,但是具体的仍然有问题,等我的Monitoring和Profiling结束以后再报告。

Restart my blogging

Keeping going Tonny!

From Nov 2006 till now, I didn't write a single post, and now, I gonna restart my blogging life.

and I will stick to blogging until I feel tired again.