<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AgilePHP &#187; 技术</title>
	<atom:link href="http://www.agilephp.net/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agilephp.net</link>
	<description>开发可以敏捷，人生需要慢慢体味</description>
	<lastBuildDate>Fri, 09 Jul 2010 14:37:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Xen Cloud Platform 0.1.1</title>
		<link>http://www.agilephp.net/2010/05/xen-cloud-platform-0-1-1/</link>
		<comments>http://www.agilephp.net/2010/05/xen-cloud-platform-0-1-1/#comments</comments>
		<pubDate>Sat, 22 May 2010 01:50:49 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[云计算]]></category>
		<category><![CDATA[虚拟化]]></category>
		<category><![CDATA[xcp]]></category>
		<category><![CDATA[xen]]></category>
		<category><![CDATA[xen cloud platform]]></category>
		<category><![CDATA[xencenter]]></category>
		<category><![CDATA[xenserver]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/05/xen-cloud-platform-0-1-1/</guid>
		<description><![CDATA[Xen Cloud Platform 是一个基本Xen虚拟化技术的云计算基础平台，这半年一直在使用另外一个商业版本XenServer，少对XCP有所关注，今天看了它的官方主页，XCP今年有一个新的版本发布，版本号是0.1.1，我去年使用XCP的时候，其版本还是0.1，这里对新版本做一个简单的介绍。
版本0.1.1发布于今年1月18号（汗，现在才知道），新增加的功能包括：

Openvswitch 
XCP Console Documentation
VNC Console Proxy and Web Front-End 
Standalone Front-End &#8211; *openxencenter*
VM Lifecycle Queuing Deadlock Fixed 
Rare Post-Fork() Spinning XAPI Process Fixed 
Active Directory Authentication Fixes 
Memory Ballooning Fixes

 其中描述的单独的前端就是XenCenter的一个开源Python实现，试用了一下，与XenCenter 5.5还是有一定差距的，但是总算是有一个前端可以选择了，之前用xe cli和Web管理太痛苦了，详细信息和下载，可以到XCP的主页查看。










Related Posts

		Xen Cloud Platform
	
<!-- Easy AdSense V2.90 -->
<!-- Post[count: 2] -->
<div class="ezAdsense adsense adsense-leadout" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "pub-1450467177950189";
/* AgilePHP Lite Ad */
google_ad_slot = "7710335250";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<!-- Easy AdSense V2.90 -->



<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/xen-cloud-platform/" rel="bookmark">Xen Cloud Platform</a><!-- (15.1355)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xen.org/products/cloudxen.html" target="_blank">Xen Cloud Platform</a> 是一个基本Xen虚拟化技术的云计算基础平台，这半年一直在使用另外一个商业版本XenServer，少对XCP有所关注，今天看了它的官方主页，XCP今年有一个新的版本发布，版本号是0.1.1，我去年使用XCP的时候，其版本还是0.1，这里对新版本做一个简单的介绍。</p>
<p>版本0.1.1发布于今年1月18号（汗，现在才知道），新增加的功能包括：</p>
<ul>
<li>Openvswitch </li>
<li>XCP Console <a href="http://foss-boss.blogspot.com/2010/01/taming-xen-cloud-platform-consoles.html">Documentation</a></li>
<li><a href="http://www.xvpsource.org">VNC Console Proxy</a> and Web Front-End </li>
<li><a href="http://www.openxencenter.com">Standalone Front-End</a> &#8211; *openxencenter*</li>
<li>VM Lifecycle Queuing Deadlock Fixed </li>
<li>Rare Post-Fork() Spinning XAPI Process Fixed </li>
<li>Active Directory Authentication Fixes </li>
<li>Memory Ballooning Fixes</li>
</ul>
<p> 其中描述的单独的前端就是XenCenter的一个开源Python实现，试用了一下，与XenCenter 5.5还是有一定差距的，但是总算是有一个前端可以选择了，之前用xe cli和Web管理太痛苦了，详细信息和下载，可以到XCP的<a href="http://www.xen.org/products/cloudxen.html" target="_blank">主页</a>查看。</p>
<!-- Easy AdSense V2.90 -->
<!-- Post[count: 3] -->
<div class="ezAdsense adsense adsense-leadout" style="float:left;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "pub-1450467177950189";
/* AgilePHP Lite Ad */
google_ad_slot = "7710335250";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<!-- Easy AdSense V2.90 -->



<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/xen-cloud-platform/" rel="bookmark">Xen Cloud Platform</a><!-- (15.1355)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/05/xen-cloud-platform-0-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用JDK进行Performance Tuning</title>
		<link>http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/</link>
		<comments>http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 13:40:41 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[jconsole]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[jmap]]></category>
		<category><![CDATA[jps]]></category>
		<category><![CDATA[jvisualvm]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/04/%e4%bd%bf%e7%94%a8jdk%e8%bf%9b%e8%a1%8cperformance-tuning/</guid>
		<description><![CDATA[JDK里有三个很好用的工具，jmap，jconsole和jvisualvm，三个工具都各有所侧重，但是如果你的系统遇到性能瓶颈（内存不足或是CPU占用率过高），你可以通过这三个工具来发现应用里的hot spot。我今天只记一下大概的用法，给自己做个备忘，详细的使用说明，等忙完了这段时间，整理一下。
先介绍一个小工具，jps，这也是jdk自带的工具之一，可以列出系统里所有的java进程。
jmap可以查看程序中堆的使用情况，具体的用法是：
jmap –histo:live &#60;pid&#62;；
以及可以将堆dump到一个文件，命令是：
jmap –dump:format=b,file=heap.bin &#60;pid&#62;；
请在&#60;pid&#62;处填入相应的进程的id。
jconsole可以查看某个java进程的内存使用、CPU占用率等，
如果想要远程查看某一java程序，则需要在该程序启动参数里加下如下参数：
-Dcom.sun.management.jmxremote   -Dcom.sun.management.jmxremote.port=9001     -Dcom.sun.management.jmxremote.authenticate=false    -Dcom.sun.management.jmxremote.ssl=false
上文使用的9001是监听的端口号，你可以指定其他的值。然后在你的终端键入jconsole，选择连接远程进程，并填入相应的主机名和端口即可。如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。
相应的数据可以导出为一个csv文件，这个很方便。
jvisualvm功能与jconsole的基本类似，但是可以做性能分析。
即可以分析出CPU时间被哪些线程所占用了，等等，并且它支持jmx，这东西我只听说过没用过，先放一边不表。
配置jvisualvm不需要改动原程序的启动参数，只需要在远程主机上运行jstatd即可。
新建一个叫jstatd.all.policy的文件，内容是：
grant codebase &#34;file:${java.home}/../lib/tools.jar&#34; {   &#160;&#160;&#160; permission java.security.AllPermission;    };
然后使用如下命令启动jstatd，
jstatd -J-Djava.security.policy=jstatd.all.policy
然后在jvisualvm里选择添加远程主机即可。如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。


Related Posts

		Java中线程同步的简单用法
		Python and RRD
		QQ五笔输入法
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (5.53993)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (4.87102)--></li>
		<li><a href="http://www.agilephp.net/2009/12/qq-wubi-input-method/" rel="bookmark">QQ五笔输入法</a><!-- (4.83449)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>JDK里有三个很好用的工具，<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html">jmap</a>，<a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html">jconsole</a>和<a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jvisualvm.html">jvisualvm</a>，三个工具都各有所侧重，但是如果你的系统遇到性能瓶颈（内存不足或是CPU占用率过高），你可以通过这三个工具来发现应用里的hot spot。我今天只记一下大概的用法，给自己做个备忘，详细的使用说明，等忙完了这段时间，整理一下。</p>
<p>先介绍一个小工具，jps，这也是jdk自带的工具之一，可以列出系统里所有的java进程。</p>
<p><strong>jmap可以查看程序中堆的使用情况，具体的用法是：</strong></p>
<p>jmap –histo:live &lt;pid&gt;；</p>
<p>以及可以将堆dump到一个文件，命令是：</p>
<p>jmap –dump:format=b,file=heap.bin &lt;pid&gt;；</p>
<p>请在&lt;pid&gt;处填入相应的进程的id。</p>
<p><strong>jconsole可以查看某个java进程的内存使用、CPU占用率等，</strong></p>
<p>如果想要远程查看某一java程序，则需要在该程序启动参数里加下如下参数：</p>
<p>-Dcom.sun.management.jmxremote   <br />-Dcom.sun.management.jmxremote.port=<em>9001     <br /></em>-Dcom.sun.management.jmxremote.authenticate=false    <br />-Dcom.sun.management.jmxremote.ssl=false</p>
<p>上文使用的9001是监听的端口号，你可以指定其他的值。然后在你的终端键入jconsole，选择连接远程进程，并填入相应的主机名和端口即可。<em>如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。</em></p>
<p>相应的数据可以导出为一个csv文件，这个很方便。</p>
<p><strong>jvisualvm功能与jconsole的基本类似，但是可以做性能分析。</strong></p>
<p>即可以分析出CPU时间被哪些线程所占用了，等等，并且它支持<a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">jmx</a>，这东西我只听说过没用过，先放一边不表。</p>
<p>配置jvisualvm不需要改动原程序的启动参数，只需要在远程主机上运行<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstatd.html">jstatd</a>即可。</p>
<p>新建一个叫jstatd.all.policy的文件，内容是：</p>
<p>grant codebase &quot;file:${java.home}/../lib/tools.jar&quot; {   <br />&#160;&#160;&#160; permission java.security.AllPermission;    <br />};</p>
<p>然后使用如下命令启动jstatd，</p>
<p>jstatd -J-Djava.security.policy=jstatd.all.policy</p>
<p>然后在jvisualvm里选择添加远程主机即可。<em>如果无法连接，请修改/etc/hosts里的内容，将localhost绑定到机器的外部ip地址。</em></p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (5.53993)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (4.87102)--></li>
		<li><a href="http://www.agilephp.net/2009/12/qq-wubi-input-method/" rel="bookmark">QQ五笔输入法</a><!-- (4.83449)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>第一次参加QClub的活动</title>
		<link>http://www.agilephp.net/2010/04/my-first-qclub-event/</link>
		<comments>http://www.agilephp.net/2010/04/my-first-qclub-event/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 14:43:07 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[opensource]]></category>
		<category><![CDATA[云计算]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[校园]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[BeansDB]]></category>
		<category><![CDATA[QClub]]></category>
		<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[豆瓣]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/04/%e7%ac%ac%e4%b8%80%e6%ac%a1%e5%8f%82%e5%8a%a0qclub%e7%9a%84%e6%b4%bb%e5%8a%a8/</guid>
		<description><![CDATA[去年也报过一次名，但是最后有事情所以就没有去。这周一收到的邮件，QClub有一个技术沙龙的活动，定在周六，想来自己周六也没有别的什么事情，就报名参加了，看到题目也是我感兴趣的内容。其一是由百度的黄容芳讲的《Web数据交互的艺术》，其二是由豆瓣的刘洪清讲的《分布式数据库BeansDB在豆瓣的应用》。
黄的演讲，如果去掉艺术二字，个人认为还是一个很好的演讲，其讲了Web数据的几种不同实现，其对长连接的分析十分清晰明了，不过黄把“轮询”写成了“轮循”，虽然是个小错误，但我觉得“轮询”解释了此事件的本质，即间隔一段时间轮流（轮）询问（询），而轮循仅能表达轮流循环的意思；关于数据压缩，主要讲到了两种主要的实施手段，一是使用类似YUI Compressor的压缩器主动对需要传输的内容进行“精简”，我觉得称之为“精简”更明确一点。另外一种是使用GZIP来做压缩，对于大型网站为了提高用户体验，加快网页的加载时间，这是两个很好的方法。后面说到的跨浏览器通信，则是我完全没有接触过的内容，主要是想解决当客户在同一台机器上打开不同的浏览器，或是使用同一浏览器同时打开某一页面时，各页面之间内容同步的问题，主要的解决方案是Flash。后面说到了数据在客户端的存储，提到了ie的UserData，Firefox的localStorage以及Flash和HTM5，却没有提Google Gears，百度是不是跟Google有仇？
说到Flash，黄说Flash的覆盖率还不是很高，只有97%，百度能在乎剩下的3%，着实是挺令我惊讶，想中国的大多数网银和几年前的淘宝支付宝都不支持Firefox。不过我倒是很赞赏Apple的作法，宁愿支持html5也不愿意支持FLASH，不论苹果是否只是由商业利益做出的考虑，但是阻止flash来扰乱本来就已经很混乱的web标准，我是很赞同这样的作法的。
另外一位豆瓣的工程师刘讲的内容也吸引了很多人，我自己也被他的话题所吸引。说到分布式key-value数据库，自己早有耳闻，但是我一直不明白也一直不是很清楚这种类型的数据库如何被有效的利用在web2.0的应用中。豆瓣的作法是没有完全将MySQL替换掉，而是将那些结构化的数据依然保留在MySQL中，而将另外一些依据应用场景数量多，对一致性要求不是十分高、许多场景下是一次写入多次读出的数据存储在他们的分布式key-value数据库中。工业界追求第一位的并不是程序的理论上的最优性，而是在应用需求前提之下的性能和成本。key-value分布式数据库不是万能的，但是在一些场景之下，却可以解决应用的许多问题。豆瓣网的现行用户有3000多万，其每天处理的数据我觉得还算是一个不是非常巨大的场景，与twitter和facebook相比，其还要差一到两个层级。随着豆瓣的成长，希望能从他们那里得到更多的经验。
最近很忙，少有更新博客，可以在twitter上联系我。@bbiao


Related Posts

	没有相关文章



<h3>Related Posts</h3>
<ol>
	<li><a href="http://www.agilephp.net" rel="bookmark">没有相关文章</a></li>
</ol>
]]></description>
			<content:encoded><![CDATA[<p>去年也报过一次名，但是最后有事情所以就没有去。这周一收到的邮件，QClub有一个技术沙龙的活动，定在周六，想来自己周六也没有别的什么事情，就报名参加了，看到题目也是我感兴趣的内容。其一是由百度的黄容芳讲的《Web数据交互的艺术》，其二是由豆瓣的刘洪清讲的《分布式数据库BeansDB在豆瓣的应用》。</p>
<p>黄的演讲，如果去掉艺术二字，个人认为还是一个很好的演讲，其讲了Web数据的几种不同实现，其对长连接的分析十分清晰明了，不过黄把“轮询”写成了“轮循”，虽然是个小错误，但我觉得“轮询”解释了此事件的本质，即间隔一段时间轮流（轮）询问（询），而轮循仅能表达轮流循环的意思；关于数据压缩，主要讲到了两种主要的实施手段，一是使用类似<a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>的压缩器主动对需要传输的内容进行“精简”，我觉得称之为“精简”更明确一点。另外一种是使用GZIP来做压缩，对于大型网站为了提高用户体验，加快网页的加载时间，这是两个很好的方法。后面说到的跨浏览器通信，则是我完全没有接触过的内容，主要是想解决当客户在同一台机器上打开不同的浏览器，或是使用同一浏览器同时打开某一页面时，各页面之间内容同步的问题，主要的解决方案是Flash。后面说到了数据在客户端的存储，提到了<a href="http://msdn.microsoft.com/en-us/library/ms531424%28VS.85%29.aspx">ie的UserData</a>，Firefox的<a href="http://hacks.mozilla.org/2009/06/localstorage/">localStorage</a>以及Flash和HTM5，却没有提<a href="http://gears.google.com/">Google Gears</a>，百度是不是跟Google有仇？</p>
<p>说到Flash，黄说Flash的覆盖率还不是很高，只有97%，百度能在乎剩下的3%，着实是挺令我惊讶，想中国的大多数网银和几年前的淘宝支付宝都不支持Firefox。不过我倒是很赞赏Apple的作法，宁愿支持html5也不愿意支持FLASH，不论苹果是否只是由商业利益做出的考虑，但是阻止flash来扰乱本来就已经很混乱的web标准，我是很赞同这样的作法的。</p>
<p>另外一位豆瓣的工程师刘讲的内容也吸引了很多人，我自己也被他的话题所吸引。说到分布式key-value数据库，自己早有耳闻，但是我一直不明白也一直不是很清楚这种类型的数据库如何被有效的利用在web2.0的应用中。豆瓣的作法是没有完全将MySQL替换掉，而是将那些结构化的数据依然保留在MySQL中，而将另外一些依据应用场景数量多，对一致性要求不是十分高、许多场景下是一次写入多次读出的数据存储在他们的分布式key-value数据库中。工业界追求第一位的并不是程序的理论上的最优性，而是在应用需求前提之下的性能和成本。key-value分布式数据库不是万能的，但是在一些场景之下，却可以解决应用的许多问题。豆瓣网的现行用户有3000多万，其每天处理的数据我觉得还算是一个不是非常巨大的场景，与twitter和facebook相比，其还要差一到两个层级。随着豆瓣的成长，希望能从他们那里得到更多的经验。</p>
<p>最近很忙，少有更新博客，可以在twitter上联系我。<a href="http://twitter.com/bbiao">@bbiao</a></p>


<h3>Related Posts</h3>
<ol>
	<li><a href="http://www.agilephp.net" rel="bookmark">没有相关文章</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/04/my-first-qclub-event/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>大数据量系统</title>
		<link>http://www.agilephp.net/2010/02/system-scalability-and-performance/</link>
		<comments>http://www.agilephp.net/2010/02/system-scalability-and-performance/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 02:54:58 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[大数据量]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/02/%e5%a4%a7%e6%95%b0%e6%8d%ae%e9%87%8f%e7%a8%8b%e5%ba%8f/</guid>
		<description><![CDATA[这半个月一直在忙，忙着改程序，做实验，原来的系统的处理能力是10^4/10^5，我现在需要处理的数据量是10^6/10^7。原来正常的程序却出现了各种各样的异常，最明显的问题有两个，一个是OutOfMemory，一个是Connection Reset。
前一个问题有很多种不同的解决方法，就是增加机器的物理内存，调优jvm的启动参数，如果这些都解决不了问题，那就是程序本身的问题。我遇到的最多的就是BufferedReader溢出、ArrayList的不正确使用。这些问题都解决了还是会发现莫明其妙的溢出的话，还是增加物理内存吧。jvm虽然有垃圾收集机制，但是如果程序设计的初衷就没有为大数据量的数据考虑过的话，内存消耗真是件杯具而且及其不好解决在问题，特别是在code base有10^5级别的时候。
后一个问题，目前我还没有找到好的解决办法，目前能想到的，就是增加发送和接收缓存，平滑发送的速率，可是16*16的链接还是会莫明其妙的断掉。
郁闷了！还是需要再接再厉，外围的方案解决不了问题的话，只能去动核心的代码了。身边也没有有经验的人可以请教，我自己现在倒是对大数据量、巨数据量系统的可伸缩性和性能有了很强的兴趣。


Related Posts

		使用JDK进行Performance Tuning
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>这半个月一直在忙，忙着改程序，做实验，原来的系统的处理能力是10^4/10^5，我现在需要处理的数据量是10^6/10^7。原来正常的程序却出现了各种各样的异常，最明显的问题有两个，一个是OutOfMemory，一个是Connection Reset。</p>
<p>前一个问题有很多种不同的解决方法，就是增加机器的物理内存，调优jvm的启动参数，如果这些都解决不了问题，那就是程序本身的问题。我遇到的最多的就是BufferedReader溢出、ArrayList的不正确使用。这些问题都解决了还是会发现莫明其妙的溢出的话，还是增加物理内存吧。jvm虽然有垃圾收集机制，但是如果程序设计的初衷就没有为大数据量的数据考虑过的话，内存消耗真是件杯具而且及其不好解决在问题，特别是在code base有10^5级别的时候。</p>
<p>后一个问题，目前我还没有找到好的解决办法，目前能想到的，就是增加发送和接收缓存，平滑发送的速率，可是16*16的链接还是会莫明其妙的断掉。</p>
<p>郁闷了！还是需要再接再厉，外围的方案解决不了问题的话，只能去动核心的代码了。身边也没有有经验的人可以请教，我自己现在倒是对大数据量、巨数据量系统的可伸缩性和性能有了很强的兴趣。</p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/02/system-scalability-and-performance/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>CentOS配置vsftpd遇到550错误的解决办法</title>
		<link>http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/</link>
		<comments>http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:24:31 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[error 550]]></category>
		<category><![CDATA[selinux]]></category>
		<category><![CDATA[vsftpd]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/01/centos%e9%85%8d%e7%bd%aevsftpd%e9%81%87%e5%88%b0550%e9%94%99%e8%af%af%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/</guid>
		<description><![CDATA[安装vsftpd很简单：yum install vsftpd
启动vsftpd也很简单：service vsftpd start
默认情况下用root是无法连接的，你可以创建一个非root帐户登录，但是登录是可以登录，却没有办法创建或是上传文件。有人说，可以把SELinux关掉，可是这样未免也有点尺度太大了，其实是SELinux里的设置问题，只要修改相应的配置就可以了。
发现问题的方法：
# getsebool -a &#124; grep ftp    allow_ftpd_anon_write &#8211;&#62; off     allow_ftpd_full_access &#8211;&#62; off     allow_ftpd_use_cifs &#8211;&#62; off     allow_ftpd_use_nfs &#8211;&#62; off     ftp_home_dir &#8211;&#62; off     httpd_enable_ftp_server &#8211;&#62; off     [...]

<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (5.02654)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.49642)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>安装vsftpd很简单：yum install vsftpd</p>
<p>启动vsftpd也很简单：service vsftpd start</p>
<p>默认情况下用root是无法连接的，你可以创建一个非root帐户登录，但是登录是可以登录，却没有办法创建或是上传文件。有人说，可以把SELinux关掉，可是这样未免也有点尺度太大了，其实是SELinux里的设置问题，只要修改相应的配置就可以了。</p>
<p>发现问题的方法：</p>
<p># getsebool -a | grep ftp    <br />allow_ftpd_anon_write &#8211;&gt; off     <br />allow_ftpd_full_access &#8211;&gt; off     <br />allow_ftpd_use_cifs &#8211;&gt; off     <br />allow_ftpd_use_nfs &#8211;&gt; off     <br /><font color="#ff0000">ftp_home_dir &#8211;&gt; off</font>     <br />httpd_enable_ftp_server &#8211;&gt; off     <br />tftp_anon_write –&gt; off</p>
<p>将红色字体部分的值改成on就可以了，设置的方法如下：</p>
<p># setsebool -P ftp_home_dir 1</p>
<p>然后就可以上传文件，做你想做的事情了。</p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (5.02654)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.49642)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refactor</title>
		<link>http://www.agilephp.net/2010/01/refactor/</link>
		<comments>http://www.agilephp.net/2010/01/refactor/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 06:32:57 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[软件工程]]></category>
		<category><![CDATA[重构]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/01/refactor/</guid>
		<description><![CDATA[为什么要重构？我不知道教科书是或是别人都会怎么讲，但是重构对我来说，基本上就是把一个糟糕的设计重新写一遍。那么，什么是我定义的两糟糕的设计？又怎么样来重写，并且期望能够达到一个怎么样的目的才算是一个好的重构呢？
糟糕的设计：


因为时间紧，任务重，没有进行设计，基本上是随心所欲的写出来的代码；


充斥着“if…else…”，打了无数的补丁，新增功能的时候，就得多增加判断条件；


代码变得越来越复杂，相同的代码出现在了不同的地方，修改一处，必须时刻记着也要修改别的地方


那怎么样来重写呢？完全抛弃以前的代码么？


完全抛弃以前的代码：之前的代码写得实在是太糟糕，没有任何可取之处。而且没有办法使用一些重构工具一进行梳理。我自己没有遇到过这种情况。每一小段代码还不至于写得面目全非，这应该算是代价相对较重的一种重构方法，与其说是重构，不如说是重新写。


使用之前的代码：之前的代码，小的部分还是可以使用的，将它们独立出来，形成单独的模块，并使用一定的模块调用机制（如使用事件机制、插件系统）等，来调合各个不同的模块之间进行谐调工作。


我希望能达到一个几样的效果呢？


简单的说，我比较追求系统的可扩展性（scalability &#38; extensibility）、可维护性、较高的系统性能。


scalability是期望在一个较大的数据集前，系统也可以有一个比较好的表现； 


extensibility是期望系统能够容易的增减功能；


可维护性是期望系统在需要做出修改的时候，可以更加方便；


较高的系统性能，这个就不必说了，谁都希望自己的程序跑得更快。


有些时候，做重构并不是一个简单的决定，因为你要做出更多的工作，还不一定能搞出一个可用的系统来，但是，有风险的事情，做成功了会收获很大的好处，大部分时间，我还是咬咬牙会去选择重构代码。
==eof==
这篇文章也发表在AgilePHP上，快去看看，Refactor


Related Posts

	没有相关文章



<h3>Related Posts</h3>
<ol>
	<li><a href="http://www.agilephp.net" rel="bookmark">没有相关文章</a></li>
</ol>
]]></description>
			<content:encoded><![CDATA[<p>为什么要重构？我不知道教科书是或是别人都会怎么讲，但是重构对我来说，基本上就是把一个糟糕的设计重新写一遍。那么，什么是我定义的两糟糕的设计？又怎么样来重写，并且期望能够达到一个怎么样的目的才算是一个好的重构呢？</p>
<p><font color="#008080">糟糕的设计：</font></p>
<ol>
<li>
<div align="left">因为时间紧，任务重，没有进行设计，基本上是随心所欲的写出来的代码；</div>
</li>
<li>
<div align="left">充斥着“if…else…”，打了无数的补丁，新增功能的时候，就得多增加判断条件；</div>
</li>
<li>
<div align="left">代码变得越来越复杂，相同的代码出现在了不同的地方，修改一处，必须时刻记着也要修改别的地方</div>
</li>
</ol>
<p align="left"><font color="#008080">那怎么样来重写呢？完全抛弃以前的代码么？</font></p>
<ol>
<li>
<div align="left">完全抛弃以前的代码：之前的代码写得实在是太糟糕，没有任何可取之处。而且没有办法使用一些重构工具一进行梳理。我自己没有遇到过这种情况。每一小段代码还不至于写得面目全非，这应该算是代价相对较重的一种重构方法，与其说是重构，不如说是重新写。</div>
</li>
<li>
<div align="left">使用之前的代码：之前的代码，小的部分还是可以使用的，将它们独立出来，形成单独的模块，并使用一定的模块调用机制（如使用事件机制、插件系统）等，来调合各个不同的模块之间进行谐调工作。</div>
</li>
</ol>
<p align="left"><font color="#008080">我希望能达到一个几样的效果呢？</font></p>
<ol>
<li>
<div align="left">简单的说，我比较追求系统的可扩展性（scalability &amp; extensibility）、可维护性、较高的系统性能。</div>
</li>
<li>
<div align="left">scalability是期望在一个较大的数据集前，系统也可以有一个比较好的表现； </div>
</li>
<li>
<div align="left">extensibility是期望系统能够容易的增减功能；</div>
</li>
<li>
<div align="left">可维护性是期望系统在需要做出修改的时候，可以更加方便；</div>
</li>
<li>
<div align="left">较高的系统性能，这个就不必说了，谁都希望自己的程序跑得更快。</div>
</li>
</ol>
<p align="left">有些时候，做重构并不是一个简单的决定，因为你要做出更多的工作，还不一定能搞出一个可用的系统来，但是，有风险的事情，做成功了会收获很大的好处，大部分时间，我还是咬咬牙会去选择重构代码。</p>
<p align="left">==eof==</p>
<p align="left">这篇文章也发表在AgilePHP上，快去看看，Refactor</p>


<h3>Related Posts</h3>
<ol>
	<li><a href="http://www.agilephp.net" rel="bookmark">没有相关文章</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/01/refactor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python and RRD</title>
		<link>http://www.agilephp.net/2010/01/python-and-rrd/</link>
		<comments>http://www.agilephp.net/2010/01/python-and-rrd/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 01:33:33 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python-pyrrd]]></category>
		<category><![CDATA[python-rrd]]></category>
		<category><![CDATA[python-rrdtool]]></category>
		<category><![CDATA[rrd]]></category>
		<category><![CDATA[rrdtool]]></category>
		<category><![CDATA[xenserver]]></category>
		<category><![CDATA[时序数据库]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/01/python-and-rrd/</guid>
		<description><![CDATA[RRD是Round Robin Database的意思，RRDTool是用来管理RRD的一个工具。RRDTool的主页在这里，Wikipedia的页面在这里。RRD其实就是一个时序数据库，使用一个固定大小的环型buffer，适用于存储一些统计性的信息，如CPU负载呀，气温变化呀。我为什么要说这个东西呢，因为XenServer里的性能统计是用的RRD，你可以访问诸如http://xenserver-host/rrd_updates?cf=AVERAGE&#38;interval=5&#38;start=123131321形式的网址来获取统计信息。XenServer将返回一个XML文件，这个XML文件其实就是用rrdtool里的export工具导出的。
好，下载完成了这个文件以后，我们假设文件名是data.xml，你可以使用rrdtool restore data.xml data.rrd的方式将数据重新恢复成rrd的格式，然后就可以使用rrdtool进行一系列操作。rrdtool的操作可以写十篇博客，这不是我今天想说的重点。
我今天想说的是，当我把rrdtool跟Python集成的时候，发现Python提供了若干封装的工具，比如Python-PyRRD，Python-rrd，Python-rrdtool，我想没几个人能搞明白这几者之间的关系吧。我来说一下。
Python-rrdtool，这个就是rrdtool的一个Python封装，调用方式与rrdtool里命令的格式是一致的。
Python-rrd，这个据说应该是rrdtool的前身，命名方式不符合Python的命名策略，所以改名成了Python-rrdtool，但是debian和ubuntu的源里还保留了一个过渡性质的傀儡包（transitional dummy package），其实就是Python-rrdtool
Python-PyRRD，这个是OO化的rrdtool封装，个人比较推荐用这个包，方便，代码也更容易让人理解。
另外，Java也提供了两个rrdtool的封装，一个是JRobin，一个是rrd4j，后者是在前者的基础上做的，提供了更好的OO的支持和性能。但是这两个项目似乎更新得很慢，XenServer导出的rrd数据（version 0003）他们现在不支持（只支持到version 0001）。所以想用Java分析XenServer的性能，还是自己去解析那个xml文件吧。


Related Posts

		在Google App Engine上进行开发
		了解一些“云”
		AOP in PHP
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/dev-in-google-app-engine/" rel="bookmark">在Google App Engine上进行开发</a><!-- (7.48529)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.71185)--></li>
		<li><a href="http://www.agilephp.net/2009/09/aop-in-php/" rel="bookmark">AOP in PHP</a><!-- (3.58277)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>RRD是Round Robin Database的意思，<a href="http://oss.oetiker.ch/rrdtool/ " target="_blank">RRDTool</a>是用来管理RRD的一个工具。<a href="http://oss.oetiker.ch/rrdtool/ " target="_blank">RRDTool</a>的<a href="http://oss.oetiker.ch/rrdtool/ " target="_blank">主页</a>在这里，Wikipedia的页面在<a href="http://en.wikipedia.org/wiki/RRDtool" target="_blank">这里</a>。RRD其实就是一个时序数据库，使用一个固定大小的<a href="http://en.wikipedia.org/wiki/Circular_buffer" target="_blank">环型buffer</a>，适用于存储一些统计性的信息，如CPU负载呀，气温变化呀。我为什么要说这个东西呢，因为XenServer里的性能统计是用的RRD，你可以访问诸如<a href="http://xenserver-host/rrd_updates?cf=AVERAGE&amp;interval=5&amp;start=123131321">http://xenserver-host/rrd_updates?cf=AVERAGE&amp;interval=5&amp;start=123131321</a>形式的网址来获取统计信息。XenServer将返回一个XML文件，这个XML文件其实就是用rrdtool里的export工具导出的。</p>
<p>好，下载完成了这个文件以后，我们假设文件名是data.xml，你可以使用rrdtool restore data.xml data.rrd的方式将数据重新恢复成rrd的格式，然后就可以使用rrdtool进行一系列操作。rrdtool的操作可以写十篇博客，这不是我今天想说的重点。</p>
<p>我今天想说的是，当我把rrdtool跟Python集成的时候，发现Python提供了若干封装的工具，比如Python-PyRRD，Python-rrd，Python-rrdtool，我想没几个人能搞明白这几者之间的关系吧。我来说一下。</p>
<p>Python-rrdtool，这个就是rrdtool的一个Python封装，调用方式与rrdtool里命令的格式是一致的。</p>
<p>Python-rrd，这个据说应该是rrdtool的前身，命名方式不符合Python的命名策略，所以改名成了Python-rrdtool，但是debian和ubuntu的源里还保留了一个过渡性质的傀儡包（transitional dummy package），其实就是Python-rrdtool</p>
<p>Python-PyRRD，这个是OO化的rrdtool封装，个人比较推荐用这个包，方便，代码也更容易让人理解。</p>
<p>另外，Java也提供了两个rrdtool的封装，一个是<a href="http://www.jrobin.org/" target="_blank">JRobin</a>，一个是<a href="https://rrd4j.dev.java.net/" target="_blank">rrd4j</a>，后者是在前者的基础上做的，提供了更好的OO的支持和性能。但是这两个项目似乎更新得很慢，XenServer导出的rrd数据（version 0003）他们现在不支持（只支持到version 0001）。所以想用Java分析XenServer的性能，还是自己去解析那个xml文件吧。</p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/dev-in-google-app-engine/" rel="bookmark">在Google App Engine上进行开发</a><!-- (7.48529)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.71185)--></li>
		<li><a href="http://www.agilephp.net/2009/09/aop-in-php/" rel="bookmark">AOP in PHP</a><!-- (3.58277)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/01/python-and-rrd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Xen Cloud Platform</title>
		<link>http://www.agilephp.net/2009/12/xen-cloud-platform/</link>
		<comments>http://www.agilephp.net/2009/12/xen-cloud-platform/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 04:03:33 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[云计算]]></category>
		<category><![CDATA[虚拟化]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[xen]]></category>
		<category><![CDATA[xen cloud platform]]></category>
		<category><![CDATA[xencenter]]></category>
		<category><![CDATA[xenserver]]></category>
		<category><![CDATA[xenserver5.5]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2009/12/xen-cloud-platform/</guid>
		<description><![CDATA[Xen Cloud Platform现在发布的版本是0.1，其实他的功能与XenServer 5.5的基本功能是几乎一样的。不过XenServer 5.5可以通过XenCenter来管理，XCP只有一个丑陋的Web界面。我没有深入的hack进去，也许存在某种方法，可以使用XenCenter来管理XCP，那样即可以使用一个开源的服务端版本，同时管理工具又很人性化。由于我的切入点是XCP，官方又混淆了许多XCP与XenServer的文档，所以开始配置的时候相当郁闷，后来才慢慢的都搞通了。
我现在手头上用做实验的还都是PC机，四台ThinkCentre M8000T，每个机器有一颗Q95504核的CPU，4G的内存。每台机器上跑3个CentOS的性能与我之前实验室里的单独的一台PC（2005年的Dell吧，1G内存，2.8GHz的CPU）的性能差得不是特别多。因为我也给每个虚拟机分配了一个CPU，1G的内存。说到这里，用到的还都是虚拟化的技术。在XCP里，不同的VM可以在Host（物理主机）间迁移，并且这种迁移可以是在VM运行的时候进行的。XCP在其文档里宣称了有Load Balancing的功能，不过到现在我都没有找到在哪里下载，又怀疑这是文档跑在了发布前的一种现象。找到了文档里说的Load Balancing下载的地方，不过这个是XenServer高级版本里才有的功能，要付费的，可以免费用30天，应该可以供我实验的时候用了吧？这种可以动态的负载均衡和动态迁移的特点，则有许多“云”的感觉了。这两天准备再找找其Load Balancing的资料，做做实验。
另外，你如果在XenServer上安装Windows 7，创建完VM后，不要自动执行，需要设置一下，才可以，命令如下：
xe vm-param-set uuid=&#60;VM UUID&#62; platform:viridian=false


Related Posts

		Xen Cloud Platform 0.1.1
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/05/xen-cloud-platform-0-1-1/" rel="bookmark">Xen Cloud Platform 0.1.1</a><!-- (15.1355)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xen.org/products/cloud_source.html" target="_blank">Xen Cloud Platform</a>现在发布的版本是0.1，其实他的功能与XenServer 5.5的基本功能是几乎一样的。不过<a href="http://www.citrix.com/English/ps2/products/feature.asp?contentID=1686939" target="_blank">XenServer 5.5</a>可以通过<a href="http://www.xenserver5.com/xencenter.php" target="_blank">XenCenter</a>来管理，XCP只有一个丑陋的Web界面。我没有深入的hack进去，也许存在某种方法，可以使用XenCenter来管理XCP，那样即可以使用一个开源的服务端版本，同时管理工具又很人性化。由于我的切入点是XCP，官方又混淆了许多XCP与XenServer的文档，所以开始配置的时候相当郁闷，后来才慢慢的都搞通了。</p>
<p>我现在手头上用做实验的还都是PC机，四台<a href="http://product.yesky.com/product/563/563237/" target="_blank">ThinkCentre M8000T</a>，每个机器有一颗Q95504核的CPU，4G的内存。每台机器上跑3个CentOS的性能与我之前实验室里的单独的一台PC（2005年的Dell吧，1G内存，2.8GHz的CPU）的性能差得不是特别多。因为我也给每个虚拟机分配了一个CPU，1G的内存。说到这里，用到的还都是虚拟化的技术。在XCP里，不同的VM可以在Host（物理主机）间迁移，并且这种迁移可以是在VM运行的时候进行的。XCP在其文档里宣称了有Load Balancing的功能，<strike>不过到现在我都没有找到在哪里下载，又怀疑这是文档跑在了发布前的一种现象</strike>。找到了文档里说的Load Balancing下载的地方，不过这个是<a href="http://www.citrix.com/essentialsxs" target="_blank">XenServer高级版本</a>里才有的功能，要付费的，可以免费用30天，应该可以供我实验的时候用了吧？这种可以动态的负载均衡和动态迁移的特点，则有许多“云”的感觉了。这两天准备再找找其Load Balancing的资料，做做实验。</p>
<p>另外，你如果在XenServer上安装Windows 7，创建完VM后，不要自动执行，需要<a href="http://support.citrix.com/article/CTX122616" target="_blank">设置</a>一下，才可以，命令如下：</p>
<p><b>xe vm-param-set uuid=&lt;VM UUID&gt; platform:viridian=false</b></p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/05/xen-cloud-platform-0-1-1/" rel="bookmark">Xen Cloud Platform 0.1.1</a><!-- (15.1355)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2009/12/xen-cloud-platform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Wave 邀请提名</title>
		<link>http://www.agilephp.net/2009/11/google-wave-invitation-form/</link>
		<comments>http://www.agilephp.net/2009/11/google-wave-invitation-form/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 05:19:09 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[invitation]]></category>
		<category><![CDATA[提名]]></category>
		<category><![CDATA[邀请]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2009/11/google-wave-%e9%82%80%e8%af%b7%e6%8f%90%e5%90%8d/</guid>
		<description><![CDATA[Loading&#8230;


Related Posts

		Google Wave 邀请11枚
	


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/google-wave-invitation/" rel="bookmark">Google Wave 邀请11枚</a><!-- (9.5685)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p><iframe height="600" marginheight="0" src="http://spreadsheets.google.com/embeddedform?key=tWf-jQc2ESH7b7V07c6z89g" frameborder="0" width="760" marginwidth="0">Loading&#8230;</iframe></p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/google-wave-invitation/" rel="bookmark">Google Wave 邀请11枚</a><!-- (9.5685)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2009/11/google-wave-invitation-form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java中线程同步的简单用法</title>
		<link>http://www.agilephp.net/2009/10/java-wait-and-notify/</link>
		<comments>http://www.agilephp.net/2009/10/java-wait-and-notify/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 02:14:36 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[concurrence]]></category>
		<category><![CDATA[IllegalMonitorStateException]]></category>
		<category><![CDATA[notify]]></category>
		<category><![CDATA[notifyAll]]></category>
		<category><![CDATA[synchronized]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[wait]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2009/10/java%e4%b8%ad%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5%e7%9a%84%e7%ae%80%e5%8d%95%e7%94%a8%e6%b3%95/</guid>
		<description><![CDATA[应用场景：应用程序需要新建若干线程进行事务处理，这些线程处理完毕后，应用程序会进行一些后续的操作。
解决办法：使用Object.wait()，Object.notify()方法。Object.wait()方法会阻断当前线程的执行，直到其他线程调用Object.notify()。
于是可以很快的写出一个示例程序：
public static void main(String[] args) {
    final Object syncObj = new Object();

    Thread thread = new Thread() {
        public void run() {
            try {
        [...]

<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/linux-unix-benchmark/" rel="bookmark">Linux\Unix性能测试</a><!-- (20.0084)--></li>
		<li><a href="http://www.agilephp.net/2009/11/couchdb-on-centos-5-4/" rel="bookmark">在CentOS 5.4上安装CouchDB</a><!-- (12.9055)--></li>
		<li><a href="http://www.agilephp.net/2010/01/fix-chrome-to-add-extensions-in-a-junction-folder/" rel="bookmark">使用mklink或junction后Chrome无法安装扩展的解决办法</a><!-- (12.6265)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>应用场景：应用程序需要新建若干线程进行事务处理，这些线程处理完毕后，应用程序会进行一些后续的操作。</p>
<p>解决办法：使用Object.wait()，Object.notify()方法。<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#wait%28%29" target="_blank">Object.wait()</a>方法会阻断当前线程的执行，直到其他线程调用<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#notify%28%29" target="_blank">Object.notify()</a>。</p>
<p>于是可以很快的写出一个示例程序：</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) {
    final Object syncObj = <span class="kwrd">new</span> Object();

    Thread thread = <span class="kwrd">new</span> Thread() {
        <span class="kwrd">public</span> <span class="kwrd">void</span> run() {
            <span class="kwrd">try</span> {
                Thread.sleep(3000);

                synchronized(syncObj) {
                    syncObj.notify();
                }
            } <span class="kwrd">catch</span> (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    thread.start();

    synchronized(syncObj) {
        <span class="kwrd">try</span> {
            syncObj.wait();
        } <span class="kwrd">catch</span> (InterruptedException e) {
            e.printStackTrace();
        }
    }

    System.<span class="kwrd">out</span>.println(<span class="str">&quot;Exit&quot;</span>);
}</pre>
<p>&#160;</p>
<p>调用wait和notify方法前，一定要用synchronized(syncObj)，否则会抛出IllegalMonitorStateException。</p>
<p>有空再写写Concurrence Util里的工具类，简化上面的操作。<br />
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>


<h3>Related Posts</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/linux-unix-benchmark/" rel="bookmark">Linux\Unix性能测试</a><!-- (20.0084)--></li>
		<li><a href="http://www.agilephp.net/2009/11/couchdb-on-centos-5-4/" rel="bookmark">在CentOS 5.4上安装CouchDB</a><!-- (12.9055)--></li>
		<li><a href="http://www.agilephp.net/2010/01/fix-chrome-to-add-extensions-in-a-junction-folder/" rel="bookmark">使用mklink或junction后Chrome无法安装扩展的解决办法</a><!-- (12.6265)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2009/10/java-wait-and-notify/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
