<?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; Linux</title>
	<atom:link href="http://www.agilephp.net/category/linux/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>SSH无密码登录</title>
		<link>http://www.agilephp.net/2011/05/ssh-private-key-login/</link>
		<comments>http://www.agilephp.net/2011/05/ssh-private-key-login/#comments</comments>
		<pubDate>Wed, 18 May 2011 07:01:05 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[dsa]]></category>
		<category><![CDATA[rsa]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ssh-keygen]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/?p=437</guid>
		<description><![CDATA[一直都有用到这个，但是每次用都要去查一下，干脆现在记下来。 除了通过交互式的方式输入用户名和密码以为，SSH中还可以通过一种“公私钥”的方式进行登录，具体的原理为： 首先在客户端上创建一对公私钥 （公钥文件：~/.ssh/id_rsa.pub； 私钥文件：~/.ssh/id_rsa） 然后把公钥放到服务器上（~/.ssh/authorized_keys）, 自己保留好私钥 当ssh登录时，ssh程序会发送私钥去和服务器上的公钥做匹配.如果匹配成功就可以登录了 具体的实现方法如下： user@ubuntu:~$ ssh-keygen -t rsa -P &#8220;&#8221; Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Created directory &#8216;/home/user/.ssh&#8217;. Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: 9b:82:ea:58:b4:e0:35:d7:ff:19:66:a6:ef:ae:0e:d2 hadoop@ubuntu The key&#8217;s [...]<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/" rel="bookmark">在C++里写一个不能被继承的类</a><!-- (4.8)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</a><!-- (3.6)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (2.9)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>一直都有用到这个，但是每次用都要去查一下，干脆现在记下来。</p>
<p>除了通过交互式的方式输入用户名和密码以为，SSH中还可以通过一种“公私钥”的方式进行登录，具体的原理为：</p>
<ul type="disc">
<li>首先在客户端上创建一对公私钥 （公钥文件：~/.ssh/id_rsa.pub； 私钥文件：~/.ssh/id_rsa）</li>
<li>然后把公钥放到服务器上（~/.ssh/authorized_keys）, 自己保留好私钥</li>
<li>当ssh登录时，ssh程序会发送私钥去和服务器上的公钥做匹配.如果匹配成功就可以登录了</li>
</ul>
<p>具体的实现方法如下：<br />
user@ubuntu:~$ <span style="color: #ff0000;">ssh-keygen -t rsa -P &#8220;&#8221;</span><br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/home/user/.ssh/id_rsa):<br />
Created directory &#8216;/home/user/.ssh&#8217;.<br />
Your identification has been saved in /home/user/.ssh/id_rsa.<br />
Your public key has been saved in /home/user/.ssh/id_rsa.pub.<br />
The key fingerprint is:<br />
9b:82:ea:58:b4:e0:35:d7:ff:19:66:a6:ef:ae:0e:d2 hadoop@ubuntu<br />
The key&#8217;s randomart image is:<br />
[...snipp...]</p>
<p>user@ubuntu:~$ <span style="color: #ff0000;">cat $HOME/.ssh/id_rsa.pub &gt;&gt; $HOME/.ssh/authorized_keys</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">主要就是红色的命令，一个是生成公私钥对，类型是rsa，当然也可以是dsa啥的。然后第二条命令就是把公钥放到受信公钥文件里。这个时候使用</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">ssh user@localhost</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">就可以直接登录不用再输入密码了。当然配置多台机器用scp搞一下就成，这里我就不详说了。<br />
</span></span></p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2010/09/make-a-final-class-in-cpp/" rel="bookmark">在C++里写一个不能被继承的类</a><!-- (4.8)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</a><!-- (3.6)--></li>
		<li><a href="http://www.agilephp.net/2010/04/performance-tuning-with-jdk-tools/" rel="bookmark">使用JDK进行Performance Tuning</a><!-- (2.9)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2011/05/ssh-private-key-login/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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++里写一个不能被继承的类</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>在Godaddy的主机上配置CodeIgniter</title>
		<link>http://www.agilephp.net/2010/06/godaddy-and-codeigniter/</link>
		<comments>http://www.agilephp.net/2010/06/godaddy-and-codeigniter/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 13:56:16 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[Godaddy]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[QUERY_STRING]]></category>
		<category><![CDATA[REQUEST_URI]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[vhs]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2010/06/%e5%9c%a8godaddy%e7%9a%84%e4%b8%bb%e6%9c%ba%e4%b8%8a%e9%85%8d%e7%bd%aecodeigniter/</guid>
		<description><![CDATA[之前在CodeIgniter上部署过一个小的CodeIgniter的应用，参考了这篇文章，当时顺利的完成了部署运行的任务。主要是因为在Godaddy的虚拟主机上使用rewrite模块产生的问题，原因不知道，只知道一种解决问题的办法。主要的步骤为： 在config.php里修改配置，使用QUERY_STRING的方式来解析URL $config['uri_protocol'] = &#34;QUERY_STRING&#34;; 然后，修改.htaccess文件，使其内容为如下所示： RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?$1 [L] 这样，某个请求，如http://www.example.com/blog/view/123 ，实际上会被解析成http://www.example.com/index.php?blog/view/123 ，但是，假如我使用的请求必须通过GET方法传参数呢？这种解决方案就不能解决问题了。如http://www.example.com/index.php?blog/view/123?from=1009&#38;author=bbiao ,这个时候就无法通过parse_str($_SERVER['QUERY_STRING'], $_GET);的方法来获得GET的数据了。但是我们可以观察到$_SERVER['REQUEST_URI']里保存了blog/view/123?from=1009&#38;author=bbiao的值，OK，解析一下这个数据就可以了。代码如下： $arr = explode(&#8216;?&#8217;, $_SERVER['REQUEST_URI']); parse_str($arr[1], $_GET); 另外说一句，由于CI里是把$_GET的数据清空的，所以才有了以上的这些说法，CI本身是不推荐使用GET来传递参数的，但有时候又不得不用，比如使用OAuth的时候，别人回调你的接口的时候都是这样传的，你能怎么办呢？事情总有解决办法的，现在我的程序在Godaddy上跑的一切正常。 相关文章 Nexus One 新家 使用Grub4DOS引导Ubuntu 11.04<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2011/01/nexus-one/" rel="bookmark">Nexus One</a><!-- (3.2)--></li>
		<li><a href="http://www.agilephp.net/2009/05/new-home/" rel="bookmark">新家</a><!-- (2.5)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</a><!-- (2.4)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>之前在CodeIgniter上部署过一个小的CodeIgniter的应用，参考了<a href="http://codeigniter.com/wiki/Godaddy_Installaton_Tips/" target="_blank">这篇</a>文章，当时顺利的完成了部署运行的任务。主要是因为在Godaddy的虚拟主机上使用rewrite模块产生的问题，原因不知道，只知道一种解决问题的办法。主要的步骤为：</p>
<p>在config.php里修改配置，使用QUERY_STRING的方式来解析URL</p>
<p><code>$config['uri_protocol'] = &quot;QUERY_STRING&quot;; </code></p>
<p><code>然后，修改.htaccess文件，使其内容为如下所示：</code></p>
<p><code>RewriteEngine on     <br />RewriteCond %{REQUEST_FILENAME} !-f      <br />RewriteCond %{REQUEST_FILENAME} !-d      <br />RewriteRule ^(.*)$ /index.php<font color="#ff0000">?</font>$1 [L] </code></p>
<p><code>这样，某个请求，如<a href="http://www.example.com/blog/view/123">http://www.example.com/blog/view/123</a> ，实际上会被解析成<a href="http://www.example.com/index.php?blog/view/123">http://www.example.com/index.php?blog/view/123</a> ，但是，假如我使用的请求必须通过GET方法传参数呢？这种解决方案就不能解决问题了。如<a href="tp://www.example.com/index.php?blog/view/123?from=1009&amp;author=bbiao">http://www.example.com/index.php?blog/view/123?from=1009&amp;author=bbiao</a> ,这个时候就无法通过parse_str($_SERVER['QUERY_STRING'], $_GET);的方法来获得GET的数据了。但是我们可以观察到$_SERVER['REQUEST_URI']里保存了blog/view/123?from=1009&amp;author=bbiao的值，OK，解析一下这个数据就可以了。代码如下：</code></p>
<p>$arr = explode(&#8216;?&#8217;, $_SERVER['REQUEST_URI']);   <br />parse_str($arr[1], $_GET);</p>
<p>另外说一句，由于CI里是把$_GET的数据清空的，所以才有了以上的这些说法，CI本身是不推荐使用GET来传递参数的，但有时候又不得不用，比如使用OAuth的时候，别人回调你的接口的时候都是这样传的，你能怎么办呢？事情总有解决办法的，现在我的程序在Godaddy上跑的一切正常。</p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2011/01/nexus-one/" rel="bookmark">Nexus One</a><!-- (3.2)--></li>
		<li><a href="http://www.agilephp.net/2009/05/new-home/" rel="bookmark">新家</a><!-- (2.5)--></li>
		<li><a href="http://www.agilephp.net/2011/05/grub4dos-ubuntu-11-04/" rel="bookmark">使用Grub4DOS引导Ubuntu 11.04</a><!-- (2.4)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2010/06/godaddy-and-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</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>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>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>
		<item>
		<title>Linux\Unix性能测试</title>
		<link>http://www.agilephp.net/2009/12/linux-unix-benchmark/</link>
		<comments>http://www.agilephp.net/2009/12/linux-unix-benchmark/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 02:47:14 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[hps]]></category>
		<category><![CDATA[性能测试]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2009/12/linuxunix%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95/</guid>
		<description><![CDATA[最近在做云计算，接触到一些虚拟化的技术，所以想测试一下虚拟机的性能到底如何，这里给出一个方法，利用UnixBench来为服务器做性能测试。 1: wget http://byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz 2: tar -xzvf unixbench-5.1.2.tar.gz 3: cd unixbench-5.1.2.tar.gz 4: make 5: ./Run 如果你不想做图形化测试，或是编译的时候遇到问题，那么你可以修改Makefile 1: #GRAPHIC_TESTS = defined 把该句注释掉即可。 相关文章 Java中线程同步的简单用法 在CentOS 5.4上安装CouchDB 使用mklink或junction后Chrome无法安装扩展的解决办法<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (30.3)--></li>
		<li><a href="http://www.agilephp.net/2009/11/couchdb-on-centos-5-4/" rel="bookmark">在CentOS 5.4上安装CouchDB</a><!-- (17.6)--></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><!-- (15.4)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p>最近在做云计算，接触到一些虚拟化的技术，所以想测试一下虚拟机的性能到底如何，这里给出一个方法，利用UnixBench来为服务器做性能测试。</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>wget http:<span class="rem">//byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz</span></pre>
<pre><span class="lnum">   2:  </span>tar -xzvf unixbench-5.1.2.tar.gz</pre>
<pre class="alt"><span class="lnum">   3:  </span>cd unixbench-5.1.2.tar.gz</pre>
<pre><span class="lnum">   4:  </span>make</pre>
<pre class="alt"><span class="lnum">   5:  </span>./Run</pre>
</div>
<style type="text/css">
<p>.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>
<p>如果你不想做图形化测试，或是编译的时候遇到问题，那么你可以修改Makefile</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>#GRAPHIC_TESTS = defined</pre>
</div>
<style type="text/css">
<p>.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>把该句注释掉即可。</p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/10/java-wait-and-notify/" rel="bookmark">Java中线程同步的简单用法</a><!-- (30.3)--></li>
		<li><a href="http://www.agilephp.net/2009/11/couchdb-on-centos-5-4/" rel="bookmark">在CentOS 5.4上安装CouchDB</a><!-- (17.6)--></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><!-- (15.4)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2009/12/linux-unix-benchmark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7 引导信息修复方法</title>
		<link>http://www.agilephp.net/2009/12/windows-7-fix-mbr/</link>
		<comments>http://www.agilephp.net/2009/12/windows-7-fix-mbr/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 12:03:50 +0000</pubDate>
		<dc:creator>bbiao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[bcdedit]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[bootsect]]></category>
		<category><![CDATA[fixmbr]]></category>
		<category><![CDATA[mbr]]></category>
		<category><![CDATA[nt60]]></category>
		<category><![CDATA[win7]]></category>

		<guid isPermaLink="false">http://www.agilephp.net/2009/12/windows-7-%e5%bc%95%e5%af%bc%e4%bf%a1%e6%81%af%e4%bf%ae%e5%a4%8d%e6%96%b9%e6%b3%95/</guid>
		<description><![CDATA[bootsect /nt60 SYS /mbr 你可以使用win7安装盘（非OEM安装盘）启动系统，并选择修复系统。然后选择命令行，敲入以上命令。一般可以修复由于安装Linux失误，或是先装Windows XP再装Windows 7造成的引导信息错误。 相关文章 制作USB启动盘 Windows 7 Windows 7 RTM build 7600.16384 x86/x64 ISO 哈希值<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/make-usb-bootable-disk/" rel="bookmark">制作USB启动盘</a><!-- (8)--></li>
		<li><a href="http://www.agilephp.net/2009/08/windows-7/" rel="bookmark">Windows 7</a><!-- (5.3)--></li>
		<li><a href="http://www.agilephp.net/2009/07/windows-7-rtm-iso-sha1/" rel="bookmark">Windows 7 RTM build 7600.16384 x86/x64 ISO 哈希值</a><!-- (5.1)--></li>
	</ol>
]]></description>
			<content:encoded><![CDATA[<p> bootsect /nt60 SYS <font color="#ff0000">/mbr</font></p>
<p>你可以使用win7安装盘（非OEM安装盘）启动系统，并选择修复系统。然后选择命令行，敲入以上命令。一般可以修复由于安装Linux失误，或是先装Windows XP再装Windows 7造成的引导信息错误。</p>
<h3>相关文章</h3>
<ol>
		<li><a href="http://www.agilephp.net/2009/12/make-usb-bootable-disk/" rel="bookmark">制作USB启动盘</a><!-- (8)--></li>
		<li><a href="http://www.agilephp.net/2009/08/windows-7/" rel="bookmark">Windows 7</a><!-- (5.3)--></li>
		<li><a href="http://www.agilephp.net/2009/07/windows-7-rtm-iso-sha1/" rel="bookmark">Windows 7 RTM build 7600.16384 x86/x64 ISO 哈希值</a><!-- (5.1)--></li>
	</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.agilephp.net/2009/12/windows-7-fix-mbr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

