<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF 
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns="http://purl.org/rss/1.0/"
         xmlns:mn="http://usefulinc.com/rss/manifest/"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
>

  <channel rdf:about="http://www.ejeliot.com/">
    <title>Ed Eliot - Latest Blog Entries</title>
    <link>http://www.ejeliot.com/</link>
    <description>Web Standards, PHP, HTML, CSS, JavaScript and technologies</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/134" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/133" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/132" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/131" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/130" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/129" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/128" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/127" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/126" />
        <rdf:li rdf:resource="http://www.ejeliot.com/blog/125" />
      </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="http://www.ejeliot.com/blog/134">
    <link>http://www.ejeliot.com/blog/134</link>
    <title>Unix Permissions Calculator Released</title>
    <description>&lt;p&gt;Over at &lt;a href=&quot;http://projectfondue.com/&quot;&gt;Project Fondue&lt;/a&gt; we've just released a new tool - &lt;a href=&quot;http://permissions-calculator.org/&quot;&gt;Permissions Calculator&lt;/a&gt;. If you always had trouble understanding how Unix file permissions worked then this is the tool for you.&lt;/p&gt;
&lt;p&gt;It allows you to specify the  permissions you need by ticking checkboxes and it then generates the correct octal code for use with chmod. Alternatively supply it with an octal code and it'll provide a breakdown of what permissions that code corresponds to. The URL of the breakdown is bookmarkable making it easy to share with other people or to cross link from online documentation.&lt;/p&gt;
&lt;p&gt;Additionally the tool can generate the symbolic values needed to added permissions to an existing, base permissions set.&lt;/p&gt;</description>
    <dc:date>2009-03-02T14:55:12-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/133">
    <link>http://www.ejeliot.com/blog/133</link>
    <title>Favicon Generator &amp; Editor Released</title>
    <description>&lt;p&gt;I've been working on several projects with a couple of former colleagues (&lt;a href=&quot;http://muffinresearch.co.uk/&quot;&gt;Stuart&lt;/a&gt; Colville &amp;amp; &lt;a href=&quot;http://cyril.doussin.name/&quot;&gt;Cyril Doussin&lt;/a&gt;) and we've just released the first of these - a &lt;a href=&quot;http://favicon-generator.org/&quot;&gt;favicon generator&lt;/a&gt;. The &lt;a href=&quot;http://spritegen.website-performance.org/&quot;&gt;CSS Sprite Generator&lt;/a&gt; tool we released back in 2007 has also had a new lick of paint and we've set up &lt;a href=&quot;http://projectfondue.com/&quot;&gt;Project Fondue&lt;/a&gt; to promote our work so check back often for new tools.&lt;/p&gt;
&lt;p&gt;Here's an extract from the about page text from the &lt;a href=&quot;http://favicon-generator.org/&quot;&gt;Favicon Generator&lt;/a&gt; which explains exactly what it does.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
This tool provides an easy way to convert any GIF, PNG or JPEG to ICO which is supported by all modern web browsers. It also enables you to create favicons from scratch via a handy online editor. Additionally the editor lets you manually tweak generated favicons to ensure the best possible result.
&lt;/p&gt;
&lt;/blockquote&gt;</description>
    <dc:date>2009-02-10T02:18:54-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/132">
    <link>http://www.ejeliot.com/blog/132</link>
    <title>Inbound Link Analyser - a tool for analysing links to your site</title>
    <description>&lt;p&gt;&lt;a href=&quot;http://ericmiraglia.com/&quot;&gt;Eric Migralia&lt;/a&gt;, of &lt;a href=&quot;http://developer.yahoo.com/yui/&quot;&gt;Yahoo! YUI&lt;/a&gt; fame, has just released a tool, &lt;a href=&quot;http://ericmiraglia.com/inlink/&quot;&gt;Inbound Link Analyser&lt;/a&gt;, for listing and analysing inbound links to any site. It's utilises YUI extensively and, I'm sure, provides a fantastic example of how to use a number of the core YUI components. I strongly recommend a browse around the source. Data for the tool is taken from &lt;a href=&quot;http://developer.yahoo.com/search/siteexplorer/V1/inlinkData.html&quot;&gt;Yahoo!'s Site Explorer&lt;/a&gt; API and &lt;a href=&quot;http://del.icio.us/&quot;&gt;del.icio.us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ericmiraglia.com/inlink/&quot; style=&quot;background: none;&quot;&gt;&lt;img src=&quot;http://ericmiraglia.com/assets/inlink.png&quot; alt=&quot;Page Inlink Analyzer UI.&quot; width=&quot;485&quot; style=&quot;border: none;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So far the tool has helped me unearth plenty of inbound links I hadn't discovered through the usual suspects (Google Analytics, Feedburner etc) so given how much I like trawling through this stuff I'm guessing I've got plenty of fun filled browsing ahead of me.&lt;/p&gt;
&lt;p&gt;The interface also lists other pages that have been indexed for the domain entered. Clicking on these or any of the inbound links opens separate tabs within the interface for you to analyse those resources further.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ericmiraglia.com/blog/?p=72&quot;&gt;Eric's written a short introduction over on his blog&lt;/a&gt; (also newly released) so I'd suggest heading over there and checking that out first.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ericmiraglia.com/inlink/?url=http://spritegen.website-performance.org/&quot;&gt;Here's a link to an analysis of my CSS Sprite Generation tool.&lt;/a&gt; It provides plenty of data to start exploring the tool with.&lt;/p&gt;</description>
    <dc:date>2008-10-14T13:23:39-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/131">
    <link>http://www.ejeliot.com/blog/131</link>
    <title>Vote for my SXSW 2009 panel proposal</title>
    <description>&lt;p&gt;&lt;a href=&quot;http://muffinresearch.co.uk/&quot;&gt;Stuart&lt;/a&gt; Coville, &lt;a href=&quot;http://www.stubbornella.org/&quot;&gt;Nicole Sullivan&lt;/a&gt;, &lt;a href=&quot;http://www.phpied.com/&quot;&gt;Stoyan Stefanov&lt;/a&gt; and myself have put forward a panel proposal for SXSW 2009 - &lt;a href=&quot;http://panelpicker.sxsw.com/ideas/view/1884/&quot;&gt;Practical Website Perfomance&lt;/a&gt;. We'll be covering a  number of frontend techniques aimed at  improving site performance, discussing how the way browsers work affects performance and generally discussing what we've learned about developing  high traffic websites.&lt;/p&gt;
&lt;p&gt;If this interests you please take a moment and head over to the SXSW panel picker to &lt;a href=&quot;http://panelpicker.sxsw.com/ideas/view/1884/&quot;&gt;vote for our panel&lt;/a&gt;.&lt;/p&gt;</description>
    <dc:date>2008-08-14T15:26:58-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/130">
    <link>http://www.ejeliot.com/blog/130</link>
    <title>Source code for version 2 of CSS Sprite Generator</title>
    <description>&lt;p&gt;&lt;a href=&quot;http://muffinresearch.co.uk/&quot;&gt;Stuart&lt;/a&gt; and I have just released the source code for the latest version of our &lt;a href=&quot;http://spritegen.website-performance.org/&quot;&gt;CSS Sprite Generator&lt;/a&gt;. As mentioned in my &lt;a href=&quot;http://www.ejeliot.com/blog/129&quot;&gt;previous post&lt;/a&gt; the code has undergone a major refactoring and support for Image Magick has been added which greatly improves the quality of the images produced. Additionally there are options for tweaking the number of colours used in the output image, the image quality and for compressing images through &lt;a href=&quot;http://optipng.sourceforge.net/&quot;&gt;OptiPNG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://launchpad.net/css-sprite-generator&quot;&gt;Download a tar.gz of the source or check out the Bazaar branch.&lt;/a&gt;&lt;/p&gt;</description>
    <dc:date>2008-07-13T10:41:10-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/129">
    <link>http://www.ejeliot.com/blog/129</link>
    <title>Version 2 of CSS Sprite Generator released</title>
    <description>&lt;p&gt;&lt;a href=&quot;http://muffinresearch.co.uk/&quot;&gt;Stuart&lt;/a&gt; and I have just released a new version of our &lt;a href=&quot;http://spritegen.website-performance.org/&quot;&gt;CSS Sprite Generator&lt;/a&gt;. We've given it quite a major overhaul and it now uses Image Magick to generate sprite images instead of GD. This produces much higher quality images and fixes all of the related bugs filed. Additionally we've added options to control the number of colours used in the sprite image for PNGs and GIFs and the image quality for JPEGs. Finally we've added an option to pass sprite images through &lt;a href=&quot;http://optipng.sourceforge.net/&quot;&gt;OptiPNG&lt;/a&gt; to compress the output when using PNGs. This frequently results in at least a 50% decrease in file size and should save trips to Image Ready to  post optimise your images.&lt;/p&gt;
&lt;p&gt;Behind the scenes we've completely restructured the code and heavily commented it to make it easier to understand. We'll be updating &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; with this latest version of the code in the next few days. Stay tuned.&lt;/p&gt;
&lt;p&gt;The addition of these features has meant we're missing a number of translations. If you think you can help us fill in the gaps for your language please drop us a line or visit our &lt;a href=&quot;http://spritegen.website-performance.org/section/your-language&quot;&gt;translation help page&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;As you can imagine CSS Sprite Generator is very CPU intensive and therefore requires a fairly high quality hosting environment. To help support future development and hosting costs we're now selling a couple of small graphical button ads along side the text links we've sold on the site up until now. We've tried to ensure these have been added as unobtrusively as possible so hopefully they won't impact your experience whilst using the tool. &lt;a href=&quot;http://spritegen.website-performance.org/section/advertising&quot;&gt;If you're interested in advertising we've got a page which gives all the details of the options available.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the future we're mulling over a number of ideas for new features. One in particular is the addition of a REST based API (returning JSON and serialised PHP). We'd love to hear what you think about this and your thoughts on what else we should add to the tool going forward.&lt;/p&gt;</description>
    <dc:date>2008-06-23T12:42:06-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/128">
    <link>http://www.ejeliot.com/blog/128</link>
    <title>Opera releases Dragonfly for Opera 9.5 beta 2</title>
    <description>&lt;p&gt;Opera has released Dragonfly, their Firebug like developer console, as part of the latest release Opera 9.5 beta 2. It looks pretty promising - at a quick glance I think it compares favourably with the equivalent tool in Safari 3.&lt;/p&gt;
&lt;p&gt;The initial version includes a JavaScript Debugger, a DOM Inspector, CSS Inspector, error console and a command line and, although it doesn't currently offer editing capabilities, they'll follow shortly as well as the ability to inspect XHR/HTTP headers.&lt;/p&gt;
&lt;p&gt;I used Opera as my main browser for a couple of months at the start of the year but found myself reluctantly returning to Firefox as I was having to run it almost all the time anyway for access to the developer tools. The addition of editing capabilities to Dragonfly will likely see me return to Opera as I found it much snappier and memory usage over time much lower.&lt;/p&gt;
&lt;p&gt;More information and download details available from the &lt;a href=&quot;http://www.opera.com/products/dragonfly/&quot;&gt;official Dragonfly web site.&lt;/a&gt; &lt;a href=&quot;http://dev.opera.com/articles/view/introduction-to-opera-dragonfly/&quot;&gt;Chris Mills has also posted a detailed walk through explaining how to use the tool on the Opera Developer site.&lt;/a&gt;&lt;/p&gt; </description>
    <dc:date>2008-05-06T13:46:11-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/127">
    <link>http://www.ejeliot.com/blog/127</link>
    <title>Mobile Browser Concurrency Test</title>
    <description>&lt;p&gt;Cloud Four, specialists in mobile development, have set up a &lt;a href=&quot;http://www.cloudfour.com/36/mobile-browser-concurrency-test/&quot;&gt;research project&lt;/a&gt; aimed at finding out more about the capabilities of mobile devices to determine the performance implications of building web sites for the wide variety of devices available. Inspired by desktop browser research, such as that carried out by &lt;a href=&quot;http://developer.yahoo.com/performance/&quot;&gt;Yahoo!'s Exceptional Performance Team&lt;/a&gt;, they're particularly interested in finding out the following information:&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;What is the number of concurrent http connections that the mobile browser supports both per domain and overall?&lt;/li&gt;
   &lt;li&gt;Does the mobile browser support gzip or other methods for reducing the size of pages?&lt;/li&gt;
   &lt;li&gt;Does the mobile browser support caching if you set the Expires header far into the future?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They plan to publish the information under a creative commons license to allow mobile web developers to benefit from their findings.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cloudfour.com/36/mobile-browser-concurrency-test/&quot;&gt;You can help them by running their test suite from your mobile phone's web browser.&lt;/a&gt;&lt;/p&gt;</description>
    <dc:date>2008-04-28T14:52:44-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/126">
    <link>http://www.ejeliot.com/blog/126</link>
    <title>Problems building MySQLdb on Mac OS X 10.4 (Power PC)</title>
    <description>&lt;p&gt;Over the last couple of days I've been trying to build and install &lt;a href=&quot;http://sourceforge.net/projects/mysql-python&quot;&gt;MySQLdb&lt;/a&gt; on my PowerPC based Mac Mini with very little success. I got the following message followed by a ton of type errors:&lt;/p&gt;
&lt;pre&gt;
Compiling with an SDK that doesn't seem to exist: 
/Developer/SDKs/MacOSX10.4u.sdk
Please check your Xcode installation
&lt;/pre&gt;
&lt;p&gt;I tried reinstalling Xcode Tools to see if it would solve the problem but with no success. Anyway after searching around it turns out that the installer doesn't add a required SDK package which you can find in Xcode Tools-&gt;Packages on the install disk. It's called MacOSX10.4.Universal.pkg.&lt;/p&gt;
&lt;p&gt;I (and others) have not had similar problems on Intel based Macs running Tiger or Leopard so I'm guessing it's specific to the PPC install.&lt;/p&gt;
&lt;p&gt;With that out of the way - on with &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;.&lt;/p&gt;</description>
    <dc:date>2008-04-17T03:00:07-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <item rdf:about="http://www.ejeliot.com/blog/125">
    <link>http://www.ejeliot.com/blog/125</link>
    <title>Automatic versioning of CSS, JavaScript and Images</title>
    <description>&lt;p&gt;&lt;em&gt;See comments for important information about HTTP caching issues with URLs containing query string parameters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When including CSS and JavaScript resources in your pages you should version file paths and update these version numbers every time the  files change. This is necessary as a visitor's browsers may, depending on settings, continue to cache files even after a change. This can result in a mismatch between your HTML and these external resources which may cause rendering or functionality problems. One will likely  encounter similar caching issues with images.&lt;/p&gt;

&lt;p&gt;So if we work on the basis that we should version these resources and that changing version numbers forces the browser to reload those resources then we can actually gain large performance improvements by explicitly instructing the browser to cache them for an extended period of time (say 10 years) thereby limiting the number of times the browser goes back to check for fresh copies.&lt;/p&gt;

&lt;p&gt;This can be achieved fairly easily within the virtual host settings of your Apache conf file. Simply add the following directives within the relevant virtual hosts section substituting /assets/ with the file path corresponding to the location where your CSS, JavaScript and images are stored.&lt;/p&gt;

&lt;ol class=&quot;code&quot;&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;Location /assets/&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;ExpiresActive On&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;ExpiresDefault &amp;quot;access plus 10 years&amp;quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;/Location&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you have the mod_deflate module installed then you can gain an additional performance benefit by gzipping CSS and JavaScript resources to reduce the amount transmitted down the wire.&lt;/p&gt;

&lt;ol class=&quot;code&quot;&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;Location /assets/&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;ExpiresActive On&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;ExpiresDefault &amp;quot;access plus 10 years&amp;quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;SetOutputFilter DEFLATE&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;/Location&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These directives can also be added to an appropriately placed .htaccess file but as &lt;a href=&quot;http://muffinresearch.co.uk/archives/2008/04/07/avoiding-the-use-of-htaccess-for-performance/&quot;&gt;Stuart&lt;/a&gt; explains there are performance implications with this method so it should only be chosen if you don't have access to your Apache conf files (perhaps because you're using shared hosting).&lt;/p&gt;

&lt;p&gt;Applying both these settings covers off a couple of recommendations made by &lt;a href=&quot;http://developer.yahoo.com/yslow/&quot;&gt;Yahoo!'s YSlow performance testing tool&lt;/a&gt; so not only will you end up with a faster site but you'll also improve your YSlow rating by a grade or two.&lt;/p&gt;

&lt;p&gt;Of course manually versioning files is a pain, it's repetitive and as &lt;a href=&quot;http://muffinresearch.co.uk/&quot;&gt;Stuart&lt;/a&gt; is always reminding me manually repetitive tasks should be eliminated wherever possible. In the past I wrote a &lt;a href=&quot;http://www.ejeliot.com/blog/72&quot;&gt;script which automatically merges CSS or JavaScript files&lt;/a&gt; and versions the combined output. Here's some simpler code which versions individual files based their last modified date - every time the file is updated it's version number updates accordingly.&lt;/p&gt;

&lt;ol class=&quot;code&quot;&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;?php&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;class Version {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;private static $aLookup = array();&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;public static function Get($sFilename) {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;if (!array_key_exists($sFilename, self::$aLookup)) {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent4&quot;&gt;&lt;code&gt;$sRealPath = realpath($_SERVER['DOCUMENT_ROOT'] . &amp;quot;/$sFilename&amp;quot;);&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent4&quot;&gt;&lt;code&gt;if (file_exists($sRealPath) &amp;amp;&amp;amp; ($iTimestamp = filemtime($sRealPath))) {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent5&quot;&gt;&lt;code&gt;self::$aLookup[$sFilename] = $iTimestamp;&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent5&quot;&gt;&lt;code&gt;$sFilename .= &amp;quot;?v=$iTimestamp&amp;quot;;&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent4&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;} else {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent4&quot;&gt;&lt;code&gt;$sFilename .= '?v='.self::$aLookup[$sFilename];&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;return $sFilename;&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;public static function GetLink($sFilename) {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;return '&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;'.self::Get($sFilename).'&amp;quot;&amp;gt;';&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;public static function GetScript($sFilename) {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;return '&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;'.self::Get($sFilename).'&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;';&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;public static function GetImage($sFilename, $iWidth, $iHeight, $sAlt = '') {&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent3&quot;&gt;&lt;code&gt;return sprintf('&amp;lt;img src=&amp;quot;%s&amp;quot; width=&amp;quot;%d&amp;quot; height=&amp;quot;%d&amp;quot; alt=&amp;quot;%s&amp;quot;&amp;gt;', self::Get($sFilename), $iWidth, $iHeight, $sAlt);&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent2&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;indent1&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;?&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ejeliot.com/samples/version/version.inc.phps&quot;&gt;Download plain text version&lt;/a&gt; (&lt;a href=&quot;http://www.ejeliot.com/samples/version/version-2.inc.phps&quot;&gt;Updated version to fix HTTP caching issues&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Using it is pretty simple - wrap the required function around the file path you'd normally have supplied to link, script or img tags.&lt;/p&gt;

&lt;ol class=&quot;code&quot;&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;?php echo Version::Get('/css/dark.css'); ?&amp;gt;&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In fact it's even easier than that - I've also provided some wrapper functions which make outputting link, script and img tags a little bit easier. The example above could be written more simply as follows:&lt;/p&gt;

&lt;ol class=&quot;code&quot;&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt;?php echo Version::GetLink('/css/dark.css'); ?&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
    <dc:date>2008-04-07T15:24:00-00:00</dc:date>
    <dc:creator>Ed Eliot</dc:creator>
  </item>

  <rdf:Description rdf:ID="manifest">
    <mn:channels>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.ejeliot.com/" />
      </rdf:Seq>
    </mn:channels>
  </rdf:Description>

</rdf:RDF>
