﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Read Sean</title><link>http://www.blogjava.net/sean/</link><description>Read me, read Sean.</description><language>zh-cn</language><lastBuildDate>Tue, 22 May 2012 07:51:36 GMT</lastBuildDate><pubDate>Tue, 22 May 2012 07:51:36 GMT</pubDate><ttl>60</ttl><item><title>独立blog开通欢迎订阅</title><link>http://www.blogjava.net/sean/archive/2012/01/31/369099.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 31 Jan 2012 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2012/01/31/369099.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/369099.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2012/01/31/369099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/369099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/369099.html</trackback:ping><description><![CDATA[<strong>URL:</strong> <a href="http://laogao.me/blog">http://laogao.me/blog</a><br />
<strong>RSS:</strong> <a href="http://laogao.me/blog/feed/">http://laogao.me/blog/feed/</a>
<img src ="http://www.blogjava.net/sean/aggbug/369099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2012-01-31 17:12 <a href="http://www.blogjava.net/sean/archive/2012/01/31/369099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学好编程，从写作开始。</title><link>http://www.blogjava.net/sean/archive/2011/08/03/355717.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Wed, 03 Aug 2011 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/08/03/355717.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/355717.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/08/03/355717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/355717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/355717.html</trackback:ping><description><![CDATA[<p>
可能很多人不以为然，写作和编程能有什么关系。</p>
<p>
首先，写作促进我们思考。程序员每天的工作，不论是学习新知识新技术、理解软件需求、阅读代码/文档、设计框架、还是实现业务逻辑，都离不开思考。相信很多人都有过这样的体验: 对于某个设计或知识点，你以为自己想清楚了，但真要让你解释给别人听，你又会觉得无从下手，几轮过后回想当初，之前所看到和相信的不过是错觉，当你完整的向其他人转述一遍之后，你才算是真正想明白了。其实这个道理和书桌上放一只橡皮鸭/填充玩偶(然后向它讲述你的想法)的做法是相通的，只不过写作本身不光整理了思路，还留下了文档，同时，写作的过程也是不断加深印象、提升信心的过程，可谓一举多得。</p>
<p>
其次，和写作一样，编程的主要目的是与世界交流，不论这个世界是指的机器的世界还是人的世界。要有效地与机器世界交流，你编写的代码必须符合一定的语法和范式，必须逻辑上讲得通，这样才有意义。而基本的写作训练可以让我们养成主动留意错别字、格式、拼写错误、逻辑错误的习惯。如C. A. R. Haore所说，我们宁要明显无错误的代码，不要无明显错误的代码。这点洁癖是好程序员必须具备的修养。这也是为什么我看到有明显拼写错误的程序员简历时，会直接把他/她们拉黑。同样地，我一直坚持认为，如果程序员写不出结构优良的纯文本文档，那么我们也不必指望他/她能够写出优雅的代码。除此之外，我们还可以再稍微发散一下: 开源项目那么多，满足类似需要的往往不止一个，为什么有的很成功，有的却无人问津? 主创/灵魂人物的写作能力，不论是代码、文档、邮件还是PPT，是很重要的分野。我相信，改变世界、影响更多的人，是很多程序员梦寐以求的，而要做到这一点，离不开写作。</p>
<p>
最后，写作通常是程序员的短板，亦即最容易低成本高产出的地方。我一直很不喜欢人为地给不同专业背景的人贴上文科和理科的标签，仿佛他们之间没有交集似的。这样做的最大问题在我看来是一方天然地觉得另一方的知识对自己没价值，以至于形成了类似"写作是文科生的菜"、"编程是理科才要学的东西"等谬误。就我的观察，计算机科班出身的同学，往往文字表达能力不够强，可能多少和这种心理暗示有关。如此明显的短板，如果能够引起广大程序员群体的重视，肯在写作上持续投入，效果一定是惊人的。</p>
<img src ="http://www.blogjava.net/sean/aggbug/355717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-08-03 23:49 <a href="http://www.blogjava.net/sean/archive/2011/08/03/355717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Windows环境下Apache最基本的调优方法</title><link>http://www.blogjava.net/sean/archive/2011/08/02/355618.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 02 Aug 2011 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/08/02/355618.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/355618.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/08/02/355618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/355618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/355618.html</trackback:ping><description><![CDATA[<p>
今天远程支持同事在Windows环境调优Apache服务器性能，记录在此，供需要的朋友参考。</p>
<p>
Java EE应用，同时部署在两个Tomcat(5.5.27)实例上，前面放了个Apache(httpd-2.2.19-win32-x86-no_ssl)，通过mod_jk(1.2.32)做负载均衡，同一台物理服务器，操作系统为64位的Windows Server 2003 SP2。现象是60+客户端，平均每个客户端每秒请求数2次，单个请求正常响应时间在500ms以内，即每秒冲进来120个请求，并发量最多在60上下，Apache就已不堪"重"负，静态资源响应时间都超过10s，同时Tomcat和数据库服务器均正常。凭我的经验，同样的压力直接压到Tomcat也不至于这么难看。看来问题出在Apache。</p>
<p>
首先修改httpd.conf配置文件，打开status模块：</p>
<p>
<code>
LoadModule status_module modules/mod_status.so<br/>
&lt;Location /status&gt;<br/>
&nbsp;&nbsp;SetHandler server-status<br/>
&nbsp;&nbsp;Order deny,allow<br/>
&nbsp;&nbsp;Deny from all<br/>
&nbsp;&nbsp;Allow from 127.0.0.1 #需要的话也可放开为all<br/>
&lt;/Location&gt;
</code></p>
<p>
这样我们就能通过/status页面查看服务器当前的状态信息，结果观察到worker(即线程)数仅为64！坑爹啊！难怪撑不住。我记得以前Windows下面的Apache默认线程数没这么小的。找准问题，接下来就好办了：</p>
<p>
<code>
&lt;IfModule mpm_winnt.c&gt;<br/>
&nbsp&nbsp;ThreadsPerChild 300<br/>
&nbsp;&nbsp;MaxRequestsPerChild 0<br/>
&lt;/IfModule&gt;
</code></p>
<p>
稍微解释一下：mpm_winnt.c是Apache为Windows NT提供的MPM (Multi-Processing Module)，对应到Linux环境下，则有prefork.c(多进程/每进程1个线程)和worker.c(多进程+多线程)两种MPM可选。Windows下面只会有父与子两个进程，因此单个子进程能同时起多少线程(ThreadsPerChild)就成了调优的关键。另一个参数MaxRequestsPerChild的含义是单个子进程累计最多处理到少个请求，超过该值则退出重启，这是出于防止内存泄露慢慢拖垮整个服务器而做的防御性措施，0表示不做此限制。</p>
<p>
新配置上线后，客户端数量顺利冲上200+。Case closed.</p>
<img src ="http://www.blogjava.net/sean/aggbug/355618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-08-02 21:04 <a href="http://www.blogjava.net/sean/archive/2011/08/02/355618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pyPdf - 用Python方便的处理PDF文档</title><link>http://www.blogjava.net/sean/archive/2011/07/26/355089.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 26 Jul 2011 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/07/26/355089.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/355089.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/07/26/355089.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/355089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/355089.html</trackback:ping><description><![CDATA[<br />
今天临时有个需求，那就是给某PDF文档切边，以方便在Kindle 3的6吋屏上阅读。<br />
<br />
很久没碰Python了，不过我相信用Python一定有办法解决这个需求，于是经过简单的googling，便发现了这个pyPdf库 (&nbsp;<a href="http://pybrary.net/pyPdf/" target="_blank">http://pybrary.net/pyPdf/</a>&nbsp;) ，操作起来相当直接易懂，把代码贴在这儿，做个记录。<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;pyPdf&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;PdfFileWriter,&nbsp;PdfFileReader<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">pdf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;PdfFileReader(file(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">original.pdf</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">rb</span><span style="color: #800000; ">'</span><span style="color: #000000; ">))<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">out&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;PdfFileWriter()<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;page&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;pdf.pages:<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;page.mediaBox.upperRight&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">580</span><span style="color: #000000; ">,</span><span style="color: #000000; ">800</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;page.mediaBox.lowerLeft&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,</span><span style="color: #000000; ">232</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;out.addPage(page)<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">ous&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;file(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">target.pdf</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">wb</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">out.write(ous)<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">ous.close()<br />
</span></div>
<br />
Enjoy!<br />
<img src ="http://www.blogjava.net/sean/aggbug/355089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-07-26 22:25 <a href="http://www.blogjava.net/sean/archive/2011/07/26/355089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"上海"是如何变成"涓婃捣"的？</title><link>http://www.blogjava.net/sean/archive/2011/03/29/347243.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Tue, 29 Mar 2011 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/03/29/347243.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/347243.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/03/29/347243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/347243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/347243.html</trackback:ping><description><![CDATA[<br/ />
<p>今天帮同事解决一个邮件乱码的问题，简记于此。
</p>
<p>邮件正文就不贴了，有一段从上下文判断明显应该是"上海"，却显示成了"涓..."，于是自然而然的拿出"上"字和"涓"字来分析。

</p>
<p>通过简单的Groovy脚本对这两个汉字分别按gbk和utf-8编码，并将得到的byte[]转换成二进制表示输出如下：

</p>
<p><code>
== 上 ==<br/ />
11001001 11001111<br/ />   
11100100 10111000 10001010 <br/ />   
== 涓 ==<br/ />
11100100 10111000<br/ />   
11100110 10110110 10010011<br/ />    
</code>
</p>
<p>注意"上"字的第2排前两组和"涓"字第1排的两组byte正好相同，于是问题迎刃而解，乱码是由于邮件以utf-8编码后被错误的以gbk解码（随后又重新编码成utf-8）造成的。</p>
<p>关键代码：</p>
<p><code>
void showBytes(String input) {<br/ />
&nbsp;&nbsp;println("== " + input + " ==")<br/ />
&nbsp;&nbsp;b = input.getBytes("gbk")<br/ />
&nbsp;&nbsp;b.each { print Integer.toBinaryString(it).substring(24) + ' ' }<br/ />
&nbsp;&nbsp;println()<br/ />
&nbsp;&nbsp;b = input.getBytes("utf8")<br/ />
&nbsp;&nbsp;b.each { print Integer.toBinaryString(it).substring(24) + ' ' }<br/ />
&nbsp;&nbsp;println()<br/ />
}<br/ />
</code>
</p>




<img src ="http://www.blogjava.net/sean/aggbug/347243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-03-29 23:50 <a href="http://www.blogjava.net/sean/archive/2011/03/29/347243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 如何给SVN资源库降级</title><link>http://www.blogjava.net/sean/archive/2011/02/16/344471.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Wed, 16 Feb 2011 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/02/16/344471.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/344471.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/02/16/344471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/344471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/344471.html</trackback:ping><description><![CDATA[<br/ /><p>问题起因: 帮同事排查一个SVN资源库导入后无法使用的问题，checkout时报错<br/ />&nbsp;&nbsp;Expected FS format '2'; found format '3'<br/ />&nbsp;&nbsp;期待文件系统(FS)格式 &#8220;2&#8221;；找到格式&#8220;3&#8221;<br/ /></p><p>熟悉SVN的朋友应该知道，Subversion大版本更新时有可能会对其文件格式进行调整，因此内部有文件格式版本的说法，以上报错信息在网上搜一下就知道，版本2和版本3分别对应Subversion的1.4.x和1.5.x，于是问题归结为如何给资源库降级，从而得到与1.4兼容的dump文件。方法很简单，记录如下，供需要的朋友参考:</p><p>首先在1.5.x的Subversion环境下新建一个与1.4.x兼容的资源库<br/ />&nbsp;&nbsp;svnadmin --pre-1.5-compatible create project01</p><p>然后将之前无法正常导入1.4.x的dump文件(dumpfile.old)导入<br/ />&nbsp;&nbsp;svnadmin load project01 < dumpfile.old</p><p>最后再做一次导出即可<br/ />&nbsp;&nbsp;svnadmin dump project01 > dumpfule.new</p><p>回到1.4.x的Subversion环境，新的dump文件(dumpfile.new)就可以正常导入和使用了。</p>
<img src ="http://www.blogjava.net/sean/aggbug/344471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-02-16 19:34 <a href="http://www.blogjava.net/sean/archive/2011/02/16/344471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh+tsocks - 远程办公利器</title><link>http://www.blogjava.net/sean/archive/2011/02/09/343994.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Wed, 09 Feb 2011 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/02/09/343994.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/343994.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/02/09/343994.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/343994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/343994.html</trackback:ping><description><![CDATA[<br />
<p>设想一下这样的场景: 你出差在外，或者生病在家，有个紧急的需求要处理，涉及到数个源代码文件的改动，你亲自修改需要10分钟，电话和在公司的同伴沟通然后由他/她来修改则需要1小时。公司svn服务仅支持svn://协议，且仅限内网访问，而你只有一个ssh账号可以远程登录到公司某台Linux/UNIX服务器。</p>
<p>你暗自庆幸，幸好管理员有先见之明，为你留了个ssh口子，这样至少你还可以ssh上去通过命令行的方式在服务器上做svn checkout，vim ...和svn commit。不过如果你认为这就是全部，那就太小瞧ssh了。</p>
<p>ssh有个命令行参数 -D [地址:]端口，含义是在某个本地地址的某个端口上开SOCKS服务进行监听，把这个端口的数据通信以加密形式转发到ssh的另一端。你说好，我有了一个SOCKS服务器，但我又不是要上网走代理，svn也并不天然支持SOCKS啊，有什么用呢? 嗯，这正是tsocks的用武之地，它能透明的让普通应用程序也走SOCKS，安装方法很简单: 主流的Linux发行版，如Debian、Archlinux等的默认软件仓库已经自带了tsocks，通常只需要apt-get install或pacman -S即可，Mac OS X下则可以利用MacPorts安装，然后修改配置文件/etc/tsocks.conf(MacPorts会安装到/opt/local/etc目录)，可以在样本文件tsocks.conf.sample的基础上修改，通常只要配置server = 127.0.0.1即可，其他都可以默认。</p>
<p>有了这些打底，剩下的就很简单了: 首先 ssh -D 1080 -f -N 用户名@公司服务器的公网地址 在本机的1080端口开启SOCKS服务；然后按照你平时使用svn的习惯，只是在命令前加上tsocks，类似这样: tsocks svn up 或者 tsocks svn ci -m 'blahblahblah' 等等即可，本地的svn sandbox不需要任何修改。</p>
<p>这个例子可以说只是冰山一角，不论是ssh还是tsocks都还有更高级的用法，而这个通道一旦打通，它的效果就像是简化版的VPN，除了ping之类的少数命令外，几乎就跟你在公司做各种操作没有两样，所以，发挥你的想象力吧 :)</p>

<img src ="http://www.blogjava.net/sean/aggbug/343994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-02-09 22:37 <a href="http://www.blogjava.net/sean/archive/2011/02/09/343994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让统一版本的Eclipse RCP应用同时支持多个平台</title><link>http://www.blogjava.net/sean/archive/2011/01/30/343769.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Sun, 30 Jan 2011 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/01/30/343769.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/343769.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/01/30/343769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/343769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/343769.html</trackback:ping><description><![CDATA[<br/ /><p>和Swing应用的直接跨平台不同，SWT/RCP应用要想同时支持不同平台，需要做些特殊的配置，不过并不复杂，记录在此，希望能帮到有需要的朋友。目前win32、32位Linux、64位Linux和Mac OS X基本上就覆盖了所有主流的桌面操作系统，本文将以同时支持这四种OS为例来进行讲解。</p>
<p>首先是下载对应版本的RCP框架在不同操作系统的插件，将它们放在同一个plugins目录，比如你可以用win32为基础，然后添加针对其他平台的如下插件: </p>
<p>org.eclipse.core.filesystem<br/ />org.eclipse.core.filesystem.win32.x86<br/ />org.eclipse.core.filesystem.linux.x86<br/ />org.eclipse.core.filesystem.linux.x86_64<br/ />org.eclipse.core.filesystem.macosx</p>
<p>org.eclipse.core.net<br/ />org.eclipse.core.net.win32.x86<br/ />org.eclipse.core.net.linux.x86</p>
<p>org.eclipse.core.resources<br/ />org.eclipse.core.resources.win32.x86</p>
<p>org.eclipse.equinox.launcher<br/ />org.eclipse.equinox.launcher.win32.win32.x86<br/ />org.eclipse.equinox.launcher.gtk.linux.x86<br/ />org.eclipse.equinox.launcher.gtk.linux.x86_64<br/ />org.eclipse.equinox.launcher.carbon.macosx</p>
<p>org.eclipse.equinox.security<br/ />org.eclipse.equinox.security.win32.x86<br/ />org.eclipse.equinox.security.macosx</p>
<p>org.eclipse.swt<br/ />org.eclipse.swt.win32.win32.x86<br/ />org.eclipse.swt.gtk.linux.x86<br/ />org.eclipse.swt.gtk.linux.x86_64<br/ />org.eclipse.swt.carbon.macosx</p>
<p>接下来将不同平台下的eclipse可执行文件(Windows下面是eclipe.exe，Linux下是eclipse，Mac OS X下面是Eclipse.app)放到不同的子目录下，当然，如果你的RCP应用有别的名称，也可以重命名eclipse可执行文件，按照不同平台的规范更换图标，然后修改.ini文件让它的-startup和-startup.libraray参数指向相对路径中正确版本的插件即可。</p>
<p>最后分享一下我们软件部署的机制: 按照前面介绍的方式打包的应用程序，交到用户手里并不是很友好，因为需要他/她自己再做一次判断，当前的操作系统是什么，然后打开不同的目录去点击不同的可执行文件。我们的做法是单独提供一个Swing程序，在客户端自动判断OS，然后自动调用不同版本的可执行文件，同时，这个Swing程序被做成Java Web Start，把整个RCP客户端的下载和同步也处理掉，这样，对用户而言，整个过程就透明了，只需要一个JNLP，剩下的工作完全自动化。</p>

<img src ="http://www.blogjava.net/sean/aggbug/343769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-01-30 12:17 <a href="http://www.blogjava.net/sean/archive/2011/01/30/343769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java命令行实用工具jps和jstat</title><link>http://www.blogjava.net/sean/archive/2011/01/27/343620.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Thu, 27 Jan 2011 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/01/27/343620.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/343620.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/01/27/343620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/343620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/343620.html</trackback:ping><description><![CDATA[<br/ /><p>在Linux或其他UNIX和类UNIX环境下，ps命令想必大家都不陌生，我相信也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' 这样的管道命令来找出Java进程的pid。常言道，Java并非真的"跨平台"，它自己就是平台。作为平台，当然也有些基本的工具，让我们可以用更简单、更统一，同时又是非侵入的方式来查询进程相关信息。今天我们就来认识一下其中的两个。</p>
<p><strong>jps</strong></p>
<p>顾名思义，它对应到UNIX的ps命令。用法如下: </p>
<p>jps [ options ] [ hostid ]</p>
<p>其中，options可以用 -q (安静) -m (输出传递给main方法的参数) -l (显示完整路径) -v (显示传递给JVM的命令行参数) -V (显示通过flag文件传递给JVM的参数) -J (和其他Java工具类似用于传递参数给命令本身要调用的java进程)；hostid是主机id，默认localhost。</p>
<p><strong>jstat</strong></p>
<p>用于输出给定java进程的统计信息。用法如下: </p>
<p>jstat -options 可以列出当前JVM版本支持的选项，常见的有 -class (类加载器) -compiler (JIT) -gc (GC堆状态) -gccapacity (各区大小) -gccause (最近一次GC统计和原因) -gcnew (新区统计) -gcnewcapacity (新区大小) -gcold (老区统计) -gcoldcapacity (老区大小) -gcpermcapacity (永久区大小) -gcutil (GC统计汇总) -printcompilation (HotSpot编译统计)</p>
<p>假定你要监控的Java进程号是12345，那么<br />
jstat -gcutil -t 12345 200 300 即可每200毫秒连续打印300次带有时间戳的GC统计信息。</p>
<p>简单解释一下: -gcutil是传入的option；必选，-t是打印时间戳，是以目标JVM启动时间为起点计算的，可选；12345是vmid/pid，和我们从jps拿到的是一样的，必选；200是监控时间间隔，可选，不提供就意味着单次输出；300是最大输出次数，可选，不提供且监控时间间隔有值的话，就是无限期打印下去。</p>
<p>具体输出明细的解释请参考官方文档 <a href="http://download.oracle.com/javase/6/docs/technotes/tools/share/jstat.html" target="_blank">http://download.oracle.com/javase/6/docs/technotes/tools/share/jstat.html</a></p>

<img src ="http://www.blogjava.net/sean/aggbug/343620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-01-27 12:04 <a href="http://www.blogjava.net/sean/archive/2011/01/27/343620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Emacs字符编码相关指令</title><link>http://www.blogjava.net/sean/archive/2011/01/05/342345.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Wed, 05 Jan 2011 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/01/05/342345.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/342345.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/01/05/342345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/342345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/342345.html</trackback:ping><description><![CDATA[<br />
<p>在Vim中，我们可以通过set fencs=utf-8,gbk告诉它按照先utf-8后gbk的顺序自动识别打开文件的字符编码。Emacs也有一组字符编码相关指令，整理如下：</p>
<p>指令全名：set-buffer-file-coding-system<br />
指令作用：改变当前buffer的编码<br />
调用方法：(以目标编码gbk为例)<br />
C-x &lt;RET&gt; f gbk &lt;RET&gt;<br />
该指令还可以用于改变当前buffer的换行习惯(编码参数用dos或unix，对应\r\n或\n)。</p>
<p>指令全名：universal-coding-system-argument<br />
指令作用：指定紧随其后的命令(如C-x C-f或C-x C-w等)所采用的编码<br />
调用方法：(以目标编码gbk为例)<br />
C-x &lt;RET&gt; c gbk &lt;RET&gt;</p>
<p>指令全名：revert-buffer-with-coding-system<br />
指令作用：用指定编码重读当前buffer(如果打开时用错了编码)<br />
调用方法：(以目标编码gbk为例)<br />
C-x &lt;RET&gt; r gbk &lt;RET&gt;</p>
<p>指令全名：recode-region<br />
指令作用：将以错误编码解码的选区以指定编码重新解码<br />
调用方法：(以目标编码gbk为例)<br />
M-x recode-region &lt;RET&gt; gbk &lt;RET&gt; utf-8 &lt;RET&gt;</p>
<p>除了这些操作外，还有一种方法，那就是在文件开始的部分给出如下形式的指令，直接告诉编辑器在打开和保存时应采用的编码：<br />
-*- coding: gbk -*-<br />
接触过Python的同学是不是觉得很眼熟?</p>
<p>[补充] 查看当前编码选择的命令为：<br />
M-x describe-coding-system &lt;RET&gt; 或 C-h C &lt;RET&gt;<br />
也可在回车前输入具体的编码名称(如gbk)以查看详细说明。</p>

<img src ="http://www.blogjava.net/sean/aggbug/342345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-01-05 13:31 <a href="http://www.blogjava.net/sean/archive/2011/01/05/342345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011年要做的事</title><link>http://www.blogjava.net/sean/archive/2011/01/02/342169.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Sun, 02 Jan 2011 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/01/02/342169.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/342169.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/01/02/342169.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/342169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/342169.html</trackback:ping><description><![CDATA[<br/ /><p>为克服拖延症，在此列出2011年要做的事，给未来的自己监督：</p><p>1- 继续去年未完成的产品改造，换一种更稳妥的方式推进；<br/ />2- 积极参与社区交流活动，不论线上还是线下；<br/ />3- 深入学习Scala，辅以Clojure和Haskell；<br/ />4- 系统学习PostgreSQL；<br/ />5- 全面使用Emacs；<br/ />6- 开始读Linux源码；<br/ />7- 重读《红楼梦》；<br/ />8- 至少读两本英文原著；<br/ />9- 带儿子回一趟老家。<br/ /></p><p>就这样。</p><img src ="http://www.blogjava.net/sean/aggbug/342169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-01-02 20:08 <a href="http://www.blogjava.net/sean/archive/2011/01/02/342169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从阅读英文小说原著谈突破</title><link>http://www.blogjava.net/sean/archive/2011/01/01/342128.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Sat, 01 Jan 2011 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2011/01/01/342128.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/342128.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2011/01/01/342128.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/342128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/342128.html</trackback:ping><description><![CDATA[<br /><p>回想大学时代，我第一本从头到尾读完的英文小说是Arthur Hailey的《Airport》，是在大学门口的外研书店买的。当时的想法很单纯：要证明自己的英文阅读水准不差，光靠新闻、应用文和专业文献是不够的，小说占到native speaker们日常阅读相当大的比重。如果能够啃下一本真正原汁原味的长篇小说，至少说明他们读什么，我也能读、能欣赏。最终花了一个礼拜，利用课余时间读完了。</p><p>这个看似不起眼的"成就"，对我自信心的建立至关重要。没有这个打底，后面恐怕也不会在知识"原始积累"的时候能有心有力去大量地阅读原版或影印版的书籍，并且往往能比别人更准确地把握原著要表达的意思。这个阅读小说原著的习惯一直延续到今天，量虽然不大，一直都有意识地在进行，比如前几年的《The Da Vinci Code》，这几年的《Animal Farm》、《1984》、《Twilight》等等。</p><p>就个人成长而言，光靠别人给你压力，给你找突破点是不够的。经验告诉我，影响自己最深远的，通常是那些自己给自己找的突破点。你能走多远，成为什么样的人，很大程度上取决于你自己。</p><img src ="http://www.blogjava.net/sean/aggbug/342128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2011-01-01 21:09 <a href="http://www.blogjava.net/sean/archive/2011/01/01/342128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《开源SOA》译者序</title><link>http://www.blogjava.net/sean/archive/2010/12/30/342003.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Thu, 30 Dec 2010 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2010/12/30/342003.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/342003.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2010/12/30/342003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/342003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/342003.html</trackback:ping><description><![CDATA[<br/ /><p>相信大家对SOA这个词并不陌生，很多企业都在讲我们要上SOA，也有很多企业在呼应：我们能帮忙。但究竟什么是SOA，SOA能做什么，如何在企业中推行SOA，采用什么样的技术，这些都是摆在我们面前的现实问题。</p><p>我为什么会对这本书产生兴趣？这要从我的工作说起。我从2004年开始投身到企业软件开发当中，具体而言，就是医院管理信息系统（HIS）。我们的团队，一直都是扮演独立软件厂商（ISV）的角色，为国内大中型医院提供高品质的HIS产品和服务。</p>
<p>接触过医院信息化的朋友都知道，医院对软件的需求是多方面的，通常很难有一家厂商能够提供从ICU/CCU、LIS、RIS/PACS到财务软件的全线产品和服务。而HIS在所有这些系统中，管理着医院的核心运营，贯穿医院业务的各个环节，经常需要和第三方系统进行通信。如何能更好地集成医院的各类资产，为医院这个特殊的企业提供优质的服务，与医院一同成长，就成为我们关注的焦点。</p>
<p>作为独立软件厂商，同时也考虑到医院的实际承受能力，我们很难说服自己和医院接受那些闭源SOA大厂高昂的产品服务价格。同时，出于对灵活配置和伸缩性的要求，我们在一开始就把目光锁定在开源产品上。 </p>
<p>SOA为我们提供了架构设计丰富的营养和施展拳脚的平台。这本书要带给大家的，正是如何用开源的产品实现完整的SOA。在这个过程中，作者为我们分析了SOA的方方面面，对每个环节采用的技术都做了大量翔实的评估和介绍，对每个关键点都给出了详细的说明和完整的源代码。</p>
<p>如果你是企业主管、业务专家，相信你读完本书，会对SOA有更清楚的认识，对SOA能为你的企业带来什么样的价值会有更深的理解和体会。</p>
<p>如果你是架构师或程序员，相信你也和我一样，在阅读完本书之后，能更明白SOA的本质，掌握实际开发SOA的技能，懂得如何在企业或现有系统中引入SOA的思想。</p>
<p>得知博文视点引进并准备翻译这本书时，网上传来了质疑的声音，认为开源加上SOA，受众太小。我却不这么看。中国的软件产业，并非只剩下互联网和外包，除了叫得出名字的大公司，有大量中小型的独立软件厂商在暗自努力，他们在网上的曝光率很低，但都在踏踏实实地做事。他们是可爱、可敬的一批人，做的是幕后支撑企业运营的重要产品和服务，这本书也是为他们准备的。</p>
<p>在这里，我要特别感谢武汉博文视点的周筠老师，给我翻译本书的机会，与她相识是我的荣幸。感谢莫锡昌、成硕为审稿付出的宝贵时间。感谢编辑卢鸫翔、刘唯一和其他所有幕后工作者的辛勤劳动。</p>
<p>我还要感谢在事业上给予我重要帮助的两个人：毛颖和林勇，是他们的信任和鼓励让我走到今天。</p>
<p>最后要感谢我的家人，为了让我安心翻译这本书，牺牲了太多的周末和假期，谢谢你们对我的包容和支持，无私的爱当然要用无私的爱来回报，我爱你们！</p>
<p>在本书的翻译过程中，译者虽已尽力确保专业术语符合中文读者的习惯，也尽力将原著的真实意图以符合中文习惯的方式呈现给大家，毕竟水平有限，书中的问题和疏漏之处在所难免，恳请各位读者朋友批评指正，联系邮箱：gaoyuxiang.soa@gmail.com。</p>
<p>高宇翔</p>
<p>2010年11月于上海</p>

<img src ="http://www.blogjava.net/sean/aggbug/342003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2010-12-30 16:20 <a href="http://www.blogjava.net/sean/archive/2010/12/30/342003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2010年12月22日 晴 命中注定的架构师</title><link>http://www.blogjava.net/sean/archive/2010/12/22/341353.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Wed, 22 Dec 2010 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2010/12/22/341353.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/341353.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2010/12/22/341353.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/341353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/341353.html</trackback:ping><description><![CDATA[<p>2010年即将过去，在这一年里，我做了什么？找到自我了吗？我问自己。</p>
<p>整个2010年，我大概有这么几件事值得一提：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;首先，我去年向公司争取的产品改造计划，执行到中段，可耻地失败了；<br />
&nbsp;&nbsp;&nbsp;&nbsp;其次，我有幸参与翻译了两本外版IT书：<a href="http://book.douban.com/subject/5377415/" target="_blank">《Scala编程》</a>和<a href="http://book.douban.com/subject/5386171/" target="_blank">《开源SOA》</a>，目前两本书均已上架；<br />
&nbsp;&nbsp;&nbsp;&nbsp;再次，我下了很大的决心转行做出版，最终也可耻地失败了。</p>
<p>不过，我找到自我了吗？我想是的：命中注定做架构师。</p>
<p>这两天在读周国平的《人生哲思录》：</p>
<p>&#8220;古希腊哲人赫拉克利特说：&#8216;一个人的性格就是他的命运。&#8217;这句话包含两层意思：一，对于每个人来说，性格是与生俱来、伴随终身的，永远不可摆脱，如同不可摆脱命运一样；二，性格决定了一个人在此生此世的命运&#8230;&#8230;赫拉克利特的名言的真正含义是：一个人应该认清自己的天性，过最适合于他的天性的生活，而对他而言这就是最好的生活&#8230;&#8230;为别人对你的好感、承认、报偿做的事，如果别人不承认，便等于零。为自己的良心、才能、生命做的事，即使没有一个人承认，也丝毫无损。&#8221;</p>
<p>我想，这就是为什么人在抉择时要追随自己的内心和天性，因为这才是对自己最合理的安排。</p>
<img src ="http://www.blogjava.net/sean/aggbug/341353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2010-12-22 23:22 <a href="http://www.blogjava.net/sean/archive/2010/12/22/341353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2010年1月31日 阵雨</title><link>http://www.blogjava.net/sean/archive/2010/01/31/311418.html</link><dc:creator>laogao</dc:creator><author>laogao</author><pubDate>Sun, 31 Jan 2010 13:25:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2010/01/31/311418.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/311418.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2010/01/31/311418.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/311418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/311418.html</trackback:ping><description><![CDATA[<br /><em>这篇日记写给自己，发散式+意识流，赶时间的朋友请放心略过。</em><br /><br />进入2010年，头1个月，到今天是最后1天，家里的事暂不去提，这个月是我参加工作以来感觉最累的1个月。<br /><br />加入现在的这支创业团队4年，我们的产品，从无到有(1.0)，到现在的2.x，倾注了很多人的心血，我们的团队，在后面的这2年多，也经历和见证了很多伤感的离别，"元老"级的人物，已经屈指可数。万事不能尽如人意，能有今天的结果，也许应该庆幸而不是哀伤，至少产品还在，至少团队还在运转。但未来会如何，谁也无法预知，我也不敢多想，我只知道，工作带给我的幸福感，正在不停的创造新低。<br /><br />创业型团队的一大特点，就是一个人要同时承担多个角色的职能，而且比其他团队更容易受到外部环境的冲击。为了生存，有时不得不做一些不相关的项目、不相关的事，活下来比什么都重要，你东西再好，技术再牛逼，没人要就是没人要，没资源就是没资源，哭爹喊娘，没人理你。<br /><br />去年年底，我们的老板带着我们一起，并入了现在这家集团公司，一个比我们大得多的团队。按说这应该是好事，我们也不必像原来那样担惊受怕，但事实证明这个想法非常天真，外部环境的冲击比以前更加真实的发生在我们身边，无时无刻不在提醒我们它的存在。以前我们卖力做事，一狠心一咬牙一跺脚，创业嘛，为整个团队付出，咱认了；现在我们卖力做事，不知道是在为谁付出：累的是你自己，收获的是别人。从创业的角度来说，我们失败了，我们为创业比别人多付出的那些汗水，除了回忆，现在看，也只有回忆了。对我们这个小团队来说，情形依然是：为了生存，有时不得不做一些不相关的项目、不相关的事，活下来比什么都重要，你东西再好，技术再牛逼，没人要就是没人要，没资源就是没资源，哭爹喊娘，没人理你。<br /><br />有人说，其实哪里都一样。这样想可能会让人更快乐，不那么痛苦，但我很清楚，这是精神毒药，如果事实果真如此，那就不仅仅是令人伤感苦闷，而是彻彻底底的让人绝望了。<br /><br />物以类聚，人以群分。我的群在哪儿？<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/311418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">laogao</a> 2010-01-31 21:25 <a href="http://www.blogjava.net/sean/archive/2010/01/31/311418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>
