<?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>Thu, 03 Nov 2011 11:53:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>使用Grub4DOS引导Ubuntu 11.04</title>
		<link>http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/</link>
		<comments>http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/#comments</comments>
		<pubDate>Thu, 05 May 2011 05:55:37 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[bcdedit]]></category>
		<category><![CDATA[grub2]]></category>
		<category><![CDATA[grub4dos]]></category>
		<category><![CDATA[natty]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/?p=434</guid>
		<description><![CDATA[Ubuntu 11.04发布以后，就第一时间把我的笔记本从10.10升级了过来，升级的过程很顺利，就是耗时稍微长了一些，要不是觉得不想把开发环境重新配置一遍，就进行全新安装了。我没有把Grub2安装到/dev/sda上，这样的话，将覆盖掉Windows 7的Loader（这个稍微有些强迫症，一直觉得Grub的引导界面太丑了），而是把Grub2装到了/dev/sda8上（/boot所在的单独的分区），然后把bootsector导出来放在Windows下新建一个引导项，用Windows 7的Loader加载Grub2，具体的作法我曾经写过一篇博文，在这里可以找到。 但是这次，升级完成的以后，重新导出了一份bootsector，重启无法进入Grub2，好吧，我也不知道是什么原因，怀疑跟Grub2本身有关，我也没有深究这件事件，以后有精力的时候再搞搞吧！可是我总得想办法引导进去啊，我首先是试了用LiveCD引导进入系统，重新安装Grub2，这件事情本身就存在着一些问题，没有成功。最后无奈，选择用Grub4DOS引导，成功。 上面有Grub4DOS的下载，具体怎么添加Grub4DOS的启动项，可以参考这篇文章。不过那篇文章没有给出menu.lst的参考，我这里给一个可以引导Grub2的menu.lst timeout 30 default 0 title GNU/Linux GRUB2 find &#8211;set-root &#8211;ignore-floppies &#8211;ignore-cd /grub/core.img kernel /grub/core.img 完毕！发现现在的Grub2还是挺漂亮的，考虑下次就直接把Grub2装到/dev/sda上得了，mbr覆盖就覆盖掉吧！省得麻烦。 相关文章 使用JDK进行Performance Tuning CentOS配置vsftpd遇到550错误的解决办法 了解一些“云”<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (4.9)--></li>
		<li><a href="http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/" rel="bookmark">CentOS配置vsftpd遇到550错误的解决办法</a><!-- (3)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (2.5)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>Ubuntu 11.04发布以后，就第一时间把我的笔记本从10.10升级了过来，升级的过程很顺利，就是耗时稍微长了一些，要不是觉得不想把开发环境重新配置一遍，就进行全新安装了。我没有把Grub2安装到/dev/sda上，这样的话，将覆盖掉Windows 7的Loader（这个稍微有些强迫症，一直觉得Grub的引导界面太丑了），而是把Grub2装到了/dev/sda8上（/boot所在的单独的分区），然后把bootsector导出来放在Windows下新建一个引导项，用Windows 7的Loader加载Grub2，具体的作法我曾经写过一篇博文，在<a href="http://bbiao.iteye.com/blog/160402">这里</a>可以找到。</p>
<p>但是这次，升级完成的以后，重新导出了一份bootsector，重启无法进入Grub2，好吧，我也不知道是什么原因，怀疑跟Grub2本身有关，我也没有深究这件事件，以后有精力的时候再搞搞吧！可是我总得想办法引导进去啊，我首先是试了用LiveCD引导进入系统，重新安装Grub2，这件事情本身就存在着一些问题，没有成功。最后无奈，选择用<a href="http://download.gna.org/grub4dos/">Grub4DOS</a>引导，成功。</p>
<p>上面有Grub4DOS的下载，具体怎么添加Grub4DOS的启动项，可以参考<a href="http://www.kisa747.com/windows7-grub4dos.html">这篇</a>文章。不过那篇文章没有给出menu.lst的参考，我这里给一个可以引导Grub2的menu.lst</p>
<p>timeout 30<br />
default 0</p>
<p>title GNU/Linux GRUB2<br />
find &#8211;set-root &#8211;ignore-floppies &#8211;ignore-cd /grub/core.img<br />
kernel /grub/core.img</p>
<p>完毕！发现现在的Grub2还是挺漂亮的，考虑下次就直接把Grub2装到/dev/sda上得了，mbr覆盖就覆盖掉吧！省得麻烦。</p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (4.9)--></li>
		<li><a href="http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/" rel="bookmark">CentOS配置vsftpd遇到550错误的解决办法</a><!-- (3)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (2.5)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在C++里写一个不能被继承的类（2）</title>
		<link>http://www.agilephp.net/2010/10/make-a-final-class-in-cpp-2/</link>
		<comments>http://www.agilephp.net/2010/10/make-a-final-class-in-cpp-2/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 04:33:18 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[final]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/10/%e5%9c%a8c%e9%87%8c%e5%86%99%e4%b8%80%e4%b8%aa%e4%b8%8d%e8%83%bd%e8%a2%ab%e7%bb%a7%e6%89%bf%e7%9a%84%e7%b1%bb%ef%bc%882%ef%bc%89/</guid>
		<description><![CDATA[上一篇博客中讲述了一种在C++中实现Final类的例子，但是后来想想那个办法有点绕，其实只要想办法让孙子类无法调用基类的构造函数就可以了，可以有很简单的办法能做到，不需要使用模板呀、友元呀那些比较复杂的机制。具体的代码如下： class AbstractFinal {     protected:          AbstractFinal() {}          ~AbstractFinal() {} }; class FinalClass: virtual private AbstractFinal { }; 只要理解我标红的地方就可以了，把AbstractFinal的构造函数设置成私有的，然后FinalClass以私有虚继承的方式继承AbstractFinal类，这个时候，再有FinalClass的子类就无法调用AbstractFinal的构造函数（对其是私有的），所以也就形成了一个无法被继承的类。 相关文章 在C++里写一个不能被继承的类 Java中线程同步的简单用法 Linux\Unix性能测试<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/" rel="bookmark">在C++里写一个不能被继承的类</a><!-- (15.7)--></li>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (4.6)--></li>
		<li><a href="http://www.agilephp.net/2009/12/linux-unix-benchmark/" rel="bookmark">Linux\Unix性能测试</a><!-- (3.4)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/" target="_blank">上一篇</a>博客中讲述了一种在C++中实现Final类的例子，但是后来想想那个办法有点绕，其实只要想办法让孙子类无法调用基类的构造函数就可以了，可以有很简单的办法能做到，不需要使用模板呀、友元呀那些比较复杂的机制。具体的代码如下：</p>
<pre>class AbstractFinal
{     <span style="color: #ff0000;">protected</span>:
         AbstractFinal() {}
         ~AbstractFinal() {}
};

class FinalClass: <span style="color: #ff0000;">virtual private</span> AbstractFinal
{

};</pre>
<p>只要理解我标红的地方就可以了，把AbstractFinal的构造函数设置成私有的，然后FinalClass以私有虚继承的方式继承AbstractFinal类，这个时候，再有FinalClass的子类就无法调用AbstractFinal的构造函数（对其是私有的），所以也就形成了一个无法被继承的类。</p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/" rel="bookmark">在C++里写一个不能被继承的类</a><!-- (15.7)--></li>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (4.6)--></li>
		<li><a href="http://www.agilephp.net/2009/12/linux-unix-benchmark/" rel="bookmark">Linux\Unix性能测试</a><!-- (3.4)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/10/make-a-final-class-in-cpp-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在C++里写一个不能被继承的类</title>
		<link>http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/</link>
		<comments>http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 11:25:38 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[c++0x]]></category>
		<category><![CDATA[final]]></category>
		<category><![CDATA[friend]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/09/%e5%9c%a8c%e9%87%8c%e5%86%99%e4%b8%80%e4%b8%aa%e4%b8%8d%e8%83%bd%e8%a2%ab%e7%bb%a7%e6%89%bf%e7%9a%84%e7%b1%bb/</guid>
		<description><![CDATA[这是最近看到的一道面试题，最近是看了不少道面试题，C++里各种变态的问法。这道题算是比较正常的吧。在C++语言里，是没有类似Java里final class的概念的，但是学C++的人心里一定要相信，C++是万能的。于是有人给出了一种解法。 代码我在下面再贴一下吧，不过著作权归原作者所有，向原作者表示敬意。 template &#60;typename T&#62; class MakeFinal { &#160;&#160;&#160;&#160;&#160; friend T; private : &#160;&#160;&#160;&#160;&#160; MakeFinal() {} &#160;&#160;&#160;&#160;&#160; ~MakeFinal() {} }; class FinalClass: virtual public MakeFinal&#60;FinalClass&#62; { public : &#160;&#160;&#160;&#160;&#160; FinalClass() {} &#160;&#160;&#160;&#160;&#160; ~FinalClass() {} }; 这个方法行不行，行！请注意红色的部分，由于声明了T是友元类，所以可以访问自己的私有成员函数，当然也包括构造和析构函数；但是由于FinalClass是虚继承自MakeFinal，所以当有一个类ChildClass: public FinalClass时，会先调用虚基类MakeFinal的构造函数，由于调用者是ChildClass，所以无法调用。上述代码要是把virtual去调，则可以有ChildClass: public FinalClass，因为普通的继承是由子类调用父类的构造函数，向上调用，ChildClass的父类FinalClass是可以调用MakeFinal的构造函数的，所以这里虚继承是必须的。不然就无法实现一个不能被继承的类。 这个方法有没有局限，答案是有。上述代码第一个红色的部分，只要在支持c++0x标准的编译器里才能编译通过，GCC 4.4就算是加上-std=c++0x也不能通过，因为4.4只是部分支持了c++0x的标准。是不是就不能做出一个在GCC 4.4里可以用的FinalClass了？非也，C++是万能的。嗯，你在friend后面直接加个class后，GCC会报有编译错误，此路是不通的。客官就别试了。 我们定义另一个结构体： template&#60;typename T&#62; struct Clazz { &#160;&#160;&#160;&#160;&#160; typedef T Type; }; [...]<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/10/make-a-final-class-in-cpp-2/" rel="bookmark">在C++里写一个不能被继承的类（2）</a><!-- (10.5)--></li>
		<li><a href="http://www.agilephp.net/2011/05/ssh-private-key-login/" rel="bookmark">SSH无密码登录</a><!-- (7)--></li>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (6.7)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>这是最近看到的一道面试题，最近是看了不少道面试题，C++里各种变态的问法。这道题算是比较正常的吧。在C++语言里，是没有类似Java里final class的概念的，但是学C++的人心里一定要相信，C++是万能的。于是有人给出了一种<a href="http://blog.csdn.net/xkyx_cn/archive/2008/04/02/2245038.aspx">解法</a>。</p>
<p>代码我在下面再贴一下吧，不过著作权归原作者所有，向原作者表示敬意。</p>
<p>template &lt;typename T&gt; class MakeFinal</p>
<p>{</p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">friend T;</font></p>
<p>private :</p>
<p>&#160;&#160;&#160;&#160;&#160; MakeFinal() {}</p>
<p>&#160;&#160;&#160;&#160;&#160; ~MakeFinal() {}</p>
<p>};</p>
<p>class FinalClass: <font color="#ff0000">virtual</font> public MakeFinal&lt;FinalClass&gt;</p>
<p>{</p>
<p>public :</p>
<p>&#160;&#160;&#160;&#160;&#160; FinalClass() {}</p>
<p>&#160;&#160;&#160;&#160;&#160; ~FinalClass() {}</p>
<p>};</p>
<p>这个方法行不行，行！请注意红色的部分，由于声明了T是友元类，所以可以访问自己的私有成员函数，当然也包括构造和析构函数；但是由于FinalClass是虚继承自MakeFinal，所以当有一个类ChildClass: public FinalClass时，会先调用虚基类MakeFinal的构造函数，由于调用者是ChildClass，所以无法调用。上述代码要是把virtual去调，则可以有ChildClass: public FinalClass，因为普通的继承是由子类调用父类的构造函数，向上调用，ChildClass的父类FinalClass是可以调用MakeFinal的构造函数的，所以这里虚继承是必须的。不然就无法实现一个不能被继承的类。</p>
<p>这个方法有没有局限，答案是有。上述代码第一个红色的部分，只要在支持c++0x标准的编译器里才能编译通过，GCC 4.4就算是加上-std=c++0x也不能通过，因为4.4只是<a href="http://gcc.gnu.org/gcc-4.4/cxx0x_status.html">部分</a>支持了c++0x的标准。是不是就不能做出一个在GCC 4.4里可以用的FinalClass了？非也，C++是万能的。嗯，你在friend后面直接加个class后，GCC会报有编译错误，此路是不通的。客官就别试了。</p>
<p>我们定义另一个结构体：</p>
<p>template&lt;typename T&gt;</p>
<p>struct Clazz</p>
<p>{</p>
<p>&#160;&#160;&#160;&#160;&#160; typedef T Type;</p>
<p>};</p>
<p>然后把原来的FinalClass略加修改：</p>
<p>template &lt;typename T&gt; class MakeFinal </p>
<p>{ </p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">friend class Class&lt;T&gt;::Type;</font> </p>
<p>private : </p>
<p>&#160;&#160;&#160;&#160;&#160; MakeFinal() {} </p>
<p>&#160;&#160;&#160;&#160;&#160; ~MakeFinal() {} </p>
<p>};</p>
<p>OK，在GCC里可以编译通过了，并且虚继承了MakeFinal的类是无法再被继承的了，会在编译的时候报错。</p>
<p>小结，其实我们的目的就只有一个，把基类或是基类的基类的构造函数变成私有的。这样子类再继承这个类是，因为无法调用构造函数，就会产生编译时错误，自然也就没有办法继承了。</p>
<p>上述在GCC里能用的办法也不是我想出来的，出处在<a href="http://objectmix.com/c/40210-template-parameter-cant-friend-we-hack.html">这里</a>。</p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/10/make-a-final-class-in-cpp-2/" rel="bookmark">在C++里写一个不能被继承的类（2）</a><!-- (10.5)--></li>
		<li><a href="http://www.agilephp.net/2011/05/ssh-private-key-login/" rel="bookmark">SSH无密码登录</a><!-- (7)--></li>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (6.7)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<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的主页查看。 相关文章 Xen Cloud Platform Python and RRD 第一次参加QClub的活动<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/xen-cloud-platform/" rel="bookmark">Xen Cloud Platform</a><!-- (15.8)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/04/my-first-qclub-event/" rel="bookmark">第一次参加QClub的活动</a><!-- (2)--></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>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/xen-cloud-platform/" rel="bookmark">Xen Cloud Platform</a><!-- (15.8)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/04/my-first-qclub-event/" rel="bookmark">第一次参加QClub的活动</a><!-- (2)--></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地址。 相关文章 Java中线程同步的简单用法 QQ五笔输入法 Python and RRD<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (5.1)--></li>
		<li><a href="http://www.agilephp.net/2009/12/qq-wubi-input-method/" rel="bookmark">QQ五笔输入法</a><!-- (4.9)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (4.7)--></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>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (5.1)--></li>
		<li><a href="http://www.agilephp.net/2009/12/qq-wubi-input-method/" rel="bookmark">QQ五笔输入法</a><!-- (4.9)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (4.7)--></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 相关文章 在Live Writer中编辑WordPress博客 Python and RRD 健身<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/live-writer-and-wordpress/" rel="bookmark">在Live Writer中编辑WordPress博客</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/07/body-building/" rel="bookmark">健身</a><!-- (2)--></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>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/live-writer-and-wordpress/" rel="bookmark">在Live Writer中编辑WordPress博客</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/07/body-building/" rel="bookmark">健身</a><!-- (2)--></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的链接还是会莫明其妙的断掉。 郁闷了！还是需要再接再厉，外围的方案解决不了问题的话，只能去动核心的代码了。身边也没有有经验的人可以请教，我自己现在倒是对大数据量、巨数据量系统的可伸缩性和性能有了很强的兴趣。 相关文章 使用JDK进行Performance Tuning Java中线程同步的简单用法 Python and RRD<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (2)--></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>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (2)--></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 tftp_anon_write –&#62; off 将红色字体部分的值改成on就可以了，设置的方法如下： # setsebool -P ftp_home_dir 1 然后就可以上传文件，做你想做的事情了。 相关文章 Python and RRD 使用JDK进行Performance Tuning 使用Grub4DOS引导Ubuntu 11.04<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (5.3)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</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>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/01/python-and-rrd/" rel="bookmark">Python and RRD</a><!-- (5.3)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (3)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</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 相关文章 CentOS配置vsftpd遇到550错误的解决办法 使用JDK进行Performance Tuning 使用Grub4DOS引导Ubuntu 11.04<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/" rel="bookmark">CentOS配置vsftpd遇到550错误的解决办法</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</a><!-- (2)--></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>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/01/solve-error-550-in-centos-and-vsftpd/" rel="bookmark">CentOS配置vsftpd遇到550错误的解决办法</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (2)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</a><!-- (2)--></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文件吧。 相关文章 在Google App Engine上进行开发 了解一些“云” AOP in PHP<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/dev-in-google-app-engine/" rel="bookmark">在Google App Engine上进行开发</a><!-- (8)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.8)--></li>
		<li><a href="http://www.agilephp.net/2009/09/aop-in-php/" rel="bookmark">AOP in PHP</a><!-- (3.8)--></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>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/dev-in-google-app-engine/" rel="bookmark">在Google App Engine上进行开发</a><!-- (8)--></li>
		<li><a href="http://www.agilephp.net/2009/08/cloud-to-overview/" rel="bookmark">了解一些“云”</a><!-- (4.8)--></li>
		<li><a href="http://www.agilephp.net/2009/09/aop-in-php/" rel="bookmark">AOP in PHP</a><!-- (3.8)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/01/python-and-rrd/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

