<?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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Skidoosh</title> <link>http://www.skidoosh.co.uk</link> <description>Skidoosh - PHP, Python, Django, Ruby on Rails Web Developer in North Wales</description> <lastBuildDate>Sat, 12 Jun 2010 09:08:31 +0000</lastBuildDate> <generator>http://wordpress.org/?v=2.9.2</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" type="application/rss+xml" href="http://feeds.feedburner.com/skidoosh" /><feedburner:info uri="skidoosh" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item><title>Optimize your MySQL queries to fine tune you application</title><link>http://www.skidoosh.co.uk/mysql/optimize-your-mysql-queries-by-fine-tuning-the-find-model-method/</link> <comments>http://www.skidoosh.co.uk/mysql/optimize-your-mysql-queries-by-fine-tuning-the-find-model-method/#comments</comments> <pubDate>Sat, 12 Jun 2010 09:08:31 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[MySQL]]></category> <category><![CDATA[performance]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=86</guid> <description><![CDATA[As applications are getting more complex and manipulating data in more complex ways it's becoming more important to optimise our database queries to be as efficient as possible. This article shows how more explicit queries can reduce execution time and take some of the strain off system resources.]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fmysql%2Foptimize-your-mysql-queries-by-fine-tuning-the-find-model-method%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fmysql%2Foptimize-your-mysql-queries-by-fine-tuning-the-find-model-method%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>As applications are getting more complex and manipulating data in more complex ways it&#8217;s becoming more important to optimise our database queries to be as efficient as possible. I&#8217;m not going to cover caching in this article, instead I&#8217;m going to cover a more fundamental rule that should be followed when querying any database and follows this Python rule:</p><blockquote><p> &#8220;Explicit is better than implicit.&#8221;</p></blockquote><p>Lets start by looking at MySQL query performance from the command line. Lets imagine we had a user table with the following fields:</p><pre name="code" class="sql">
CREATE  TABLE  `article_db`.`users` (
`id` INT( 6  )  UNSIGNED NOT  NULL  AUTO_INCREMENT  PRIMARY  KEY ,
`group_id` INT( 6  )  UNSIGNED NOT  NULL ,
`username` VARCHAR( 30  )  CHARACTER  SET utf8 COLLATE utf8_general_ci NOT  NULL ,
`email` VARCHAR( 100  )  CHARACTER  SET utf8 COLLATE utf8_general_ci NOT  NULL ,
`password` VARCHAR( 36  )  CHARACTER  SET utf8 COLLATE utf8_general_ci NOT  NULL ,
`created` DATETIME NOT  NULL DEFAULT  '0000-00-00 00:00:00',
`updated` DATETIME NOT  NULL DEFAULT  '0000-00-00 00:00:00',
`active` TINYINT( 1  )  NOT  NULL DEFAULT  '0',
UNIQUE (
`username` ,
`email`
)
)  ENGINE  =  MYISAM  CHARACTER  SET utf8 COLLATE utf8_general_ci;
</pre><p>Normally to retrieve data from this table you would execute a query like the following. please note that I am using a remote database to create some lag. If you use a local database on your development machine you will probably retrieve the data in 0 seconds.</p><pre name="code" class="sql">
mysql> SELECT * FROM users;
+----+----------+----------+-----------------------+----------------------------------+---------------------+---------------------+--------+
| id | group_id | username | email                 | password                         | created             | updated             | active |
+----+----------+----------+-----------------------+----------------------------------+---------------------+---------------------+--------+
|  1 |        1 | admin    | admin@example.com     | 21232f297a57a5a743894a0e4a801fc3 | 2010-04-11 23:08:51 | 2010-04-11 23:08:51 |      1 |
|  2 |        2 | user     | user@example.com      | ee11cbb19052e40b07aac0ca060c23ee | 2010-04-11 23:08:51 | 2010-04-11 23:08:51 |      1 |
|  3 |        3 | test     | test@example.com      | 098f6bcd4621d373cade4e832627b4f6 | 2010-04-11 23:13:50 | 2010-04-11 23:13:50 |      0 |
|  4 |        4 | temp     | temp@example.com      | 3d801aa532c1cec3ee82d87a99fdf63f | 2010-04-11 23:13:50 | 2010-04-11 23:13:50 |      1 |
|  5 |        2 | me       | me@example.com        | ab86a1e1ef70dff97959067b723c5c24 | 2010-04-11 23:15:50 | 2010-04-11 23:15:50 |      1 |
|  6 |        2 | you      | you@example.com       | 639bae9ac6b3e1a84cebb7b403297b79 | 2010-04-11 23:15:50 | 2010-04-11 23:15:50 |      0 |
|  7 |        1 | john     | john@example.com      | 527bd5b5d689e2c32ae974c6229ff785 | 2010-04-11 23:17:04 | 2010-04-11 23:17:04 |      1 |
|  8 |        1 | master   | master@example.com    | eb0a191797624dd3a48fa681d3061212 | 2010-04-11 23:17:04 | 2010-04-11 23:17:04 |      1 |
|  9 |        1 | theboss  | theboss@testing.com   | b248e08d5c23541514558eea059c08cf | 2010-04-11 23:23:43 | 2010-04-11 23:23:43 |      1 |
| 10 |        2 | susan    | susan@localdomain.com | ac575e3eecf0fa410518c2d3a2e7209f | 2010-04-11 23:23:43 | 2010-04-11 23:23:43 |      1 |
+----+----------+----------+-----------------------+----------------------------------+---------------------+---------------------+--------+
10 rows in set (0.05 sec)
</pre><p>In the previous query we used the wild-card selector &#8216;*&#8217; to return all columns from the &#8216;users&#8217; table. This in turn queried the database and returned the results as above. What I&#8217;m going to do next is query the database for the same data but this time I&#8217;m going to name the fields that I require in my returned dataset:</p><pre name="code" class="sql">
mysql> SELECT id,group_id,username,email,password,created,updated,active FROM users;
+----+----------+----------+-----------------------+----------------------------------+---------------------+---------------------+--------+
| id | group_id | username | email                 | password                         | created             | updated             | active |
+----+----------+----------+-----------------------+----------------------------------+---------------------+---------------------+--------+
|  1 |        1 | admin    | admin@example.com     | 21232f297a57a5a743894a0e4a801fc3 | 2010-04-11 23:08:51 | 2010-04-11 23:08:51 |      1 |
|  2 |        2 | user     | user@example.com      | ee11cbb19052e40b07aac0ca060c23ee | 2010-04-11 23:08:51 | 2010-04-11 23:08:51 |      1 |
|  3 |        3 | test     | test@example.com      | 098f6bcd4621d373cade4e832627b4f6 | 2010-04-11 23:13:50 | 2010-04-11 23:13:50 |      0 |
|  4 |        4 | temp     | temp@example.com      | 3d801aa532c1cec3ee82d87a99fdf63f | 2010-04-11 23:13:50 | 2010-04-11 23:13:50 |      1 |
|  5 |        2 | me       | me@example.com        | ab86a1e1ef70dff97959067b723c5c24 | 2010-04-11 23:15:50 | 2010-04-11 23:15:50 |      1 |
|  6 |        2 | you      | you@example.com       | 639bae9ac6b3e1a84cebb7b403297b79 | 2010-04-11 23:15:50 | 2010-04-11 23:15:50 |      0 |
|  7 |        1 | john     | john@example.com      | 527bd5b5d689e2c32ae974c6229ff785 | 2010-04-11 23:17:04 | 2010-04-11 23:17:04 |      1 |
|  8 |        1 | master   | master@example.com    | eb0a191797624dd3a48fa681d3061212 | 2010-04-11 23:17:04 | 2010-04-11 23:17:04 |      1 |
|  9 |        1 | theboss  | theboss@testing.com   | b248e08d5c23541514558eea059c08cf | 2010-04-11 23:23:43 | 2010-04-11 23:23:43 |      1 |
| 10 |        2 | susan    | susan@localdomain.com | ac575e3eecf0fa410518c2d3a2e7209f | 2010-04-11 23:23:43 | 2010-04-11 23:23:43 |      1 |
+----+----------+----------+-----------------------+----------------------------------+---------------------+---------------------+--------+
10 rows in set (0.01 sec)
</pre><p>As you can see, by defining a more explicit query you have reduced the execution time from 0.05 to 0.01 seconds. This may not be too impressive, but imagine the &#8220;now&#8221; common application queries a database. During the life cycle of a page execution in a content management system you could be looking at around 10 &#8211; 40 (this is just an example figure) database queries being executed during this time. In turn each of these queries take .05 seconds to execute (40 * .05) = 2 seconds. So you go through your application and modify it to select one the columns you need. If we take the examples above we would have (40 * .01) = .04, thats a massive 1.96 seconds faster!</p><p>Hope this helps!</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/mysql/optimize-your-mysql-queries-by-fine-tuning-the-find-model-method/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Test a django ModelForm field to determin if it is “required”</title><link>http://www.skidoosh.co.uk/python-language/test-a-django-modelform-field-to-determin-if-it-is-required/</link> <comments>http://www.skidoosh.co.uk/python-language/test-a-django-modelform-field-to-determin-if-it-is-required/#comments</comments> <pubDate>Fri, 11 Jun 2010 13:15:32 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[Django]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Snippets]]></category> <category><![CDATA[forms]]></category> <category><![CDATA[framework]]></category> <category><![CDATA[HTML]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=101</guid> <description><![CDATA[Django is a fantastic Python framework with numerous methods to render forms. In this short article I will be showing you how to determine if a form field is "required" or not. ]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fpython-language%2Ftest-a-django-modelform-field-to-determin-if-it-is-required%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fpython-language%2Ftest-a-django-modelform-field-to-determin-if-it-is-required%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>In Django when creating form templates it&#8217;s good practice in the field&#8217;s of accessibility and usability to mark a field as &#8220;required&#8221;. Django provides us with numerous methods to render forms into custom templates but most of the time it is quite nice to be able to just iterate over all of the fields in the form object and render them out in turn. In cases like this it might be required denote some form fields as &#8220;required&#8221;. Below I will demonstrate how you would typically render a form in a loop and detect if the current form element is required:</p><pre name="code" class="html">
{% extends 'base.html' %}
{% load i18n %}

{% block content %}
<h2>{% trans "Contact Us" %}</h2>
<form name="contact" id="contact" action="" method="post">
<fieldset>
<legend>{% trans "Contact Form" %}</legend>

		{% for field in form %}
<div class="form-item">
				{% if field.errors %}
<div class="error">{{ field.errors|striptags }}</div>

				{% endif %}
				{% if not field.is_hidden %}<label for="{{ field.auto_id }}">{% trans field.label %} {% if field.field.required %}<span class="required">({% trans "Required" %})</span>{% endif %}{% endif %}</label>
				{{ field }}
			</div>

		{% endfor %}      
<div class="buttons">
<input type="submit" name="submit" id="submit" value="{% trans 'Submit' %}" tabindex="100" class="form-submit" /></div>
</fieldset>
</form>

{% endblock content %}
</pre><p>The important part of the snippet above is the &#8220;{% if field.field.required %}&#8221;. The required attribute of the current element object, in this case &#8220;field&#8221;, resides in &#8220;field.required&#8221;. So just to firm this in your mind it in &#8220;{object}.field.required&#8221; or &#8220;{form_object}.{object}.field.required&#8221;.</p><p>Hope this helps.</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/python-language/test-a-django-modelform-field-to-determin-if-it-is-required/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Create Twitter like date formatted strings with PHP</title><link>http://www.skidoosh.co.uk/php/create-twitter-like-date-formatted-strings-with-php/</link> <comments>http://www.skidoosh.co.uk/php/create-twitter-like-date-formatted-strings-with-php/#comments</comments> <pubDate>Mon, 12 Apr 2010 13:50:46 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Snippets]]></category> <category><![CDATA[Twitter]]></category> <category><![CDATA[Date]]></category> <category><![CDATA[Time]]></category> <category><![CDATA[UNIX Timestamp]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=82</guid> <description><![CDATA[A small function to produce Twitter like dates from various date formats. Just feed it a date, it converts it to a time (a unix timestamp), works out the difference and returns a "nice" formatted date i.e. About 1 week ago. Hope this helps.]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fphp%2Fcreate-twitter-like-date-formatted-strings-with-php%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fphp%2Fcreate-twitter-like-date-formatted-strings-with-php%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>Well I got a little bored and decided to code this function. It creates the old Twitter like date format i.e. About 4 minutes ago, etc.. As you can see the code below has a few tests so you can decipher how to use it.</p><pre name="code" class="php">
&lt;?php
	#If your running PHP > 5.3 you need to set this or your app will throw errors
	date_default_timezone_set('Europe/London');

	function twitter_time_format ($date) {

		$blocks = array (
			array('year',  (3600 * 24 * 365)),
			array('month', (3600 * 24 * 30)),
			array('week',  (3600 * 24 * 7)),
			array('day',   (3600 * 24)),
			array('hour',  (3600)),
			array('min',   (60)),
			array('sec',   (1))
		);

		#Get the time from the function arg and the time now
		$argtime = strtotime($date);
		$nowtime = time();

		#Get the time diff in seconds
		$diff    = $nowtime - $argtime;

		#Store the results of the calculations
		$res = array ();

		#Calculate the largest unit of time
		for ($i = 0; $i < count($blocks); $i++) {
			$title = $blocks[$i][0];
			$calc  = $blocks[$i][1];
			$units = floor($diff / $calc);
			if ($units > 0) {
				$res[$title] = $units;
			}
		}

		if (isset($res['year']) &#038;&#038; $res['year'] > 0) {
			if (isset($res['month']) &#038;&#038; $res['month'] > 0 &#038;&#038; $res['month'] < 12) {
				$format      = "About %s %s %s %s ago";
				$year_label  = $res['year'] > 1 ? 'years' : 'year';
				$month_label = $res['month'] > 1 ? 'months' : 'month';
				return sprintf($format, $res['year'], $year_label, $res['month'], $month_label);
			} else {
				$format     = "About %s %s ago";
				$year_label = $res['year'] > 1 ? 'years' : 'year';
				return sprintf($format, $res['year'], $year_label);
			}
		}

		if (isset($res['month']) &#038;&#038; $res['month'] > 0) {
			if (isset($res['day']) &#038;&#038; $res['day'] > 0 &#038;&#038; $res['day'] < 31) {
				$format      = "About %s %s %s %s ago";
				$month_label = $res['month'] > 1 ? 'months' : 'month';
				$day_label   = $res['day'] > 1 ? 'days' : 'day';
				return sprintf($format, $res['month'], $month_label, $res['day'], $day_label);
			} else {
				$format      = "About %s %s ago";
				$month_label = $res['month'] > 1 ? 'months' : 'month';
				return sprintf($format, $res['month'], $month_label);
			}
		}

		if (isset($res['day']) &#038;&#038; $res['day'] > 0) {
			if ($res['day'] == 1) {
				return sprintf("Yesterday at %s", date('h:i a', $argtime));
			}
			if ($res['day'] <= 7) {
				return date("\L\a\s\\t l \a\\t h:i a", $argtime);
			}
			if ($res['day'] <= 31) {
				return date("l \a\\t h:i a", $argtime);
			}
		}

		if (isset($res['hour']) &#038;&#038; $res['hour'] > 0) {
			if ($res['hour'] > 1) {
				return sprintf("About %s hours ago", $res['hour']);
			} else {
				return "About an hour ago";
			}
		}

		if (isset($res['min']) &#038;&#038; $res['min']) {
			if ($res['min'] == 1) {
				return "About one minut ago";
			} else {
				return sprintf("About %s minuts ago", $res['min']);
			}
		}

		if (isset ($res['sec']) &#038;&#038; $res['sec'] > 0) {
			if ($res['sec'] == 1) {
				return "One second ago";
			} else {
				return sprintf("%s seconds ago", $res['sec']);
			}
		}
	}

	$now            = date(DATE_RFC2822, time());
	$anhourago      = date(DATE_RFC2822, time() - (3600));
	$fourhoursago   = date(DATE_RFC2822, time() - (3600 * 4));
	$yesterday      = date(DATE_RFC2822, time() - (3600 * 24));
	$lastweek       = date(DATE_RFC2822, time() - (3600 * 24 * 6));
	$lastmonth      = date(DATE_RFC2822, time() - (3600 * 24 * 31));
	$threemonthsago = date(DATE_RFC2822, time() - (3600 * 24 * 31 * 3));
	$ayearago       = date(DATE_RFC2822, time() - (3600 * 24 * 365));
	$fiveyearsago   = date(DATE_RFC2822, time() - (3600 * 24 * 365 * 5));

	echo 'Now (should be empty): '              . twitter_time_format($now) . '';
	echo 'An Hour Ago: '      . twitter_time_format($anhourago) . '';
	echo 'Four Hours Ago: '   . twitter_time_format($fourhoursago) . '';
	echo 'Yesterday: '        . twitter_time_format($yesterday) . '';
	echo 'Last Week: '        . twitter_time_format($lastweek) . '';
	echo 'Last Month: '       . twitter_time_format($lastmonth) . '';
	echo 'Three Months Ago: ' . twitter_time_format($threemonthsago) . '';
	echo 'A Year Ago: '       . twitter_time_format($ayearago) . '';
	echo 'Five Years Ago: '   . twitter_time_format($fiveyearsago) . '';
?&gt;
</pre><p>Hope this helps!</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/php/create-twitter-like-date-formatted-strings-with-php/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Convert a date to a UNIX timestamp with PHP</title><link>http://www.skidoosh.co.uk/php/covert-a-date-to-a-unix-timestamp-with-php/</link> <comments>http://www.skidoosh.co.uk/php/covert-a-date-to-a-unix-timestamp-with-php/#comments</comments> <pubDate>Mon, 15 Mar 2010 23:43:11 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Date]]></category> <category><![CDATA[Time]]></category> <category><![CDATA[UNIX Timestamp]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=74</guid> <description><![CDATA[In this article I will cover how to convert a date from such things as a database like MySQL, RSS feed or other formats into a UNIX timestamp.]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fphp%2Fcovert-a-date-to-a-unix-timestamp-with-php%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fphp%2Fcovert-a-date-to-a-unix-timestamp-with-php%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>In this article I will cover how to convert a date from such things as a database like MySQL, RSS feed or other formats into a UNIX timestamp. Firstly for some people it will be handy to know what a UNIX timestamp actually is. A UNIX timestamp is the number of seconds that have passed since midnight on the 1st January, 1970 also known as the birth of modern computing.</p><p>In PHP there two; nice, simple functions for generating UNIX timestamps. The first is the &#8220;time()&#8221; function used as follows:</p><pre name="code" class="php">
    &lt;?php
        //Get the current UNIX timestamp
        $now = time();
        //Get the date one week from now as a UNIX timestamp
        $nextweek = $now + (3600 * 24 * 7);
        //Get the date last week as a UNIX timestamp
        $nextweek = $now + (3600 * 24 * 7);
        //Compare the dates
        if ($lastweek &lt; $nextweek) echo 'Next week is greater than last week';
    ?&gt;
</pre><p>I think you can gather from that that UNIX timestamps are quite useful when you need to calculate or compare dates. Because a UNIX timestamp is in seconds it is treated like any other integer number.</p><p>Now for the function we would use to generate a UNIX timestamp from a date:</p><pre name="code" class="php">
    &lt;?php
        //The following date could be any date in
        //ISO 8601, RFC 2822 and even non ISO
        //or RFC standards
        $date = date('Y-m-d h:i:s');
        //Get the UNIX timestamp
        $timestamp = strtotime($date);
    ?&gt;
</pre><p>As you can see it&#8217;s really quite simple to get a UNIX timestamp from a date. But that&#8217;s not all you can do all sorts of amazing things with dates in PHP. To see more great examples of just how flexible the strtotime function really is just look at the PHP function reference at <a href="http://php.net/manual/en/function.strtotime.php" title="Official PHP strtotime reference">http://php.net/manual/en/function.strtotime.php</a>.</p><p>Hope this helps.</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/php/covert-a-date-to-a-unix-timestamp-with-php/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>CakePHP Aptana and Eclipse PDT code completion that works</title><link>http://www.skidoosh.co.uk/php/cakephp-aptana-and-eclipse-pdt-code-completion-that-works/</link> <comments>http://www.skidoosh.co.uk/php/cakephp-aptana-and-eclipse-pdt-code-completion-that-works/#comments</comments> <pubDate>Thu, 17 Dec 2009 00:44:38 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[Aptana]]></category> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[PHP]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=68</guid> <description><![CDATA[A short guide on how to enable CakePHP auto completion within the Aptana Studio or Eclipse PDT IDE for Models within controllers and helpers. This actually works!]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fphp%2Fcakephp-aptana-and-eclipse-pdt-code-completion-that-works%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fphp%2Fcakephp-aptana-and-eclipse-pdt-code-completion-that-works%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>I keep seeing people asking the question &#8220;How do I get code completion to work in Aptana and Eclipse PDT?&#8221;. A lot of the time I see the Helper fix but nothing else! With a bit of fiddling I&#8217;ve finally got a complete solution <strong>that works!</strong> Here how I did it:</p><p>Follow this guide to enable the .thtml or .ctp file extentions: <a href="http://bakery.cakephp.org/articles/view/setting-up-eclipse-to-work-with-cake" title="Setting up Eclipse to work with Cake" target="_blank">Setting up Eclipse to work with Cake</a></p><p>Create a dummy file in your cake root directory with the following code:</p><pre name="code" class="php">
&lt;?php
   exit();
   //declare and define all of the helpers
   //to helper enable codecompletion
   if(1 == 0) {
        $ajax = new AjaxHelper();
        $cache = new CacheHelper();
        $form = new FormHelper();
        $html = new HtmlHelper();
        $javascript = new JavascriptHelper();
        $number = new NumberHelper();
        $session = new SessionHelper();
        $text = new TextHelper();
        $time = new TimeHelper();
    }
?&gt;
</pre><p>Then to get the Model code completion from within controllers create an app_controller.php file in you app directory and add a dummy function with the following code:</p><pre name="code" class="php">
&lt;?php
    class AppController extends Controller {
        public function dummy () {
            //for each of your models add a definition and declaration
            //like the ones that follow
            $this->User = new User();
            $this->Post = new Post();
        }
    }
?&gt;
</pre><p>So with a bit of luck this will help you on your way. Thanks for reading!</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/php/cakephp-aptana-and-eclipse-pdt-code-completion-that-works/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>MySQL Find and Replace Function</title><link>http://www.skidoosh.co.uk/mysql/mysql-find-and-replace-function/</link> <comments>http://www.skidoosh.co.uk/mysql/mysql-find-and-replace-function/#comments</comments> <pubDate>Wed, 16 Dec 2009 19:21:21 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[MySQL]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=62</guid> <description><![CDATA[A quick guide to one of the most useful MySQL functions. The replace function is a great way to find and replace bulk text matches in one easy step.]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fmysql%2Fmysql-find-and-replace-function%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fmysql%2Fmysql-find-and-replace-function%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>The MySQL REPLACE function is one of the most useful function MySQL has to offer. It&#8217;s great if you need to do a bulk find and replace on text in your database table. It&#8217;s very useful for migrations from one domain name to another and I have used it countless times to move Wordpress installations from a testing to a production environment to re-point images. Here the code:</p><pre name="code" class="sql">UPDATE table_name SET column_name = REPLACE(column_name, 'find_string_in_quotes', 'replace_string_in_quotes');</pre><p>Hope you find this useful. If you know a better way please leave a reply!</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/mysql/mysql-find-and-replace-function/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Wordpress Plugin: WP Post To Twitter</title><link>http://www.skidoosh.co.uk/wordpress-plugins/wordpress-plugin-wp-post-to-twitter/</link> <comments>http://www.skidoosh.co.uk/wordpress-plugins/wordpress-plugin-wp-post-to-twitter/#comments</comments> <pubDate>Thu, 19 Nov 2009 22:04:22 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[Wordpress Plugins]]></category> <category><![CDATA[plugins]]></category> <category><![CDATA[Twitter]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=37</guid> <description><![CDATA[WP Post To Twitter: A nice simple Twitter Wordpress plugin for your blog. Allows you to Tweet from your blog and automatically updates Twitter when you create a new blog post.]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fwordpress-plugins%2Fwordpress-plugin-wp-post-to-twitter%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fwordpress-plugins%2Fwordpress-plugin-wp-post-to-twitter%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p><strong>Version 1.5.0 has now been released.</strong></p><p style="text-align: center;"><strong><span style="color: #ff0000;">* This Plugin Requires CURL To Work *</span><br /> </strong></p><p>This Wordpress Twitter plugin is a nice simple plugin. All it does is post updates from your blog to your twitter account when you create a fresh post and allows you to tweet from you blog. Some other features are:</p><ul><li>Auto shorten URL&#8217;s with tinyurl</li><li>Validation to make sure you can tweet or warns you if you cant</li><li>Automatic character limitation to make sure you don&#8217;t post anything over 140 characters</li><li>Good for SEO, creating automatic links to your blog and it&#8217;s posts</li></ul><p><strong>Installation</strong></p><p>All you have to do is download version 1.1.0 from the link below, unzip it, upload it to your plugins folder and activate it from the plugins menu.</p><p>Hope you like it :)</p><p><a rel="external" href="http://wordpress.org/extend/plugins/wp-post-to-twitter/">Download WP Post To Twitter</a></p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/wordpress-plugins/wordpress-plugin-wp-post-to-twitter/feed/</wfw:commentRss> <slash:comments>15</slash:comments> </item> <item><title>SQL Injection in Action</title><link>http://www.skidoosh.co.uk/security/sql-injection-in-action/</link> <comments>http://www.skidoosh.co.uk/security/sql-injection-in-action/#comments</comments> <pubDate>Wed, 11 Nov 2009 23:40:48 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[Security]]></category> <category><![CDATA[attack]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[sql injection]]></category><guid isPermaLink="false">http://www.skidoosh.co.uk/?p=30</guid> <description><![CDATA[Have you ever heard of an SQL injection attack? Ever wondered how it's actually done? Well take a look at the video in this post to see one in action!]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fsecurity%2Fsql-injection-in-action%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fsecurity%2Fsql-injection-in-action%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>Have you ever heard of an SQL injection attack? Ever wondered how it&#8217;s actually done? Well here&#8217;s a great video showing you how:</p><p><a title="Blind SQL Injection Attack" href="http://www.milw0rm.com/video/watch.php?id=100">Blind SQL Injection Attack Video</a></p><p>You don&#8217;t often get to see a demonstration of how an attacker will actually use techniques such as this the infiltrate a site. My belief is that if you need to defend yourself or your application against it you need to see it in action. <a title="Application Exploit Database" href="http://www.milw0rm.com/">milw0rm</a> is a great place to see what applications are vulnerable to attack, how, why and has it been fixed.</p><h2>What could have been done to prevent this attack?</h2><p>Lots of things could have been done to prevent this from happening, but often is the case in large applications or small one&#8217;s built by an inexperienced developer holes are left in the security of an application. One thing to remember when developing an application that <strong>any </strong>user submitted data should be treated as hostile. It should be checked via Regex, cleaned, Type Casted and validated to ensure what your getting from the user is what you expected.</p><p>In the video a function as simple as mysql_real_escape_string could have prevented this but here are some other things you should know about:</p><h3>Hash your passwords</h3><p>I don&#8217;t know if you noticed in the video but the attacker acquired a plain text password. This was the application developers first mistake. If the password had been hashed, even if the attacked had got the entire hash it would have been useless. If you put another hash in it will just be converted to guess what, another hash. This would have rendered this attack fruitless. MD5 is a great Hashing function that comes pre-packed with most programming languages and would turn this &#8220;password&#8221; into this &#8220;5f4dcc3b5aa765d61d8327deb882cf99&#8243;. Even if one character changes the hash would be completely different.</p><h3>Use a Database abstraction layer</h3><p>In PHP a great example of this would be the MDB2 class. This class comes with a whole list of security features including some great sanitisation functions. Using a single gateway to your database will greatly reduce the margin for error. You could even develop your own with automatic data cleaning.</p><h3>Use an odd admin section name</h3><p>One issue with applications with an integrated CMS is the admin section is simply called &#8220;admin&#8221;. In this case if the attacker armed with a username and password couldn&#8217;t find your admin section he would have had to employ some more sophisticated tools to monitor where you where going to update your site. At this point they may get bored or more often than not, it&#8217;s an automated attack. In this case the application may try to guess where it is, fail and move on. So try to name your admin sections more carefully!</p><p>Well I hope someone finds this of use and I look forward to your responses!</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/security/sql-injection-in-action/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>jQuery selectors and attribute selectors reference and examples V2</title><link>http://www.skidoosh.co.uk/jquery/jquery-selectors-and-attribute-selectors-reference-and-examples-v2/</link> <comments>http://www.skidoosh.co.uk/jquery/jquery-selectors-and-attribute-selectors-reference-and-examples-v2/#comments</comments> <pubDate>Sun, 08 Nov 2009 13:38:05 +0000</pubDate> <dc:creator>Glyn Mooney</dc:creator> <category><![CDATA[jQuery]]></category><guid isPermaLink="false">http://skidoosh.co.uk/?p=3</guid> <description><![CDATA[At the start of the year I wrote an article over on another site detailing the different methods you could use to select elements using the powerful jQuery attribute selectors. Because I no longer work for that company any more and the article is no longer being maintained, I've decided to create a second version of the article so I can update it and extend it's usefulness.]]></description> <content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"> <a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fjquery%2Fjquery-selectors-and-attribute-selectors-reference-and-examples-v2%2F"><br /> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.skidoosh.co.uk%2Fjquery%2Fjquery-selectors-and-attribute-selectors-reference-and-examples-v2%2F&amp;source=skidoosh&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br /> </a></div><p>At the start of the year I wrote an article over on another site detailing the different methods you could use to select elements using the powerful jQuery attribute selectors. Because I no longer work for that company any more and the article is no longer being maintained, I&#8217;ve decided to create a second version of the article so I can update it and extend it&#8217;s usefulness.</p><p>jQuery selectors and attribute selectors are some of the best features jQuery has to offer when it comes to DOM manipulation. They allow you to quickly select all elements or groups of element of a given tag name, attribute name or their contents and allow you to manipulate them as a group or a single node. This article can be used as a beginners guide to selectors or as a cheahsheet or reference.</p><p>The following table lists the different methods you have available to you to select nodes when using jQuery. All of the listed selectors should be wrapped in the following to stop your jQuery scripts conflicting with other libraries:</p><pre class="javascript">    (function ($) {
        //Your code here
    })(jQuery);</pre><h2>jQuery selectors and examples</h2><p>Below are a slip tabular list of the different selector and groups they seem to fit into.</p><ul><li><a href="#simple">jQuery Simple selectors</a></li><li><a href="#css">jQuery CSS style sudo selectors</a></li><li><a href="#xpath">jQuery XPath style selectors</a></li><li><a href="#form">jQuery form selectors</a></li></ul><p><a name="simple"> </a></p><div class="table-wrapper"><table border="0" summary=" jQuery Simple selectors"><caption> jQuery Simple selectors<br /></caption><thead><tr><th scope="col"> Selector</th><th scope="col"> Example</th><th width="40%" scope="col"> Description</th></tr></thead><tfoot><tr><td colspan="3">List accurate as of jQuery 1.3</td></tr></tfoot><tbody><tr class="odd"><th scope="row"> *</th><td>$(’*&#8217;);</td><td>This selector is a wild card method and will select all elements in a document.</td></tr><tr><th scope="row"> #id</th><td>$(’#id’);</td><td>This selector selects an element with the given ID.</td></tr><tr class="odd"><th scope="row"> .class</th><td>$(’.class’)</td><td>The class selector will gather all elements in the document with the given class name</td></tr><tr><th scope="row"> element</th><td>$(’element’)</td><td>This selector will collect all elements in a document with the given tag name i.e. table, ul, li, a etc.</td></tr><tr class="odd"><th scope="row"> a, b, c. … n</th><td>$(’th, td, .class, #id’)</td><td>This method can use multiple selection patterns to collect elements.</td></tr><tr><th scope="row"> parent child</th><td>$(’li a’)</td><td>This will select all “a” elements that are a descendant of “li”</td></tr><tr class="odd"><th scope="row"> a &gt; b</th><td>$(’table &gt; tr’);</td><td>This will select all b elements which are a child element of a or in our example all tr elements in a table or tables.</td></tr><tr><th scope="row"> a + b</th><td>$(’li + a’);</td><td>This will select all “a” elements that are an immediate descendant of “li” in our example.</td></tr><tr class="odd"><th scope="row"> a ~ b</th><td>$(’p ~ ul’);</td><td>This selector will select all “ul” elements that are a sibling of “p”</td></tr><tr><th scope="row"> :first</th><td>$(’ul li:first’);</td><td>Returns the first element in a result set</td></tr></tbody></table></div><p><a name="css"> </a></p><div class="table-wrapper"><table border="0" summary="jQuery CSS style sudo selectors"><caption> jQuery CSS style sudo selectors<br /></caption><thead><tr><th scope="col"> Selector</th><th scope="col"> Example</th><th width="40%" scope="col"> Description</th></tr></thead><tfoot><tr><td colspan="3">List accurate as of jQuery 1.3</td></tr></tfoot><tbody><tr class="odd"><th scope="row"> :first-child</th><td>$(’ul li:first-child’);</td><td>Returns the first child element of the parent element.</td></tr><tr class="odd"><th scope="row"> :last</th><td>$(’ul li:last’);</td><td>Returns the last element in a result set</td></tr><tr><th scope="row"> :last-child</th><td>$(’ul li:last-child’);</td><td>Returns the last child element of the parent element.</td></tr><tr class="odd"><th scope="row"> :only-child</th><td>$(’div p:only-child’);</td><td>Returns elements which are the only child of the parent element.</td></tr><tr><th scope="row"> :not(a)</th><td>$(’input:not(:checked)’);</td><td>Returns all elements that are <strong>not</strong><br /> “a” on in our example all input elements that are not checked</td></tr><tr class="odd"><th scope="row"> :has(a)</th><td>$(’div:has(p)’);</td><td>Returns all elements with a descendant that matches a in out example a “div” that contains a “p”.</td></tr><tr><th scope="row"> :odd</th><td>$(’ul li:odd’);</td><td>Returns all <strong>odd</strong><br /> elements in a result set (zero based)</td></tr><tr class="odd"><th scope="row"> :even</th><td>$(’ul li:even’);</td><td>Returns all <strong>even</strong><br /> elements in a result set (zero based)</td></tr><tr><th scope="row"> :eq(n)</th><td>$(’ul li:eq(n)’);</td><td>Returns a numbered element identified by n (zero based)</td></tr><tr class="odd"><th scope="row"> :gt(n)</th><td>$(’ul li:gt(n)’);</td><td>Returns all elements in a result set greater than n (zero based)</td></tr><tr><th scope="row"> :lt(n)</th><td>$(’ul li:lt(n)’);</td><td>Returns all elements in a result set less than n (zero based)</td></tr><tr class="odd"><th scope="row"> :nth-child(n)</th><td>$(’ul li:nth-child(n)’);</td><td>Returns the nth child in a result set (one based)</td></tr><tr><th scope="row"> :nth-child(odd)</th><td>$(’ul li:nth-child(odd)’);</td><td>Returns all <strong>odd</strong><br /> numbered elements in a result set (one based)</td></tr><tr class="odd"><th scope="row"> :nth-child(even)</th><td>$(’ul li:nth-child(even)’);</td><td>Returns all <strong>even</strong><br /> numbered elements in a result set (one based)</td></tr><tr><th scope="row"> :nth-child(formula)</th><td>$(’ul li:nth-child(3n)’);</td><td>Returns every nth child in a result set. In our example every third child (one based)</td></tr><tr class="odd"><th scope="row"> :header</th><td>$(’:header’);</td><td>Returns all heading elements e.g. h1, h2, etc.</td></tr><tr><th scope="row"> :animated</th><td>$(’ul:animated’);</td><td>Returns elements with an animation currently in progress</td></tr><tr class="odd"><th scope="row"> :contains(text)</th><td>$(’:contains(hello)’);</td><td>Returns all elements containing the passed string</td></tr><tr><th scope="row"> :empty</th><td>$(’:empty’);</td><td>Returns all elements that contain no child nodes</td></tr><tr class="odd"><th scope="row"> :parent</th><td>$(’li:parent’);</td><td>Returns all elements that a parent nodes to any other DOM element including text nodes.</td></tr><tr><th scope="row"> :hidden</th><td>$(’ul:hidden’);</td><td>Returns all hidden elements that are hidden with CSS or input fields of the type “hidden”</td></tr><tr class="odd"><th scope="row"> :visible</th><td>$(’ul:visible’);</td><td>Returns all visible elements</td></tr></tbody></table></div><p><a name="xpath"> </a></p><div class="table-wrapper"><table border="0" summary="jQuery XPath style selectors"><caption> jQuery XPath style selectors<br /></caption><thead><tr><th scope="col"> Selector</th><th scope="col"> Example</th><th width="40%" scope="col"> Description</th></tr></thead><tfoot><tr><td colspan="3">List accurate as of jQuery 1.3</td></tr></tfoot><tbody><tr class="odd"><th scope="row"> [attribute]</th><td>$(’[href]‘);</td><td>Returns all elements that contain the passed attribute in our example any element with a “href” attribute</td></tr><tr><th scope="row"> [attribute=value]</th><td>$(’[rel=external]‘);</td><td>Returns all elements that the passed attribute value is equal to the passed value. In our example ant element with a “rel” attribute equal to “external”</td></tr><tr class="odd"><th scope="row"> ['attribute!=value']</th><td>$(’[rel!=external]‘);</td><td>Returns all elements that the passed attribute value is not equal to the passed value. In our example ant element with a “rel” attribute that is not equal to “external”</td></tr><tr><th scope="row"> [attribute!=value]</th><td>$(’[class^=open]‘);</td><td>Returns all elements that the passed attribute value start with the passed value. In our example any element thats “class” attribute value begins with “open”</td></tr><tr class="odd"><th scope="row"> [attribute$=value]</th><td>$(’[id$=-wrapper]‘);</td><td>Returns all elements that the passed attribute value ends with the passed value. In our example any element whos “id” ends with “-wrapper”</td></tr><tr><th scope="row"> [attribute*=value]</th><td>$(’[class*=offer]‘);</td><td>Returns all elements that the passed attribute value contains the passed value. In our example any element whos “class” contains the string “offer”</td></tr></tbody></table></div><p><a name="form"> </a></p><div class="table-wrapper"><table border="0" summary="jQuery form element selectors"><caption> jQuery Form Selectors<br /></caption><thead><tr><th scope="col"> Selector</th><th scope="col"> Example</th><th width="40%" scope="col"> Description</th></tr></thead><tfoot><tr><td colspan="3">List accurate as of jQuery 1.3</td></tr></tfoot><tbody><tr class="odd"><th scope="row"> :input</th><td>$(’:input’);</td><td>Returns only input elements of the tag name input, select, textarea and button</td></tr><tr><th scope="row"> :text</th><td>$(’:text’);</td><td>Returns only input elements of the type “text”</td></tr><tr class="odd"><th scope="row"> :password</th><td>$(’:password’);</td><td>Returns only input elements of the type “password”</td></tr><tr><th scope="row"> :radio</th><td>$(’:radio’);</td><td>Returns only input elements of the type “radio”</td></tr><tr class="odd"><th scope="row"> :checkbox</th><td>$(’:checkbox’);</td><td>Returns only input elements of the type “checkbox”</td></tr><tr><th scope="row"> :submit</th><td>$(’:submit’);</td><td>Returns only input elements of the type “submit”</td></tr><tr class="odd"><th scope="row"> :image</th><td>$(’:image’);</td><td>Returns only input elements of the type “image”</td></tr><tr><th scope="row"> :reset</th><td>$(’:reset’);</td><td>Returns only input elements of the type “reset”</td></tr><tr class="odd"><th scope="row"> :file</th><td>$(’:file’);</td><td>Returns only input elements of the type “file”</td></tr><tr><th scope="row"> :button</th><td>$(’:button’);</td><td>Returns only input elements of the type “button”</td></tr><tr class="odd"><th scope="row"> :enabled</th><td>$(’:enabled’);</td><td>Returns all enabled input elements</td></tr><tr><th scope="row"> :selected</th><td>$(’:selected’);</td><td>Returns the <strong>selected</strong><br /> element in a select list.</td></tr><tr class="odd"><th scope="row"> :disabled</th><td>$(’:disabled’);</td><td>Returns disabled input elements</td></tr><tr><th scope="row"> :checked</th><td>$(’:checked’);</td><td>Returns checked input elements of the type radio or checkbox.</td></tr></tbody></table></div><p>Well I hope that version two of &#8220;jQuery selectors and attribute selectors reference and examples&#8221; is more helpful than V1. With a bit of luck you&#8217;ll find the grouping a little better too. Thanks for visiting! Please leave a message!</p> ]]></content:encoded> <wfw:commentRss>http://www.skidoosh.co.uk/jquery/jquery-selectors-and-attribute-selectors-reference-and-examples-v2/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Database Caching using disk

Served from: www.skidoosh.co.uk @ 2010-08-21 05:40:05 -->
