<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Old dog, new tricks</title>
    
    
    <link rel="alternate" type="text/html" href="http://www.olddognewtricks.co.uk/" />
    <id>tag:typepad.com,2003:weblog-499676</id>
    <updated>2010-01-21T20:59:25+00:00</updated>
    <subtitle>How an old dog is learning to cope with web two-point-oh</subtitle>
    <generator uri="http://www.typepad.com/">TypePad</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/OldDogNewTricks" /><feedburner:info uri="olddognewtricks" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
        <title>High performance websites</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/Ehk2kZUI-m0/high-performance-websites.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2010/01/high-performance-websites.html" thr:count="1" thr:updated="2010-01-22T05:13:23+00:00" />
        <id>tag:typepad.com,2003:post-6a00d8341ca31353ef0120a7f91460970b</id>
        <published>2010-01-21T20:59:25+00:00</published>
        <updated>2010-01-21T21:01:37+00:00</updated>
        <summary>Google guru Matt Cutts has recently reviewed the year at Google and focused quite a bit time on performance, noting that the speed of a web site may become a factor in search results ranking in the future. So I...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">&lt;p&gt;Google guru &lt;a href="http://www.mattcutts.com/blog/"&gt;Matt Cutts&lt;/a&gt; has recently &lt;a href="http://googlewebmastercentral.blogspot.com/2010/01/state-of-index-2009.html"&gt;reviewed the year at Google&lt;/a&gt; and focused quite a bit time on performance, noting that the speed of a web site may become a factor in search results ranking in the future.&lt;/p&gt;&lt;p&gt;So I took a look at our busiest website using &lt;a href="http://developer.yahoo.com/yslow/"&gt;Yahoo's YSlow&lt;/a&gt; and was dismayed - but not terribly surprised - to get a 'D' rating for one of the most complex pages.  The result for the overall speed has probably got a lot to do with the number of complex SQL queries but that wasn't what was bothering YSlow.  So I spent a fun afternoon making these fairly simple changes.&lt;/p&gt;&lt;p&gt;Where to start?  Yahoo's &lt;a href="http://developer.yahoo.com/performance/rules.htm"&gt;"Best Practices for Speeding Up Your Web Site"&lt;/a&gt; starts with &lt;strong&gt;Minimize HTTP Requests&lt;/strong&gt; so let's go with that.&lt;/p&gt;&lt;p&gt;1. Combining and Minifying CSS&lt;/p&gt;&lt;p&gt;Google has a great tool called &lt;a href="http://code.google.com/p/minify/"&gt;Minify&lt;/a&gt; which sits on your server and gathers up your CSS files and serves then minified, compressed and with cache control headers.  It's a PHP app which you just download and slap on your server.  Minimal setup is required.&lt;/p&gt;&lt;p&gt;This site is ten years old and now has six CSS files, including two that were only for print.  They aren't big but that's not the problem.  The problem is that they make multiple HTTP calls and that slows everything down.  A compliant web browser only asks for two things at a time so it will wait while each pair arrive.  In tests, using &lt;a href="http://www.webpagetest.org/"&gt;www.webpagetest.org&lt;/a&gt;, I trimmed off about 0.3s (about 25%) of the &lt;strong&gt;time taken to start rendering the page&lt;/strong&gt;.  Why was I worried about the time taken to start rendering, rather than completion?  Because that's what user's notice.  Once the page has started to arrive, they feel rewarded.  As long as the rest of the page arrives with out undue delay, yhey'll be happy.&lt;/p&gt;&lt;p&gt;The first thing I did was remove the need for the Print CSS files by moving their content into their Screen equivalents and wrapping it with @media print { }.  The @media instruction didn't work in Netscape 4 and it looks like parts of this site date back to when Netscape 4 mattered.  So then there were four.&lt;/p&gt;&lt;p&gt;The next step was to let Minify loose on the remaining four.  By editing the groupsConfig.php file in Minify, you can define groups of CSS files.  Version control is useful here as it will allow me to override the cache control I'm about to impose.  So I set up groups:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    'west-one-v01' =&amp;gt; array( '//_css/westwing.css', &lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;					&lt;/span&gt;    '//_css/firstfloor.css', &lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;					&lt;/span&gt;    '//_css/nifty/niftyCorners.css',&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;					&lt;/span&gt;    '//_css/main.css' ),&lt;/p&gt;&lt;p&gt;Note my old friend Nifty is still in use (but probably not for much longer).  I have called my group 'west-one' but have added 'v01' to the group name.  If I need to override the cache control, I can create an identical group with a new name 'west-one-v02' and link to that instead.&lt;/p&gt;&lt;p&gt;Then I wrote a PHP function to generate the link:&lt;/p&gt;&lt;p&gt;    &lt;span style="font-family: monospace; line-height: 14px; white-space: pre; "&gt;&amp;lt;&lt;span class="start-tag"&gt;link&lt;/span&gt;&lt;span class="attribute-name"&gt; type&lt;/span&gt;=&lt;span class="attribute-value"&gt;"text/css" &lt;/span&gt;&lt;span class="attribute-name"&gt;rel&lt;/span&gt;=&lt;span class="attribute-value"&gt;"stylesheet" &lt;/span&gt;&lt;span class="attribute-name"&gt;href&lt;/span&gt;&lt;span&gt;="/min/g=west-one-v01&lt;/span&gt;&lt;span&gt;" &lt;/span&gt;&lt;span class="error"&gt;&lt;span class="attribute-name"&gt;/&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It's easy to change that function if I need to in the future - easier than changing a Dreamweaver page template.&lt;/p&gt;&lt;p&gt;2. Combining and Minifying Javascript&lt;/p&gt;&lt;p&gt;Minify will do the same job on Javascript.  I don't really remember what half this Javascript does or I would feed it through Google's &lt;a href="http://code.google.com/closure/compiler/"&gt;Closure compiler&lt;/a&gt;.  That would hugely improve it but there's not much of it so I'm going to skip ahead.&lt;/p&gt;&lt;p&gt;As with the CSS files, I can create a Minify group that covers most of them.  However, I also use &lt;a href="http://haveamint.com/"&gt;Mint&lt;/a&gt; and I can't do anything about the link to its Javascript.  Mint is/was a great package and well worth every cent of its $30 price but Google Analytics must be very hard for &lt;a href="http://www.shauninman.com/pact/"&gt;the excellent Shaun Inman&lt;/a&gt; to compete with. I'll keep using it because it's one-page summary of a website is still better than paging through GA.&lt;/p&gt;&lt;p&gt;So I've left Mint where it is.  Maybe it could be moved from the header to the footer which would improve the time the page takes to start rendering but I'm not certain the gain is worth it.  I'll ponder on that.  I hope Shaun will to.&lt;/p&gt;&lt;p&gt;3. Cache Control&lt;/p&gt;&lt;p&gt;So far, so good.  YSlow likes what I've done and now gives me Grade A on "Make fewer HTTP requests" but is still giving me an 'E' for &lt;strong&gt;Add Expires headers&lt;/strong&gt;.  &lt;/p&gt;&lt;p&gt;I'll do that it two ways.  Firstly I can edit Minify's config.php and tell it to put 30 days on the CSS and Javascript.  Actually yahoo suggests a month so I've made it 32 days to Yahoo gets off my back.  &lt;/p&gt;&lt;p&gt;    $min_serveOptions['maxAge'] = 2764800;&lt;/p&gt;&lt;p&gt;I also need to cache my images.  For that I've gone to my .htaccess file and added:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    &amp;lt;FilesMatch "\.(ico|jpg|jpeg|png|gif)$"&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;Header set Cache-Control "max-age=2764800, public, must-revalidate"&lt;/p&gt;&lt;p&gt;    &amp;lt;/FilesMatch&amp;gt;&lt;/p&gt;&lt;p&gt;Again, if I need to change an image I'll have to give it a new name.  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Again, YSlow is impressed and gives me Grade C.  Remember that I haven't touched Mint yet.&lt;/p&gt;&lt;p&gt;4. Compression&lt;/p&gt;&lt;p&gt;Why isn't all website content compressed?  It's so easy to do and all modern browsers accept it but still the majority of websites don't compress.  I have no idea why.  Maybe they'd just never thought of it.  Like me!&lt;/p&gt;&lt;p&gt;I'm using Apache 1.3 and I should really be using Apache 2.  If I was using Apache 2 I could use mod_deflate and just add these lines to my .htaccess:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    &amp;lt;IfModule mod_deflate.c&amp;gt;&lt;/p&gt;&lt;p&gt;    # compress all text &amp;amp; html:&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;AddOutputFilterByType DEFLATE text/html text/plain text/xml&lt;/p&gt;&lt;p&gt;    &amp;lt;/IfModule&amp;gt;&lt;/p&gt;&lt;p&gt;But that doesn't do anything because I don't have mod_deflate.  But I do have mod_gzip so this should work:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    &amp;lt;IfModule mod_gzip.c&amp;gt;&lt;/p&gt;&lt;p&gt;        mod_gzip_on       Yes&lt;/p&gt;&lt;p&gt;        mod_gzip_dechunk  Yes&lt;/p&gt;&lt;p&gt;        mod_gzip_item_include file      \.(html?|txt|css|js|php|pl)$&lt;/p&gt;&lt;p&gt;        mod_gzip_item_include handler   ^cgi-script$&lt;/p&gt;&lt;p&gt;        mod_gzip_item_include mime      ^text/.*&lt;/p&gt;&lt;p&gt;        mod_gzip_item_include mime      ^application/x-javascript.*&lt;/p&gt;&lt;p&gt;        mod_gzip_item_exclude mime      ^image/.*&lt;/p&gt;&lt;p&gt;        mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*&lt;/p&gt;&lt;p&gt;    &amp;lt;/IfModule&amp;gt;&lt;/p&gt;&lt;p&gt;But it doesn't work because I'm hosting this at &lt;a href="http://www.fasthosts.co.uk/"&gt;Fasthosts&lt;/a&gt;.  I really like Fasthosts - I've used them for ten years and they are completely reliable.  They aren't going to be the most up-to-date on technology but at £50 a month for a reseller account, you can't expect them to be.  Anyway, GZIP didn't work and the engineer couldn't help.  &lt;/p&gt;&lt;p&gt;But there is a third solution - to do it in PHP.  Amazingly, all you have to do is add one line to the top of your PHP files:&lt;/p&gt;&lt;p&gt;    &amp;lt;?php ob_start("ob_gzhandler"); ?&amp;gt;&lt;/p&gt; But you do need to ask yourself whether this is worth it.  Out of the 1.2 seconds it originally took my page to arrive, less than 0.05 seconds was taken up receiving the content.  On pages with lots of content, this may be worthwhile but not everywhere.  Also, if your page is designed to lay out one piece at a time, you may not want to buffer the output, which is what this command will do.  &lt;p&gt;&lt;/p&gt;&lt;p&gt;And that's where I stopped.  A page that started out taking 1.2 seconds, now takes less than 0.5 seconds.  If I move Mint into the footer, I can trim that further.  YSlow now gives me a Grade B for my smaller pages, where Mint is more significant, and a Grade A for my larger pages, where I've added compression.  Not bad for two hours' work.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=Ehk2kZUI-m0:50JtjW1ih50:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=Ehk2kZUI-m0:50JtjW1ih50:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=Ehk2kZUI-m0:50JtjW1ih50:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=Ehk2kZUI-m0:50JtjW1ih50:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=Ehk2kZUI-m0:50JtjW1ih50:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=Ehk2kZUI-m0:50JtjW1ih50:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/Ehk2kZUI-m0" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2010/01/high-performance-websites.html</feedburner:origLink></entry>
    <entry>
        <title>Word's "magic quotes" in HTML</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/isN-ssAmFY4/words-magic-quotes-in-html.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2009/10/words-magic-quotes-in-html.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341ca31353ef0120a60c5d06970b</id>
        <published>2009-10-21T10:48:03+01:00</published>
        <updated>2009-10-21T10:49:41+01:00</updated>
        <summary>Sometimes it is necessary to take content in Word and put it into your CMS. Some tools will replace Word's "magic quotes" with the correct HTML codes but some won't. If you find you need to do it yourself, you...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">&lt;p&gt;Sometimes it is necessary to take content in Word and put it into your CMS.  Some tools will replace Word's "magic quotes" with the correct HTML codes but some won't.  If you find you need to do it yourself, you might find this Word macros useful:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;'&lt;/p&gt;&lt;p&gt;' WordReplaceSpecialChars Macro&lt;/p&gt;&lt;p&gt;'&lt;/p&gt;&lt;p&gt;    Selection.Find.ClearFormatting&lt;/p&gt;&lt;p&gt;    Selection.Find.Replacement.ClearFormatting&lt;/p&gt;&lt;p&gt;    With Selection.Find&lt;/p&gt;&lt;p&gt;        .Text = ChrW(8220)&lt;/p&gt;&lt;p&gt;        .Replacement.Text = "&amp;amp;#8220;"&lt;/p&gt;&lt;p&gt;        .Forward = True&lt;/p&gt;&lt;p&gt;        .Wrap = wdFindContinue&lt;/p&gt;&lt;p&gt;        .Format = False&lt;/p&gt;&lt;p&gt;        .MatchCase = True&lt;/p&gt;&lt;p&gt;        .MatchWholeWord = False&lt;/p&gt;&lt;p&gt;        .MatchWildcards = False&lt;/p&gt;&lt;p&gt;        .MatchSoundsLike = False&lt;/p&gt;&lt;p&gt;        .MatchAllWordForms = False&lt;/p&gt;&lt;p&gt;    End With&lt;/p&gt;&lt;p&gt;    Selection.Find.Execute Replace:=wdReplaceAll&lt;/p&gt;&lt;p&gt;    &lt;/p&gt;&lt;p&gt;    Selection.Find.ClearFormatting&lt;/p&gt;&lt;p&gt;    Selection.Find.Replacement.ClearFormatting&lt;/p&gt;&lt;p&gt;    With Selection.Find&lt;/p&gt;&lt;p&gt;        .Text = ChrW(8221)&lt;/p&gt;&lt;p&gt;        .Replacement.Text = "&amp;amp;#8221;"&lt;/p&gt;&lt;p&gt;        .Forward = True&lt;/p&gt;&lt;p&gt;        .Wrap = wdFindContinue&lt;/p&gt;&lt;p&gt;        .Format = False&lt;/p&gt;&lt;p&gt;        .MatchCase = True&lt;/p&gt;&lt;p&gt;        .MatchWholeWord = False&lt;/p&gt;&lt;p&gt;        .MatchWildcards = False&lt;/p&gt;&lt;p&gt;        .MatchSoundsLike = False&lt;/p&gt;&lt;p&gt;        .MatchAllWordForms = False&lt;/p&gt;&lt;p&gt;    End With&lt;/p&gt;&lt;p&gt;    Selection.Find.Execute Replace:=wdReplaceAll&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    Selection.Find.ClearFormatting&lt;/p&gt;&lt;p&gt;    Selection.Find.Replacement.ClearFormatting&lt;/p&gt;&lt;p&gt;    With Selection.Find&lt;/p&gt;&lt;p&gt;        .Text = ChrW(8216)&lt;/p&gt;&lt;p&gt;        .Replacement.Text = "&amp;amp;#8216;"&lt;/p&gt;&lt;p&gt;        .Forward = True&lt;/p&gt;&lt;p&gt;        .Wrap = wdFindContinue&lt;/p&gt;&lt;p&gt;        .Format = False&lt;/p&gt;&lt;p&gt;        .MatchCase = True&lt;/p&gt;&lt;p&gt;        .MatchWholeWord = False&lt;/p&gt;&lt;p&gt;        .MatchWildcards = False&lt;/p&gt;&lt;p&gt;        .MatchSoundsLike = False&lt;/p&gt;&lt;p&gt;        .MatchAllWordForms = False&lt;/p&gt;&lt;p&gt;    End With&lt;/p&gt;&lt;p&gt;    Selection.Find.Execute Replace:=wdReplaceAll&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    Selection.Find.ClearFormatting&lt;/p&gt;&lt;p&gt;    Selection.Find.Replacement.ClearFormatting&lt;/p&gt;&lt;p&gt;    With Selection.Find&lt;/p&gt;&lt;p&gt;        .Text = ChrW(8217)&lt;/p&gt;&lt;p&gt;        .Replacement.Text = "&amp;amp;#8217;"&lt;/p&gt;&lt;p&gt;        .Forward = True&lt;/p&gt;&lt;p&gt;        .Wrap = wdFindContinue&lt;/p&gt;&lt;p&gt;        .Format = False&lt;/p&gt;&lt;p&gt;        .MatchCase = True&lt;/p&gt;&lt;p&gt;        .MatchWholeWord = False&lt;/p&gt;&lt;p&gt;        .MatchWildcards = False&lt;/p&gt;&lt;p&gt;        .MatchSoundsLike = False&lt;/p&gt;&lt;p&gt;        .MatchAllWordForms = False&lt;/p&gt;&lt;p&gt;    End With&lt;/p&gt;&lt;p&gt;    Selection.Find.Execute Replace:=wdReplaceAll&lt;/p&gt;&lt;p&gt;End Sub&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=isN-ssAmFY4:XJptEfrBIjA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=isN-ssAmFY4:XJptEfrBIjA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=isN-ssAmFY4:XJptEfrBIjA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=isN-ssAmFY4:XJptEfrBIjA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=isN-ssAmFY4:XJptEfrBIjA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=isN-ssAmFY4:XJptEfrBIjA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/isN-ssAmFY4" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2009/10/words-magic-quotes-in-html.html</feedburner:origLink></entry>
    <entry>
        <title>A bug in Nifty Corners</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/-6vc5y759Xg/a-bug-in-nifty-.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/10/a-bug-in-nifty-.html" thr:count="1" thr:updated="2007-11-08T15:41:03+00:00" />
        <id>tag:typepad.com,2003:post-40822754</id>
        <published>2007-10-29T16:19:14+00:00</published>
        <updated>2007-10-29T16:19:14+00:00</updated>
        <summary>I'm have been using the latest version of Nifty Corners (NiftyCube) in two sites for some time but one of them, my main Rails site, has been exhibiting a strange bug which I couldn't quite isolate. Sometimes the page would...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="nifty" />
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;I'm have been using the latest version of Nifty Corners (&lt;a href="http://www.html.it/articoli/niftycube/index.html"&gt;NiftyCube&lt;/a&gt;) in two sites for some time but one of them, my main Rails site, has been exhibiting a strange bug which I couldn't quite isolate.&amp;nbsp; Sometimes the page would finish downloading but wouldn't display until either (a) I touched a key or (b) some considerable time had passed.&amp;nbsp; I decided to ignore it.&lt;/p&gt;

&lt;p&gt;But now I'm completing a third site to use Nifty Corners and I'm guessing that the client won't let me get away with ignoring it this time.&amp;nbsp; I noticed that the problem was at its worst when using the Back or Forward keys as most of the pages on this third site were straight HTML with only a dash of PHP and should display almost instantly.&amp;nbsp; But there was that five or ten second delay again.&amp;nbsp; Maybe it was trying to download one last component of the HTML but I couldn't see why that would stop the page downloading.&amp;nbsp; I decided it had to be Javascript in the window.onload function.&lt;/p&gt;

&lt;p&gt;After some digging through Alessandro Fulciniti's very elegant Javascript, I spotted a function AddCss() where he creates a link tag to load in his CSS file niftyCorners.css.&amp;nbsp; The problem was that the code assumed that the CSS file was in the current folder.&amp;nbsp; I changed this to specify the folder:&lt;/p&gt;&lt;blockquote dir="ltr"&gt;&lt;p&gt;function AddCss(){&lt;br /&gt;niftyCss=true;&lt;br /&gt;var l=CreateEl(&amp;quot;link&amp;quot;);&lt;br /&gt;l.setAttribute(&amp;quot;type&amp;quot;,&amp;quot;text/css&amp;quot;);&lt;br /&gt;l.setAttribute(&amp;quot;rel&amp;quot;,&amp;quot;stylesheet&amp;quot;);&lt;br /&gt;l.setAttribute(&amp;quot;href&amp;quot;,&amp;quot;&lt;strong&gt;/_css/&lt;/strong&gt;niftyCorners.css&amp;quot;);&lt;br /&gt;l.setAttribute(&amp;quot;media&amp;quot;,&amp;quot;screen&amp;quot;);&lt;br /&gt;document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(l);&lt;br /&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Now I can get on with what I was supposed to be doing this afternoon.&amp;nbsp; Hope this post helps someone.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=-6vc5y759Xg:uY4hs_AEdiQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=-6vc5y759Xg:uY4hs_AEdiQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=-6vc5y759Xg:uY4hs_AEdiQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=-6vc5y759Xg:uY4hs_AEdiQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=-6vc5y759Xg:uY4hs_AEdiQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=-6vc5y759Xg:uY4hs_AEdiQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/-6vc5y759Xg" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/10/a-bug-in-nifty-.html</feedburner:origLink></entry>
    <entry>
        <title>Converting ASP sites to PHP</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/l2VvWgUk49M/converting-asp-.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/08/converting-asp-.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-37665801</id>
        <published>2007-08-14T16:24:48+01:00</published>
        <updated>2007-08-14T16:24:48+01:00</updated>
        <summary>OK, here's a quick tip of you're converting some ancient ASP site to PHP. Did I mention I used to create sites in ASP. Sorry, it's a bit embarrassing you see... When changing a site's technology you don't want old...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;OK, here's a quick tip of you're converting some ancient ASP site to PHP.&amp;nbsp; Did I mention I used to create sites in ASP.&amp;nbsp; Sorry, it's a bit embarrassing you see...&lt;/p&gt;

&lt;p&gt;When changing a site's technology you don't want old URLs to stop working so you'll want each of the old URLs with .asp in them to safely find the new URLs with .php in them.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;So you'll have a URL such as:&lt;/p&gt;&lt;blockquote dir="ltr"&gt;&lt;p&gt;http:⁄⁄www.example.com/foo/bar.&lt;strong&gt;asp&lt;/strong&gt;?someid=14&amp;amp;someotherid=apple&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;and you want it to be:&lt;/p&gt;&lt;blockquote dir="ltr"&gt;&lt;p&gt;http:⁄⁄www.example.com/foo/bar.&lt;strong&gt;php&lt;/strong&gt;?someid=14&amp;amp;someotherid=apple&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Apache makes this easy.&amp;nbsp; Just get hold of the .htaccess file in the root folder of your site and add a line to it:&lt;/p&gt;&lt;blockquote dir="ltr"&gt;&lt;p&gt;RewriteRule&amp;nbsp; ^(.*)\.asp(.*)$ $1.php$2 [R=301]&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Care what it means?&amp;nbsp; Didn't think so.&lt;/p&gt;

&lt;p&gt;I'll tell you anyway.&amp;nbsp; It tells Apache to look for a URL that has &amp;quot;.asp&amp;quot; in it somewhere and tell the browser to redirect to a URL that is made up of the bit before the &amp;quot;.asp&amp;quot; plus &amp;quot;.php&amp;quot; plus the bit after the &amp;quot;'asp&amp;quot;.&amp;nbsp; In regular expressions, anything enclosed in brackets, e.g. (.*), can be accessed in the replacement string using $1, $2 etc.&lt;/p&gt;

&lt;p&gt;The bit on the end - [R=301] - tells Apache to send a status code of 301 to the browser telling it is a permanent redirect.&lt;/p&gt;

&lt;p&gt;Told you it was quick!&lt;/p&gt;

&lt;p&gt;PS There are other ways of doing this of course.&amp;nbsp; You could keep all the ASP files and fill them with individual instructions to redirect to the new URL or you could put the PHP code into the old ASP pages and keep the URLs the same.&amp;nbsp; If you go one of those routes, you'll need to tell Apache to execute the .asp page as if it's a PHP page.&amp;nbsp; The line to go into your .htaccess page would be something like this:&lt;/p&gt;&lt;blockquote dir="ltr"&gt;&lt;p&gt;AddType application/x-httpd-php .php .phtml .php3 &lt;strong&gt;.asp&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=l2VvWgUk49M:bsfEcyniUXo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=l2VvWgUk49M:bsfEcyniUXo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=l2VvWgUk49M:bsfEcyniUXo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=l2VvWgUk49M:bsfEcyniUXo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=l2VvWgUk49M:bsfEcyniUXo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=l2VvWgUk49M:bsfEcyniUXo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/l2VvWgUk49M" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/08/converting-asp-.html</feedburner:origLink></entry>
    <entry>
        <title>Contribution Manager - Gift Aid software on Rails</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/8_iaRdwB5d4/contribution_ma.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/06/contribution_ma.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-35076812</id>
        <published>2007-06-11T15:14:56+01:00</published>
        <updated>2007-06-11T15:14:56+01:00</updated>
        <summary>Perhaps unfairly, Rails is mainly associated with social networking sites so it's nice to be able to show that it's being used for mainstream business applications. Contribution Manager (www.contributionmanager.co.uk) is intended for small UK charities to help them with the...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="rails" />
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Perhaps unfairly, Rails is mainly associated with social networking sites so it's nice to be able to show that it's being used for mainstream business applications.&lt;/p&gt;

&lt;p&gt;Contribution Manager (&lt;a href="http://www.contributionmanager.co.uk/"&gt;www.contributionmanager.co.uk&lt;/a&gt;) is intended for small UK charities to help them with the administration and claim process for Gift Aid.&amp;nbsp; It has been designed for use by churches and other charities that use contribution envelopes but can also be used by scout groups, music societies, parent-teacher groups and any other small charity.&amp;nbsp; Pricing is remarkably low as small charities have enough trouble raising funds and won't want to spend their hard-earned contributions on software.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;As it's designed for UK tax laws, it is unlikely to be much help to non-UK charities/not-for-profit organisations but if it could be modified for use in other countries, I'm sure the authors would appreciate suggestions.&lt;/p&gt;

&lt;a href="http://technorati.com/tag/gift+aid" rel="tag"&gt;&lt;img style="border:0;vertical-align:middle;margin-left:.4em" src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=gift+aid" alt=" " /&gt;gift aid&lt;/a&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=8_iaRdwB5d4:019pQ6SQ94o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=8_iaRdwB5d4:019pQ6SQ94o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=8_iaRdwB5d4:019pQ6SQ94o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=8_iaRdwB5d4:019pQ6SQ94o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=8_iaRdwB5d4:019pQ6SQ94o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=8_iaRdwB5d4:019pQ6SQ94o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/8_iaRdwB5d4" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/06/contribution_ma.html</feedburner:origLink></entry>
    <entry>
        <title>Domain mapping and Typepad revisited</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/2ov-119iHt8/domain_mapping_.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/06/domain_mapping_.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-35136588</id>
        <published>2007-06-10T13:27:04+01:00</published>
        <updated>2007-06-10T13:27:04+01:00</updated>
        <summary>Last year, I published a how-to on setting up domain mapping with Typepad. Since then, I have noticed that some sites link to emilyrose.org instead of linking to www.emilyrose.org. Because of the way I'd set this up, emilyrose.org still links...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="typepad" />
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Last year, I published a how-to on setting up &lt;a href="http://www.olddognewtricks.co.uk/2006/09/domain_mapping_.html"&gt;domain mapping with Typepad&lt;/a&gt;.&amp;nbsp; Since then, I have noticed that some sites link to emilyrose.org instead of linking to www.emilyrose.org.&amp;nbsp; Because of the way I'd set this up, emilyrose.org still links to my ISP's parking page so &lt;a href="http://technorati.com/"&gt;Technorati&lt;/a&gt;, for example, was showing a picture of the parking page instead of a picture of my home page &lt;/p&gt;

&lt;p&gt;So, as I'm using &lt;a href="http://www.godaddy.com/"&gt;godaddy&lt;/a&gt;, I've switched on domain forwarding as well but only to forward emilyrose.org to http://www.emilyrose.org.&amp;nbsp; The CNAME record to then forward www.emilyrose.org on to olddog.typepad.com does the rest of the job.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;This may seem a roundabout solution but it does work.&amp;nbsp; &lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=2ov-119iHt8:8n_xzSXe6NU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=2ov-119iHt8:8n_xzSXe6NU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=2ov-119iHt8:8n_xzSXe6NU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=2ov-119iHt8:8n_xzSXe6NU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=2ov-119iHt8:8n_xzSXe6NU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=2ov-119iHt8:8n_xzSXe6NU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/2ov-119iHt8" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/06/domain_mapping_.html</feedburner:origLink></entry>
    <entry>
        <title>Social networking is not exactly new</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/lRWJ4kQGDt8/social_networki.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/05/social_networki.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-34827198</id>
        <published>2007-05-19T16:08:00+01:00</published>
        <updated>2007-05-19T16:08:00+01:00</updated>
        <summary>I think I know how this started. The Guardian G2 editor reads a story that William Wales (aka 'Prince William', an English 'it boy') has joined Facebook and thinks to himself "Facebook - have I heard of that?". Then Lily...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;I think I know how this started.&amp;nbsp; The Guardian G2 editor reads a story that William Wales (aka 'Prince William', an English 'it boy') has joined Facebook and thinks to himself &amp;quot;Facebook - have I heard of that?&amp;quot;.&amp;nbsp; Then Lily Allen (English singer) joins MySpace and he think &amp;quot;I need to get someone to explain this to me&amp;quot;.&amp;nbsp; So some young people are duly rounded up by the technology correspondent and &lt;a href="http://www.guardian.co.uk/g2/story/0,,2080312,00.html"&gt;an article appears on the &amp;quot;social networking revolution&amp;quot;&lt;/a&gt;.&amp;nbsp; The young people are asked to talk about Facebook, MySpace, Bebo, Twitter and SecondLife.&amp;nbsp; No LinkedIn.&amp;nbsp; No Ecademy.&amp;nbsp; No realisation that 'old' people do it too.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;Social networking has been around a while.&amp;nbsp; How do you suppose the second and third people to master fire found out about it?&amp;nbsp; Read a book?&amp;nbsp; Looked it up on Wikipedia?&amp;nbsp; I'd guess one of their trusted network told them about it.&amp;nbsp; Social networking was thriving in pubs when I was a nipper and going pretty strong at the IoD when I was a member there.&amp;nbsp; Just because there's a way to do it online doesn't make it new.&amp;nbsp; &amp;nbsp;&lt;/p&gt;

&lt;p&gt;MySpace started in September 2003, Facebook in February 2004, Bebo in January 2005 and Twitter in March 2006.&amp;nbsp; But &lt;a href="http://www.linkedin.com/"&gt;Linkedin&lt;/a&gt; has been going since before any of them and Ecademy since June 1998.&amp;nbsp; Even a mention of &lt;a href="http://www.friendster.com/"&gt;Friendster&lt;/a&gt; (March 2002) or &lt;a href="http://www.friendsreunited.co.uk/"&gt;Friends Reunited&lt;/a&gt; (July 2000) would have given the article a little more perspective.&lt;/p&gt;

&lt;p&gt;So I did a test.&amp;nbsp; I logged into Facebook, set up a profile and then looked for university friends.&amp;nbsp; Not one.&amp;nbsp; So I pretended I was five years younger and got a few.&amp;nbsp; Ten years; more.&amp;nbsp; But I had to act like a 25-year-old before I found significant quantities.&amp;nbsp; The same test in LinkedIn showed a much broader cross section, right up my former MD who must by 58 or 59 by now.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;So if you think social networking is leaving you behind, don't just pile into Facebook and start making friends with teenages.&amp;nbsp; That might not actually be very good for your reputation.&amp;nbsp; Find out what your friends use and give that one a try instead.&amp;nbsp; And may I give you a tip; don't just form an online connection with anyone and everyone in an attempt to have more connections than your friends and to prove to them that you're not Billy No-Mates after all.&amp;nbsp; I'd strongly advise that you stick with people you know and people who are personally recommended to you.&amp;nbsp; Go for quality over quantity.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=lRWJ4kQGDt8:ZgIfL6U4ZA0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=lRWJ4kQGDt8:ZgIfL6U4ZA0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=lRWJ4kQGDt8:ZgIfL6U4ZA0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=lRWJ4kQGDt8:ZgIfL6U4ZA0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=lRWJ4kQGDt8:ZgIfL6U4ZA0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=lRWJ4kQGDt8:ZgIfL6U4ZA0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/lRWJ4kQGDt8" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/05/social_networki.html</feedburner:origLink></entry>
    <entry>
        <title>Mephisto and cyclothymic development</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/bSjCE3dQgzI/mephisto_april_.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/04/mephisto_april_.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-32492924</id>
        <published>2007-04-04T11:36:46+01:00</published>
        <updated>2007-04-04T11:36:46+01:00</updated>
        <summary>It's always nice to learn a new word and Nikolay Kolev has taught me 'cyclothymic', a personality disorder characterised by bouts of intense activity followed by periods of the complete opposite. Nikolay associates this disorder with OSS Rails development and...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="mephisto" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="rails" />
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;It's always nice to learn a new word and &lt;a href="http://mephistoblog.com/2007/3/20/globalizing-mephisto#comments"&gt;Nikolay Kolev&lt;/a&gt; has taught me 'cyclothymic', a personality disorder characterised by bouts of intense activity followed by periods of the complete opposite.&amp;nbsp; Nikolay associates this disorder with OSS Rails development and it's easy to see his point.&amp;nbsp; Many Rails developments have set off in a burst of enthusiasm and code marathons followed by a rapid descent into inactivity.&amp;nbsp; I was involved in one myself - I still don't know where half the development team disappeared to.&lt;/p&gt;

&lt;p&gt;Mephisto is one such sufferer.&amp;nbsp; &lt;a href="http://mephistoblog.com/2007/3/22/is-mephisto-dead"&gt;Rick Olsen has confessed&lt;/a&gt; that it's been comatose since the end of last year and the prognosis isn't good.&amp;nbsp; The 'community' around Mephisto hasn't produced any meaningful documentation yet - and yes, I am one of that community so I am part of the problem - so the product isn't getting the following it deserves.&amp;nbsp; To pick up on a point made by Justin Palmer, it is still seen as a great Rails publishing tool, not a great publishing tool.&lt;/p&gt;

&lt;p&gt;This blog uses Typepad and I have other sites that use Wordpress.&amp;nbsp; Neither tool is leading edge or even particularly impressive but they both do exactly what they need to do and they do it effectively.&amp;nbsp; I have no need for more than what they do.&amp;nbsp; So no, I don't use Mephisto and I doubt that I will for a good while yet.&amp;nbsp; I hope it pulls through as it's a great piece of software ... but there's more to a successful software project than good software.&lt;/p&gt;

&lt;p&gt;It is clear that two distinct and damaging problems are afflicting the Rails world.&amp;nbsp; Firstly, there is a desire to rework existing applications as Rails applications even if no specific advantage is offered to the end user - for example blogging tools, forum tools, to-do lists and so on.&amp;nbsp; Secondly, the documentation is then neglected so only fellow Rails enthusiasts can be confident of using the software successfully.&amp;nbsp; I remember the RTFM responses I got from early Unix vendors but at least there was a manual to read.&amp;nbsp; RTFSVN is no answer at all.&amp;nbsp; If these issues aren't addressed by the core team, I'm worried that much of the buzz that surrounded Rails in 2005 will be wasted.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=bSjCE3dQgzI:jtv-o10NJ_Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=bSjCE3dQgzI:jtv-o10NJ_Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=bSjCE3dQgzI:jtv-o10NJ_Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=bSjCE3dQgzI:jtv-o10NJ_Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=bSjCE3dQgzI:jtv-o10NJ_Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=bSjCE3dQgzI:jtv-o10NJ_Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/bSjCE3dQgzI" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/04/mephisto_april_.html</feedburner:origLink></entry>
    <entry>
        <title>Rails, email and multipart/alternative</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/ruvgY4fR9KY/multipartaltern.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/03/multipartaltern.html" thr:count="1" thr:updated="2007-04-12T17:52:04+01:00" />
        <id>tag:typepad.com,2003:post-31218162</id>
        <published>2007-03-05T21:45:11+00:00</published>
        <updated>2007-03-05T21:45:11+00:00</updated>
        <summary>All of a sudden, I need to produce an HTML email for a client. Is that the only way it ever happens - without warning? Having recently bought Chad Fowler's Rails Recipes, a book I would recommend, and having spotted...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="rails" />
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;style&gt;pre {
        background-color: #f1f1f3;
        color: #112;
        padding: 10px;
        font-size: 13px;
        overflow: auto;
        margin: 4px 0px;
		width: 97%;
		overflow-x: auto;
		overflow-y: hidden;
		margin-top: 12px;
}


/* Syntax highlighting */
pre .normal {}
pre .comment { color: #005; font-style: italic; }
pre .keyword { color: #A00; font-weight: bold; }
pre .method { color: #077; }
pre .class { color: #074; }
pre .module { color: #050; }
pre .punct { color: #447; font-weight: bold; }
pre .symbol { color: #099; }
pre .string { color: #944; background: #FFE; }
pre .char { color: #F07; }
pre .ident { color: #004; }
pre .constant { color: #07F; }
pre .regex { color: #B66; background: #FEF; }
pre .number { color: #F99; }
pre .attribute { color: #5bb; }
pre .global { color: #7FB; }
pre .expr { color: #227; }
pre .escape { color: #277; }&lt;/style&gt;&lt;p&gt;All of a sudden, I need to produce an HTML email for a client.&amp;nbsp; Is that the only way it ever happens - without warning?&lt;/p&gt;

&lt;p&gt;Having recently bought Chad Fowler's &lt;a href="http://www.pragmaticprogrammer.com/titles/fr_rr/"&gt;Rails Recipes&lt;/a&gt;, a book I would recommend, and having spotted its recipe for Gracefully Degrading Rich-Content Emails, I thought I'd use Rails for this exercise.&amp;nbsp; The recipe uses the multipart/alternative MIME type which allows you to specify an HTML version and a plain text version within the same email.&amp;nbsp; If the mail client can deal with HTML it displays that version, otherwise it displays the plain text version.&amp;nbsp; With more emails being picked up on phones and Blackberries, having a plain text fall back option is essential.&lt;/p&gt;

&lt;p&gt;The recipe is #67, if you have the book, but I've found one or two problems.&amp;nbsp; The code for the controller in the book is roughly as follows:&lt;/p&gt;&lt;style&gt;&lt;/style&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;multipart_alternative&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;recipient&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sent_at&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;subject&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Test multipart HTML email&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;recipients&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span class="ident"&gt;recipient&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;from&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Old Dog &amp;lt;olddog@examplel.com&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;sent_on&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="ident"&gt;sent_at&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;content_type&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;multipart/alternative&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 

&amp;nbsp; &lt;span class="ident"&gt;part&lt;/span&gt; &lt;span class="symbol"&gt;:content_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;text/html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
&amp;nbsp; &amp;nbsp; &lt;span class="symbol"&gt;:body&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;render_message&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;multipart_alternative&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&amp;nbsp; &lt;span class="ident"&gt;part&lt;/span&gt; &lt;span class="symbol"&gt;:content_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;text/plain&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
&amp;nbsp; &amp;nbsp; &lt;span class="symbol"&gt;:body&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;render_message&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;multipart_alternative_plain&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;The problem with this code is that multipart_alternative behaves like any Rails method and, by default, renders the view multipart_alternative.rhtml if it finds it.&amp;nbsp; So the email generated has the content of multipart_alternative appearing twice and thus messing up the MIME syntax.&lt;/p&gt;

&lt;p&gt;There are many possible fixes but I preferred to simply rename multipart_alternative.rhtml to multipart_alternative_html.rhtml and alter the render_message accordingly.&lt;/p&gt;

&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;multipart_alternative&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;recipient&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sent_at&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;subject&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Test multipart HTML email&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;recipients&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span class="ident"&gt;recipient&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;from&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Old Dog &amp;lt;olddog@example.com&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;sent_on&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="ident"&gt;sent_at&lt;/span&gt;
&amp;nbsp; &lt;span class="ident"&gt;content_type&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;multipart/alternative&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 

&amp;nbsp; &lt;span class="ident"&gt;part&lt;/span&gt; &lt;span class="symbol"&gt;:content_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;text/html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
&amp;nbsp; &amp;nbsp; &lt;span class="symbol"&gt;:body&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;render_message&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;multipart_alternative_html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&amp;nbsp; &lt;span class="ident"&gt;part&lt;/span&gt; &lt;span class="symbol"&gt;:content_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;text/plain&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
&amp;nbsp; &amp;nbsp; &lt;span class="symbol"&gt;:body&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;render_message&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;multipart_alternative_plain&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;The second problem I discovered is when I tested this on a variety of email tools.&amp;nbsp; Outlook picks up the HTML version and displays it fine but Google Mail chooses the plain text version instead.&amp;nbsp; Testing is, as ever, essential.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=ruvgY4fR9KY:_8w-GBAnIiM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=ruvgY4fR9KY:_8w-GBAnIiM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=ruvgY4fR9KY:_8w-GBAnIiM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=ruvgY4fR9KY:_8w-GBAnIiM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=ruvgY4fR9KY:_8w-GBAnIiM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=ruvgY4fR9KY:_8w-GBAnIiM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/ruvgY4fR9KY" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/03/multipartaltern.html</feedburner:origLink></entry>
    <entry>
        <title>Rails and Windows, a natural partnership?</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OldDogNewTricks/~3/n_eyLYCdNkk/rails_and_windo.html" />
        <link rel="replies" type="text/html" href="http://www.olddognewtricks.co.uk/2007/03/rails_and_windo.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-31203082</id>
        <published>2007-03-05T14:59:48+00:00</published>
        <updated>2007-03-05T14:59:48+00:00</updated>
        <summary>I happened to be looking at the stats on a website I recently created for a large well-known IT company (whose name is a three-letter acronym) and was surprised how few of the hits were from Firefox. It was 96%...</summary>
        <author>
            <name>Allen Brown</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="rails" />
        
        
<content type="html" xml:lang="en-GB" xml:base="http://www.olddognewtricks.co.uk/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;I happened to be looking at the stats on a website I recently created for a large well-known IT company (whose name is a three-letter acronym) and was surprised how few of the hits were from Firefox.&amp;nbsp; It was 96% IE and just 4% Firefox.&amp;nbsp; When I looked at OS, it was virtually 100% Windows.&amp;nbsp; Curious, I thought, that's not what I would have expected from an IT company.&lt;/p&gt;

&lt;p&gt;So that got me thinking.&amp;nbsp; I took a look at Feedburner's stats for this blog, which could be categorised a Rails Blog as I rarely talk about anything else, and found Firefox 54%, IE 26%, Safari 11% and Opera 9%.&amp;nbsp; So I scrolled down expecting to see masses of Macs and yet ... 67% Windows, 25% Macs and 8% Linux.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;So does this mean more people develop Rails applications on Windows than anywhere else?&amp;nbsp; I strongly suspect it does.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=n_eyLYCdNkk:aTZ_msCoI5o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=n_eyLYCdNkk:aTZ_msCoI5o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=n_eyLYCdNkk:aTZ_msCoI5o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=n_eyLYCdNkk:aTZ_msCoI5o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?i=n_eyLYCdNkk:aTZ_msCoI5o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OldDogNewTricks?a=n_eyLYCdNkk:aTZ_msCoI5o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OldDogNewTricks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OldDogNewTricks/~4/n_eyLYCdNkk" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.olddognewtricks.co.uk/2007/03/rails_and_windo.html</feedburner:origLink></entry>
 
</feed><!-- ph=1 --><!-- nhm:dynamic-ssi -->
