<?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">
  <title>urgetopunt technologies blog</title>
  
  <link href="http://urgetopunt.com" />
  <updated>2009-11-07T07:06:00+00:00</updated>
  <id>http://urgetopunt.com/</id>
  <author>
    <name>John Parker</name>
    <email>jparker@urgetopunt.com</email>
  </author>
  
  
  <link rel="self" href="http://feeds.feedburner.com/urgetopunt" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <title>Better Conditional Sum in Google Spreadsheet</title>
    <link href="http://urgetopunt.com/googledocs/2009/11/06/google-spreadsheet-sumif.html" />
    <updated>2009-11-06T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/googledocs/2009/11/06/google-spreadsheet-sumif.html</id>
    <content type="html">&lt;p&gt;In the &lt;a href="/googledocs/2009/05/09/google-spreadsheet-filter-sum.html"&gt;original article&lt;/a&gt; I described using &lt;code&gt;SUM()&lt;/code&gt; and &lt;code&gt;FILTER()&lt;/code&gt; in a &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt; spreadsheet to calculate the sum over a subset of cells within a column. Turns out, there&amp;#8217;s a better way:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&lt;code&gt;
=SUMIF('Worksheet name'!E:E, "food", 'Worksheet name'!D:D)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this version, the &lt;code&gt;SUMIF()&lt;/code&gt; function combines the behavior of the &lt;code&gt;SUM()&lt;/code&gt; and &lt;code&gt;FILTER()&lt;/code&gt; functions I was using before. The first argument is the column to be compared to the filter value, the second argument is the filter value itself (or the cell address containing the filter value) and the third argument is the column over which the sum is to be calculated. So in the above example, in column D of the worksheet named &amp;#8220;Worksheet name&amp;#8221; all cells for which the corresponding cell in column E contains the value &amp;#8220;food&amp;#8221; are selected, and the sum of those select cells is returned.&lt;/p&gt;
&lt;p&gt;In addition to being more succinct and easier to read, the use of &lt;code&gt;SUMIF()&lt;/code&gt; has the added benefit of returning &lt;code&gt;0&lt;/code&gt; if there are no rows matching the filter. Using &lt;code&gt;SUM()&lt;/code&gt; and &lt;code&gt;FILTER()&lt;/code&gt; instead returns &lt;code&gt;#N/A&lt;/code&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Using Passenger with rvm</title>
    <link href="http://urgetopunt.com/2009/09/27/passenger-with-rvm.html" />
    <updated>2009-09-27T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/2009/09/27/passenger-with-rvm.html</id>
    <content type="html">&lt;p&gt;I&amp;#8217;ve recently starting using &lt;a href="http://rvm.beginrescueend.com/"&gt;Ruby Version Manager&lt;/a&gt; (aka rvm) to manage multiple ruby versions on my workstation. So far I&amp;#8217;m quite pleased with the ease of use. (My only gripe so far is that the &lt;code&gt;rvm&lt;/code&gt; command is uncomfortably close to &lt;code&gt;rm&lt;/code&gt; &amp;#8212; it&amp;#8217;s only a matter of time before I shoot myself in the foot).&lt;/p&gt;
&lt;p&gt;There is one gotcha. In production I use &lt;a href="http://www.modrails.com/"&gt;Phusion Passenger&lt;/a&gt; in conjunction with &lt;a href="http://www.rubyenterpriseedition.com/"&gt;Ruby Enterprise Edition&lt;/a&gt;. I would like to use the same environment in development. However, when installing the passenger gem into an rvm-managed ruby installation, the path to the ruby binary (which you need to plug somewhere into your Apache config) will not work. It will have an incorrect gem path, and in my case, that resulted in passenger failing to spin up because it was unable to load the fastthread gem.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&lt;code&gt;/Users/jparker/.rvm/ruby-enterprise-1.8.6-20090610/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- fastthread (LoadError)
        from /Users/jparker/.rvm/ruby-enterprise-1.8.6-20090610/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /Users/jparker/.rvm/gems/ruby-enterprise/1.8.6/gems/passenger-2.2.5/lib/phusion_passenger/utils.rb:28
        from /Users/jparker/.rvm/gems/ruby-enterprise/1.8.6/gems/passenger-2.2.5/bin/passenger-spawn-server:53:in `require'
        from /Users/jparker/.rvm/gems/ruby-enterprise/1.8.6/gems/passenger-2.2.5/bin/passenger-spawn-server:53
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The solution is &lt;a href="http://rvm.beginrescueend.com/passenger/"&gt;very clearly printed&lt;/a&gt; on the rvm web site. Instead of passing the path to the actual ruby binary to the &lt;code&gt;PassengerRuby&lt;/code&gt; directive, pass in the &lt;code&gt;RVM_ROOT/bin/ruby-VERSION&lt;/code&gt; (replacing RVM_PATH with the root of your rvm installation [usually &lt;code&gt;$HOME/.rvm&lt;/code&gt;] and &lt;span class="caps"&gt;VERSION&lt;/span&gt; with the ruby version you want to use [in my case &lt;code&gt;ruby-enterprise-1.8.6-20090610&lt;/code&gt;]).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&lt;code&gt;# Don't do this
PassengerRuby /Users/jparker/.rvm/ruby-enterprise-1.8.6-20090610/bin/ruby

# Do this instead
PassengerRuby /Users/jparker/.rvm/bin/ruby-enterprise-1.8.6-20090610
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The latter is a shell script which execs the actual ruby binary after setting an appropriate &lt;code&gt;GEM_HOME&lt;/code&gt; and &lt;code&gt;GEM_PATH&lt;/code&gt; (among other things).&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Using ERB in YAML Configuration File</title>
    <link href="http://urgetopunt.com/rails/2009/09/12/yaml-config-with-erb.html" />
    <updated>2009-09-12T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/rails/2009/09/12/yaml-config-with-erb.html</id>
    <content type="html">&lt;p&gt;A while back in &lt;a href="http://railscasts.com/episodes/85-yaml-configuration-file"&gt;Railscast #85&lt;/a&gt; Ryan Bates demonstrated how to add a &lt;span class="caps"&gt;YAML&lt;/span&gt;-based configuration file to a Rails application. You start with the configuration file &amp;#8212; say &lt;code&gt;RAILS_ROOT/config/app_config.yml&lt;/code&gt; &amp;#8212; containing your configuration data:&lt;/p&gt;
&lt;script src="http://gist.github.com/185832.js"&gt;&lt;/script&gt;&lt;p&gt;And then you load the file from an initializer &amp;#8212; say &lt;code&gt;RAILS_ROOT/config/initializer/load_config.rb&lt;/code&gt; &amp;#8212; containing the following:&lt;/p&gt;
&lt;script src="http://gist.github.com/185833.js"&gt;&lt;/script&gt;&lt;p&gt;And from then on a Hash named &lt;code&gt;APP_CONFIG&lt;/code&gt; will be available throughout your application containing the configuration specific to the environment in which your application is running, i.e., development, test or production.&lt;/p&gt;
&lt;p&gt;But what if you want to dynamically configure one or more values in your configuration file? Other &lt;span class="caps"&gt;YAML&lt;/span&gt; files loaded by Rails such as fixture files or &lt;code&gt;database.yml&lt;/code&gt; are processed through &lt;span class="caps"&gt;ERB&lt;/span&gt; before being loaded. Wouldn&amp;#8217;t it be nice to be able to do the same in your application configuration file?&lt;/p&gt;
&lt;script src="http://gist.github.com/185834.js"&gt;&lt;/script&gt;&lt;p&gt;As it is Rails will not process those &lt;span class="caps"&gt;ERB&lt;/span&gt; snippets, but you can change that with one small change to your initializer:&lt;/p&gt;
&lt;script src="http://gist.github.com/185835.js"&gt;&lt;/script&gt;&lt;p&gt;Now, instead of loading the file directly, &lt;span class="caps"&gt;YAML&lt;/span&gt; loads the string returned by &lt;code&gt;ERB#result&lt;/code&gt; which will contain the contents of the &lt;code&gt;app_config.yml&lt;/code&gt; after the &lt;span class="caps"&gt;ERB&lt;/span&gt; snippets have been evaluated.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Launchd for Cron Jobs</title>
    <link href="http://urgetopunt.com/osx/2009/08/30/launchd-for-cron-jobs.html" />
    <updated>2009-08-30T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/osx/2009/08/30/launchd-for-cron-jobs.html</id>
    <content type="html">&lt;p&gt;Although cron is nominally supported on OS X, the preferred alternative seems to be &lt;a href="http://developer.apple.com/MacOsX/launchd.html"&gt;launchd&lt;/a&gt;. It is often used to run jobs at startup (much like an init script), but it also has configuration options to produce cron-like scheduling. For more information, check out the &lt;code&gt;launchd(8)&lt;/code&gt; and &lt;code&gt;launchd.plist(5)&lt;/code&gt; man page, and pay particular attention to the &lt;code&gt;StartCalendarInterval&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;This is a plist file I&amp;#8217;m using to get launchd to periodically run a &lt;a href="http://github.com/jparker/dotfiles/blob/master/bin/backup.rb"&gt;script&lt;/a&gt; which pulls down copies of database dumps from remote servers and then uploads them to &lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt;:&lt;/p&gt;
&lt;script src="http://gist.github.com/177658.js"&gt;&lt;/script&gt;&lt;p&gt;The file lives in &lt;code&gt;$HOME/Library/LaunchAgents/com.urgetopunt.backup.plist&lt;/code&gt;, and it was loaded into launchd by running the following command (no root privileges necessary):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ launchctl load -w $HOME/Library/LaunchAgents/com.urgetopunt.backup.plist&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Crontabs are still, in my opinion, much easier to deal with than &lt;span class="caps"&gt;XML&lt;/span&gt; documents, but launchd does offer certain advantages for desktop platforms. If my Mac is asleep when a cron job is scheduled to run, that run is missed. If launchd determines that a run was missed because the system was asleep, it runs the job when the system wakes up. If multiple consecutive runs are missed, it only runs the job once to get caught up.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Fibonacci Sequence in a Hash</title>
    <link href="http://urgetopunt.com/ruby/2009/08/13/fibonacci-hash.html" />
    <updated>2009-08-13T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/ruby/2009/08/13/fibonacci-hash.html</id>
    <content type="html">&lt;p&gt;Being able to instantiate a Hash that calculates Fibonacci numbers is just another reason I like Ruby&amp;#8230;&lt;/p&gt;
&lt;script src="http://gist.github.com/167437.js"&gt;&lt;/script&gt;&lt;p&gt;It may not be as compact as what Perl 6 promises, but it&amp;#8217;s a lot more legible.&lt;/p&gt;
&lt;script src="http://gist.github.com/167443.js"&gt;&lt;/script&gt;</content>
  </entry>
  
  <entry>
    <title>OSCON Highlights</title>
    <link href="http://urgetopunt.com/oscon/2009/07/25/oscon-highlights.html" />
    <updated>2009-07-25T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/oscon/2009/07/25/oscon-highlights.html</id>
    <content type="html">&lt;p&gt;&lt;span class="caps"&gt;OSCON&lt;/span&gt; is over. While there were a number of interesting sessions, the following two struck me as particularly interesting.&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8062"&gt;7 Principles of &lt;span class="caps"&gt;API&lt;/span&gt; Design&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/speaker/4710"&gt;Damian Conway&amp;#8217;s&lt;/a&gt; &lt;span class="caps"&gt;API&lt;/span&gt; design tutorial used Perl for the examples, but the ideas can reasonably be applied to most other languages as well. The talk was organized around Arthur C. Clark&amp;#8217;s third &lt;a href="http://en.wikipedia.org/wiki/Clarke&amp;#39;s_three_laws"&gt;law of prediction&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Any sufficiently advanced technology is indistinguishable from magic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The idea is to develop software modules that are so clever they can be useful with a minimal interface or even no interface at all. A good example of this is Perl&amp;#8217;s &lt;a href="http://perldoc.perl.org/strict.html"&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/a&gt; pragma which does everything expected just by adding &lt;code&gt;use strict&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The seven principles follow:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Do one thing well.&lt;/strong&gt; Keep methods small and tightly focused.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Design by coding.&lt;/strong&gt; Designing APIs around expected usage leads to intuitive, easy-to-use APIs.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Evolve by subtraction.&lt;/strong&gt; Squash needless complexity whenever you can. Find better defaults.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Declarative beats imperative.&lt;/strong&gt; Let users say &amp;#8220;what&amp;#8221; rather than &amp;#8220;how&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Preserve the metadata.&lt;/strong&gt; If a module knows something useful at one point, it should remember that information later on.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Leverage the familiar.&lt;/strong&gt; The easiest interface to understand and use is one you are already using.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Best code is no code at all.&lt;/strong&gt; Modules that can be used with very little conscious effort can be a delight to use.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8856"&gt;The &lt;span class="caps"&gt;HTML&lt;/span&gt; 5 Experiment&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/speaker/49932"&gt;Bruce Lawson&lt;/a&gt; discussed the future with &lt;span class="caps"&gt;HTML&lt;/span&gt; 5. All of the major browser players &amp;#8212; Microsoft (IE), Mozilla (Firefox), Apple (Safari), Opera (Opera) and Google (Chrome) &amp;#8212; support some subset of the features of &lt;span class="caps"&gt;HTML&lt;/span&gt; 5 already, so you can start playing with it today. &lt;span class="caps"&gt;HTML&lt;/span&gt; 5 is (mostly) a superset of &lt;span class="caps"&gt;HTML&lt;/span&gt; 4 which means &lt;span class="caps"&gt;HTML&lt;/span&gt; 5 pages will usually degrade with some semblance of grace. Because it is so common for page structures to include distinct areas for headers (not to be confused with &lt;code&gt;HEAD&lt;/code&gt;), footers and navigation menus, &lt;span class="caps"&gt;HTML&lt;/span&gt; 5 has &lt;code&gt;header&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt; and &lt;code&gt;nav&lt;/code&gt; tags. Unlike a &lt;code&gt;div&lt;/code&gt; with a specific id attribute, these tags have semantic meaning that can be used by page readers. Forms in &lt;span class="caps"&gt;HTML&lt;/span&gt; 5 have a whole slough of features that previously could only by achieved with a lot of Javascript. Among these features are common validations (required fields, valid email formats, valid numbers, etc.), an &lt;code&gt;autofocus&lt;/code&gt; attribute and a calendar picker.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Open Source Bridge -- Day One</title>
    <link href="http://urgetopunt.com/2009/06/17/os-bridge-day-one.html" />
    <updated>2009-06-17T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/2009/06/17/os-bridge-day-one.html</id>
    <content type="html">&lt;p&gt;Amber Case on our gradual transition into cyborgs. Very funny talk. I wouldn&amp;#8217;t normally think of myself or any of my fellow human beings as cyborgs, but when you stop to think about the gadgetry that we keep on our persons at just about all times nowadays&amp;#8230;&lt;/p&gt;
&lt;p&gt;Kurt von Finck and the &amp;#8220;hacker business model&amp;#8221;. What if, instead of specifically asking employees to put in 7.5 hours a day, you asked them to put in 75 hours every two weeks? It&amp;#8217;s an interesting idea. While many programmers do their best work with fixed-width, evenly-spaced work shifts, others thrive on binge coding. Perpetual binging is unmaintainable, but with nice, long breaks between sprints, it can be quite productive.&lt;/p&gt;
&lt;p&gt;J. Chris Anderson presented &lt;a href="http://opensourcebridge.org/sessions/109"&gt;Deploying to the Edge from CouchDB&lt;/a&gt;. A good overview of &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; which seems to get more and more attention these days. CouchDB is not a traditional relational database but rather a document-based database. It&amp;#8217;s written in &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt; and communication is based on &lt;span class="caps"&gt;HTTP&lt;/span&gt; and &lt;span class="caps"&gt;JSON&lt;/span&gt;. Among its most appealing features is its capacity for distributed and even embedded operation. It has enticing potential for offline applications.&lt;/p&gt;
&lt;p&gt;Scott Becker spoke about &lt;a href="http://opensourcebridge.org/sessions/139"&gt;Agile Javscript Testing&lt;/a&gt;. Informative presentation on a topic on which I really need to get up to speed. He demonstrated &lt;a href="http://github.com/nathansobo/screw-unit/tree/master"&gt;Screw.Unit&lt;/a&gt;, a &lt;span class="caps"&gt;BDD&lt;/span&gt; framework inspired by &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;. He also demonstrated &lt;a href="http://github.com/relevance/blue-ridge/tree/master"&gt;Blue Ridge&lt;/a&gt;, a Rails plugin which combines several Javascript-testing tools (including Screw.Unit) and paves the way for integrating Javascript tests into the rest of the test suite for Rails applications.&lt;/p&gt;
&lt;p&gt;There were some promising sessions in the afternoon schedule, but, tragically work beckoned and I spent the better part of the afternoon on the computer.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>The Importance of Being Specific</title>
    <link href="http://urgetopunt.com/autotest/2009/06/05/importance-of-being-specific.html" />
    <updated>2009-06-05T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/autotest/2009/06/05/importance-of-being-specific.html</id>
    <content type="html">&lt;p&gt;Do not do this in your &lt;code&gt;.autotest&lt;/code&gt; file.&lt;/p&gt;
&lt;script src="http://gist.github.com/124105.js"&gt;&lt;/script&gt;&lt;p&gt;Instead, be specific.&lt;/p&gt;
&lt;script src="http://gist.github.com/124106.js"&gt;&lt;/script&gt;&lt;p&gt;One of the benefits of &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;autotest&lt;/a&gt; is that it can save you time. It&amp;#8217;s not saving you time when you spend 15 minutes trying to figure out why it isn&amp;#8217;t running any of the tests from &lt;code&gt;vendor_controller_test.rb&lt;/code&gt;. Be good to your tools, and they will be good to you. Tell them &lt;strong&gt;exactly&lt;/strong&gt; what it is you&amp;#8217;d like to do, and they will be happy to oblige. Read the &lt;a href="http://zentest.rubyforge.org/ZenTest"&gt;documentation&lt;/a&gt; about a feature when you use it &amp;#8212; then maybe you&amp;#8217;ll realize that a &lt;a href="http://zentest.rubyforge.org/ZenTest/Autotest.html#M000043"&gt;method&lt;/a&gt; actually expects a Regexp as an argument.&lt;/p&gt;
&lt;p&gt;If you don&amp;#8217;t read the documentation, you risk being a tool&amp;#8230; Like me.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Refactoring Views for Clarity</title>
    <link href="http://urgetopunt.com/views/2009/05/28/refactoring-views-for-clarity.html" />
    <updated>2009-05-28T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/views/2009/05/28/refactoring-views-for-clarity.html</id>
    <content type="html">&lt;p&gt;I recently found myself doing some work on the views of an application I developed more than 18 months ago. As seems so often the case when looking at something I wrote long ago, I found myself somewhat dissatisfied with the way some of the code had been written. The partials I was looking at were &lt;span class="caps"&gt;DRY&lt;/span&gt; but long. In Ruby I&amp;#8217;ve learned to extoll the virtues of shorter, more focused methods, and in Rails, by extension, I think these same virtues apply to smaller, more focused views.&lt;/p&gt;
&lt;p&gt;The controller I was working on handled the usual &lt;a href="http://api.rubyonrails.org/classes/ActionController/Resources.html#M000501"&gt;RESTful actions&lt;/a&gt; for a resource named &lt;code&gt;billable&lt;/code&gt;, but in addition to the usual suspects, the billable resource also had several custom collection actions named &lt;code&gt;day&lt;/code&gt;, &lt;code&gt;week&lt;/code&gt; and &lt;code&gt;month&lt;/code&gt;. As you might guess from their names, they returned collections of billables by day, week and month, respectively. The base views were simple &amp;#8212; they displayed a title and rendered a &lt;code&gt;_billables&lt;/code&gt; partial which displayed a table summarizing the collection. The &lt;code&gt;_billables&lt;/code&gt; partial was my primary concern as it had grown too long. (See the original code &lt;a href="#before"&gt;below&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I decided to address the problem breaking the &lt;code&gt;_billables&lt;/code&gt; partial up. I created &lt;code&gt;_head&lt;/code&gt; and &lt;code&gt;_foot&lt;/code&gt; partials to display the header and footer sections of the table, and I created a &lt;code&gt;_billable&lt;/code&gt; (singular) partial which displayed a row for individual billables. I opted to shed some of the original approach&amp;#8217;s DRYness by replacing the one call to &lt;code&gt;#render&lt;/code&gt; in each view with two calls for the &lt;code&gt;_head&lt;/code&gt; and &lt;code&gt;_foot&lt;/code&gt; partials and a third call for the &lt;code&gt;_billable&lt;/code&gt; partial for the entire collection. (See these changes &lt;a href="#after"&gt;below&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;While I am not necessarily wed to the details of this new approach, I do think the result is a net gain. There are more files, more lines of code and there&amp;#8217;s more duplication. But I believe everything is clearer. I also believe the duplication I&amp;#8217;ve added is unlikely to add maintenance headaches &amp;#8212; it&amp;#8217;s hard to imagine it changing in any way that wouldn&amp;#8217;t require significant updates with or without the duplication. (As long as I am using a table to display the collection, I will have a header, footer and main body).&lt;/p&gt;
&lt;p&gt;&lt;a name="before"&gt;&lt;/a&gt;These are the partials I started with:&lt;/p&gt;
&lt;script src="http://gist.github.com/119137.js"&gt;&lt;/script&gt;&lt;p&gt;&lt;a name="after"&gt;&lt;/a&gt;These are the partials I ended with:&lt;/p&gt;
&lt;script src="http://gist.github.com/119140.js"&gt;&lt;/script&gt;</content>
  </entry>
  
  <entry>
    <title>Conditional Sum in Google Spreadsheet</title>
    <link href="http://urgetopunt.com/googledocs/2009/05/09/google-spreadsheet-filter-sum.html" />
    <updated>2009-05-09T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/googledocs/2009/05/09/google-spreadsheet-filter-sum.html</id>
    <content type="html">&lt;p&gt;It&amp;#8217;s the simplest things I always forget. Hopefully I&amp;#8217;ll remember this article next time. When traveling to a conference I record and categorize my expenses in a &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt; spreadsheet, usually creating a new worksheet for each trip. I have a separate worksheet which contains a cumulative summary of each category of expense. This is the formula I use to keep the running total for specific categories.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&lt;code&gt;
=SUM(FILTER('Worsheet name'!D2:D; 'Worksheet name'!E2:E="food"))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;span class="caps"&gt;SUM&lt;/span&gt; function is self-explanatory. The &lt;span class="caps"&gt;FILTER&lt;/span&gt; function selects all cells from a given range which match particular conditions. The range of cells to choose from is the first argument. Subsequent arguments describe the conditions. In the above example we select all cells from column D from row 2 onwards for which the value of the corresponding cell in column E equals &amp;#8220;food&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;&lt;/strong&gt;: As is so often the case when I learn something, there is a &lt;a href="/googledocs/2009/11/06/google-spreadsheet-sumif.html"&gt;better way&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>RailsConf Day Four</title>
    <link href="http://urgetopunt.com/railsconf/railsconf09/2009/05/07/rails-conf-day-four.html" />
    <updated>2009-05-07T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/railsconf/railsconf09/2009/05/07/rails-conf-day-four.html</id>
    <content type="html">&lt;p&gt;I attended &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8739"&gt;HTTP&amp;#8217;s Best-Kept Secret: Caching&lt;/a&gt; with Ryan Tomayko for the early morning session. Ryan gave a brief overview of different types of &lt;span class="caps"&gt;HTTP&lt;/span&gt; caching (client, shared proxy and gateway), eventually focusing on the server-side gateway caching. This form of caching still sends data over the wire, but allows you to avoid hitting Rails entirely, or else &amp;#8212; using something like &lt;a href="http://en.wikipedia.org/wiki/HTTP_ETag"&gt;ETags&lt;/a&gt; &amp;#8212; allows you to minimize the amount of work done within Rails to generate the content. It sounds like &lt;span class="caps"&gt;HTTP&lt;/span&gt; caching in its current form is still a bit awkward to handle when the content of the response varies based on session state, e.g., whether or not the user is logged in.&lt;/p&gt;
&lt;p&gt;Mid morning session found me at &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7485"&gt;When to Tell Your Kids About Presentation Caching&lt;/a&gt; with Matthew Deiters. This covered some of the same material as the previous caching talk, but Matthew focused more on minimizing the amount of data sent over the wire. In addition to client-side caching, he covered some general tips on reducing the size of the server responses. Tips included reducing the number of resources (e.g., use Rails&amp;#8217; asset caching functionality to condense multiple javascript/&lt;span class="caps"&gt;CSS&lt;/span&gt; files into fewer [but larger] files) and reducing the size of resources through minification (obfuscation) and compression (e.g., Apache&amp;#8217;s mod_deflate).&lt;/p&gt;
&lt;p&gt;My late morning session was &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/6967"&gt;It&amp;#8217;s Not Always Sunny in the Clouds: Lessons Learned&lt;/a&gt; with Mike Subelsky. Mike described some of the surprises and challenges he encountered over the past year working with &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;. He&amp;#8217;s still a fan of the power and convenience introduced by cloud computing, but he&amp;#8217;s developed a healthy respect for the complications and expenses it introduces over the old tangible, colocated server route. Turnkey provisioning rocks, but it involves a lot of work.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>RailsConf Day Three</title>
    <link href="http://urgetopunt.com/railsconf/railsconf09/2009/05/06/rails-conf-day-three.html" />
    <updated>2009-05-06T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/railsconf/railsconf09/2009/05/06/rails-conf-day-three.html</id>
    <content type="html">&lt;p&gt;My early morning session was &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7935"&gt;Using metric_fu to Make Your Rails Code Better&lt;/a&gt; with Jake Scruggs. Aside from &lt;a href="http://eigenclass.org/hiki.rb?rcov"&gt;rcov&lt;/a&gt; and the stats rake task in Rails I haven&amp;#8217;t yet spent much time studying code metrics. Jake touched on a number of different tools available today, each of which looked quite interesting and each of which is (or can be) used within &lt;a href="http://metric-fu.rubyforge.org/"&gt;metric_fu&lt;/a&gt;. The metric_fu rake tasks generate reports which can provide useful information on where you might need to focus your refactoring efforts by identifying potential problem spots like overly complex methods and repetitious code. I&amp;#8217;ve seen the announcements about metric_fu, but hadn&amp;#8217;t taken a close look at it until this session. I find I&amp;#8217;m eager to try it out but dreading what I will discover.&lt;/p&gt;
&lt;p&gt;In the late morning I attended &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7591"&gt;Are You Taking Things Too Far?&lt;/a&gt; with Michael Koziarski. The basic message of this session is pretty easy to extract from the title, and it&amp;#8217;s one that I&amp;#8217;ve heard in several sessions this week &amp;#8212; don&amp;#8217;t be overly dogmatic. Rails has introduced plenty of conventions that, in general, make our jobs easier, but it&amp;#8217;s important to remember that, sometimes, the conventional way may not be the best way. Sometimes fiercely sticking to convention can mean writing more code than you really need that requires more maintenance than you have time for and which expresses your intent less obviously than a simpler, less conventional approach. Conventions are good, but sometimes you need to be willing to break with them.&lt;/p&gt;
&lt;p&gt;Early afternoon session probably would have been interesting, but I had to catch up with work (coffee in Las Vegas isn&amp;#8217;t cheap).&lt;/p&gt;
&lt;p&gt;For the mid afternoon session I attended &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7847"&gt;Working Effectively with Legacy Rails Code&lt;/a&gt; with Pat Maddox and BJ Clark. This was a particularly appealing talk, as it&amp;#8217;s a challenge I&amp;#8217;ve spent a lot of time wrestling recently &amp;#8212; taming Rails code I wrote before I&amp;#8217;d learned many of Rails most helpful features. One of their suggestions was to keep an eye out for occasions where complex, semi-redundant code can be abstracted into a &amp;#8220;mini framework&amp;#8221; that you can mix-in as needed, and, as a corollary, keep an eye out for occasions where convoluted code may be unnecessry because Rails already provides a facility to do what needs to be done. They also announced their &lt;a href="http://refactorsquad.com/"&gt;new blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Late afternoon session &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8519"&gt;%w(map reduce).first &amp;#8212; A Tale About Rabbits, Latency and Slim Crontabs&lt;/a&gt; with Paolo Negri. Paulo gave an interesting overview of how and why to use &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; from Ruby. This is one of those times where the topic is fascinating, but I really don&amp;#8217;t have any immediate application for it.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8482"&gt;evening keynote&lt;/a&gt; with Bob Martin was a particular treat and one of the most entertaining I&amp;#8217;ve attended in years. The value of testing was the core of the talk. He presented the three rules of true test-driven development:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;You are not allowed to write a single line of production code until you have written a failing test.&lt;/li&gt;
	&lt;li&gt;You are not allowed to write a single line of additional test code once you have a failing test.&lt;/li&gt;
	&lt;li&gt;You are not allowed to write a single line of production code beyond what is needed to make the failing test pass.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Following those rules to the letter requires extraordinary discipline, but he asked us to think what our development world would be like if we followed through. Tests eliminate fear and risk &amp;#8212; if you have the tests, you can refactor the production code with confidence. Ruby (and Rails) can spare itself the fate of Smalltalk (which he said basically died of hubris) by three things:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Professional discipline &amp;#8212; specifically, writing well-tested code.&lt;/li&gt;
	&lt;li&gt;Professional humility &amp;#8212; not encouraging and adversarial relationship with other languages.&lt;/li&gt;
	&lt;li&gt;Professional responsibility &amp;#8212; not shying away from fixing dirty coding problems when they are discovered.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#8220;Uncle Bob&amp;#8221; is a marvelous presenter and showman in general, but one comment near the end struck me as particularly funny:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[When Smalltalk died, its programmers] had to start writing Java, and it nearly killed them.&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  
  <entry>
    <title>RailsConf Day Two</title>
    <link href="http://urgetopunt.com/railsconf/railsconf09/2009/05/05/rails-conf-day-two.html" />
    <updated>2009-05-05T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/railsconf/railsconf09/2009/05/05/rails-conf-day-two.html</id>
    <content type="html">&lt;p&gt;Early morning session was &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8497"&gt;The Even Darker Art of Rails Engines&lt;/a&gt; by James Adam. Good overview of Rails Engines as they are implemented in Rails 2.3, including caveats of some of the shortcomings. One issue is that when application routes and engine routes collide, the engine route takes precedence. James considers this a &lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/2592-plugin-routes-override-application-routes"&gt;bug&lt;/a&gt; (I&amp;#8217;m inclined to agree). Another gotcha is migrations. Migrations in an engine are not visible unless they are copied into the top-level migrations directory, but this is tricky because the version number/timestamp on a migration in the application may collide with that of a migration in the engine. Finally, public assets that are bundled with an engine must be copied into the application&amp;#8217;s public directory in order to be visible to the web server. Overall, engines have a lot of potential as well as room for improvement. As things stand, they are reasonably easy to deal with across in-house applications, but it becomes much more complicated when they are published by third parties. It&amp;#8217;s also worth noting that Rails 3 promises to have mountable applications based on Rails Engines and Merb Slices.&lt;/p&gt;
&lt;p&gt;Late morning session was &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8004"&gt;In Praise of Non-Fixtured Data&lt;/a&gt; by Kevin Barnes. It was interesting to see some of the options for avoiding fixtures that have arisen although for day-to-day work I have already switched over to &lt;a href="http://thoughtbot.com/projects/factory_girl"&gt;Factory Girl&lt;/a&gt;. I doubt it&amp;#8217;s rational, but the idea of data generators being added directly to the model class bothers me. That&amp;#8217;s one of the reasons I stick with Factory Girl.&lt;/p&gt;
&lt;p&gt;Early afternoon session was &amp;#8220;The Future of Deployment: A Killer Panel&amp;#8221; with Marc-André Cournoyer, Christian Neukirchen, Ryan Tomayko, Adam Wiggins, Blake Mizerany and James Lindenbaum. The panel members represented different layers of the deployment stack including &lt;a href="http://code.macournoyer.com/thin/"&gt;Thin&lt;/a&gt;, &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;, &lt;a href="http://tomayko.com/src/rack-cache/"&gt;Rack::Cache&lt;/a&gt;, &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; and &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt;. Discussion centered around how the different components came into being, how they&amp;#8217;ve come to interact and how they might need to develop for the future. If I spent more time working with complex deployment issues, I probably would have gotten more out of this session, but as it is my needs are quite simple.&lt;/p&gt;
&lt;p&gt;Mid afternoon session was &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7035"&gt;I Rock, I Suck, I Am &amp;#8212; Jumpstart Your Journey to Agile&lt;/a&gt; by Davis W. Frank. Davis went over some practices and guidelines that helped him adapt to the Agile workflow. Sometimes it seems that Agile pays off the same way that &lt;span class="caps"&gt;REST&lt;/span&gt; does &amp;#8212; it&amp;#8217;s a simple, well-structured way to breakdown complex tasks.&lt;/p&gt;
&lt;p&gt;Late afternoon session was Obie Fernandez&amp;#8217;s &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7721"&gt;Blood, Sweat and Rails&lt;/a&gt;. An interesting talk about some of the perils of launching a formal consultancy. Dealing with contract lawyers and keeping up with collections are serious drawbacks.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>RailsConf Day One</title>
    <link href="http://urgetopunt.com/railsconf/railsconf09/2009/05/04/rails-conf-day-one.html" />
    <updated>2009-05-04T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/railsconf/railsconf09/2009/05/04/rails-conf-day-one.html</id>
    <content type="html">&lt;p&gt;The tutorial day for &lt;a href="http://www.railsconf.com/"&gt;RailsConf 2009&lt;/a&gt; has drawn to a close. I spent the morning in &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7763"&gt;Running the Show: Configuration Management with Chef&lt;/a&gt; by Edd Dumbill. The first half of the tutorial was a bit awkward when the live demo failed to get off the ground. While I don&amp;#8217;t feel I walked away with any concrete training, I did come away with enough appreciation of &lt;a href="http://wiki.opscode.com/display/chef/Home"&gt;Chef&lt;/a&gt; that I&amp;#8217;m looking forward to learning and using it to rein in the increasing number of nearly identical systems I find myself managing.&lt;/p&gt;
&lt;p&gt;In the afternoon I attended Joe O&amp;#8217;Brien&amp;#8217;s and Jim Weirich&amp;#8217;s &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/7786"&gt;Testing, Design and Refactoring&lt;/a&gt;. The first half of the tutorial consisted of presentation by both Jim and Joe. Part of Jim&amp;#8217;s talk included the material from his &amp;#8220;Writing Modular Code&amp;#8221; talk from &lt;a href="http://scotlandonrails.com/"&gt;Scotland on Rails&lt;/a&gt;. Joe&amp;#8217;s portion covered some of the general methods of &lt;a href="http://refactoring.com/"&gt;refactoring&lt;/a&gt; and why you might use them. One concept that struck a chord with me was the concept (or goal) of simplicity. Simple code has the following characteristics:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Passes tests, i.e., the code works&lt;/li&gt;
	&lt;li&gt;No duplication&lt;/li&gt;
	&lt;li&gt;Clearly expresses intent&lt;/li&gt;
	&lt;li&gt;Minimal number of classes and methods&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And those characteristics are in order of importance. If the code doesn&amp;#8217;t work, it doesn&amp;#8217;t matter whether or not it&amp;#8217;s clear. (I&amp;#8217;m a little fuzzy about the order of duplication and clarity in that list though. If eliminating duplication results in loss of clarity, that may not be a net win.)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Scotland on Rails 2009</title>
    <link href="http://urgetopunt.com/2009/04/01/scotland-on-rails.html" />
    <updated>2009-04-01T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/2009/04/01/scotland-on-rails.html</id>
    <content type="html">&lt;p&gt;&lt;a href="http://scotlandonrails.com/"&gt;Scotland on Rails 2009&lt;/a&gt; was held at the University of Edinburgh 26-28 March. I confess that when I registered and made travel plans I regarded the conference as a good excuse to visit Scotland but not much more. It ended up being one of the finest conferences I have attended in a while. Good assortment of sessions, fascinating speakers, a good venue and superlative organization made the conference as valuable an experience as it was enjoyable. The conference organizers deserve a lot of credit for the job they did.&lt;/p&gt;
&lt;p&gt;For me, the highlight sessions included:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Marcel Molina&amp;#8217;s opening keynote &amp;#8212; fascinating and humorous insight into the early development of Rails.&lt;/li&gt;
	&lt;li&gt;Jim Weirich&amp;#8217;s session &amp;#8220;Building Blocks of Modularity&amp;#8221; &amp;#8212; turned out to actually be a thought provoking &amp;#8220;Grand Unified Theory of Software Development&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;Joe O&amp;#8217;Brien&amp;#8217;s and Jim Weirich&amp;#8217;s &amp;#8220;Ruby Code Review&amp;#8221; &amp;#8212; shined a light on taking simple steps to rein in untested code (and earned a good many guffaws in the process).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But, yeah, it was still a good excuse to visit &lt;a href="http://picasaweb.google.com/johncparker/ScotlandIreland2009?feat=directlink"&gt;Scotland&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Connascence and Software Development</title>
    <link href="http://urgetopunt.com/2009/03/27/sor-connascence.html" />
    <updated>2009-03-27T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/2009/03/27/sor-connascence.html</id>
    <content type="html">&lt;p&gt;This morning at &lt;a href="http://scotlandonrails.com/"&gt;Scotland on Rails&lt;/a&gt; &lt;a href="http://onestepback.org/"&gt;Jim Weirich&lt;/a&gt; gave a fascinating talk covering a software development pattern called &lt;em&gt;connascence_. His slides are &lt;a href="http://github.com/jimweirich/presentation"&gt;available on Github&lt;/a&gt;&lt;/em&gt;connascence.&lt;/p&gt;
&lt;p&gt;Connascence describes a kind of coupling within your code. Jim covered several forms:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Connascence of Name (CoN)&lt;/li&gt;
	&lt;li&gt;Connascence of Position (CoP)&lt;/li&gt;
	&lt;li&gt;Connascence of Meaning (CoM)&lt;/li&gt;
	&lt;li&gt;Contranascence (CN)&lt;/li&gt;
	&lt;li&gt;Connascence of Algorithm (CoA)&lt;/li&gt;
	&lt;li&gt;Connascence of Timing (CoT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition to the various forms of connascence he described two rules for dealing with connascence in your software.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Rule of Locality &amp;#8212; As the distance between software elements increases, use weaker forms of connascence.&lt;/li&gt;
	&lt;li&gt;Rule of Degree &amp;#8212; Convert high degrees of connascence into weaker forms of connascence.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;His slides have good examples of each of these forms, but consider a quick example. If a method has several &amp;#8212; say 4 or 5 &amp;#8212; positional parameters, it has a high degree of connascence of position. Over time, if parameters have to be added, removed or just reordered, this code will prove to be brittle as any code that calls that method would also have to be updated. The situation can be improved by replacing those positional parameters with a single hash parameter. The hash keys introduce connascence of name but eliminate concern over position, decoupling the method defintion somewhat from the code that calls it.&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t yet attended a talk by Jim that wasn&amp;#8217;t enlightening (I got started with Ruby because of his &amp;#8220;Ruby for Java Programmers&amp;#8221; talk at &lt;span class="caps"&gt;OSCON&lt;/span&gt; 2005), and this talk was no different. Seeing these patterns isolated and explained helps me with the ongoing goal of achieving greater discipline as a software developer. Thanks, Jim.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Hidden Files and the Finder</title>
    <link href="http://urgetopunt.com/2009/03/23/hidden-files-finder.html" />
    <updated>2009-03-23T00:00:00+00:00</updated>
    <id>http://urgetopunt.com/2009/03/23/hidden-files-finder.html</id>
    <content type="html">&lt;p&gt;If you are working on a Mac and have an unfortunate run-in with a mistyped &lt;code&gt;rm -r&lt;/code&gt; command, you may find yourself in need of restoring files, including those elusive dot files which don&amp;#8217;t show up in the OS X Finder by default. If you&amp;#8217;ve been using &lt;a href="http://www.apple.com/macosx/features/timemachine.html"&gt;Time Machine&lt;/a&gt; to backup your data, doing restores is easy, but before you can restore hidden files, you have to tell the Finder to display them.&lt;/p&gt;
&lt;p&gt;The following commands will do just that:&lt;/p&gt;
&lt;script src="http://gist.github.com/109551.js" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;After the Finder has restarted, you can go into Time Machine and restore hidden files to your heart&amp;#8217;s content. When you&amp;#8217;re done, if you want to turn display of hidden files back off (they do clutter up Finder windows and the Desktop), the reverse is intuitive:&lt;/p&gt;
&lt;script src="http://gist.github.com/109552.js" type="text/javascript"&gt;&lt;/script&gt;&lt;p&gt;Voil&amp;agrave;.&lt;/p&gt;</content>
  </entry>
  
</feed>
