<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Secondhand Lederhosen: Why Software Is Not There Yet</title>
    <link>http://www.secondhandlederhosen.com/articles/2005/12/10/why-software-is-not-there-yet</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>A Series of Tubes</description>
    <item>
      <title>Why Software Is Not There Yet</title>
      <description>&lt;p&gt;So when I tried to post the previous entry, I got a 500 error.  I don't really know ruby, but there was at least a nice backtrace in the typo log.  The operative bit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RuntimeError (wrong dateTime.iso8601 format):
    /lib/xmlrpc_fix.rb:9:in `dateTime'
    /usr/local/lib/ruby/1.8/xmlrpc/parser.rb:538:in `tag_end'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It was also nice enough to log the incoming XML-RPC data.  The operative bit of that:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{"name"=&amp;gt;"dateCreated",
 "value"=&amp;gt;{"dateTime.iso8601"=&amp;gt;"20051210T08:28:40+0000"}}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, thanks to open source and all that jazz, I could pretty easily find &lt;a href="http://typo.leetsoft.com/trac/file/trunk/lib/xmlrpc_fix.rb"&gt;this code&lt;/a&gt;, repeated here since it's short:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def self.dateTime(str)
  if str =~ /^(-?\d\d\d\d)(\d\d)(\d\d)T(\d\d):(\d\d):(\d\d)Z?$/ then
    a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i}
    XMLRPC::DateTime.new(*a)
  else
    raise "wrong dateTime.iso8601 format"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For what it's worth, this is overriding a method from ruby's own xmlrpc library, the version of which on my system being very similar but not accepting the final "Z" (for Zulu AKA GMT AKA UTC).  That's not good enough, since MarsEdit has chosen to send the time zone, even though it's Zulu, as +0000.&lt;/p&gt;

&lt;p&gt;But also on the web, I found &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/xmlrpc/rdoc/classes/XMLRPC/Convert.html#M010039"&gt;this&lt;/a&gt;, and if you click on the "Source" bit of the dateTime method, you see a much longer and fancier function that attempts to actually handle ISO8601, including the format MarsEdit sends.  There we see:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;when /^(-?\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(?:Z|([+-])(\d\d):?(\d\d))?$/
  a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i}
  if $7
    ofs = $8.to_i*3600 + $9.to_i*60
    ofs = -ofs if $7=='+'
    utc = Time.utc(a.reverse) + ofs
    a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ]
  end
  XMLRPC::DateTime.new(*a)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Thinking that was what I needed, I updated the overridden method in Typo to use it.  But alas:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TypeError (cannot convert Array into Integer):
    /lib/xmlrpc_fix.rb:11:in `utc'
    /lib/xmlrpc_fix.rb:11:in `dateTime'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What's the deal?  A little research, and it turns out that in ruby you write *a to get the list of elements in a, rather than the Array itself.  Don't ask me why it's written without the * in what appears to be official ruby library code -- my guess is that it's for a newer version of ruby where you can pass an Array to Time.utc.  In any case, I tried:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;utc = Time.utc(*a.reverse) + ofs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Behold, a new error!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ArgumentError (argument out of range):
    /lib/xmlrpc_fix.rb:11:in `utc'
    /lib/xmlrpc_fix.rb:11:in `dateTime'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Looking more closely, that a.reverse falls under suspicion.  Time.utc seems to want (year, month, day, hour, min, sec), and that is in fact how it's coming out of the regex.  So why reverse it?  I haven't the foggiest clue!  I took out the reverse:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;utc = Time.utc(*a) + ofs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and voila!  The post went through.  I'm still totally stumped on how that could possibly ever work as written.  Maybe some reader will help me out here.  Of course, I only have the one reader (hi, Josh!), so maybe not.&lt;/p&gt;</description>
      <pubDate>Sat, 10 Dec 2005 04:06:24 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:426206b2-c98b-49f9-94ba-056d276683c8</guid>
      <author>chris@masto.com (Chris)</author>
      <link>http://www.secondhandlederhosen.com/articles/2005/12/10/why-software-is-not-there-yet</link>
      <category>software</category>
      <category>meta</category>
      <category>ruby</category>
      <category>typo</category>
      <category>bugs</category>
    </item>
  </channel>
</rss>
