<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Webtatic.com</title>
	
	<link>http://www.webtatic.com</link>
	<description>Just another technical blog</description>
	<lastBuildDate>Sat, 18 Jul 2009 07:31:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/BlogWebtaticcom" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>PHP public key cryptography using OpenSSL</title>
		<link>http://www.webtatic.com/blog/2009/07/php-public-key-cryptography/</link>
		<comments>http://www.webtatic.com/blog/2009/07/php-public-key-cryptography/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 10:36:02 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/blog/2009/07/php-public-key-cryptography/</guid>
		<description><![CDATA[Using the PHP OpenSSL extension it is fairly easy to sort out a secure system for encrypting data with one key that only can be decrypted with another.]]></description>
			<content:encoded><![CDATA[<p>Recently I have been handling the security of some sensitive data. I had originally been encrypting/decrypting data with a <a href="http://en.wikipedia.org/wiki/Symmetric-key_algorithm">symmetric-key system</a> using <a href="http://uk3.php.net/manual/en/function.mcrypt-encrypt.php">mcrypt</a> for PHP. This was due to the web frontend and the backend existing on the same server. However for security purposes I am now separating the frontend and backend onto different servers, so that there is no way the web accessible frontend, whether compromised or not, can get at the data it inserts into the database.</p>
<p>In order to do this, a asymmetric-key system is needed, such as <a href="http://en.wikipedia.org/wiki/Public-key_cryptography">public-key cryptography</a>. Googling for examples of this in PHP, there doesn&#8217;t seem to be any results of this other than the <a href="http://uk3.php.net/manual/en/book.openssl.php">php OpenSSL extension documentation</a>, and systems that try to reinvent the wheel with their own implementations.</p>
<p>Using the PHP OpenSSL extension it is fairly easy to sort out a secure system for encrypting data with one key that only can be decrypted with another.<br />
<span id="more-335"></span><br />
First, you need to generate your private and public keys. You can either do this yourself with the openssl command-line application:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"># generate a 1024 bit rsa private key, ask for a passphrase to encrypt it and save to file
openssl genrsa -des3 -out /path/to/privatekey 1024
&nbsp;
# generate the public key for the private key and save to file
openssl rsa -in /path/to/privatekey -pubout -out /path/to/publickey</pre></div></div>

<p>or programatically using php-openssl:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// generate a 1024 bit rsa private key, returns a php resource, save to file</span>
<span style="color: #000088;">$privateKey</span> <span style="color: #339933;">=</span> <span style="color: #990000;">openssl_pkey_new</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'private_key_bits'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1024</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'private_key_type'</span> <span style="color: #339933;">=&gt;</span> OPENSSL_KEYTYPE_RSA<span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">openssl_pkey_export_to_file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$privateKey</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/path/to/privatekey'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$passphrase</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// get the public key $keyDetails['key'] from the private key;</span>
<span style="color: #000088;">$keyDetails</span> <span style="color: #339933;">=</span> <span style="color: #990000;">openssl_pkey_get_details</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$privateKey</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/path/to/publickey'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$keyDetails</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'key'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Next, you can load the public key, and encrypt the data:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$pubKey</span> <span style="color: #339933;">=</span> <span style="color: #990000;">openssl_pkey_get_public</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'file:///path/to/publickey'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">openssl_public_encrypt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sensitiveData</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encryptedData</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pubKey</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// store $encryptedData ...</span></pre></div></div>

<p>When you need to get the sensitive data again, you can load the private key and decrypt:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// retrieve $encryptedData from storage ...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// load the private key and decrypt the encrypted data</span>
<span style="color: #000088;">$privateKey</span> <span style="color: #339933;">=</span> <span style="color: #990000;">openssl_pkey_get_private</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'file:///path/to/privatekey'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$passphrase</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">openssl_private_decrypt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$encryptedData</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sensitiveData</span><span style="color: #339933;">,</span> <span style="color: #000088;">$privateKey</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Alternatively you can use the private key to encrypt data, sign data or seal it against multiple other public keys, but that is beyond the scope of this article.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/07/php-public-key-cryptography/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.2.10 on CentOS 5</title>
		<link>http://www.webtatic.com/blog/2009/06/php-5210-on-centos-5/</link>
		<comments>http://www.webtatic.com/blog/2009/06/php-5210-on-centos-5/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 10:13:47 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=319</guid>
		<description><![CDATA[My previous articles on installing PHP on CentOS dealt with installing PHP 5.2.6. I have found this to have some bugs that kill the process without error information. One bug I found, which was on an x86_64 server, was that converting an object to a string did this.
So, I have compiled the latest PHP version, [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://www.webtatic.com/blog/2009/05/installing-php-526-on-centos-5/">previous articles</a> on installing PHP on CentOS dealt with installing PHP 5.2.6. I have found this to have some bugs that kill the process without error information. One bug I found, which was on an x86_64 server, was that converting an object to a string did this.</p>
<p>So, I have compiled the latest PHP version, 5.2.10, and put it in my own repository for easy installation. I have compiled it for CentOS 5 i386 and x86_64, and provided the source RPMS in the repo, if anyone wants to compile it for another OS or architecture.</p>
<p>I have also included the same php extensions I mentioned in my <a href="http://www.webtatic.com/blog/2009/05/installing-php-526-extra-extensions/">other article</a>, php-mcrypt, php-mhash, php-mssql and php-tidy</p>
<p>To install, first you must tell rpm to accept rpm&#8217;s signed by me:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rpm --import http://repo.webtatic.com/yum/RPM-GPG-KEY-webtatic-andy</pre></div></div>

<p>Then add the yum repository information to yum:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">cd /etc/yum.repos.d/
wget http://repo.webtatic.com/yum/webtatic.repo</pre></div></div>

<p>Now you can upgrade php by doing:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">yum --enablerepo=webtatic update php</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/06/php-5210-on-centos-5/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>mod_auth_mysql digest authentication patch</title>
		<link>http://www.webtatic.com/blog/2009/05/patch-for-mod_auth_mysql-to-allow-digest-authentication/</link>
		<comments>http://www.webtatic.com/blog/2009/05/patch-for-mod_auth_mysql-to-allow-digest-authentication/#comments</comments>
		<pubDate>Sun, 31 May 2009 10:59:13 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_auth_mysql]]></category>
		<category><![CDATA[mod_auth_mysql digest]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=301</guid>
		<description><![CDATA[Recently, I wrote a mod_perl module for using a database backend for basic and digest authentication in Apache, however I found it to be much slower than mod_auth_mysql. This would be due to using mod_perl and DBI. So I have written a patch for mod_auth_mysql which performs the same, which means its as fast.
The main [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I wrote a mod_perl module for using a database backend for basic and digest authentication in Apache, however I found it to be much slower than <a href="http://modauthmysql.sourceforge.net/">mod_auth_mysql</a>. This would be due to using <a href="http://perl.apache.org/">mod_perl</a> and DBI. So I have written a patch for mod_auth_mysql which performs the same, which means its as fast.</p>
<p>The main reason why I chose to do this rather than use <a href="http://www.webtatic.com/projects/webtaticauthdbi/">Webtatic::AuthDBI</a> is because subversion checkouts were taking twice as long. A mod_perl authentication provider, even without performing authentication (just returning OK for any login details) seems to be the speed of the whole mod_auth_mysql without even establishing a mysql connection.</p>
<p>This patch seems to perform just as well as mod_auth_mysql.</p>
<p>Check it out here: <a href="/projects/mod_auth_mysql-auth/">/projects/mod_auth_mysql-auth/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/05/patch-for-mod_auth_mysql-to-allow-digest-authentication/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Secure digest HTTP authentication using Webtatic::AuthDBI</title>
		<link>http://www.webtatic.com/blog/2009/05/secure-digest-http-authentication-using-webtaticauthdbi/</link>
		<comments>http://www.webtatic.com/blog/2009/05/secure-digest-http-authentication-using-webtaticauthdbi/#comments</comments>
		<pubDate>Sun, 24 May 2009 10:01:24 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_perl]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Webtatic::AuthDBI]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=268</guid>
		<description><![CDATA[The HTTP protocol gives a standardised way to provide authentication. This is supported via two modes:
Basic &#8211; transmit the username and password in a reversable base-64 encode
Digest &#8211; transmits complex MD5 hash of the username, realm, password, a server generated nonce, request method and request uri
Basic HTTP authentication suffers from a very easy man-in-the-middle attack, [...]]]></description>
			<content:encoded><![CDATA[<p>The HTTP protocol gives a standardised way to provide authentication. This is supported via two modes:<br />
<a href="http://en.wikipedia.org/wiki/Basic_access_authentication">Basic</a> &#8211; transmit the username and password in a reversable base-64 encode<br />
<a href="http://en.wikipedia.org/wiki/Digest_access_authentication">Digest</a> &#8211; transmits complex MD5 hash of the username, realm, password, a server generated nonce, request method and request uri</p>
<p>Basic HTTP authentication suffers from a very easy man-in-the-middle attack, where the attacker can simply reverse the base-64 encode to get the user&#8217;s password. This is preventable if switching to HTTPS, where a man-in-the-middle is not possible.</p>
<p>Digest HTTP authentication however uses a complex series of MD5 operations on data provided by the server and client variables. This, depending on the server implementation, can prevent the man-in-the-middle from decyphering the password, and prevent replay attacks.</p>
<p>Digest HTTP authentication is relatively new, but is supported fully in all the latest browsers. Internet Explorer 6 however <a href="http://www.eweek.com/c/a/Security/IE-Apache-Clash-on-Web-Standard/">does not support the standard correctly</a>, but there is an Apache server workaround to allow it.</p>
<p>I have written a mod_perl module which will provide a database backend to this method, called Webtatic::AuthDBI. It is similar to that of mod_auth_mysql, which only supports Basic auth.</p>
<p>I have published a project page for this at <a href="/projects/webtaticauthdbi/">/projects/webtaticauthdbi/</a>. It is free to use, and uses the same licensing terms as Perl. Installation and use instructions are on that page.</p>
<p>In theory, digest authentication will be more secure than cookie sessions, as once the session id is captured by the attacker, the attacker could then use that session themselves. Digest authentication always sends a different authorization header every request, so if the server can prevent replay attacks, the attacker wouldn&#8217;t be able to use the header again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/05/secure-digest-http-authentication-using-webtaticauthdbi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing PHP 5.2.6 on CentOS 5 – extra extensions</title>
		<link>http://www.webtatic.com/blog/2009/05/installing-php-526-extra-extensions/</link>
		<comments>http://www.webtatic.com/blog/2009/05/installing-php-526-extra-extensions/#comments</comments>
		<pubDate>Tue, 19 May 2009 21:03:17 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=225</guid>
		<description><![CDATA[Update 20th June 2009 &#8211; I found a bug in PHP 5.2.9, so I have compiled 5.2.9 rpms, including the ones that this article talks about, check out the article here.
Update 23rd May 2009 &#8211; It appears dbase, readline, json and filter were included either compiled into php or as a shared module in php-common, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update 20th June 2009</strong> &#8211; I found a bug in PHP 5.2.9, so I have compiled 5.2.9 rpms, including the ones that this article talks about, <a href="http://www.webtatic.com/blog/2009/06/php-529-on-centos-5/">check out the article here</a>.<br />
<strong>Update 23rd May 2009</strong> &#8211; It appears dbase, readline, json and filter were included either compiled into php or as a shared module in php-common, so I&#8217;ve removed them from the spec.</p>
<p>In using the <a href="/blog/2009/05/installing-php-526-on-centos-5/">installation of PHP 5.2.6 on CentOS</a>, I noticed that there were a few modules missing from the repository that are included as part of CentOS&#8217;s extras repository. They are nowhere to be found in the testing repository.</p>
<p>I found an easy way to build the RPM&#8217;s by downloading both the testing php source RPM (SRPM), and the extras php-extras-5.1.6 SRPM, rewriting the php-extras spec file so it incorporated the same patches, and building it as the php-5.2.6 version.</p>
<p>The php-extras include the <del datetime="2009-05-23T15:58:44+00:00">dbase, readline,</del> mcrypt, mhash, tidy and mssql extensions. In my spec file, I have removed dbase and readline, as they have moved to php-common. <del datetime="2009-05-23T15:58:44+00:00">I have also included the newly added extensions to php 5.2; <a href="http://uk3.php.net/json">json</a> and <a href="http://uk3.php.net/filter">filter</a>.</del> In future versions of CentOS, these should hopefully be updated in the extras or the base repository.<br />
<span id="more-225"></span><br />
The steps that are needed:</p>
<p>Set up a source RPM build environment</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">useradd mockbuild
mkdir /usr/src/redhat
yum install rpm-build</pre></div></div>

<p>Download and install the SRPMs, so that their build files are in the environment</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">wget http://mirror.centos.org/centos/5.3/extras/SRPMS/php-extras-5.1.6-15.el5.centos.1.src.rpm
wget http://dev.centos.org/centos/5/testing/SRPMS/php-5.2.6-2.el5s2.src.rpm
&nbsp;
rpm -i php-extras-5.1.6-15.el5.centos.1.src.rpm
rpm -i php-5.2.6-2.el5s2.src.rpm</pre></div></div>

<p>Save this <a href="/files/2009/05/php-extras.spec">php-extras.spec</a> file to /usr/src/redhat/SPECS/php-extras.spec. The changes I have made reference the patches contained in the php SRPM, and have dbase and readline removed.<del datetime="2009-05-23T16:04:38+00:00">also include the json and filter extensions to be built into RPMs as well</del>.</p>
<p>Now run the build process</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rpmbuild -ba /usr/src/redhat/SPECS/php-extras.spec</pre></div></div>

<p>You will probably get an error at the start e.g.</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">error: Failed build dependencies:
        freetds-devel is needed by php-extras-5.2.6-1.1.i386
        libtidy-devel is needed by php-extras-5.2.6-1.1.i386</pre></div></div>

<p>Install all of the packages mentioned, e.g.</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">yum install -y freetds-devel libtidy-devel
yum --disablerepo=* --enablerepo=c5-testing install php-devel</pre></div></div>

<p>Now run the build process again, and by the end, you should have both an SRPM and the RPMs of the php extras.</p>
<p>You can put these in a repository or install them as the following:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rpm -i /usr/src/redhat/RPMS/i386/php-tidy-5.2.6-1.1.i386.rpm</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/05/installing-php-526-extra-extensions/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Installing PHP 5.2.6 on CentOS 5</title>
		<link>http://www.webtatic.com/blog/2009/05/installing-php-526-on-centos-5/</link>
		<comments>http://www.webtatic.com/blog/2009/05/installing-php-526-on-centos-5/#comments</comments>
		<pubDate>Sun, 17 May 2009 13:45:06 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=201</guid>
		<description><![CDATA[Update 20th June 2009 &#8211; I found a bug in PHP 5.2.6, so I have compiled 5.2.10 rpms and provided a repository from which to install them, check out the article here.
Update 19th May 2009 &#8211; I have written an article here detailing how to build RPMs and install some additional php extensions, which although [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update 20th June 2009</strong> &#8211; I found a bug in PHP 5.2.6, so I have compiled 5.2.10 rpms and provided a repository from which to install them, <a href="http://www.webtatic.com/blog/2009/06/php-529-on-centos-5/">check out the article here</a>.<br />
<strong>Update 19th May 2009</strong> &#8211; I have written an <a href="/blog/2009/05/installing-php-526-extra-extensions/">article here</a> detailing how to build RPMs and install some additional php extensions, which although part of the PHP source distribution, is not included in this installation (extensions mcrypt, mhash, tidy, mssql)</p>
<p><strong>Update 13th June 2009</strong> &#8211; I&#8217;ve made the guide easier by using yum options to install the testing RPMs rather than using yum-priorities.</p>
<p>Redhat-based distributions tend to supply out of date releases of software. This isn&#8217;t technically a bad thing. They extensively test their updates before releasing out to the public, and upstream security fixes from the latest versions, meaning that they can be extremely stable when compared to some other distributions such as Debian-based Ubuntu.</p>
<p>However, this means that you rarely get new features added, until there is a new major release. Again this isn&#8217;t all bad, as new features add new bugs, which affect stability.</p>
<p>PHP 5.1.6, which is part of the base CentOS repository, was released 24-Aug-2006, almost 3 years ago. Since then, PHP 5.2 has been released, gone through 9 release builds since, and is considered stable for production environments.<br />
<span id="more-201"></span></p>
<h3>Installation</h3>
<p>There is a version of PHP (5.2.6) in CentOS&#8217;s Testing repository. You could either download each rpm and install, or set up your yum to install from the testing repository. </p>
<p>Install the testing repository&#8217;s GPG key:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rpm --import http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing</pre></div></div>

<p>And download the CentOS-Testing repo file:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">cd /etc/yum.repos.d
wget http://dev.centos.org/centos/5/CentOS-Testing.repo</pre></div></div>

<p>Now you can install/update to PHP 5.2.6 by running</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">yum --disablerepo=* --enablerepo=c5-testing update php</pre></div></div>

<h3>Reasoning</h3>
<p>As much as I have wanted to be using PHP 5.2, using just CentOS&#8217;s normal repositories meant not being able to use its new features.</p>
<p>It appears now that Zend Framework no longer supports PHP 5.1 in all of its sub-components, take for example Zend_View_Helper_Placeholder_Container_Abstract since ZF 1.7.5, and its derivative classes. This extends from ArrayObject, and it uses the php method ArrayObject::ksort(). This is not available in the version of SPL contained in Centos 5&#8217;s PHP 5.1.6. It causes a fatal error when used.</p>
<p>So, the question is should I write a patch for Zend Framework, which wont get incorporated into their code, or upgrade to PHP 5.2?</p>
<p>I chose the former initially, which fixes that problem, but I don&#8217;t know if there are any other bugs which might crop up in the library, so I&#8217;ve now chosen to update PHP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/05/installing-php-526-on-centos-5/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Generating a random PHP identifier</title>
		<link>http://www.webtatic.com/blog/2009/05/generating-a-random-php-identifier/</link>
		<comments>http://www.webtatic.com/blog/2009/05/generating-a-random-php-identifier/#comments</comments>
		<pubDate>Sat, 02 May 2009 12:53:18 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=187</guid>
		<description><![CDATA[Update 1st June 2009 &#8211; Added a note mentioning about case-insensitive comparisons in MySQL.
I&#8217;ve been looking at generating random identifiers in PHP, and making sure they are random enough. Looking at the PHP function uniqid(), and its suggested better token, I don&#8217;t think this is an adiquate enough way:

$better_token = md5&#40;uniqid&#40;rand&#40;&#41;, true&#41;&#41;;


Md5 is a 128 [...]]]></description>
			<content:encoded><![CDATA[<p>Update 1st June 2009 &#8211; Added a note mentioning about case-insensitive comparisons in MySQL.</p>
<p>I&#8217;ve been looking at generating random identifiers in PHP, and making sure they are random enough. Looking at the PHP function <a href="http://uk3.php.net/manual/en/function.uniqid.php">uniqid</a>(), and its suggested better token, I don&#8217;t think this is an adiquate enough way:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$better_token = md5<span class="br0">&#40;</span>uniqid<span class="br0">&#40;</span>rand<span class="br0">&#40;</span><span class="br0">&#41;</span>, true<span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></div></div>

<p><span id="more-187"></span><br />
Md5 is a 128 bit hash algorithm. Looking at the data inside the function, there doesn&#8217;t appear to be enough data (i.e. entrophy) for the 128 bits, so at best, the uniqueness of the resulting string will be less than the capacity of the md5.</p>
<p>uniqid(), this alone generates 13 hexadecimal characters, which is the equivallent of 52 bits,<br />
<a href="http://uk3.php.net/manual/en/function.rand.php">rand</a>(), generates a random integer number, which would fill 32 bits<br />
uniqid(&#8221;, true), this appends additional entropy to the string, 9 decimal numbers and a dot, less than 20 bits of randomness</p>
<p>Adding these all up, 52+32+20 = 104 bits.</p>
<p>So what happens when you md5 a value that has 104 bits of randomness? You get at most 2^104 possible random values back in a md5 that has 2^128 values. Hashing algorithms can have multiple input values which generate the same output value, causing <a href="http://en.wikipedia.org/wiki/Hash_collision">collisions</a>, so the actual randomness would be less.</p>
<h3>A better way</h3>
<p>*nix systems (including Solaris, Linux, OSX and FreeBSD) have special device files usually <a href="http://en.wikipedia.org/wiki//dev/random">/dev/random</a>, which can generate as much randomness as required by reading in the number of bytes needed. /dev/urandom is a non-blocking version which sacrifices entrophy in order for the file to not lock.</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$uniqueId = bin2hex<span class="br0">&#40;</span>file_get_contents<span class="br0">&#40;</span>'/dev/urandom', <span style="">0</span>, null, -<span style="">1</span>, <span style="">16</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></div></div>

<p>This will return a random 32 character hexadecimal (128 bits). You shouldn&#8217;t need to md5 this.</p>
<h3>Generating a shorter (yet just as random) string suitable for urls</h3>
<p>The hexadecimal format consists of the numbers 0-9 and a-f, 16 symbols in total, yet there are many more acceptable acceptable characters available in a url.</p>
<p>You can have a shorter identifier if you encode the binary data as <a href="http://en.wikipedia.org/wiki/Base64">base 64</a> instead, which as its name suggests, has 64 symbols. However, the standard ascii symbols used in this encoding include + and /, which have special meaning in URLs. You can convert these to &#8211; and _ respectively to make them more compatible.</p>
<p>Also, base-64 encoding pads the end with = if there isn&#8217;t enough bytes in a block. These are not needed by an identifier, so can be stripped.</p>
<p>If the data string is already in binary, you can just do the following to convert it to base 64:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$base64encodedString = str_replace<span class="br0">&#40;</span>
    array<span class="br0">&#40;</span>'+','/','='<span class="br0">&#41;</span>,
    array<span class="br0">&#40;</span>'-','_',''<span class="br0">&#41;</span>,
    base64_encode<span class="br0">&#40;</span>md5<span class="br0">&#40;</span>$data, true<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></div></div>

<p>If however the data was in hexadecimal, you can convert it to binary using the php function <a href="http://uk3.php.net/manual/en/function.pack.php">pack</a>() beforehand:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$base64encodedString = str_replace<span class="br0">&#40;</span>
    array<span class="br0">&#40;</span>'+','/','='<span class="br0">&#41;</span>,
    array<span class="br0">&#40;</span>'-','_',''<span class="br0">&#41;</span>,
    base64_encode<span class="br0">&#40;</span>pack<span class="br0">&#40;</span>'H*', md5<span class="br0">&#40;</span>$data<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></div></div>

<p>Doing this will shorten a 32 character hexadecimal into a 22 character base-64 encoded string.</p>
<p>Please note that when doing MySQL comparisons, your text field&#8217;s collate will most likely be case-insensitive. Comparing a base64 string against one in the database when the collation is case-insensitive (e.g. latin1_*_ci, utf8_*_ci) will dramatically increase the chance of collisions as 26 of the 64 characters will match the other 26 case ones, giving a significant reduction in bits.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/05/generating-a-random-php-identifier/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Laptop DNS forwarding to DHCP DNS</title>
		<link>http://www.webtatic.com/blog/2009/03/laptop-dns/</link>
		<comments>http://www.webtatic.com/blog/2009/03/laptop-dns/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 20:12:50 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[bind9]]></category>
		<category><![CDATA[dhclient]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=154</guid>
		<description><![CDATA[I run bind9, a DNS server, on my Ubuntu laptop so that I can use more advanced local dns resolution than what /etc/hosts can provide, such as wildcard domain names.
The problem is that in order for me to be able to use that DNS server whilst being able to resolve internet domains at the same [...]]]></description>
			<content:encoded><![CDATA[<p>I run <a href="http://www.bind9.net/">bind9, a DNS server</a>, on my <a href="http://www.ubuntu.com/">Ubuntu</a> laptop so that I can use more advanced local dns resolution than what /etc/hosts can provide, such as wildcard domain names.</p>
<p>The problem is that in order for me to be able to use that DNS server whilst being able to resolve internet domains at the same time used to require me to do two things:</p>
<ul>
<li>Edit /etc/resolv.conf, and change nameserver to 127.0.0.1</li>
<li>Edit /etc/bind/named.conf.options, and add a forwarder to the nameserver IP that was previously in /etc/resolv.conf</li>
</ul>
<p>Obviously this is too annoying to have to do every time the dhcp renews, wiping my /etc/resolv.conf changes. Also, if I am frequently changing networks, as I do on my laptop. I have to go and update the bind forwarders again.</p>
<p>In came the solution I wrote in Ubuntu 8.04 (Hardy), using the dhcp-script hook directory in /etc/dhcp3/dhclient-exit-hooks.d/, which scripts inside get called when dhcp renews, after the /etc/resolv.conf, I was able to write a script that did the above automatically.</p>
<p><span id="more-154"></span></p>
<p><a href="/files/2009/03/zzzzz_bind-forwarders">/etc/dhcp3/dhclient-exit-hooks.d/zzzzz_bind-forwarders</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #007800;">BIND_IP</span>=127.0.0.1
&nbsp;
<span style="color: #007800;">NAMED_FORWARDERS</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>bind<span style="color: #000000; font-weight: bold;">/</span>named.conf.forwarders
<span style="color: #007800;">NAMED_INITD</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>bind9
<span style="color: #007800;">RESOLV_CONF</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>resolv.conf
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$new_domain_name_servers</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'
iforwarders {\n
s/\([^ ]\+\)\s*/ \1;\n/g
a};'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$NAMED_FORWARDERS</span>&quot;</span>
&nbsp;
<span style="color: #ff0000;">&quot;<span style="color: #007800;">$NAMED_INITD</span>&quot;</span> restart
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;
<span style="color: #000099; font-weight: bold;">\$</span>anameserver <span style="color: #007800;">$BIND_IP</span>
/^\s*nameserver/i# moved following nameserver to bind forwarders
s/^\s*nameserver/# nameserver/&quot;</span> <span style="color: #660033;">-i</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$RESOLV_CONF</span>&quot;</span></pre></div></div>

<p>This will read the dhcp announced nameserver from the parameters dhclient sends to it, create a /etc/bind/named.conf.forwarders configuration file with the dhcp nameserver in, and rewrite the /etc/resolv.conf nameserver to 127.0.0.1, and restart bind.</p>
<p>Now you just need to include the /etc/bind/named.conf.forwarders in your /etc/bind/named.conf.options file:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">options <span style="color: #7a0874; font-weight: bold;">&#123;</span>
        directory <span style="color: #ff0000;">&quot;/var/cache/bind&quot;</span>;
&nbsp;
        include <span style="color: #ff0000;">&quot;/etc/bind/named.conf.forwarders&quot;</span>;
&nbsp;
        auth-nxdomain no;    <span style="color: #666666; font-style: italic;"># conform to RFC1035</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>;</pre></div></div>

<p>As I mentioned in the post <a href="/blog/2009/03/workaround-so-networkmanager-runs-dhclient-hooks/">Workaround so NetworkManager runs dhclient hooks</a>, when I upgraded to Ubuntu 8.10 (Intrepid), this script no longer ran. Please read this article to make the script work again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/03/laptop-dns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workaround so NetworkManager runs dhclient hooks</title>
		<link>http://www.webtatic.com/blog/2009/03/workaround-so-networkmanager-runs-dhclient-hooks/</link>
		<comments>http://www.webtatic.com/blog/2009/03/workaround-so-networkmanager-runs-dhclient-hooks/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 19:41:57 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Server Admin]]></category>
		<category><![CDATA[dhclient]]></category>
		<category><![CDATA[NetworkManager]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=157</guid>
		<description><![CDATA[When I upgraded from Ubuntu 8.04 (Hardy) to Ubuntu 8.10 (Intrepid), a dhclient-exit-hook script I wrote no longer functioned.
dhclient-script was previously used by dhclient so that whenever the dhcp changed, it would reconfigure the interfaces, generate the /etc/resolv.conf, and run scripts who&#8217;s intention is to modify the /etc/resolv.conf file based on the dhcp settings. These [...]]]></description>
			<content:encoded><![CDATA[<p>When I upgraded from Ubuntu 8.04 (Hardy) to Ubuntu 8.10 (Intrepid), a dhclient-exit-hook script I wrote no longer functioned.</p>
<p>dhclient-script was previously used by dhclient so that whenever the dhcp changed, it would reconfigure the interfaces, generate the /etc/resolv.conf, and run scripts who&#8217;s intention is to modify the /etc/resolv.conf file based on the dhcp settings. These scripts are located in the folders /etc/dhcp3/dhclient-enter-hooks.d/ and /etc/dhcp3/dhclient-exit-hooks.d/.</p>
<p>Reading up on <a href="https://bugzilla.redhat.com/show_bug.cgi?id=446631">the problem</a>, thanks to perlhead on the <a href="http://ubuntuforums.org/showthread.php?p=6748706">Ubuntu Forums</a>, it appears that since NetworkManager did the same function as dhclient-script, which got in the way of NetworkManager&#8217;s plugins, so dhclient-script was disabled.</p>
<p>Sadly NetworkManager fails to call any hooks on dhcp renew, which is what my script needed. It only calls its hooks, which are located in /etc/NetworkManager/dispatcher.d/, when the interface is brought up or down.</p>
<p>I&#8217;ve made a modified dhclient-script, which when set as the dhclient script, will call the enter hooks, then call NetworkManager&#8217;s dhclient script, then call the exit hooks. This effectively gives the intended effect of allowing NetworkManager to run with the old dhcp hooks available.</p>
<p>To use it, modify your /etc/dhcp3/dhclient.conf and add/modify the line:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>dhclient-script-networkmanager</pre></div></div>

<p>And save this file <a href="/files/2009/03/dhclient-script-networkmanager">/sbin/dhclient-script-networkmanager</a></p>
<p>Make sure its executable:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>dhclient-script-networkmanager</pre></div></div>

<p>Now restart NetworkManager to see if it has worked:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>NetworkManager restart</pre></div></div>

<p>Wait for the network to reconnect again, if it hangs then it probably didn&#8217;t work. Check out your resolv.conf:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>resolv.conf</pre></div></div>

<p>Please let me know how it goes when running this script. I have only tested it on Ubuntu 8.10.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/03/workaround-so-networkmanager-runs-dhclient-hooks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Which subversion branch should I follow?</title>
		<link>http://www.webtatic.com/blog/2009/03/which-subversion-branch-should-i-follow/</link>
		<comments>http://www.webtatic.com/blog/2009/03/which-subversion-branch-should-i-follow/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 15:00:03 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Code Versioning]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Wordpress-MU]]></category>

		<guid isPermaLink="false">http://www.webtatic.com/?p=142</guid>
		<description><![CDATA[Subversion has become a popular versioning system for open-source projects. It has the capability to tag or branch the source code at a specific point in development, used to give users access to these revisions easily.
It can be used to distribute this source to the developers working on the project, the end-user and other projects [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://subversion.tigris.org/">Subversion</a> has become a popular versioning system for open-source projects. It has the capability to tag or branch the source code at a specific point in development, used to give users access to these revisions easily.</p>
<p>It can be used to distribute this source to the developers working on the project, the end-user and other projects which use the project. They each need to pick the correct Subversion folder to download from.</p>
<p>For example, you can track minor revisons to Wordpress MU 2.7.* by checking out <a href="http://svn.automattic.com/wordpress-mu/branches/2.7/">http://svn.automattic.com/wordpress-mu/branches/2.7/</a>.</p>
<p>Once you&#8217;ve picked the folder, you can download it using:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> checkout http:<span style="color: #000000; font-weight: bold;">//</span>svn.automattic.com<span style="color: #000000; font-weight: bold;">/</span>wordpress-mu<span style="color: #000000; font-weight: bold;">/</span>branches<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.7</span><span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>wordpress<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>If it is the trunk or a branch which changes, you can update it using:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> update <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>wordpress<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>If you want to switch to another folder (whilst retaining any modifications you&#8217;ve made/unversioned files):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> switch http:<span style="color: #000000; font-weight: bold;">//</span>svn.automattic.com<span style="color: #000000; font-weight: bold;">/</span>wordpress-mu<span style="color: #000000; font-weight: bold;">/</span>branches<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.8</span><span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>wordpress<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>It is important to note not all projects follow the same guidelines, and may not even create tags or branches of the project for other people. You shouldn&#8217;t for example assume that a &#8220;branches/2.7&#8243; branch tracks the releases in tags/2.7.* without checking.</p>
<p><span id="more-142"></span></p>
<p>The most prevailing Subversion folder structure used by projects is a simplified CVS style, e.g.:</p>
<ul>
<li>http://svn.example.com/project/
<ul>
<li>trunk</li>
<li>branches
<ul>
<li>fubra</li>
<li>2.7</li>
<li>newfeature</li>
</ul>
</li>
<li>tags
<ul>
<li>2.7.2</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>trunk</h3>
<p>The trunk is the development version. Developers of the project checkout this version to work on, and commit to the repository. End-users and other projects wouldn&#8217;t tend to checkout this one, as it is likely unstable.</p>
<h3>tags</h3>
<p>When a project is in a stable and tested state, in a beta or is to be release candidate, the developers tag the project with a label, usually giving the label a version number, and a short description of its condition. e.g. RC for release candidate</p>
<p>Tags are meant to be fixed read-only, so they&#8217;ll never change, even with minor changes to the project. These are good for following if you want to lock to a specific build of the project.</p>
<h3>branches</h3>
<p>Branches are commonly used as forks in development which are intended to add new features to the project. Developers would use these.</p>
<p>They are also sometimes used to track minor revisions of releases, so that an end-user or other project can checkout this version and just &#8220;svn update&#8221; as minor changes are added to the repository. Examples of projects that do this are Wordpress and Zend Framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webtatic.com/blog/2009/03/which-subversion-branch-should-i-follow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 1.353 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-07-18 08:41:22 --><!-- Compression = gzip -->
