<?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>Alunduil&#039;s Hosting &#187; Linux Guides</title> <atom:link href="http://www.alunduil.com/category/linux-guides/feed/" rel="self" type="application/rss+xml" /><link>http://www.alunduil.com</link> <description>Gentoo Hackery and Other Fun ...</description> <lastBuildDate>Fri, 13 Aug 2010 17:25:11 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0.1</generator> <item><title>MySQL SELECT Statement Explanation</title><link>http://www.alunduil.com/2010/08/13/mysql-select-statement-explanation/</link> <comments>http://www.alunduil.com/2010/08/13/mysql-select-statement-explanation/#comments</comments> <pubDate>Fri, 13 Aug 2010 17:25:11 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[mysql]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=177</guid> <description><![CDATA[Introduction SQL SELECT statements have the following form: SELECT COLUMNS FROM TABLES [WHERE CONDITIONS] [GROUP BY COLUMNS [HAVING CONDITIONS] ] [ORDER BY COLUMNS ASC&#124;DESC] The way SQL processes these directives is slightly different: FROM TABLES [WHERE CONDITIONS] [GROUP BY COLUMNS [HAVING CONDITIONS] ] [ORDER BY COLUMNS ASC&#124;DESC] SELECT COLUMNS FROM Clause FROM TABLE [AS ALIAS] [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>SQL SELECT statements have the following form:</p><pre><code>SELECT COLUMNS 
FROM TABLES 
[WHERE CONDITIONS] 
[GROUP BY COLUMNS 
[HAVING CONDITIONS]
]   
[ORDER BY COLUMNS ASC|DESC]
</code></pre><p>The way SQL processes these directives is slightly different:</p><pre><code>FROM TABLES
[WHERE CONDITIONS] 
[GROUP BY COLUMNS 
[HAVING CONDITIONS]
] 
[ORDER BY COLUMNS ASC|DESC]
SELECT COLUMNS
</code></pre><h1>FROM Clause</h1><p>FROM TABLE [AS ALIAS] .. TABLE [AS ALIAS]</p><p>This lets SQL know which tables are being used for the query and any aliases they might be referenced as in the query.  The aliases are only <em>necessary</em> when an inner join is performed.</p><h2>Examples</h2><ul><li>FROM table1, table2</li><li>FROM table1 as t1, table2 as t2</li><li>FROM table1 as t1a, table1 as t1b</li></ul><p>This last example is a join and requires the aliases.</p><h1>WHERE Clause</h1><p>WHERE CONDITIONS</p><p>This lets SQL know which rows should be selected from the table based on the <em>conditions</em> passed.  The conditions can also be combined with the logical <code>or</code> and <code>and</code> operators.  (Which should be properly parenthesized to demonstrate priority.)</p><p>The following operators can act on columns in a where clause:</p><ul><li>=</li><li>&lt;> (also !=)</li><li>></li><li>&lt;</li><li>>=</li><li>&lt;=</li><li>BETWEEN</li><li>LIKE</li><li>IN</li></ul><h2>Examples</h2><ul><li>WHERE t1.c1 = &#8220;string&#8221;</li><li>WHERE t1.c1 = t2.c1 and t1.c2 &lt;> t2.c2</li><li>WHERE t1.c1 = t2.c1 and (t1.c2 &lt;> t2.c2 or t1.c3 &lt;> t2.c3)</li><li>WHERE t1.c1 in (value set)</li></ul><p>This last example demonstrates using either an explicit set or a subquery where the subquery returns a list of values that filter this main query.</p><h1>GROUP BY Clause</h1><p>GROUP BY COLUMNS</p><p>This lets SQL know to group the table for aggregate filtering operations.  For example if you need to sort based on the max sales of your sales people you could group by your sales members&#8217; identifiers and then use a HAVING clause to filter based on their max(sales_amount).  This clause is only really useful when a HAVING clause is useful.</p><p>Multiple GROUP BY columns just restricts the groupings to be tighter and tighter.  For example, if you have three columns t1, t2, and t3 and you use a GROUP by t1, t2 you will end up with the following groupings:</p><pre><code>-------------------------------------------------------------------------------
t1 and t2 are all the same in this group; t3 varies
-------------------------------------------------------------------------------
t1 and t2 are all the same in this group; t3 varies
-------------------------------------------------------------------------------
</code></pre><h2>Examples</h2><ul><li>GROUP BY c1, c2</li><li>GROUP BY c1</li></ul><h1>HAVING Clause</h1><p>HAVING CONDITIONS</p><p>This is very similar to the WHERE clause and the logical operators <code>and</code> and <code>or</code> can be used as in the WHERE clause.  The difference here is that typically you&#8217;ll be filtering based on an aggregate operation on an ungrouped column to filter out groups.</p><h2>Examples</h2><ul><li>HAVING max(t3) > n</li><li>HAVING average(t3) between x and y</li></ul><h1>ORDER BY Clause</h1><p>ORDER BY COLUMNS ASC|DESC</p><p>This lets SQL know you want to sort the specified columns ascending or descending.  The sorting will be applied to the columns in the order that they are specified.  Thus it works similar to the way groups work it makes groups out of the first specification and then the second and so on.  Performing the new operation only within the context of the previous.  Thus the following data would be sorted as shown:</p><p>Before Sorting:</p><pre><code>----------------
| c1 | c2 | c3 |
----------------
| aa | aa | aa |
| bb | bb | bb |
| aa | dd | ee |
| cc | cc | cc |
| aa | bb | cc |
----------------
</code></pre><p>After Sorting (ORDER BY c1, c2, c3):</p><pre><code>----------------
| c1 | c2 | c3 |
----------------
| aa | aa | aa |
| aa | bb | cc |
| aa | dd | ee |
| bb | bb | bb |
| cc | cc | cc |
----------------
</code></pre><h2>Examples</h2><ul><li>ORDER BY c1</li><li>ORDER BY c1, c2, c3</li></ul><h1>SELECT Clause</h1><p>SELECT COLUMNS</p><p>This lets SQL know which columns (or what projection) of the table to actually display.  One can also specify aggregate functions here to perform functions such as counting, averaging, etc.</p><h2>Examples</h2><ul><li>SELECT col1, col2</li><li>SELECT col1, t1.col2</li><li>SELECT COUNT(col1)</li></ul><h1>Conclusion</h1><p>Remember that SQL SELECT statements are not processed in the order that they are parsed.  This will simplify the query building process to think of it as operations on a set of data (since that is what it is).  The steps are as follows:</p><p>1 Select the set to act on.<br /> 2 Filter out elements from the set. 3 Group the remaining elements. 4 Filter out groups of elements. 5 Sort the elements. 6 Get the projection of the elements&#8217; attributes.</p><p>All of this somehow translates to the SQL SELECT statement syntax we started this discussion with:</p><pre><code>SELECT COLUMNS 
FROM TABLES 
[WHERE CONDITIONS] 
[GROUP BY COLUMNS 
[HAVING CONDITIONS]
]   
[ORDER BY COLUMNS ASC|DESC]
</code></pre><h1>References</h1><ul><li><a href="http://dev.mysql.com/doc/refman/5.0/en/select.html">MySQL Manual</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/08/13/mysql-select-statement-explanation/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Gearman-0.14 on CentOS 5.5</title><link>http://www.alunduil.com/2010/08/08/gearman-0-14-on-centos-5-5/</link> <comments>http://www.alunduil.com/2010/08/08/gearman-0-14-on-centos-5-5/#comments</comments> <pubDate>Sun, 08 Aug 2010 18:49:25 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[centos]]></category> <category><![CDATA[epel]]></category> <category><![CDATA[fedora]]></category> <category><![CDATA[gearman]]></category> <category><![CDATA[ius]]></category> <category><![CDATA[pear]]></category> <category><![CDATA[pecl]]></category> <category><![CDATA[php]]></category> <category><![CDATA[rhel]]></category> <category><![CDATA[rpm]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=174</guid> <description><![CDATA[Introduction I was recently tasked with working on getting PHP 5.3 installed with Gearman on CentOS 5.5. I&#8217;ve learned quite a few of the pains of working with RPMs and have reminded myself why I don&#8217;t work with RHEL on a regular basis (for personal items anyway). I have had some success in getting everything [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>I was recently tasked with working on getting PHP 5.3 installed with Gearman on CentOS 5.5.  I&#8217;ve learned quite a few of the pains of working with RPMs and have reminded myself why I don&#8217;t work with RHEL on a regular basis (for personal items anyway).  I have had some success in getting everything working correctly and the following is the quick easy way to get this done on an x86_64 CentOS 5.5 install (although other RHELs should work as well.</p><h1>Upgrade PHP</h1><p>First, we need to upgrade PHP from the <a href="http://wiki.iuscommunity.org/Doc/ClientUsageGuide#Configuration">IUS Community Repository</a>.  Once you have the epel and ius repositories installed and working you simply:</p><pre><code>yum remove php
yum install php53
</code></pre><p>If the second yum command complains simply remove all php packages listed form `rpm -qa | grep ^php&#8217; and install the php53 equivalents.</p><h1>Install Gearman</h1><p>I recompiled the Fedora source RPMs (with a slightly modified spec file) to get Gearman to play nicely with the CentOS 5.5 environment.  These RPMs are available in <a href="http://www.alunduil.com/svn/RHELL/trunk/">my repository</a>.  Simply install these RPMs (letting me know if there are any issues with them) and you should be ready to install the PHP Gearman Interface.</p><h1>Install php-gearman</h1><p>This is the easiest part of all once you have the requirements fulfilled.  Simply <code>pear install channel://pecl.php.net/gearman-0.7.0</code> and you&#8217;re finished.</p><h1>Conclusion</h1><p>If you must use RHEL this guide should help you get gearman running with PHP in a snap.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/08/08/gearman-0-14-on-centos-5-5/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Holland on Gentoo</title><link>http://www.alunduil.com/2010/08/01/holland-on-gentoo/</link> <comments>http://www.alunduil.com/2010/08/01/holland-on-gentoo/#comments</comments> <pubDate>Sun, 01 Aug 2010 18:32:37 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[backups]]></category> <category><![CDATA[database]]></category> <category><![CDATA[directory]]></category> <category><![CDATA[gentoo]]></category> <category><![CDATA[holland]]></category> <category><![CDATA[ldap]]></category> <category><![CDATA[lvm]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[portage]]></category> <category><![CDATA[postgresql]]></category> <category><![CDATA[python]]></category> <category><![CDATA[sqlite]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=167</guid> <description><![CDATA[Introduction There is a new king of backups in town, holland. This little framework written in Python allows one to easily backup anything that might need to be converted to a more flat file style before being backed up. Right now there is support for mysql, sqlite, and postgresql but with a little finesse it [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>There is a new king of backups in town, <a href="http://hollandbackup.org/">holland</a>.  This little framework written in Python allows one to easily backup anything that might need to be converted to a more flat file style before being backed up.  Right now there is support for mysql, sqlite, and postgresql but with a little finesse it could potentially support directories as well as databases.  This would make not only mysql backups a breeze but LDAP as well.</p><h1>Progress Update</h1><p>I have added a preliminary set of ebuilds to my overlay (which could use some code review if anyone is interested) that allows holland to easily be installed on Gentoo systems.  So easy in fact that all it takes is <code>emerge holland</code>.</p><p>It accepts a set of use flags to bring in the &#8220;providers&#8221; you want to be able to backup for and makes sure that those packages are installed on the system.</p><h2>Examples</h2><p>The holland ebuilds have three providers right now:</p><ul><li>mysql</li><li>postgresql</li><li>sqlite</li></ul><p>You can install any of these three you want in any combination it doesn&#8217;t care.  It will default to installing the mysql but can easily be told not to by placing -mysql in the use flags for holland. <a href="http://blog.flameeyes.eu/">Diego Pettenò — Flameeyes</a> mentioned to me that in EAPI 4 we&#8217;ll get the cool option of being able to specify one of a set of use flags must be set without forcing the choice but until then we have this slick solution.</p><p>There is also lvm support for snapshotting off the database directory before grabbing the database and a myriad of other features I haven&#8217;t had a chance to explore yet.</p><p>To perform a rudimentary backup after installing holland simply run <code>holland bk</code>.  This will read the configurations in <code>/etc/holland</code> and backup the databases it finds.</p><h1>Conclusion</h1><p>The new kid on the block, holland, will make backups of complex databases and directories a breeze.  Simply change that cronjob from using mysqldump to calling holland and you&#8217;re finished.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/08/01/holland-on-gentoo/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Bacula Update Database Woes</title><link>http://www.alunduil.com/2010/06/27/bacula-update-database-woes/</link> <comments>http://www.alunduil.com/2010/06/27/bacula-update-database-woes/#comments</comments> <pubDate>Sun, 27 Jun 2010 20:47:32 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[backups]]></category> <category><![CDATA[bacula]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=160</guid> <description><![CDATA[Introduction Backups, a subject always talked about but rarely put into practice. If you do happen to have a backup solution, excellent, you probably sleep better than our comrades without a recovery plan. I&#8217;ve been using bacula for my backup solution for over a year now and one thing I&#8217;ve never had enough experience with [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>Backups, a subject always talked about but rarely put into practice.  If you do happen to have a backup solution, excellent, you probably sleep better than our comrades without a recovery plan.  I&#8217;ve been using bacula for my backup solution for over a year now and one thing I&#8217;ve never had enough experience with has been upgrading bacula.  The upgrade process can be pretty hairy depending your distribution, level of investment, etc.</p><h1>Bacula Updates</h1><p>Recently bacula-5.0.2-r1 was marked as stable for the Gentoo distribution.  Upon finishing the emerge (laugh if you like at my compilation of all packages), I attempted the restart of all bacula services to bring the new version live:</p><pre><code>/etc/init.d/bacula-sd restart
/etc/init.d/bacula-fd restart
/etc/init.d/bacula-dir restart
</code></pre><p>All went well until I did the restart on the director (bacula-dir).  At that point things took a nasty turn for the worse.  The director didn&#8217;t want to start and there were no messages on the screen indicating why this might be the case.</p><p>Long story short: the database needed some schema changes to be applied before the director could start up and get running again.  In order to determine this I needed to run: <code>bacula -u root -g bacula -c /etc/bacula/bacula-dir.conf -fvm</code>.  Once I ran this I got some meaningful output that told me I needed to update the database a couple of versions.  It&#8217;s important to know which versions you are dealing with as you have to run each update to the database individually.</p><p>First, a dump of all databases that are relevant is a good idea: <code>mysqldump -A -p &gt; backup.sql</code>.  Then, we can move onto updating the databases knowing full well that if something goes awry we simply import our backup and revert bacula to the old version.</p><p>The database update scripts were located in <code>/usr/libexec/bacula/updatedb/</code> and when run in the correct order will get you back up and running in short order.  When all is said and done utter the <code>/etc/init.d/bacula-dir</code> and your installation should whir to life once again.</p><h1>Conclusion</h1><p>When updating bacula don&#8217;t forget the catalog database may have changes that require it to be updated using the various bacula updatedb scripts.  Backups should commence at their regularly scheduled time.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/06/27/bacula-update-database-woes/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Blueman with Dolphin: Bluetooth File Browsing</title><link>http://www.alunduil.com/2010/06/27/blueman-with-dolphin-bluetooth-file-browsing/</link> <comments>http://www.alunduil.com/2010/06/27/blueman-with-dolphin-bluetooth-file-browsing/#comments</comments> <pubDate>Sun, 27 Jun 2010 17:05:31 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[blueman]]></category> <category><![CDATA[bluetooth]]></category> <category><![CDATA[dolphin]]></category> <category><![CDATA[fuse]]></category> <category><![CDATA[gnome]]></category> <category><![CDATA[kde]]></category> <category><![CDATA[kde 4]]></category> <category><![CDATA[nautilus]]></category> <category><![CDATA[obex]]></category> <category><![CDATA[obexfs]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=154</guid> <description><![CDATA[Introduction Bluetooth is a convenience that shouldn&#8217;t be underestimated. Bluetooth has invaded pretty much every peripheral device we&#8217;ve come to know and love: mice, keyboards, ad-hoc networks, etc. One of the most convenient aspects of bluetooth is the ability to browse filesystems through a simple ad-hoc network connection from a phone or other peripheral device. [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>Bluetooth is a convenience that shouldn&#8217;t be underestimated.  Bluetooth has invaded pretty much every peripheral device we&#8217;ve come to know and love: mice, keyboards, ad-hoc networks, etc.  One of the most convenient aspects of bluetooth is the ability to browse filesystems through a simple ad-hoc network connection from a phone or other peripheral device.</p><h1>Enter Blueman</h1><p>Blueman is my current preferred bluetooth management utility but others do exist including (gnome-bluetooth and kbluetooth).  I have found the configurability and freedom of blueman to give me a bit more flexibility than the other solutions.</p><p>The problem with blueman under KDE is that first and foremost blueman is a gnome application.  Now this isn&#8217;t inherently bad but it makes interoperability a little trickier than if I used kbluetooth (which of course hooks directly into KDE).  The first issue (and pretty much only issue so far) is that blueman expects you to use nautilus to browse files on a remote device.  Again, not bad but I don&#8217;t have nautilus so it&#8217;s a little tricky to see those files.</p><div id="attachment_155" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.alunduil.com/wp-content/uploads/2010/06/blueman.png"><img src="http://www.alunduil.com/wp-content/uploads/2010/06/blueman-300x253.png" alt="Blueman Transfer Settings" title="Blueman Transfer Settings" width="300" height="253" class="size-medium wp-image-155" /></a><p class="wp-caption-text">Blueman Transfer Settings</p></div><p>What we see in the image above is that we can modify the obex ftp browser that is used by blueman.  We&#8217;re going to change this to a custom script (shown below) that uses a FUSE obexfs and dolphin to achieve our desired behavior, browsing our bluetooth file with dolphin.</p><pre><code>#!/bin/bash
# bluemount.sh

obexfs -b $1  ~/.bluemnt 
dolphin ~/.bluemnt --nofork
fusermount -u ~/.bluemnt
</code></pre><p>This script requires obexfs, fuse and of course dolphin to work properly.  What the script does is mounts the bluetooth file system to a location that we can actually browse (I arbitrarily chose ~/.bluemnt and you can choose another directory if you like).  The argument we get from blueman, <code>$1</code>, is the device id that obexfs expects in order to mount our filesystem (very convenient).  Once the filesystem is mounted we simply tell dolphin to open that directory but stay in the foreground so we can properly unmount the device when we finish.</p><h1>Conclusion</h1><p>Integrating blueman with KDE can seem daunting but a few hooks and scripts allows the two to inter-operate with ease.  Now we can simply open our device list and click the browse button to get dolphin to show our files on the bluetooth device in question.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/06/27/blueman-with-dolphin-bluetooth-file-browsing/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Memcached Remote Memory Sharing</title><link>http://www.alunduil.com/2010/06/24/memcached-remote-memory-sharing/</link> <comments>http://www.alunduil.com/2010/06/24/memcached-remote-memory-sharing/#comments</comments> <pubDate>Thu, 24 Jun 2010 22:15:03 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[mediawiki]]></category> <category><![CDATA[memcached]]></category> <category><![CDATA[optimization]]></category> <category><![CDATA[php]]></category> <category><![CDATA[web]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=150</guid> <description><![CDATA[Introduction Memcached is a simple key/value memory store that allows values from pretty much any application to be stored in memory for quick retrieval. Most languages have simple APIs that make this very easy from a programming standpoint. This also means that it&#8217;s not quite as simple to configure as APC (but nearly for modern [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>Memcached is a simple key/value memory store that allows values from pretty much any application to be stored in memory for quick retrieval.  Most languages have simple APIs that make this very easy from a programming standpoint.  This also means that it&#8217;s not quite as simple to <a href="http://www.alunduil.com/2010/05/26/apc-caching-php/">configure as APC</a> (but nearly for modern applications).</p><h1>Installation and Configuration</h1><p>To install memcached I recommend using your choice of installation (mine being emerge) and then checking the configuration (again in the case of Gentoo) located at /etc/conf.d/memcached.</p><p>Update the file to listen on the interface you want, use the memory you want, etc and then start the daemon up.  Now if you&#8217;re using memcached on the same server as your apache server most webapps will be able to just turn on memcached and connect and work but if you&#8217;re using memcached and apache on separate servers it&#8217;s a little more work.</p><h1>WordPress and memcached</h1><p>I&#8217;ve already touted the wordpress plugin: <a href="http://www.w3-edge.com/wordpress-plugins/w3-total-cache/">W3 Total Cache</a> but unfortunately this plugin doesn&#8217;t allow you to easily configure memcached usage through the web interface.  It defaults to using the memcached server located at 127.0.0.1:11211 which if we&#8217;re using separate servers is less than ideal.  The file we need to modify with a simply sed (or by hand if you prefer knowing what&#8217;s going on) is %{DOCROOT}/wp-content/w3-total-cache-config.php.</p><p>We just need to change the memcached servers to point at our server&#8217;s location before enabling it in the interface.  To easily accomplish this we can use sed:</p><pre><code>sed -i -e 's/127.0.0.1:11211/&lt;host&gt;:&lt;port&gt;/g' %{DOCROOT}/wp-content/w3-total-cache-config.php
</code></pre><h1>Mediawiki and memcached</h1><p>The other application we can easily setup for memcached is mediawiki.  Mediawiki wants us to modify its LocalSettings.php with the following additions:</p><pre><code>## Shared memory settings 
$wgMainCacheType = CACHE_MEMCACHED; 
$wgParserCacheType = CACHE_MEMCACHED; 
$wgMessageCacheType = CACHE_MEMCACHED; 
$wgMemCachedServers = array("giskard.alunduil.com:11211"); 

$wgSessionsInMemcached = true; 
</code></pre><p>These settings simply turn on memcached (CACHE_MEMCACHED) for the various caching areas that mediawiki uses and specifies an array of memcached servers to store that caching information in.</p><p>If you do have more than one memcached server configured and available you can use the following syntax to include all of them with various weights:</p><pre><code>$wgMemCachedServers = array(array("host:port", weight), array("host2:port2", weight));
</code></pre><h1>Conclusion</h1><p>Using memcached can greatly improve the performance of webapps or other applications that don&#8217;t need to present the most up to date information.  This can reduce traffic to an overloaded database or configuration file or whatever other store you want to place a cache in front of.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/06/24/memcached-remote-memory-sharing/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Backup Roaming Clients Easily</title><link>http://www.alunduil.com/2010/05/27/backup-roaming-clients-easily/</link> <comments>http://www.alunduil.com/2010/05/27/backup-roaming-clients-easily/#comments</comments> <pubDate>Fri, 28 May 2010 01:46:09 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[backup]]></category> <category><![CDATA[client]]></category> <category><![CDATA[cron]]></category> <category><![CDATA[incremental]]></category> <category><![CDATA[rdiff-backup]]></category> <category><![CDATA[roaming]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=138</guid> <description><![CDATA[Introduction We all know that backups are awesome &#8230; until we try to find the time to set them up or the space to store them on. We all know that without backups we may see that day when we boot up our computer and our data isn&#8217;t there for whatever reason. How can we [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>We all know that backups are awesome &#8230; until we try to find the time to set them up or the space to store them on.  We all know that without backups we <em>may</em> see that day when we boot up our computer and our data isn&#8217;t there for whatever reason.  How can we simplify backups and more importantly initiate them client side?</p><h1>rdiff-backup</h1><p>The backup utility that I use to accomplish backing up roaming clients is rdiff-backup.  This simple python wrapper for rsync simplifies keeping incremental backups and backup sets for a historical set of backups.  By default rdiff-backup is pretty versatile and its documentation is fairly extensive.</p><p>What they don&#8217;t mention is how to automate these backups with an ssh key to a remote system and a cron job as a scheduler.</p><h2>The cron job</h2><p>The cron job is very very simple and highly adaptable:</p><pre><code>/usr/bin/rdiff-backup --remote-schema 'ssh -i /home/alunduil/.ssh/backup_dsa %s rdiff-backup --server' --exclude-other-filesystems --print-statistics /home/alunduil daneel.alunduil.com::elijah-backup &amp;&amp; /usr/bin/rdiff-backup --remote-schema 'ssh -i /home/alunduil/.ssh/backup_dsa %s rdiff-backup --server' --remove-older-than 7D --force daneel.alunduil.com::elijah-backup
</code></pre><p>Now let&#8217;s break this down so you can make it yours:</p><ul><li>/usr/bin/rdiff-backup &#8211; Our script of course.</li><li>&#8211;remote-schema &#8211; The trick that makes it work.  This actually allows you to specify the way ssh is called by rdiff-backup allowing a lot of control over how it authenticates and what happens on the server.</li><li>&#8211;exclude-other-filesystems &#8211; Specifies to stay on the mountpoint it started on.</li><li>&#8211;print-statistics &#8211; Prints some nice information about the backup when it finishes.</li><li>/home/alunduil daneel.alunduil.com::elijah-backup &#8211; The source and destination of the backup.</li><li>&amp;&amp; &#8211; Just making sure we don&#8217;t delete old backups without having a good one (trust me you want it this way).</li><li>&#8211;remove-older-than 7D &#8211;force &#8211; Force the removal of any backups that are older than one week.</li></ul><h1>Conclusion</h1><p>Creating a backup of a roaming client should be easy and with rdiff-backup with cron it certainly is.  You have complete control over when and where your backups reside and it can be set to run on boot or any other condition.  This is ideal for hosts that don&#8217;t always have an internet connection or who have uptimes of less than 50%.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/05/27/backup-roaming-clients-easily/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>APC Caching PHP</title><link>http://www.alunduil.com/2010/05/26/apc-caching-php/</link> <comments>http://www.alunduil.com/2010/05/26/apc-caching-php/#comments</comments> <pubDate>Thu, 27 May 2010 00:42:57 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[apc]]></category> <category><![CDATA[optimization]]></category> <category><![CDATA[php]]></category> <category><![CDATA[w3 total cache]]></category> <category><![CDATA[web]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=132</guid> <description><![CDATA[Introduction Making PHP run faster is usually pretty easy when you see some of the code that people can write (myself included) but what if we either don&#8217;t want to look at their code or don&#8217;t want to fix the code? What else can we do to improve the runtime and the load time of [...]]]></description> <content:encoded><![CDATA[<h1>Introduction</h1><p>Making PHP run faster is usually pretty easy when you see some of the code that people can write (myself included) but what if we either don&#8217;t want to look at their code or don&#8217;t want to fix the code?  What else can we do to improve the runtime and the load time of PHP web sites (this website included)?</p><p>We&#8217;ll cover how to use APC (Alternative PHP Cache) to help alleviate some of the issues of a slow web site.  Just like <a href="http://www.alunduil.com/2010/05/23/optimizing-the-am-out-of-lamp/">last time</a> we optimized MySQL and talked about optimizing Apache we&#8217;ll continue on the path to getting PHP applications as fast as we can (without touching a line of code).</p><h1>Enter APC</h1><p>APC is PEAR project and a PHP module that after installed and a restart of Apache is already doing some work to make life better.  By default APC turns on op-code caching which saves on the compile and execution times of PHP.  The configuration for this module is pretty straight forward but let&#8217;s look at a copy of the one I&#8217;m using:</p><pre><code>; /etc/php/apache2-php5/ext-active/apc.ini (On Gentoo anyways ...)
extension=apc.so
apc.enabled="1"
apc.shm_segments="4"
apc.shm_size="128"
apc.num_files_hint="1024"
apc.ttl="7200"
apc.user_ttl="7200"
apc.gc_ttl="3600"
apc.cache_by_default="1"
;apc.filters=""
;apc.mmap_file_mask="/tmp/apcphp5.XXXXXX"
apc.slam_defense="0"
apc.file_update_protection="2"
apc.enable_cli="0"
apc.max_file_size="1M"
apc.stat="1"
apc.write_lock="1"
apc.report_autofilter="0"
apc.include_once_override="0"
apc.rfc1867="0"
apc.rfc1867_prefix="upload_"
apc.rfc1867_name="APC_UPLOAD_PROGRESS"
apc.rfc1867_freq="0"
apc.localcache="0"
apc.localcache.size="512"
apc.coredump_unmap="0"
</code></pre><h2>Zooming In</h2><p>These options are documented fairly thoroughly in the <a href="http://php.net/manual/en/apc.configuration.php">APC PHP Manual</a>.</p><p>Most of these options can stay at their defaults and provide a pleasant experience but if we have the memory we should probably tweak these to get more out of them: * apc.shm_segments &#8211; The number of chunks to use from /dev/shm. * apc.shm_size &#8211; The size of aforementioned chunks.</p><p>These two parameters are the heart of APC and dictate the memory usage you&#8217;ll get out of it.  If you take segments*size you&#8217;ll get the maximum amount of shm space used by APC for the cache.  A limitation on shm_size is usually in place through the kernel and to determine what this is you can simply <code>cat /proc/sys/kernel/shmmax</code> (remember this command prints out B and APC expects MB).</p><h1>Further Caching</h1><p>APC also has an object cache available which can be used for just about anything but the application has to be modified to support this.  If you&#8217;re using <a href="http://wordpress.org/">WordPress</a> to host your site an excellent plugin for doing this is <a href="http://www.w3-edge.com/wordpress-plugins/w3-total-cache/">W3 Total Cache</a>.</p><h1>Conclusion</h1><p>APC can help you get an edge out of your server but without careful tuning won&#8217;t get you more than the last inch of performance.  Play with the memory settings until it isn&#8217;t over-utilizing memory (have a larger cache than your code base needs) or under-utilizing memory (having a smaller cache than your code base needs) but don&#8217;t forget you don&#8217;t want it to run into your swap space.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/05/26/apc-caching-php/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Optimizing the AM out of LAMP</title><link>http://www.alunduil.com/2010/05/23/optimizing-the-am-out-of-lamp/</link> <comments>http://www.alunduil.com/2010/05/23/optimizing-the-am-out-of-lamp/#comments</comments> <pubDate>Mon, 24 May 2010 02:22:34 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[efficiency]]></category> <category><![CDATA[lamp]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[optimization]]></category> <category><![CDATA[php]]></category> <category><![CDATA[web]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=127</guid> <description><![CDATA[A hot topic for anyone running MySQL and Apache on any machine is optimization and what I hope to accomplish is a quick explanation of how to optimize MySQL and where to tweak Apache to help with it&#8217;s operational efficiency as well. First things first &#8230; A few common things to possibly turn on, install, [...]]]></description> <content:encoded><![CDATA[<p>A hot topic for anyone running MySQL and Apache on any machine is optimization and what I hope to accomplish is a quick explanation of how to optimize MySQL and where to tweak Apache to help with it&#8217;s operational efficiency as well.</p><h1>First things first &#8230;</h1><p>A few common things to possibly turn on, install, or enable:</p><ul><li>APC (Another PHP Cache)</li><li>Memcached</li></ul><h1>MySQL Optimization</h1><p>The easiest way (and the quickest) to determine what can be done to optimize MySQL is to use a script called mysqltuner.pl.  The really interesting thing about this script is that to get it you simply run the following:</p><pre><code>wget mysqltuner.pl
</code></pre><p>After you&#8217;ve gotten this script run it with your perl interpreter:</p><pre><code>perl mysqltuner.pl
</code></pre><p>It will prompt you for your username and password for mysql and then print out a nice report outlining how your mysql daemon has been running.  Here&#8217;s an example of this output:</p><pre><code> &gt;&gt;  MySQLTuner 1.0.1 - Major Hayden &lt;major@mhtx.net&gt;
 &gt;&gt;  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 &gt;&gt;  Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: 

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.90-log
[OK] Operating on 32-bit architecture with less than 2GB RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 28M (Tables: 96)
[--] Data in InnoDB tables: 1M (Tables: 55)
[!!] Total fragmented tables: 2

-------- Performance Metrics -------------------------------------------------
[--] Up for: 1h 39m 49s (24K q [4.163 qps], 354 conn, TX: 9M, RX: 34M)
[--] Reads / Writes: 60% / 40%
[--] Total buffers: 148.6M global + 960.0K per thread (100 max threads)
[OK] Maximum possible memory usage: 242.3M (11% of installed RAM)
[OK] Slow queries: 0% (0/24K)
[OK] Highest usage of available connections: 28% (28/100)
[OK] Key buffer size / total MyISAM indexes: 64.0K/6.3M
[OK] Key buffer hit rate: 99.6% (164K cached / 682 reads)
[OK] Query cache efficiency: 81.3% (14K cached / 17K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 463 sorts)
[!!] Joins performed without indexes: 42
[OK] Temporary tables created on disk: 12% (54 on disk / 417 total)
[OK] Thread cache hit rate: 70% (106 created / 354 connections)
[!!] Table cache hit rate: 2% (48 open / 2K opened)
[OK] Open file limit used: 9% (95/1K)
[OK] Table locks acquired immediately: 98% (7K immediate / 7K locks)
[!!] Connections aborted: 7%
[OK] InnoDB data size / buffer pool: 1.0M/4.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Adjust your join queries to always utilize indexes
    Increase table_cache gradually to avoid file descriptor limits
    Your applications are not closing MySQL connections properly
Variables to adjust:
    join_buffer_size (&gt; 128.0K, or always use indexes with joins)
    table_cache (&gt; 48)
</code></pre><p>The first thing to notice is that mysql should be running for 24 to 48 hours before you trust the results of this script the second thing to acknowledge is that it isn&#8217;t omniscient.  Understanding how these parameters affect your memory footprint and your runtime efficiency are what we&#8217;re most interested in though.</p><h2>Glossary of Parameters</h2><p>The best source of my.cnf parameters is of course the MySQL documentation but I&#8217;ll clarify a few of the more pertinent items from the above output.</p><ul><li>Maximum Possible Memory &#8211; This is not the actual hard limit on your memory usage but a calculated theoretical maximum based on the parameters in your my.cnf and if this is over ~90% you may use your swap more than you want to.  After making any changes I suggest you check this to make sure you haven&#8217;t over-allocated yourself.</li><li>Highest Usage of Available Connections &#8211; This is the historical max connections used by mysql and if it&#8217;s at 100% this isn&#8217;t a guarantee that you need to increase max_connections but may just indicate that your connections spiked once.  That being said I recommend following its advice if you have the memory for it.</li><li>Query Cache Efficiency &#8211; The hit rate for the cache on your queries (I hope you have enabled).  As with any hash table if you&#8217;re not hitting what&#8217;s in the top bucket you need to increase the number of buckets.</li><li>Temporary Tables Created on Disk &#8211; This can be a finicky parameter to get right and is the first place I would recommend cutting if you don&#8217;t have the memory to run mysql like you would want, but if you do have the memory then up this as far as you can within reason.</li><li>Thread Cache Hit Rate &#8211; Just like any other cache.</li><li>Table Cache Hit Rate &#8211; Just like any other cache.</li></ul><h2>Fragmented Tables</h2><p>If you noticed the fragmented tables along with the recommendation to run OPTIMIZE TABLE that&#8217;s not something that will typically slow mysql down noticeably with today&#8217;s disks but if you want to defragment them I recommend reading <a href="http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/">this article on the topic</a>.</p><h1>Apache Tweaking</h1><p>The following parameters are usually in httpd.conf unless you run a distribution that organizes apache in an easier to work with manner (my preference of course is Gentoo which stores these parameters in: 00_mpm.conf).</p><p>The parameters for tweaking apache&#8217;s processes depend on which worker module you have in use.  The following is the pertinent sections from my configuration:</p><pre><code># prefork MPM
# This is the default MPM if USE=-threads
#
# MinSpareServers: Minimum number of idle child server processes
# MaxSpareServers: Maximum number of idle child server processes
&lt;IfModule mpm_prefork_module&gt;
        StartServers            5
        MinSpareServers         5
        MaxSpareServers         10
        MaxClients                      50
        MaxRequestsPerChild     500
&lt;/IfModule&gt;

# worker MPM
# This is the default MPM if USE=threads
#
# MinSpareThreads: Minimum number of idle threads available to handle request spikes
# MaxSpareThreads: Maximum number of idle threads
# ThreadsPerChild: Number of threads created by each child process
&lt;IfModule mpm_worker_module&gt;
        StartServers            2
        MinSpareThreads         15
        MaxSpareThreads         50
        ThreadsPerChild         25
        MaxClients                      150
        MaxRequestsPerChild     1000
&lt;/IfModule&gt;
</code></pre><p>These parameters are pretty self explanatory but just for completeness&#8217; sake I&#8217;ll do a small recap on these here:</p><ul><li>StartServers &#8211; The number of servers to have running and handling connections at first launch.</li><li>MinSpareServers &#8211; The minimum number of servers to have running not currently handling connections.</li><li>MaxSpareServers &#8211; The maximum number of servers to have running not currently handling connections.</li><li>MaxClients &#8211; The maximum number of clients that can simultaneously connect to Apache.</li><li>MaxRequestsPerChild &#8211; The maximum number of requests that a child will respond to before terminating.</li></ul><p>Using these parameters we can control the amount of memory that Apache will consume at the cost of other things we may want to have like lots of connections or many sequential requests.</p><h1>Conclusion</h1><p>There are a lot of different things that can be done for a server that seems to be performing less than ideally and I&#8217;ve only covered a fraction of things that can happen.  As always with this topic the situation will change based on your needs and how your server runs but at least now you may have a starting point for what to modify after you&#8217;ve troubleshooted every other thing that could go wrong.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/05/23/optimizing-the-am-out-of-lamp/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Running awstats on Gentoo</title><link>http://www.alunduil.com/2010/03/02/running-awstats-on-gentoo/</link> <comments>http://www.alunduil.com/2010/03/02/running-awstats-on-gentoo/#comments</comments> <pubDate>Tue, 02 Mar 2010 16:31:40 +0000</pubDate> <dc:creator>Alex Brandt</dc:creator> <category><![CDATA[Linux Guides]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[awstats]]></category> <category><![CDATA[gentoo]]></category> <category><![CDATA[statistics]]></category> <category><![CDATA[web]]></category><guid isPermaLink="false">http://www.alunduil.com/?p=102</guid> <description><![CDATA[Requirements I&#8217;m assuming for this quick guide that you already have a website installed and consequently apache. emerge -av awstats A quick breakdown on the use flags from gentookit&#8217;s equery: apache2 : Add Apache2 support geoip : Add geoip support for country and city lookup based on IPs vhosts : Adds support for installing web-based [...]]]></description> <content:encoded><![CDATA[<h1>Requirements</h1><p>I&#8217;m assuming for this quick guide that you already have a website installed and consequently apache.</p><pre><code>emerge -av awstats
</code></pre><p>A quick breakdown on the use flags from gentookit&#8217;s equery:</p><ul><li>apache2 : Add Apache2 support</li><li>geoip   : Add geoip support for country and city lookup based on IPs</li><li>vhosts  : Adds support for installing web-based applications into a virtual-hosting environment</li></ul><h1>Configuration</h1><p>Lots of configuration needs to occur for awstats to work correctly:</p><p>First, we need to setup a configuration file for the web site so we can update the statistics. cp /etc/awstats/awstats.model.conf /etc/awstats/awstats.<fqdn>.conf</fqdn></p><p>Where fqdn is the fully qualified domain name of your website you&#8217;ll be monitoriing.  After you&#8217;ve copied the default configuration customize it for your particular website.</p><p>Second, you need to enable awstats in your apache vhost configuration:</p><pre><code>CustomLog /var/www/localhost/log/apache/production.log combined

Alias /awstats/classes "/usr/share/webapps/awstats/6.9-r1/htdocs/classes/"
Alias /awstats/css "/usr/share/webapps/awstats/6.9-r1/htdocs/css/"
Alias /awstats/icons "/usr/share/webapps/awstats/6.9-r1/htdocs/icon/"
ScriptAlias /awstats/ "/usr/share/webapps/awstats/6.9-r1/hostroot/cgi-bin/"
ScriptAlias /awstats "/usr/share/webapps/awstats/6.9-r1/hostroot/cgi-bin/awstats.pl"
ScriptAlias /awstats.pl "/usr/share/webapps/awstats/6.9-r1/hostroot/cgi-bin/awstats.pl"

&lt;Directory "/usr/share/webapps/awstats/6.9-r1/htdocs"&gt;
   Options None
   AllowOverride None
   &lt;IfModule mod_access.c&gt;
       Order allow,deny
       Allow from all
   &lt;/IfModule&gt;
&lt;/Directory&gt;

&lt;Directory "/usr/share/webapps/awstats/6.9-r1/hostroot/cgi-bin"&gt;
    Options ExecCGI
    AllowOverride None
    &lt;IfModule mod_access.c&gt;
        Order allow,deny
        Allow from all
    &lt;/IfModule&gt;
&lt;/Directory&gt;

&lt;Directory "/usr/share/webapps/awstats/6.9-r1/hostroot"&gt;
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;

&lt;Directory "/usr/share/webapps/awstats/6.9-r1/htdocs/icon"&gt;
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;
</code></pre><p>And verify the logging output in /etc/apache2/modules.d/00_mod_log_config.conf:</p><pre><code>&lt;IfModule log_config_module&gt;
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common

    LogFormat "%{Referer}i -&gt; %U" referer
    LogFormat "%{User-Agent}i" agent
    LogFormat "%v %h %l %u %t \"%r\" %&gt;s %b %T" script
    LogFormat "%v %h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\" VLOG=%{VLOG}e" vhost

    &lt;IfModule logio_module&gt;
        # You need to enable mod_logio.c to use %I and %O
        LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
        LogFormat "%v %h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" vhostio
    &lt;/IfModule&gt;

    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a &lt;VirtualHost&gt;
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-&lt;VirtualHost&gt; access logfiles, transactions will be
    # logged therein and *not* in this file.
    CustomLog /var/log/apache2/access_log common

    # If you would like to have agent and referer logfiles,
    # uncomment the following directives.
    #CustomLog /var/log/apache2/referer_log referer
    #CustomLog /var/log/apache2/agent_logs agent

    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #CustomLog /var/log/apache2/access_log combined
&lt;/IfModule&gt;
</code></pre><p>And Lastly, you need to add a cron entry to update the statistics on a regular basis: # AWStats */15 * * * * perl /usr/share/webapps/awstats/6.9-r1/hostroot/cgi-bin/awstats.pl -config=www.alunduil.com -update > /dev/null</p><p>Everything should be running smoothly but give your installation some time to begin collecting statistics.</p> ]]></content:encoded> <wfw:commentRss>http://www.alunduil.com/2010/03/02/running-awstats-on-gentoo/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using apc
Page Caching using memcached (user agent is rejected)
Database Caching 4/12 queries in 0.022 seconds using memcached

Served from: www.alunduil.com @ 2010-09-09 08:27:53 -->