<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>AirBlog - Home</title>
  <id>tag:blog.airbladesoftware.com,2009:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  <link href="http://blog.airbladesoftware.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://blog.airbladesoftware.com/" rel="alternate" type="text/html"/>
  <updated>2009-01-06T09:09:55Z</updated>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2009-01-06:81794</id>
    <published>2009-01-06T08:58:00Z</published>
    <updated>2009-01-06T09:09:55Z</updated>
    <category term="Typography"/>
    <link href="http://blog.airbladesoftware.com/2009/1/6/i-3-helvetica" rel="alternate" type="text/html"/>
    <title>I &lt;3 Helvetica</title>
<content type="html">
            &lt;div class=&quot;imagery&quot;&gt;
&lt;img src=&quot;/assets/2009/1/6/helvetica_tattoo_464.jpg&quot; alt=&quot;Helvetica Tattoo&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;From the &lt;a href=&quot;http://typophile.com/node/52779&quot;&gt;Typophile&lt;/a&gt; forum (via &lt;a&gt;i love typography&lt;/a&gt;) — man gets tattoo on impulse.  The first comment:&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;&lt;i&gt;What made you go with bold?&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Genius.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2009-01-02:81708</id>
    <published>2009-01-02T10:35:00Z</published>
    <updated>2009-01-02T10:35:40Z</updated>
    <category term="Productivity"/>
    <category term="Quotations"/>
    <link href="http://blog.airbladesoftware.com/2009/1/2/meaningful-work" rel="alternate" type="text/html"/>
    <title>Meaningful Work</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;Meaningful work is one of the most important things we can impart to children. Meaningful work is work that is autonomous. Work that is complex, that occupies your mind. And work where there is a relationship between effort and reward — for everything you put in, you get something out.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.charlierose.com/view/interview/9855&quot;&gt;Malcom Gladwell&lt;/a&gt; (via &lt;a href=&quot;http://www.37signals.com/svn/posts/1483-malcolm-gladwell-on-meaningful-work-and-curiosity&quot;&gt;Signal vs. Noise&lt;/a&gt;)&lt;/cite&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-12-24:81274</id>
    <published>2008-12-24T14:17:00Z</published>
    <updated>2008-12-24T14:18:38Z</updated>
    <category term="Productivity"/>
    <category term="Quotations"/>
    <link href="http://blog.airbladesoftware.com/2008/12/24/work-on-what-you-use-and-care-about" rel="alternate" type="text/html"/>
    <title>Work on what you use and care about</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;My core philosophy about open source is that we should all be working on the things that we personally use and care about. Working for other people is just too hard and the quality of the work will reflect that. But if we all work on the things we care about and then share those solutions between us, the world gets richer much faster.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.loudthinking.com/posts/36-work-on-what-you-use-and-share-the-rest&quot; title=&quot;Work on what you use and share the rest&quot;&gt;David Heinemeier Hansson&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-12-20:80958</id>
    <published>2008-12-20T13:34:00Z</published>
    <updated>2008-12-20T13:35:55Z</updated>
    <category term="Windsurfing"/>
    <link href="http://blog.airbladesoftware.com/2008/12/20/13-year-old-girl-braver-than-me" rel="alternate" type="text/html"/>
    <title>13 Year Old Girl Braver Than Me</title>
<content type="html">
            &lt;p&gt;(FYI: this has nothing to do with software.  If you want code, go and read about &lt;a href=&quot;http://weblog.rubyonrails.org/2008/12/17/introducing-rails-metal&quot;&gt;Rails Metal&lt;/a&gt; or &lt;a href=&quot;http://treetop.rubyforge.org/&quot;&gt;Treetop&lt;/a&gt;!)&lt;/p&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img src=&quot;/assets/2008/12/20/bail_out_200.jpg&quot; alt=&quot;Nayra Alonso&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;&lt;a href=&quot;http://www.nayrae4.com/&quot;&gt;Nayra Alonso&lt;/a&gt; demonstrates how to bail out&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Last night I went to &lt;a href=&quot;http://www.oxfordsailingclub.com/&quot; title=&quot;Oxford Sailing Club&quot;&gt;my local windsurfing club&lt;/a&gt;&#8217;s Christmas Dinner.  I&#8217;ve only just joined so I don&#8217;t know many people there yet, but I happened to be sitting near a 13 year old girl who won the club award for Young Windsurfer of the Year 2008.  I asked her mother what her story was.&lt;/p&gt;

&lt;p&gt;In July this girl was competing in a &lt;a href=&quot;http://www.team15.org.uk/&quot; title=&quot;Team 15&quot;&gt;Team 15&lt;/a&gt; event, an inter-club competition for young windsurfers.  It was pretty windy.  A boy from another club was hurtling along, overpowered, and realised he was on a collision course.  Instead of bailing out he tried to steer round her.  His attempt to change course sheeted in the sail, powering it up further still.  Rather than missing he accelerated and bounced off some chop straight into her.&lt;/p&gt;

&lt;p&gt;The safety boat scooped her up and dumped her on the shore.  A paramedic called an ambulance which took her straight to intensive care.  Her torso had taken the impact and she had broken half a dozen ribs, several in multiple places, collapsed a lung, bled a great deal, and so on.  For three days the doctors didn&#8217;t know whether she would make it.&lt;/p&gt;

&lt;p&gt;Four months later she got back on the water, with considerable trepidation, for a Team 15 training session.  Soon after that she was one of a few windsurfers selected for the &lt;a href=&quot;http://www.team15.org.uk/page0014v01.htm&quot; title=&quot;T15 South Zone&quot;&gt;South Zone&lt;/a&gt; squad, a promotion from club level to regional level.  I believe that places her in the top 75 young windsurfers in the UK &#8212; not bad for somebody who&#8217;s been knitting her bones back together for the past few months.&lt;/p&gt;

&lt;p&gt;All the people I spoke to said it was the worst windsurfing accident they had ever seen.  To overcome The Fear and go windsurfing again, just a short time later, was brave.  And to come back so strongly that she promptly won a place at the next level was all the more remarkable.&lt;/p&gt;

&lt;p&gt;I thought it best not to mention I find the water a bit cold at this time of year.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-11-20:78570</id>
    <published>2008-11-20T17:20:00Z</published>
    <updated>2008-11-20T17:20:53Z</updated>
    <category term="Quotations"/>
    <link href="http://blog.airbladesoftware.com/2008/11/20/on-programming" rel="alternate" type="text/html"/>
    <title>On Programming</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;If you&#8217;ve been programming for any length of time, you&#8217;ll know there are multiple ways things could go wrong.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://topfunky.com&quot;&gt;Geoffrey Grosenbach&lt;/a&gt; in a recent &lt;a href=&quot;http://peepcode.com&quot;&gt;PeepCode screencast&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;I concur!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-11-12:77997</id>
    <published>2008-11-12T19:41:00Z</published>
    <updated>2008-11-12T19:42:30Z</updated>
    <category term="CSS"/>
    <link href="http://blog.airbladesoftware.com/2008/11/12/the-two-problems-with-css" rel="alternate" type="text/html"/>
    <title>The Two Problems With CSS</title>
<content type="html">
            &lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;CSS&quot; src=&quot;/assets/2008/11/12/css_200.jpg&quot; alt=&quot;CSS&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;Not this &lt;a href=&quot;http://en.wikipedia.org/wiki/Cansei_de_Ser_Sexy&quot;&gt;CSS&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;I like cascading style sheets (&lt;a href=&quot;http://www.w3.org/TR/CSS21/&quot;&gt;CSS&lt;/a&gt;).  Although the cross-browser differences drive me mad, I find writing clean CSS very satisfying.  I like it so much that I wrote &lt;a href=&quot;http://github.com/airblade/css_dryer/tree/master&quot;&gt;css_dryer&lt;/a&gt;, a Rails plugin, to let me write even cleaner CSS.&lt;/p&gt;

&lt;p&gt;But there are two problems with CSS and they suck you into a world of pain.  You don&#8217;t know when you&#8217;ve broken your visual design, and you don&#8217;t know when you&#8217;ve broken your visual design.  &lt;a href=&quot;http://www.youtube.com/watch?v=p-JfFYZHZLQ&quot;&gt;Technically speaking that&#8217;s only one problem, but it&#8217;s such a big one it&#8217;s worth mentioning twice&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let&#8217;s say I&#8217;m working on the appearance of a web page.  I decide that every &lt;code&gt;h2&lt;/code&gt; element that&#8217;s the first child of its parent should have no top margin.  So in my stylesheet I write:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;h2:first-child { margin-top: 0; }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But what I don&#8217;t realise is that I&#8217;ve stuffed up the top of my sidebar whose &lt;code&gt;h2&lt;/code&gt; heading, for example, is now vertically wrong.&lt;/p&gt;

&lt;h2&gt;Consider code&lt;/h2&gt;

&lt;p&gt;I&#8217;m not sure this makes any sense, so consider code instead.  Specifically, think about what happens when you modify a method.  You want to make sure all the existing callers will work with the new behaviour.  Two things give us that confidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Grep&quot;&gt;Grep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actually only tests give us confidence that everything still works.  Grep helps us hunt through our code for everywhere the method is called, if we want to, and check things out by eye.  You&#8217;d have to be pretty methodical doing this, and you&#8217;d probably miss dynamic invocations and so on, but something is better than nothing.&lt;/p&gt;

&lt;p&gt;Anyway the point is that your tests tell you straightaway whether or not your change has broken anything.  And if your tests are a little sparse, you can at least grep your way through the code in a valiant (albeit probably doomed) effort to check things out yourself.&lt;/p&gt;

&lt;h2&gt;Back to CSS&lt;/h2&gt;

&lt;p&gt;Compare this to CSS.  If you modify a selector, or add a rule, you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No way to write tests that verify the visual appearance of your pages&lt;/li&gt;
&lt;li&gt;No way to search through your pages for what your change would affect (grep takes regular expressions, not CSS selectors)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I constantly tweak top and bottom margins for heading elements, first-child paragraphs, etc.  And every time I do, I mess up the appearance of the same element on some other page.  I have a 100% record.&lt;/p&gt;

&lt;h2&gt;What to do?&lt;/h2&gt;

&lt;p&gt;I would dearly love to be able to write tests that &lt;a href=&quot;http://www.zenspider.com/ZSS/Products/ZenTest/&quot;&gt;autotest&lt;/a&gt; can run, verifying that elements which are supposed to be aligned with each other still are.  You can probably tell that margins and paddings are my achilles heel; colours I&#8217;m fine with (black, white, grey &#8212; how hard can it be?).&lt;/p&gt;

&lt;p&gt;I would also very much like to grep my &lt;a href=&quot;http://haml.hamptoncatlin.com/&quot;&gt;HAML&lt;/a&gt; templates, or rendered pages, by CSS selector pattern.  Then I could at least do a manual check to see just how much crapola I have sprayed across my site with each change to a CSS style rule.&lt;/p&gt;

&lt;p&gt;But I&#8217;m not sure how to do these.  Anyone got any ideas?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-05-22:56974</id>
    <published>2008-05-22T09:15:00Z</published>
    <updated>2008-09-29T18:12:34Z</updated>
    <category term="Client Work"/>
    <category term="Rails"/>
    <link href="http://blog.airbladesoftware.com/2008/5/22/gps-style-latitudes-and-longitudes-on-rails-forms" rel="alternate" type="text/html"/>
    <title>GPS-style Latitudes and Longitudes on Rails Forms</title>
<content type="html">
            &lt;h2&gt;The Problem&lt;/h2&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Great circles&quot; src=&quot;/assets/2008/5/22/lat_long_200.jpg&quot; alt=&quot;Globe with great circles&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;Latitudes and Longitudes (credit: NASA)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Quite a few plugins exist to help you geocode post codes or zipcodes, and calculate the distance between two points.  However few, if any, help you with latitudes and longitudes on forms, with input elements that match your GPS, and intelligent validation.&lt;/p&gt;

&lt;p&gt;This is now solved.&lt;/p&gt;

&lt;h2&gt;The Situation&lt;/h2&gt;

&lt;p&gt;I&#8217;m building a web application that holds cruising information for offshore sailors.  Much of the information is located, in the sense that it applies to a specific point on the Earth&#8217;s surface.  A report on an anchorage, for example, might say something like, &#8220;Beware the submerged rock to starboard at the entrance; strong katabatic winds in spring; herds of wildebeest ashore.&#8221;  So we need the sailors to supply latitudes and longitudes on most of the forms they fill in.&lt;/p&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Offshore sailing&quot; src=&quot;/assets/2008/5/22/offshore_200.jpg&quot; alt=&quot;Offshore sailing&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;The only way to travel (credit: Horse&#8217;s Mouth)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The consensus among existing geo plugins is to treat latitudes and longitudes as floats, storing them in the database as decimals.  However that&#8217;s not how people handle latitudes and longitudes.  For excellent &lt;a href=&quot;http://www.amazon.co.uk/Longitude-Dava-Sobel/dp/1857025717&quot;&gt;historical reasons&lt;/a&gt;, we think in degrees, minutes and seconds.  Or, if you use a GPS &#8212; and all sailors do &#8212; degrees, minutes and decimal minutes (milli-minutes).&lt;/p&gt;

&lt;p&gt;If you want people to enter the latitude and longitude of an anchorage on your site, and to enter them correctly, you need to let them just read it off their GPS.  And if they enter an invalid value, you need to flag whether it&#8217;s the degrees, the minutes, or the milli-minutes &#8212; not simply say the whole lot &#8220;is invalid&#8221;.&lt;/p&gt;

&lt;h2&gt;The Solution&lt;/h2&gt;

&lt;p&gt;Buy the &lt;a href=&quot;http://peepcode.com/products/rails-2-plugin-patterns&quot;&gt;Rails 2 Plugin Patterns Peepcode PDF&lt;/a&gt;.  Using the PDF I was able to write the plugin right, first-time.  No trial and error: straight to the solution.  The time it saved was more than worth $9.  And the author&#8217;s a great guy ;-)&lt;/p&gt;

&lt;p&gt;So, install my &lt;a href=&quot;http://github.com/airblade/geo_tools/&quot;&gt;GeoTools plugin&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
$ script/plugin install git://github.com/airblade/geo_tools.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(I&#8217;ll move all my plugins to Git soon, but they&#8217;ll remain available in Subversion for the forseeable future.)&lt;/p&gt;

&lt;p&gt;Run a database migration to add latitudes and longitudes to the relevant tables.  Let&#8217;s say we are talking about buried treasure:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
  def self.up
    create_table :treasures do |t|
      t.string :name
      t.boolean :display_on_map, :default =&gt; true
      t.with_options :precision =&gt; 15, :scale =&gt; 10 do |c|
        c.decimal :latitude
        c.decimal :longitude
      end
      t.timestamps
    end
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Looking for treasure&quot; src=&quot;/assets/2008/5/22/pirates_of_caribbean_200.jpg&quot; alt=&quot;Looking for treasure (credit: Pirates of the Caribbean)&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;Show me the treasure&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Note we store latitudes and longitudes in the conventional way, so you can use other geo plugins too.&lt;/p&gt;

&lt;p&gt;Tell your models what to do:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
  class Treasure &amp;lt; ActiveRecord::Base
    acts_as_location
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add latitude and longitude fields to your forms:&lt;/p&gt;

&lt;p&gt;&lt;br class=&quot;clear&quot; /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;
&amp;lt;% form_for @treasure do |f| %&gt;
  &amp;lt;p&gt;
    &amp;lt;label for='treasure_name'&gt;Name&amp;lt;/label&gt;
    &amp;lt;%= f.text_field :name %&gt;
  &amp;lt;/p&gt;
  &amp;lt;p&gt;
    &amp;lt;label for='treasure_display_on_map'&gt;Display on map?&amp;lt;/label&gt;
    &amp;lt;%= f.check_box :display_on_map %&gt;
  &amp;lt;/p&gt;
  &amp;lt;p&gt;
    &amp;lt;label for='treasure_latitude'&gt;Latitude&amp;lt;/label&gt;
    &amp;lt;%= f.latitude_field :latitude %&gt;
  &amp;lt;/p&gt;
  &amp;lt;p&gt;
    &amp;lt;label for='treasure_longitude'&gt;Longitude&amp;lt;/label&gt;
    &amp;lt;%= f.longitude_field :longitude %&gt;
  &amp;lt;/p&gt;
&amp;lt;% end %&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;You can also easily display a latitude and longitude:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;
&amp;lt;p&gt;Name: &amp;lt;%=h @treasure.name %&gt;&amp;lt;/p&gt;
&amp;lt;p&gt;Location: &amp;lt;%= @treasure.location %&gt;&amp;lt;/p&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And that will produce:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;
&amp;lt;p&gt;Name: King Solomon's Mines&amp;lt;/p&gt;
&amp;lt;p&gt;Location: 12&amp;deg;34.567&amp;prime;S, 98&amp;deg;76.543&amp;prime;W&amp;lt;/p&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Bonus&lt;/h2&gt;

&lt;p&gt;Happily for you, my &lt;a href=&quot;http://github.com/airblade/air_budd_form_builder/&quot;&gt;AirBudd accessible form builder plugin&lt;/a&gt; is fully compatible with &lt;a href=&quot;http://github.com/airblade/geo_tools/&quot;&gt;GeoTools&lt;/a&gt;.  So instead of the form shown above, you can write this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
&amp;lt;% airbudd_form_for @treasure do |f| %&gt;
  &amp;lt;%= f.text_field      :name %&gt;
  &amp;lt;%= f.check_box       :display_on_map %&gt;
  &amp;lt;%= f.latitude_field  :latitude %&gt;
  &amp;lt;%= f.longitude_field :longitude %&gt;
&amp;lt;% end %&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And that&#8217;s compatible with &lt;a href=&quot;http://haml.hamptoncatlin.com/&quot;&gt;HAML&lt;/a&gt; too.&lt;/p&gt;

&lt;p&gt;So now we have meaningful, GPS-style latitudes and longitudes with minimal effort.  And treasure.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-05-06:56413</id>
    <published>2008-05-06T14:51:00Z</published>
    <updated>2008-05-06T14:55:30Z</updated>
    <category term="Databases"/>
    <link href="http://blog.airbladesoftware.com/2008/5/6/relational-databases-are-not-relational" rel="alternate" type="text/html"/>
    <title>Relational Databases Are Not Relational</title>
<content type="html">
            &lt;p&gt;I&#8217;ve been meaning to write about this ever since reading &lt;a href=&quot;http://www.amazon.co.uk/Database-Depth-Relational-Theory-Practitioners/dp/0596100124/&quot;&gt;Databases in Depth&lt;/a&gt;, a punchy presentation of relational theory by &lt;a href=&quot;http://en.wikipedia.org/wiki/Edgar_F._Codd&quot;&gt;C.J.&amp;nbsp;Date&lt;/a&gt;.  I&#8217;m sure you already know this, but Date worked closely for many years with &lt;a href=&quot;http://en.wikipedia.org/wiki/Edgar_F._Codd&quot;&gt;E.F.&amp;nbsp;Codd&lt;/a&gt;, the man who introduced the relational model in his 1969 paper &lt;i&gt;Derivability, Redundancy, and Consistency of Relations Stored in Large Data Banks&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, here are some highlights from the &lt;a href=&quot;http://www.amazon.co.uk/Database-Depth-Relational-Theory-Practitioners/dp/0596100124/&quot;&gt;book&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The term &#8220;relational&#8221; has nothing to do with relating two tables on a common set of columns.&lt;/li&gt;
&lt;li&gt;Relations are multi-dimensional.  Don&#8217;t let the term &#8220;table&#8221; fool you into thinking they are two-dimensional.&lt;/li&gt;
&lt;li&gt;Nulls are not values.&lt;/li&gt;
&lt;li&gt;SQL is not a set-oriented language (it is bag-oriented).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used to think I had a pretty good understanding of databases until I read that &lt;a href=&quot;http://www.amazon.co.uk/Database-Depth-Relational-Theory-Practitioners/dp/0596100124/&quot;&gt;book&lt;/a&gt;.  Now at least I know how little I know.  I think that&#8217;s progress.&lt;/p&gt;

&lt;p&gt;If you work with databases — and that includes anybody writing Rails code — I recommend you read the &lt;a href=&quot;http://www.amazon.co.uk/Database-Depth-Relational-Theory-Practitioners/dp/0596100124/&quot;&gt;book&lt;/a&gt;.  Think of it as part of your edumacation.  After all, I doubt you&#8217;ve read many other database books recently :-)&lt;/p&gt;

&lt;p&gt;So why write this now?  Well, I was &lt;a href=&quot;http://blog.labnotes.org/2007/09/02/couchdb-thinking-beyond-the-rdbms/&quot; title=&quot;CouchDB - thinking beyond the RDBMS, by Tobias Lütke&quot;&gt;reading about CouchDB&lt;/a&gt; and found in the comments a highly intelligent&amp;sup1; contribution from somebody called Breton.  Here it is:&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;There’s a few myths floating around in this article and in the comments. I normally don’t have much luck diffusing myths, but hopefully if the people read this have the ability to think critically, and do their own research instead of knee-jerk react, then it should go alright.&lt;/p&gt;

&lt;p&gt;Myth 1: SQL is relational. It turns out this is rubbish. SQL is so much &lt;em&gt;not&lt;/em&gt; relational that the committee in charge of SQL had to remove the words &#8220;relation&#8221; and &#8220;relational&#8221; from the standard. This is easily verified: find the standard and do a simple find. What’s not relational about it? In short: in SQL, tables and rows are not sets; the order of records and columns are significant; SQL allows duplicates, and introduces three valued logic with the NULL — all violations of the relational model which introduce bugs, inconsistencies, and a significant risk of data corruption.&lt;/p&gt;

&lt;p&gt;Myth 2: Relational Databases are flawed. Truth: There’s no way to know since there’s never been a widely used relational database. There are some who argue that should the relational model ever be implemented in a DBMS system, it would outperform current database systems in terms of speed and stability. It seems to me this is probably true, but then, what do I know? (Though some vendors claim that they produce relational database systems, this could not possibly be true as long as such systems use SQL).&lt;/p&gt;

&lt;p&gt;Myth 3: Systems like CouchDB are in every way better than relational database systems.&lt;/p&gt;

&lt;p&gt;Again, there’s no way to know since there isn&#8217;t a widely available and usable relational database. But a truly relational database system would hold significant advantages over a &#8220;flat&#8221; data storage system such as CouchDB. Assuming, of course, that it is utilized properly, a relational database is essentially a large scale inference engine. Meaning that if you can reason about a subject using formal logic, you can reason about data on the subject on a large scale using the relational algebra or relational calculus. This is amazingly powerful, but since most people never bother learning about the relational model they never take advantage of it.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;And then, to wrap it up:&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;A good analogy might be claiming that Web Standards, semantic html, and seperation of presentation and content are unworthy concepts because they happen to be difficult to achieve in IE6. Don’t blame the inadequacies of the implementation on the concept itself.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;Indeedy.&lt;/p&gt;

&lt;p&gt;&amp;sup1; I know it was intelligent because it agreed with me.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-30:56096</id>
    <published>2008-04-30T08:14:00Z</published>
    <updated>2008-04-30T08:14:36Z</updated>
    <category term="Business"/>
    <category term="Quotations"/>
    <link href="http://blog.airbladesoftware.com/2008/4/30/small-business" rel="alternate" type="text/html"/>
    <title>Small Business</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;The silly thing is that a fair amount of these small businesses (10% or so) will end up growing into some pretty large companies. The doggy daycare that I take my dog to occasionally started out as just one guy with one location (he even slept on the floor next to the dogs for the first year). Now they’ve got more than a dozen locations in three states, and the guy is a millionaire.&lt;/p&gt;

&lt;p&gt;Just do what you love, and even if you’re not trying to become a millionaire, it might just happen anyways.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://subwindow.com&quot;&gt;Erik Peterson&lt;/a&gt; commenting on &lt;a href=&quot;http://www.37signals.com/svn/posts/979-quit-your-job&quot;&gt;Quit your job!&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Well, now I know what to do if the software doesn&#8217;t work out :-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-18:55213</id>
    <published>2008-04-18T15:04:00Z</published>
    <updated>2008-04-18T15:05:10Z</updated>
    <category term="Productivity"/>
    <category term="Quotations"/>
    <link href="http://blog.airbladesoftware.com/2008/4/18/urgency" rel="alternate" type="text/html"/>
    <title>Urgency</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;Emergency is the only urgency&#8230;.If your deliveries are that critical to the hour or day, maybe you’re setting up false priorities and dangerous expectations.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;Jason Fried, &lt;a href=&quot;http://www.37signals.com/svn/posts/966-urgency-is-poisonous&quot;&gt;Urgency is poisonous&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-15:54951</id>
    <published>2008-04-15T08:21:00Z</published>
    <updated>2008-04-15T08:21:59Z</updated>
    <category term="Quotations"/>
    <category term="Ruby"/>
    <link href="http://blog.airbladesoftware.com/2008/4/15/static-typing" rel="alternate" type="text/html"/>
    <title>Static Typing</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;In most cases a statically typed language is a premature optimization that gets extremely much in the way of productivity.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://ola-bini.blogspot.com/2008/04/pragmatic-static-typing.html&quot;&gt;Pragmatic Static Typing&lt;/a&gt;, Ola Bini&lt;/cite&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-09:54643</id>
    <published>2008-04-09T18:40:00Z</published>
    <updated>2008-04-09T18:50:01Z</updated>
    <category term="Ruby"/>
    <link href="http://blog.airbladesoftware.com/2008/4/9/i-have-seen-the-future-of-dance-music" rel="alternate" type="text/html"/>
    <title>I Have Seen The Future Of Dance Music</title>
<content type="html">
            &lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Archaeopteryx&quot; src=&quot;/assets/2008/4/9/archaeopteryx_200.jpg&quot; alt=&quot;Archaeopteryx&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;Bird?  Dinosaur?  Dance music generator&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;And his name is &lt;a href=&quot;http://gilesbowkett.blogspot.com/&quot;&gt;Giles Bowkett&lt;/a&gt;.  Or, rather, its name is &lt;a href=&quot;http://archaeopteryx.rubyforge.org/svn/&quot;&gt;Archaeopteryx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With more layers of indirection than Enron&#8217;s accounts, this is lambda central.  Unlike the accounts, this isn&#8217;t obfuscation &#8212; it&#8217;s &lt;em&gt;adaptability&lt;/em&gt;.  At its heart, &lt;a href=&quot;http://archaeopteryx.rubyforge.org/svn/&quot;&gt;Archaeopteryx&lt;/a&gt; is a probabilistic MIDI generator.  The lambdas vary the probabilities randomly, or perhaps probabilistically; it really depends on the last lambda.&lt;/p&gt;

&lt;p&gt;Anyway, don&#8217;t take my word for it.  Get yourself some &lt;a href=&quot;http://www.propellerheads.se/products/reason&quot; title=&quot;Reason: a virtual studio rack&quot;&gt;Reason&lt;/a&gt;, a copy of &lt;a href=&quot;http://www.amazon.co.uk/Practical-Ruby-Projects-Programmer-Professionals/dp/159059911X/&quot;&gt;Practical Ruby Projects&lt;/a&gt;, and &#8230; something else whose name I&#8217;ve forgotten (pipes &lt;a href=&quot;http://archaeopteryx.rubyforge.org/svn/&quot;&gt;Archaeopteryx&lt;/a&gt;&#8217;s output into &lt;a href=&quot;http://www.propellerheads.se/products/reason&quot; title=&quot;Reason: a virtual studio rack&quot;&gt;Reason&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Right now &lt;a href=&quot;http://archaeopteryx.rubyforge.org/svn/&quot;&gt;Archaeopteryx&lt;/a&gt; generates pretty convincing drum &amp;amp; bass, and techno too.  &lt;a href=&quot;http://gilesbowkett.blogspot.com/&quot;&gt;Giles&lt;/a&gt; has vision for this, so &lt;a href=&quot;http://gilesbowkett.blogspot.com/2008/02/archaeopteryx-ruby-midi-generator.html&quot; title=&quot;Archaeopteryx unveiled&quot;&gt;watch that space&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-08:54620</id>
    <published>2008-04-08T10:22:00Z</published>
    <updated>2008-04-14T12:03:49Z</updated>
    <category term="Conferences"/>
    <category term="Rails"/>
    <link href="http://blog.airbladesoftware.com/2008/4/8/scotland-on-rails-2008" rel="alternate" type="text/html"/>
    <title>Scotland on Rails 2008</title>
<content type="html">
            &lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; &lt;a href=&quot;/assets/2008/4/14/Scotland_on_Rails_long_running_tasks.pdf&quot;&gt;here are my slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Well the last people I expected to see when I wandered down to breakfast on the first day were the Russian national women&#8217;s hockey team.&lt;/p&gt;

&lt;p&gt;This &lt;a href=&quot;http://scotlandonrails.com&quot;&gt;conference&lt;/a&gt; was very good.  I encountered a lot of intriguing new ideas, many friendly and interesting people with whom I&#8217;d love to spend more time, and (not at the conference) a cousin I last saw thirteen years ago in Western Australia!&lt;/p&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Pollock Halls&quot; src=&quot;/assets/2008/4/8/pollock_halls_200.jpg&quot; alt=&quot;Pollock Halls&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;The venue next door&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;You can&#8217;t really go wrong holding a conference in Edinburgh.  It&#8217;s a magnificent city, and because my grandfather grew up there I can walk around telling myself I&#8217;m not a tourist (I tell myself a lot of things).  And you&#8217;re never far from a pub, er, castle.&lt;/p&gt;

&lt;h2&gt;BDD and SDD&lt;/h2&gt;

&lt;p&gt;The talks I heard were all good.  The most immediately useful to me were those on testing: &lt;a href=&quot;http://www.tammersaleh.com/&quot;&gt;Tammer Saleh&lt;/a&gt; on &lt;a href=&quot;http://thoughtbot.com/projects/shoulda&quot;&gt;behaviour driven development with Shoulda&lt;/a&gt;, &lt;a href=&quot;http://www.brynary.com/&quot;&gt;Bryan Helmkamp&lt;/a&gt; on &lt;a href=&quot;http://rspec.info/&quot;&gt;story driven development&lt;/a&gt; and &lt;a href=&quot;http://svn.eastmedia.net/public/plugins/webrat/README&quot;&gt;Webrat&lt;/a&gt;, and &lt;a href=&quot;http://www.theedgecase.com/&quot;&gt;Jim Weirich and Joe O&#8217;Brien&lt;/a&gt; on &lt;a href=&quot;http://onestepback.org/software/flexmock/&quot;&gt;mocking&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To date I&#8217;ve found writing tests irksome; worthwhile, but clunky.  However, I&#8217;ve been using old-school Test::Unit, so I think now it&#8217;s time to upgrade.  (Not convinced yet by SDD, but time will tell.)&lt;/p&gt;

&lt;h2&gt;Erlang/OTP&lt;/h2&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Palm trees in the snow&quot; src=&quot;/assets/2008/4/8/edinburgh_snow_200.jpg&quot; alt=&quot;Palm trees in the snow&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;Picnic, anyone?&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;I was pleased &lt;a href=&quot;http://en.wikipedia.org/wiki/Erlang_%28programming_language%29&quot;&gt;Erlang/OTP&lt;/a&gt; slipped into the schedule.  &lt;a href=&quot;http://hypernumbers.com/about/&quot;&gt;Gordon Guthrie&lt;/a&gt; ran through the concepts and architecture of Erlang/OTP systems, locating them within their historical context.  Guthrie was surprisingly irreverent, and his talk was all the better for it.&lt;/p&gt;

&lt;p&gt;Apparently in the UK telephone system&#8217;s first year of operation on Erlang/OTP, its downtime was 31 milliseconds.  That&#8217;s 99.9999999% availability.  Respect.&lt;/p&gt;

&lt;h2&gt;JRuby&lt;/h2&gt;

&lt;p&gt;As somebody who spent five years writing J2EE applications, I have no desire to interact with the Java language again.  But the Java platform &#8212; that&#8217;s a different kettle of ball games.  The JVM, with its dynamic optimisation, native threading and tuned garbage collection, is a sophisticated and fast runtime environment.  A Java-based Ruby implementation can take full advantage of those capabilities.&lt;/p&gt;

&lt;p&gt;So although I don&#8217;t care that &lt;a href=&quot;http://jruby.codehaus.org/&quot;&gt;JRuby&lt;/a&gt; lets me write &lt;a href=&quot;http://java.sun.com/javase/6/docs/technotes/guides/swing/index.html&quot;&gt;Swing&lt;/a&gt; in Ruby, I sat up and listened when &lt;a href=&quot;http://headius.blogspot.com/&quot;&gt;Charles Oliver Nutter&lt;/a&gt; and &lt;a href=&quot;http://www.bloglines.com/blog/ThomasEEnebo&quot;&gt;Thomas Enebo&lt;/a&gt; showed a threaded Ruby program using all its machine&#8217;s cores.  And I was intrigued by the idea of Rails application deployment to a single &lt;a href=&quot;http://wiki.jruby.org/wiki/JRuby_on_Rails_in_GlassFish&quot;&gt;Glassfish&lt;/a&gt; process.&lt;/p&gt;

&lt;h2&gt;Big Names, Delivering&lt;/h2&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;More snow&quot; src=&quot;/assets/2008/4/8/more_edinburgh_snow_200.jpg&quot; alt=&quot;More snow&quot; /&gt;
&lt;p class=&quot;caption&quot;&gt;The weather begins to bite&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Other speakers that stood out for me were &lt;a href=&quot;http://onestepback.org/&quot;&gt;Jim Weirich&lt;/a&gt; on Ruby class design, &lt;a href=&quot;http://www.koziarski.com/&quot;&gt;Michael Koziarski&lt;/a&gt; speaking frankly about the quality of Rails&#8217; internals, and &lt;a href=&quot;http://rubypal.com/&quot;&gt;David Black&lt;/a&gt; with his extended music analogy.&lt;/p&gt;

&lt;h2&gt;Highlight&lt;/h2&gt;

&lt;p&gt;But the most stimulating talk was &lt;a href=&quot;http://gilesbowkett.blogspot.com/&quot;&gt;Giles Bowkett&lt;/a&gt;&#8217;s on &lt;a href=&quot;http://www.manning.com/herrington/&quot;&gt;code generation&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Metaprogramming&quot;&gt;metaprogramming&lt;/a&gt;.  Few could mash up so amusingly Archimedes, &lt;a href=&quot;http://en.wikipedia.org/wiki/Jessica_Alba&quot;&gt;Jessica Alba&lt;/a&gt;, respect for &lt;a href=&quot;http://en.wikipedia.org/wiki/Lisp_programming_language&quot;&gt;Lisp&lt;/a&gt;, disrespect for &lt;a href=&quot;http://lispers.org/&quot;&gt;Lispers&lt;/a&gt;, code generation and sombreros.  Superb.&lt;/p&gt;

&lt;h2&gt;Overall&lt;/h2&gt;

&lt;p&gt;I had a much better time at Scotland on Rails than at both RailsConfs Europe.  And this was only the first one.  I&#8217;m looking forward to Scotland on Rails 2009.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-07:54618</id>
    <published>2008-04-07T19:39:00Z</published>
    <updated>2008-04-07T19:42:00Z</updated>
    <category term="Conferences"/>
    <link href="http://blog.airbladesoftware.com/2008/4/7/the-highland-fling-2008" rel="alternate" type="text/html"/>
    <title>The Highland Fling 2008</title>
<content type="html">
            &lt;div class=&quot;imagery&quot;&gt;
&lt;a href=&quot;http://www.thehighlandfling.com/&quot;&gt;&lt;img title=&quot;The Highland Fling&quot; src=&quot;/assets/2008/4/7/highland_fling_155.png&quot; alt=&quot;The Highland Fling&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Pulled out of the bag at the eleventh hour by the inimitable &lt;a href=&quot;http://www.alanwhitewebdevelopment.com/&quot; title=&quot;Alan White Web Development&quot;&gt;Alan White&lt;/a&gt;, &lt;a href=&quot;http://www.thehighlandfling.com/&quot; title=&quot;The Highland Fling&quot;&gt;The Highland Fling&lt;/a&gt; was a fun, interesting one-day conference about &#8220;The Browser and Beyond&#8221;.&lt;/p&gt;

&lt;p&gt;Three features made the conference work so well: it was small, ensuring a convivial atmosphere; the talks came one after the other, not in parallel, so you didn&#8217;t miss anything; and the traditional Q&amp;amp;A was enlivened considerably by &lt;a href=&quot;http://www.boagworld.com/&quot; title=&quot;Boagworld&quot;&gt;Paul Boag&lt;/a&gt;&#8217;s compèring.&lt;/p&gt;

&lt;p&gt;The most intriguing talk for me was &lt;a href=&quot;http://www.slideshare.net/simon/comet-at-the-highland-fling/&quot; title=&quot;Simon Willison&#8217;s slides on Comet&quot;&gt;Simon Willison&#8217;s on Comet&lt;/a&gt;, a set of techniques for pushing live updates to web pages.  Calling them techniques lends thems an air of respectability but, in reality, these are a shifty bunch of hacks that mislead browsers in various startling ways.  Somehow, extraordinarily, this all works reliably, and across platforms too.  Even better, the nastiness has been swept under the carpet by the &lt;a href=&quot;http://dojotoolkit.org/&quot; title=&quot;Dojo Toolkit&quot;&gt;Dojo&lt;/a&gt; JavaScript library, which you can drop innocently into your webapp.&lt;/p&gt;

&lt;p&gt;Best of all, the &lt;a href=&quot;http://svn.xantus.org/shortbus/trunk/bayeux/bayeux.html&quot; title=&quot;The Bayeux protocol&quot;&gt;Bayeux protocol&lt;/a&gt; defines a standard communications protocol between Comet clients and Comet servers.  Immediately this separates the difficult, infrastructural parts of Comet from the rest of your application and, in theory, gives you implementation independence.&lt;/p&gt;

&lt;p&gt;Simon showed a few examples of Comet in action, including Google&#8217;s updating spreadsheets and his own slideshow tool.  HTTP&#8217;s client-request, server-response rhythm is so foundational that it seemed &lt;a href=&quot;http://www.quotationspage.com/quote/776.html&quot; title=&quot;Any sufficiently advance technology is indistinguishable from magic.&quot;&gt;almost magical&lt;/a&gt; watching changes made in one browser show up, without polling, in another.&lt;/p&gt;

&lt;p&gt;Of course, the nature of the technology requires many concurrent client-server connections, a profile for which general web servers such as Apache are not designed.  This, I think, is my excuse finally to wheel out an &lt;a href=&quot;http://cometdaily.com/2007/12/14/getting-started-with-comet-on-erlang/&quot; title=&quot;Comet on Erlang&quot;&gt;Erlang server&lt;/a&gt; to see for myself what Comet can do.&lt;/p&gt;

&lt;p&gt;It was also good to see the &lt;a href=&quot;http://www.freeagentcentral.com/?referrer=19b9fl58&quot; title=&quot;FreeAgent Central&quot;&gt;FreeAgent&lt;/a&gt; crew out in force, especially as they took me out for dinner afterwards.  Thanks!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.airbladesoftware.com/">
    <author>
      <name>Andy Stewart</name>
    </author>
    <id>tag:blog.airbladesoftware.com,2008-04-07:54578</id>
    <published>2008-04-07T08:29:00Z</published>
    <updated>2008-04-07T08:30:15Z</updated>
    <category term="Client Work"/>
    <category term="Quotations"/>
    <link href="http://blog.airbladesoftware.com/2008/4/7/professionalism" rel="alternate" type="text/html"/>
    <title>Professionalism</title>
<content type="html">
            &lt;blockquote&gt;&lt;div&gt;
&lt;p&gt;Apart from the food, the great joy of French restaurants in England is French waiters who are serious professionals and do not try to be your friend.  They have been brought up to respect clients for being &lt;i&gt;exigeant&lt;/i&gt;, and to despise them for being undiscriminating.  So when the English describe a mediocre dish as &#8216;lovely&#8217; or &#8216;very nice&#8217; and never make a fuss about the &lt;i&gt;cuisson&lt;/i&gt; of their steak, they are treated with the &lt;i&gt;hauteur&lt;/i&gt; they deserve.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.co.uk/Dossier-How-Survive-English/dp/0719568463/&quot; title=&quot;Le Dossier&quot;&gt;Le Dossier&lt;/a&gt;, Hortense de Monplaisir (translated by Sarah Long)&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Hmm, I never thought I&#8217;d say this, but perhaps I need to act more like a Frenchman.  Not in despising people, but in trying to be your clients&#8217; or customers&#8217; friend.  Regularly not charging for small pieces of work soon adds up &#8212; or rather, it doesn&#8217;t &#8212; and does not pay the bills.&lt;/p&gt;

&lt;p&gt;And if I don&#8217;t value my time, nobody else will value it for me.&lt;/p&gt;

&lt;div class=&quot;imagery&quot;&gt;
&lt;img title=&quot;Reassuringly expensive&quot; src=&quot;/assets/2008/4/7/stella_artois.jpg&quot; alt=&quot;Reassuringly expensive&quot; /&gt;&lt;/a&gt;
&lt;p class=&quot;caption&quot;&gt;Reassuringly expensive&lt;/p&gt;
&lt;/div&gt;
          </content>  </entry>
</feed>
