<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>AndrewBruce.net</title>
  <link href="http://www.andrewbruce.net/atom" rel="self"/>
  <updated>2008-05-22T13:42:00+01:00</updated>
  <author>
    <name>Andrew Bruce</name>
  </author>
  <rights>Andrew Bruce</rights>
  <generator>AndrewBruce.net</generator>
  <id>http://www.andrewbruce.net/</id>
  <entry>
    <id>tag:www.andrewbruce.net,2008-05-22:/rails_consultancy</id>
    <title>Rails Consultancy</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/rails_consultancy" rel="alternate"/>
    <published>2008-05-22T13:42:00+01:00</published>
    <updated>2008-05-22T13:51:29+01:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Jandaweb logo" class="blog thumbnail" src="/blog_entry/image/25/thumbnail/logo.png?1211460636" /&gt;&lt;h2&gt;Our Rails greatness, now public!&lt;/h2&gt;

&lt;p&gt;Warning: this is a shameless plug.&lt;/p&gt;

&lt;p&gt;If you're in the market for some web development, our new &lt;a href="http://www.jandaweb.com/"&gt;Rails Consultancy&lt;/a&gt;, Jandaweb, might be what you're after. We do bespoke web development, Rails consultancy services, contracting and basic template-based web sites.&lt;/p&gt;

&lt;p&gt;The latter is something we're developing to allow punters to do a straightforward checkout of a website, selecting a template and number of pages along the way. We hope it will be attractive to people who want to get a web presence quickly and cheaply, with the option of having extra dynamic features added later.&lt;/p&gt;

&lt;h2&gt;Blog&lt;/h2&gt;

&lt;p&gt;As we need to increase the profile of the company in both the Rails community and the general web, I'll be blogging about Rails whenever I can on the Jandaweb site, rather than here. This will hopefully bring in a bit of PageRank for Railsy terms.&lt;/p&gt;

&lt;p&gt;Go and take a peek!&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2008-04-15:/jackie_chan_drawing_competition</id>
    <title>Jackie Chan drawing competition</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/jackie_chan_drawing_competition" rel="alternate"/>
    <published>2008-04-15T14:10:00+01:00</published>
    <updated>2008-04-15T14:11:29+01:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Jackie Chan 'before'" class="blog thumbnail" src="/blog_entry/image/24/thumbnail/Halloween_2006_Henny_17_Indonesia_4.jpg?1208265024" /&gt;&lt;p&gt;I don't know how old this is, but it's incredible.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.jackiechankids.com/files/Halloween_Contest_2006_1-c.htm"&gt;Jackie Chan Outfits&lt;/a&gt;&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2008-03-01:/best_amazon_checkout_ever</id>
    <title>Best Amazon Checkout Ever</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/best_amazon_checkout_ever" rel="alternate"/>
    <published>2008-03-01T14:56:00+00:00</published>
    <updated>2008-03-01T14:57:31+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="The Postman Poster" class="blog thumbnail" src="/blog_entry/image/23/thumbnail/51EZ374H0AL._SS500_.jpg?1204383386" /&gt;&lt;h2&gt;Get this, losers&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The Postman 1998&lt;/li&gt;
&lt;li&gt;Waterworld 1995&lt;/li&gt;
&lt;li&gt;Braindead 1993&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I don't need to say much more than that.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-10-28:/gutsy_broke_my_wireless</id>
    <title>Gutsy broke my wireless</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/gutsy_broke_my_wireless" rel="alternate"/>
    <published>2007-10-28T02:19:00+00:00</published>
    <updated>2008-02-16T00:12:43+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Wireless radio" class="blog thumbnail" src="/blog_entry/image/22/thumbnail/1179.jpg?1193537990" /&gt;&lt;h2&gt;Hasty upgrade&lt;/h2&gt;

&lt;p&gt;So I hastily upgraded my Feisty installation to &lt;a href="http://www.ubuntulinux.org"&gt;Gutsy&lt;/a&gt;. I had no reason to do so other than to be up to date.&lt;/p&gt;

&lt;p&gt;My wireless device is a Linksys Wireless-G USB thingy. It was working great under Feisty. Thankfully I had a backup 64-bit Feisty installation on a separate partition that I could use to research the fix.&lt;/p&gt;

&lt;p&gt;The answer for me was to download the &lt;a href="http://rt2x00.serialmonkey.com/wiki/index.php/Downloads"&gt;CVS snapshot of the rt2570 module&lt;/a&gt; I was using. Gutsy thought it best that I use rt2500USB. The rt2500USB module was sneakily allowing me to scan wireless networks, but not connect to them (hence many people's complaints that the wireless encryption times out).&lt;/p&gt;

&lt;p&gt;So, after a simple untarring and reading of the INSTALL document, I was set. In simple terms:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://rt2x00.serialmonkey.com/rt2570-cvs-daily.tar.gz
tar -zxf rt2570-cvs-daily.tar.gz
cd rt2570-cvs-2007102720/Module
make
sudo make install
sudo modprobe rt2570
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then edit /etc/network/interfaces. I needed the following (key and essid changed):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;iface rausb0 inet dhcp
wireless-key 354398734589
wireless-essid HWAERAAWREAW
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then bring up the interface and you should be set!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo ifup rausb0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Hope someone finds this useful. I was getting tired of rebooting to try stuff...&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-09-19:/code/capistrano_sftp_deployment</id>
    <title>Capistrano SFTP Deployment</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/capistrano_sftp_deployment" rel="alternate"/>
    <published>2007-09-19T17:49:00+01:00</published>
    <updated>2007-09-20T11:11:15+01:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;img alt="Hair loss" class="blog thumbnail" src="/blog_entry/image/21/thumbnail/hdc_0000_0001_0_img0094.jpg?1190220611" /&gt;&lt;h2&gt;Deploying without Subversion access&lt;/h2&gt;

&lt;p&gt;If you don't have Subversion access from your live Rails server, the standard Capistrano setup after a 'capify' can cause problems if using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set :deploy_via, :copy
set :copy_strategy, :export
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In that, when Capistrano &lt;em&gt;says&lt;/em&gt; it's uploading stuff, it really only makes a 0-length file. It's something to do with Net::SFTP being thread-problematic.&lt;/p&gt;

&lt;p&gt;However, as I found at the bottom of &lt;a href="http://www.mail-archive.com/capistrano@googlegroups.com/msg01818.html"&gt;this Capistrano mailing archive&lt;/a&gt;, you just need to add this line to your config/deploy.rb:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set :synchronous_connect, true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And everything work hunky-dory.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-09-11:/you_home</id>
    <title>YOU Home</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/you_home" rel="alternate"/>
    <published>2007-09-11T16:21:00+01:00</published>
    <updated>2007-09-11T16:24:31+01:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Bournemouth estate agents YOU Home logo" class="blog thumbnail" src="/blog_entry/image/20/thumbnail/logo.gif?1189524105" /&gt;&lt;h2&gt;Bournemouth Estate Agency&lt;/h2&gt;

&lt;p&gt;The new, currently four-page, mostly static XHTML web presence for &lt;a href="http://www.youhome.co.uk"&gt;YOUhome&lt;/a&gt; has just launched.&lt;/p&gt;

&lt;p&gt;It's an estate agency in Bournemouth (with head office in London, where I work) that'll be strongly focussed on providing data for buyers and sellers alike. Being techy. Hence my involvement.&lt;/p&gt;

&lt;p&gt;End of pitch. &lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-08-06:/not_bs_alert</id>
    <title>Not BS Alert</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/not_bs_alert" rel="alternate"/>
    <published>2007-08-06T00:49:00+01:00</published>
    <updated>2007-08-06T00:50:04+01:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Stuck" class="blog thumbnail" src="/blog_entry/image/19/thumbnail/z4_stuck.jpg?1186357775" /&gt;&lt;h2&gt;Stuck Pixel&lt;/h2&gt;

&lt;p&gt;I recently bought a nice 22" LG Flatron monitor. It had a single stuck pixel that was always on red. I was shocked to find that the following howto actually fixed the problem (the 'pressure method' worked for me).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.wikihow.com/Fix-a-Stuck-Pixel-on-an-LCD-Monitor"&gt;Fixing a stuck pixel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, that was the first entry in Google, so you probably already found it.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-07-21:/code/bash_completion_for_subversion</id>
    <title>BASH completion for Subversion</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/bash_completion_for_subversion" rel="alternate"/>
    <published>2007-07-21T22:35:00+01:00</published>
    <updated>2007-07-21T22:37:15+01:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;p&gt;Whilst looking for Python &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; stuff I found this:&lt;/p&gt;

&lt;p&gt;Source the following file to enable completion of all commands, including svn:externals and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://svn.collab.net/repos/svn/trunk/tools/client-side/bash_completion"&gt;Subversion BASH Completion&lt;/a&gt;&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-04-03:/doggy_fizzle</id>
    <title>Doggy Fizzle</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/doggy_fizzle" rel="alternate"/>
    <published>2007-04-03T21:09:00+01:00</published>
    <updated>2007-04-03T21:10:12+01:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Huey's dog" class="blog thumbnail" src="/blog_entry/image/17/thumbnail/sam-ugliest-dog.jpg?1177541869" /&gt;&lt;h2&gt;The Underdog Show&lt;/h2&gt;

&lt;p&gt;If you've ever had a bad day, you'll know that some good television is likely to do nothing about it: exactly why &lt;a href="http://www.bbc.co.uk/underdogshow/"&gt;The Underdog Show&lt;/a&gt; is likely to help those in search of answers to The Big Questions.&lt;/p&gt;

&lt;p&gt;Got a burning desire to see Huey from the Fun Lovin' Criminals fail to train a mangy dog? Join the party. As an added bonus, it's presented by none other than Julian Clary. And he's a personal hero of mine.&lt;/p&gt;

&lt;p&gt;My rating: 5 stars. Worth the licence fee alone.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-03-22:/things_to_do_when_tests_are_running</id>
    <title>Things to do when tests are running</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/things_to_do_when_tests_are_running" rel="alternate"/>
    <published>2007-03-22T16:04:00+00:00</published>
    <updated>2007-03-22T16:07:30+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="A lady running a suite of Rails tests" class="blog thumbnail" src="/blog_entry/image/16/thumbnail/sleep-mask.jpg?1177541869" /&gt;&lt;h2&gt;Test-driven development, ain't it fun?&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go on &lt;a href="http://www.43things.com"&gt;43things.com&lt;/a&gt; and search for dirty words&lt;/li&gt;
&lt;li&gt;Google for all your old schoolmates to see how better off they are than you&lt;/li&gt;
&lt;li&gt;Write a blog entry about things to do when tests are running&lt;/li&gt;
&lt;li&gt;Search eBay in hope you might find a 1973 Aston Martin for 3p&lt;/li&gt;
&lt;li&gt;Stare out of the window&lt;/li&gt;
&lt;li&gt;Make tea&lt;/li&gt;
&lt;li&gt;Drink tea&lt;/li&gt;
&lt;li&gt;Tell your minions to make tea and / or drink it for you&lt;/li&gt;
&lt;li&gt;Go for a wee after too much tea&lt;/li&gt;
&lt;li&gt;Go to the ASDA down the road and buy bagels&lt;/li&gt;
&lt;li&gt;Write complaint letters to Walkers Crisps claiming a bag of crisps was underweight&lt;/li&gt;
&lt;li&gt;Shop people in your block of flats for benefit fraud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be continued...&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-02-18:/code/really_forcing_removal_of_debian_or_ubuntu_packages</id>
    <title>REALLY forcing removal of Debian or Ubuntu packages</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/really_forcing_removal_of_debian_or_ubuntu_packages" rel="alternate"/>
    <published>2007-02-18T00:18:00+00:00</published>
    <updated>2007-02-18T03:39:32+00:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;img alt="Fighting a fire - instead of starting it - geddit?" class="blog thumbnail" src="/blog_entry/image/15/thumbnail/fire_fighting.jpg?1177541869" /&gt;&lt;h2&gt;Computers can patronise&lt;/h2&gt;

&lt;p&gt;It took me a while to find this, so here it is for reference.&lt;/p&gt;

&lt;p&gt;First, try the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo dpkg -r --force-remove-reinstreq firestarter
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If that complains because its pre-removal script fails, edit it. Find it with, for example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;locate firestarter.prerm
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Take out the failing lines. Now try the first script again, then do it with the --purge option if you so wish.&lt;/p&gt;

&lt;p&gt;I can now proceed to upgrade to Edgy...&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-02-16:/chettz</id>
    <title>Chettz</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/chettz" rel="alternate"/>
    <published>2007-02-16T22:49:00+00:00</published>
    <updated>2007-02-16T22:50:22+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Fiddy Chettz" class="blog thumbnail" src="/blog_entry/image/14/thumbnail/fiddy.jpg?1177541869" /&gt;&lt;h2&gt;The Return&lt;/h2&gt;

&lt;p&gt;Back in university days, my first web project was an internal site for ridiculing &lt;a href="http://www.chettz.com"&gt;Chettz&lt;/a&gt;. Since that site is of another era, I'm beginning another. At present, it's worse than the previous one, but hopefully should grow as my free time continues to expand.&lt;/p&gt;

&lt;p&gt;Go and pay &lt;a href="http://www.chettz.com"&gt;Chettz&lt;/a&gt; a visit!&lt;/p&gt;

&lt;p&gt;It even has an &lt;a href="http://www.chettz.com/isms.xml"&gt;Atom feed&lt;/a&gt;!&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-02-16:/code/upgrading_to_rails_1.2</id>
    <title>Upgrading to Rails 1.2</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/upgrading_to_rails_1.2" rel="alternate"/>
    <published>2007-02-16T00:02:00+00:00</published>
    <updated>2007-02-16T08:52:19+00:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;h2&gt;Making the switch&lt;/h2&gt;

&lt;p&gt;The Rails team didn't make the switch to Rails 1.2 very easy. I've spent a few hours getting this site ready to deploy as &lt;a href="http://weblog.rubyonrails.org/2007/2/6/rails-1-2-2-sqlite3-gems-singular-resources"&gt;Rails 1.2.2&lt;/a&gt; (the latest version at time of writing). As I was also using &lt;a href="http://www.rails-engines.org"&gt;Rails Engines&lt;/a&gt; it was even harder than your average upgrade.&lt;/p&gt;

&lt;p&gt;It didn't help that the sparse documentation on upgrading is inaccurate.&lt;/p&gt;

&lt;h2&gt;Update&lt;/h2&gt;

&lt;p&gt;Upgrade everything. Yes, do it. But wait! Only do it on your development box. As this server has several Rails projects, and as I only wanted to upgrade one of them, I froze Rails 1.2.2 into this application under vendor/rails. If you're going to do this, do it on your development box, and then upload your changes to your live server - i.e. don't upgrade Rails on your live box!&lt;/p&gt;

&lt;p&gt;To upgrade Rails:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem update rails --include-dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To freeze the version inside an application, type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake rails:freeze:edge TAG=rel_1-2-2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that the stable version of mongrel 1.1 is out. If you are friends with mongrel (and you should be):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem update mongrel --include-dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Routes&lt;/h2&gt;

&lt;p&gt;One of the big gotchas for this site was routes. Because I use dynamic URLs that include commas and dots and so forth, depending on the title of a blog article, I found I could no longer retrieve articles by clicking their old links. I made the following change.&lt;/p&gt;

&lt;p&gt;From:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.connect '/code/:title', :controller =&amp;gt; 'code', :action =&amp;gt; 'show'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.connect '/code/:title', :controller =&amp;gt; 'code', :action =&amp;gt; 'show', :requirements =&amp;gt; { :title =&amp;gt; /.*/ }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, the regexp in :requirements allows you to restrict or enable access to certain ':title's.&lt;/p&gt;

&lt;h2&gt;Upgrading Engines&lt;/h2&gt;

&lt;p&gt;Upgrading engines was a pain.&lt;/p&gt;

&lt;p&gt;Firstly, you must upgrade to &lt;a href="http://www.rails-engines.org/news/2007/02/04/engines-1-2-released/"&gt;Rails Engines Version 1.2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This means uninstalling your vendor/plugins/engines plugin and reinstalling the latest engines plugin in their trunk svn repository. After that, take the following steps. There may well be more for you.&lt;/p&gt;

&lt;h3&gt;engine_schema_info deprecation&lt;/h3&gt;

&lt;p&gt;That's right. The table previously known as 'engine_schema_info' should now be called 'plugin_schema_info'. Don't pay attention to the lies in the engines documentation - it tells you to change a table called 'engine_schema' to 'plugin_schema'. This table doesn't exist.&lt;/p&gt;

&lt;p&gt;I wrote a migration that does a drop_table on plugin_schema_info (as I wasn't using it before), then does a rename_table on engine_schema_info. I'm sure you can work out a solution that best fits you.&lt;/p&gt;

&lt;h3&gt;init_engine.rb =&gt; init.rb&lt;/h3&gt;

&lt;p&gt;Rename your init_engine.rb files to init.rb. I removed all references to versions while I was at it, as I didn't need to declare versions for my wholly unpublished engines. &lt;/p&gt;

&lt;h3&gt;Configs&lt;/h3&gt;

&lt;p&gt;If you use engine config helpers, you need to get rid of them. They've been removed in favour of using attr_accessors, as the documentation says, or as I prefer, mattr_accessors, since the engines require a module by default in init.rb. &lt;/p&gt;

&lt;p&gt;You must then remove occurrences within your config/environment.rb of:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module YourEngine
  config :name_of_config, 'something'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And replace them with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;YourEngine.name_of_config = 'something'
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Tests&lt;/h3&gt;

&lt;p&gt;I removed lines 3-13 from the standard generated test/test_helper.rb within all engines. You basically need to remove all references to EngineName.config. I haven't been able to successfully run all my previous tests just yet.&lt;/p&gt;

&lt;h3&gt;end_form_tag&lt;/h3&gt;

&lt;p&gt;Now a deprecated helper in favour of the block-taking form_for helper, all it ever did was this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So for now, I've replaced all occurences of end_form_tag with the raw HTML, to stop whiny warnings.&lt;/p&gt;

&lt;h3&gt;Helpers&lt;/h3&gt;

&lt;p&gt;Engine helpers that were previously included within app/helpers/application_helper.rb should now be required from your engine's init.rb. What I prefer to do is edit the vendor/plugins/my_engine/lib/my_engine.rb and simply stick the following in there:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ActionView::Base
  def stuff
    'some html'
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;That's your lot&lt;/h2&gt;

&lt;p&gt;If you got this far without sleeping, you're probably a Rails programmer. Good luck to you sir. Add comments if you find any more useful tips for upgrading.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-01-31:/rails_1.2</id>
    <title>Rails 1.2</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/rails_1.2" rel="alternate"/>
    <published>2007-01-31T19:02:00+00:00</published>
    <updated>2007-01-31T23:16:54+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="London Underground - it has rails - geddit?" class="blog thumbnail" src="/blog_entry/image/12/thumbnail/tube.jpg?1177541869" /&gt;&lt;h2&gt;Woopee Do&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://weblog.rubyonrails.org/2007/1/19/rails-1-2-rest-admiration-http-lovefest-and-utf-8-celebrations"&gt;Rails 1.2 is out&lt;/a&gt;. This means I will be upgrading this box to use it just as soon as I've run all the tests on all the sites it's hosting, and made sure that everything works. All three of them.&lt;/p&gt;

&lt;p&gt;Amongst the changes are REST controllery thingies, as you can tell from the above link, and some plugin changes that have &lt;a href="http://rails-engines.org/news/2007/01/03/engines-are-dead-long-live-engines/"&gt;a knock on effect for Rails Engines users&lt;/a&gt;. There are a few deprecated features that should provide work for idle hands.&lt;/p&gt;

&lt;p&gt;It will be interesting to see how it changes the way we develop at work. It looks as though the REST stuff will suggest a more natural way to separate controllers.&lt;/p&gt;

&lt;h2&gt;Rails Engines 1.2&lt;/h2&gt;

&lt;p&gt;If you're an engines user, you should be using &lt;a href="http://svn.rails-engines.org/engines/branches/rb_1.2/"&gt;Rails Engines 1.2.0&lt;/a&gt;, which is designed for Rails 1.2. It includes a much-needed fix for the migrations-in-engines-synchronisation problem. That is, how to do migrations in a specific order across the application and each engine. It is solved by running the following command from RAILS_ROOT whenever an engine migration is added:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate plugin_migration
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This creates a migration that brings the application's database up to the current engines' migration versions.&lt;/p&gt;

&lt;h2&gt;Word of Warning&lt;/h2&gt;

&lt;p&gt;After writing the above, I've tried an upgrade of this site. From this I have concluded the following: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;it's no simple task to upgrade your apps to 1.2.1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is apparently no official documentation on doing so. I'll post here once I've cracked how to do it. For this site, it looks like I might be recreating everything from a fresh Rails app. Something tells me that's not going to cut it for headline projects at work...&lt;/p&gt;

&lt;h2&gt;Geek Update&lt;/h2&gt;

&lt;p&gt;Just in case you didn't get it, this is a geek update.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-01-17:/feeding%3A_use_atom%2C_not_rss</id>
    <title>Feeding: Use Atom, not RSS</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/feeding%3A_use_atom%2C_not_rss" rel="alternate"/>
    <published>2007-01-17T21:38:00+00:00</published>
    <updated>2007-01-17T21:37:35+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Vampire, feeding, geddit?" class="blog thumbnail" src="/blog_entry/image/11/thumbnail/vampire.jpg?1177541869" /&gt;&lt;h2&gt;Atom&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://tools.ietf.org/html/rfc4287"&gt;Atom is better than RSS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;RSS&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://blogs.law.harvard.edu/tech/rss"&gt;RSS isn't as good as Atom&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Non-technical reason&lt;/h2&gt;

&lt;p&gt;Atom works and has normative documentation. RSS is a pile of crap heaped together by warring businesses, and apparently maintained by a Law school. I would provide references to other documents claiming the same, but I've bored you altogether already.&lt;/p&gt;

&lt;p&gt;You can subscribe to my feed by clicking the lovely orange icon in your browser. Then you'll know when I've coughed up more nonsense such as this.&lt;/p&gt;

&lt;h2&gt;Next week&lt;/h2&gt;

&lt;p&gt;How exciting my life becomes when I take up base jumping, axe wielding and other invigorating pastimes.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-01-12:/code/google_sitemap_xslt</id>
    <title>Google Sitemap XSLT</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/google_sitemap_xslt" rel="alternate"/>
    <published>2007-01-12T19:31:00+00:00</published>
    <updated>2007-01-12T19:31:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;img alt="Map of Europe" class="blog thumbnail" src="/blog_entry/image/10/thumbnail/map_of_europe.jpg?1177541869" /&gt;&lt;h2&gt;XSLTing Your Google Sitemap&lt;/h2&gt;

&lt;p&gt;Take a look at my &lt;a href="/sitemap"&gt;Google Sitemap&lt;/a&gt;. It's pretty simple, but view the source - there's no XHTML markup. It's doing some magical client-side XSLT.&lt;/p&gt;

&lt;p&gt;Now take a look at &lt;a href="/sitemap/xslt"&gt;The XSLT&lt;/a&gt; and see if you can adapt it to your own evil means.&lt;/p&gt;

&lt;h2&gt;How it's done&lt;/h2&gt;

&lt;p&gt;Your standard Google Sitemap has no stylesheet associated with it, so you can reference one with a line such as mine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml-stylesheet href="http://www.andrewbruce.net/sitemap/xslt" type="text/xsl"?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This tells the visitor's browser that humans should see the styled page, but robots should just read the XML in its raw form.&lt;/p&gt;

&lt;p&gt;The XSLT itself is fairly simple, &lt;em&gt;if you know how&lt;/em&gt;. Here are some of the interesting bits of my sitemap transformation to get you going if you're not an XSLT enthusiast.&lt;/p&gt;

&lt;h2&gt;Importing&lt;/h2&gt;

&lt;p&gt;These are the following lines.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;xsl:import href="../date-time.xml"/&amp;gt;
&amp;lt;xsl:import href="../string.xml"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is a little confusing - I've renamed the files from the &lt;a href="http://xsltsl.sourceforge.net/"&gt;XSLTSL Library&lt;/a&gt; to use .xml extensions, purely because &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt; has no default mime-type for .xsl files.&lt;/p&gt;

&lt;p&gt;These imported templates are called in format-text, my custom template for formatting titles, and in format-date, another custom template for formatting dates to the W3C-style, required for a Google Sitemap.&lt;/p&gt;

&lt;h2&gt;Namespaces&lt;/h2&gt;

&lt;p&gt;This line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;xsl:template match="gsm:url"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Starts a template for the &lt;strong&gt;G&lt;/strong&gt;oogle &lt;strong&gt;S&lt;/strong&gt;ite&lt;strong&gt;m&lt;/strong&gt;ap, whose namespace is defined at the top of the file, in the root node:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gsm="http://www.google.com/schemas/sitemap/0.84"
  xmlns:dt="http://xsltsl.org/date-time"
    xmlns:str="http://xsltsl.org/string"
      xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note also the namespaces for dt (date-time XSLTSL template), str (string XSLTST template), xsl (the space for XSLT statements) and the default namespace for the outputted HTML.&lt;/p&gt;

&lt;h2&gt;More Later&lt;/h2&gt;

&lt;p&gt;That's exhausted me already.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2007-01-04:/code/301_redirect_with_rails</id>
    <title>301 redirect with Rails</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/301_redirect_with_rails" rel="alternate"/>
    <published>2007-01-04T01:10:00+00:00</published>
    <updated>2007-01-04T01:10:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;img alt="One Way Sign" class="blog thumbnail" src="/blog_entry/image/9/thumbnail/one_way_sign.jpg?1177541869" /&gt;&lt;h2&gt;What a 301 Redirect is&lt;/h2&gt;

&lt;p&gt;301 'permanently moved' redirects are a useful, search engine friendly way to move your visitors from an outdated address to an up-to-date one. I use the method on this site to redirect visitors with old bookmarks or caches from before my &lt;a href="/all_change_please"&gt;move to Rails&lt;/a&gt; to the new pages.&lt;/p&gt;

&lt;p&gt;It's a very simple, two-step procedure.&lt;/p&gt;

&lt;h2&gt;The Controller&lt;/h2&gt;

&lt;p&gt;Create a new controller under, for example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app/controllers/redirect_controller.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The contents of that file should be:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class RedirectController &amp;lt; ApplicationController
  def index
    headers["Status"] = "301 Moved Permanently"
    if params[:url]
      redirect_to params[:url]
      return
    else
      redirect_to "/"
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;The Config&lt;/h2&gt;

&lt;p&gt;That's step 1. Now for each redirected page, add an entry within your &lt;code&gt;config/routes.rb&lt;/code&gt; add a line similar to the following (excuse the layout-popping length):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.connect '/old_page_that_used_html_suffix.html', :controller =&amp;gt; 'redirect', :url =&amp;gt; '/path/to/new_page_that_does_not'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Step 2 of 2 complete.&lt;/p&gt;

&lt;p&gt;You may have noticed that if there is no path sent to the redirect index action, then the visitor is redirected to the site's home page. This allows you to do the following for pages that you know do not exist, but you do not want to appear as 404s (you'd prefer the visitors to be directed to the home page):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.connect '/old_file_to_be_dropped.html', :controller =&amp;gt; 'redirect'
&lt;/code&gt;&lt;/pre&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2006-12-26:/chocolate</id>
    <title>Chocolate</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/chocolate" rel="alternate"/>
    <published>2006-12-26T20:50:00+00:00</published>
    <updated>2006-12-26T20:50:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Chocolate squares" class="blog thumbnail" src="/blog_entry/image/8/thumbnail/choccy.jpg?1177541869" /&gt;&lt;h2&gt;Bleurgh&lt;/h2&gt;

&lt;p&gt;Chocolate everywhere. Sticky burn at back of throat.&lt;/p&gt;

&lt;p&gt;Thank you Mr Chocolate Man. I'm now a filthy mess.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2006-12-19:/on_london</id>
    <title>On London</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/on_london" rel="alternate"/>
    <published>2006-12-19T23:03:00+00:00</published>
    <updated>2006-12-19T23:03:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Clock at Canary Wharf (courtesy of edholden.com)" class="blog thumbnail" src="/blog_entry/image/7/thumbnail/20060129-009_-_Clock_at_Canary_Wharf-1.jpg?1177541869" /&gt;&lt;h2&gt;The Move&lt;/h2&gt;

&lt;p&gt;I recently moved from the back waters of North Wales to the smokey streets of the capital. The move was mostly motivated by selfish ambition and the relief of those 5 hour journeys to see my dear girlfriend in Cambridge.&lt;/p&gt;

&lt;p&gt;London is big. My flat, The Tube and my place of work is most of what I see of it. &lt;/p&gt;

&lt;h2&gt;The Flat&lt;/h2&gt;

&lt;p&gt;The flat is fine, if a bit Victorian in terms of plumbing. It's on a quiet road and it, as my flatmate Jamie might put it, 'has character'.&lt;/p&gt;

&lt;p&gt;I share the flat with two guys from uni. One is a techy working for a big bank. He rakes it in. The other is, for the moment, a teacher.&lt;/p&gt;

&lt;h2&gt;The Tube&lt;/h2&gt;

&lt;p&gt;The Tube is becoming more tolerable - I've learned the London way - to find the places with the lowest concentration of other bodies, and to disregard those who insist on passing judgement of your movements through use of the 'tut'. It's becoming more tolerable now that my fear of reading, after having to read the most dry material imaginable at university, has lifted.&lt;/p&gt;

&lt;h2&gt;The Work&lt;/h2&gt;

&lt;p&gt;Work is fun, and not nearly as stressful as I imagine other Londoners have to deal with. I'm now leading a team and doing mostly back-end development work for a web-based reuseable ordering and automated product fulfilment system for domain and web hosting companies. It's all in Ruby and Rails, and so I couldn't ask for a better, more progressive development environment. The deadline is Friday and it looks like we'll just about make it. And I'm learning.&lt;/p&gt;

&lt;h2&gt;The Other Bits&lt;/h2&gt;

&lt;p&gt;London is arguably not as pretty as North Wales. However, it has a kind of stark, filthy beauty. I seem to live, like many others, in Terraceville.&lt;/p&gt;

&lt;p&gt;The docklands canals are quite attractive, however, like a modern day Venice with smoke and a couple of skyscrapers for good measure. It's obviously expanding rapidly and could soon be a mini-Manhattan.&lt;/p&gt;

&lt;p&gt;Like most places in Britain, I think London is at its best in the Winter.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2006-11-30:/code/rails_tips</id>
    <title>Rails Tips</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/code/rails_tips" rel="alternate"/>
    <published>2006-11-30T19:49:00+00:00</published>
    <updated>2006-11-30T19:49:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/code" label="code" term="code"/>
    <content type="html">
&lt;img alt="Cotton Buds" class="blog thumbnail" src="/blog_entry/image/6/thumbnail/tips-small.jpg?1177541869" /&gt;&lt;h2&gt;Engines&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.rails-engines.org"&gt;Rails Engines&lt;/a&gt; are an essential trick in your reuse toolbox. Don't believe the player haters - engines are not evil.&lt;/p&gt;

&lt;p&gt;An engine is a plugin that looks like a Rails application within a Rails application. It stores tests, views, controllers, models, helpers and so on, with the same directory layout that you're used to.&lt;/p&gt;

&lt;p&gt;For instance, if you created a 'fluffy_bears_engine', you'd likely put the FluffyBear model into app/models/fluffy_bear.rb under vendor/plugins/fluffy_bears_engine&lt;/p&gt;

&lt;p&gt;Here's &lt;a href="http://alterlabs.com/ruby/how-to-build-a-ruby-on-rails-engine-in-depth-start-to-finish-tutorial"&gt;a great introduction to using engines&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Make your own plugins&lt;/h2&gt;

&lt;p&gt;For stuff that you know is going to be used in almost all your projects, stick them into a plugin. I've got three plugins that I regularly feed with new code: controller_helpers, view_helpers and test_helpers.&lt;/p&gt;

&lt;p&gt;For the controller_helpers, simply do a &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate plugin controller_helpers
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will create the plugin in your current application. Next, edit the file init.rb under vendor/plugins/controller_helpers. Make it contain only:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'controller_helpers'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next, edit controller_helpers.rb under vendor/plugins/controller_helpers/lib and put the following in there:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module ActionController
  class Base

  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can then stick any methods you'd like to be made available to &lt;em&gt;all&lt;/em&gt; your controllers inside the Base class.&lt;/p&gt;

&lt;h2&gt;Test first&lt;/h2&gt;

&lt;p&gt;It can be tricky to stick to this when you're coding alone, but for the tasks that you &lt;em&gt;know&lt;/em&gt; are going to be complicated, you'd be doing yourself a disservice by not testing first.&lt;/p&gt;

&lt;p&gt;Try starting with functional tests, and assert what you want on the page before you make it appear. Run the test, make sure it fails. Then fulfil the requirements of the test in a trivial way - by putting the string you want in the view, for example. &lt;em&gt;Then&lt;/em&gt; think about refactoring your code to get the data dynamically.&lt;/p&gt;

&lt;h2&gt;Create your own &lt;a href="http://subversion.tigris.org"&gt;subversion&lt;/a&gt; library&lt;/h2&gt;

&lt;p&gt;Try putting all your own plugins into a subversion repository, as well as all the plugins made by others (use &lt;code&gt;svn export&lt;/code&gt;). Then install each plugin with &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install -x svn://url.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That way, when you want to make a change to a plugin, either to your own plugin or one written by a third party, you can be sure that a simple &lt;code&gt;svn up&lt;/code&gt; inside each of your applications will update each with the latest changes.&lt;/p&gt;

&lt;p&gt;And don't forget to tag your plugins subversion directory when you go live with a site!&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2006-11-25:/all_change_please</id>
    <title>All change please</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/all_change_please" rel="alternate"/>
    <published>2006-11-25T02:04:00+00:00</published>
    <updated>2006-11-25T02:04:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/" label="blog" term="blog"/>
    <content type="html">
&lt;img alt="Steam train" class="blog thumbnail" src="/blog_entry/image/1/thumbnail/train.jpg?1177541869" /&gt;&lt;h2&gt;Re-done&lt;/h2&gt;

&lt;p&gt;It's taken a while, but I've finally re-done the whole site in a &lt;a href="http://www.rails-engines.org"&gt;modular&lt;/a&gt; way. I was so close to succumbing to &lt;a href="http://typosphere.org/"&gt;Typo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This should mean a lot more useful stuff on the site, and hopefully some more pictures. If you'd noticed my old articles were disappearing, it was because I was too lazy to implement a pagination system. Beautiful &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; to the rescue!&lt;/p&gt;

&lt;p&gt;For the short term, though, it'll mean a large drop in PageRank and a loss of a lot of content. It would take too much time to migrate it all over, and a lot of it was old hat anyway.&lt;/p&gt;

&lt;p&gt;I was sad to abandon the idea of an open-source &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; and XSLT-based development environment. But, with using &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; at work every day, it's hard and somewhat pointless to reinvent the rapid development environment wheel.&lt;/p&gt;

&lt;p&gt;I hope to release the source code to the engines I use on this site just as soon as I've made sure it all works. Although the development has been test-driven, there are still a few cracks I'd like to fill before releasing code that could potentially harm my own site :)&lt;/p&gt;

&lt;h2&gt;Re-design&lt;/h2&gt;

&lt;p&gt;I'm painfully aware that this design is looking a little naff. I want fancy things and AJAX goodness. But that will (and should) come after this thing gets working.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2006-11-16:/portfolio/urm_audio_ltd</id>
    <title>URM Audio Ltd</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/portfolio/urm_audio_ltd" rel="alternate"/>
    <published>2006-11-16T23:36:00+00:00</published>
    <updated>2006-11-16T23:36:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/portfolio" label="portfolio" term="portfolio"/>
    <content type="html">
&lt;img alt="URM Audio Web Site" class="blog thumbnail" src="/blog_entry/image/5/thumbnail/urm.jpg?1177541869" /&gt;&lt;p&gt;A &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; application designed and hosted by yours truly.&lt;/p&gt;

&lt;p&gt;It's fully content manageable and in progressive development. Future plans include a blogging function and a more detailed technical services section.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.urmaudio.co.uk"&gt;URM Audio&lt;/a&gt;&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2006-11-16:/portfolio/maenol_property_services</id>
    <title>Maenol Property Services</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/portfolio/maenol_property_services" rel="alternate"/>
    <published>2006-11-16T23:00:00+00:00</published>
    <updated>2006-11-16T23:00:00+00:00</updated>
    <category scheme="http://www.andrewbruce.net/portfolio" label="portfolio" term="portfolio"/>
    <content type="html">
&lt;img alt="Maenol Property Services Web Site" class="blog thumbnail" src="/blog_entry/image/3/thumbnail/maenol_property_services.jpg?1177541869" /&gt;&lt;p&gt;This was another PHP / XHTML / CSS project. It uses a variable-width layout and randomised images.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.offices-to-let.net"&gt;Offices To Let&lt;/a&gt;&lt;/p&gt;    </content>
  </entry>
  <entry>
    <id>tag:www.andrewbruce.net,2005-10-20:/portfolio/mahoney%27s_bistro</id>
    <title>Mahoney's Bistro</title>
    <link type="text/html" hreflang="en" href="http://www.andrewbruce.net/portfolio/mahoney%27s_bistro" rel="alternate"/>
    <published>2005-10-20T14:45:00+01:00</published>
    <updated>2007-06-24T13:36:42+01:00</updated>
    <category scheme="http://www.andrewbruce.net/portfolio" label="portfolio" term="portfolio"/>
    <content type="html">
&lt;img alt="Mahoney's Bistro Web Site" class="blog thumbnail" src="/blog_entry/image/2/thumbnail/mahoneys_bistro.jpg?1177541869" /&gt;&lt;p&gt;I took a design that had been done in tables and converted it to valid XHTML / CSS. There are a few PHP tricks here, too, such as dynamically generated images.&lt;/p&gt;

&lt;p&gt;Graphic design by Peter Smith&lt;/p&gt;

&lt;p&gt;(apparently offline)&lt;/p&gt;    </content>
  </entry>
</feed>
