<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
  <title>Blog-o!</title>
  <link rel="stylesheet" href="/static/blog.css" type="text/css"
    media="screen and (min-device-width: 481px)" />
  <link rel="stylesheet" href="/static/iTouch.css" type="text/css"
    media="only screen and (max-device-width: 480px)" />
  <link rel="alternate" type="application/atom+xml" title="Atom"
    href="http://weblog.latte.ca/index.xml" />
  <link rel="stylesheet" href="/static/pygments.css" type="text/css" />
  <link rel="apple-touch-icon" href="/images/iPhoneMug.png"/>
  <meta name="viewport" content="initial-scale=1.0" />
 </head>
 <body>
  <div class="title">
   <span class="title">Blog-o!</span><br />
   <span class="description">Notes from latte.ca<br /><a href="http://weblog.latte.ca/blake">blake</a></span>
  </div>
  <div class="content">
<div class="blosxomFirstDayDiv">
<div class="blosxomDate">Sun, 20 Dec 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="folderModes" href="http://weblog.latte.ca/blake/tech/thunderbird/folderModes.html"><b>How folder modes work.</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>Earlier today, I was asked by <a href="http://www.andreasn.se/blog/">Andreas Nilsson</a> to give him a hand with a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=535021">folder pane header
bug</a> he was trying to
   fix.  In the middle of digging around in the code, I thought “I should
   really write this down, so that I can understand it later.”, and so here it
   is.
</p>
<p>The main place we’ll need to change is in <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#55">this object</a>.
</p>
<p>We start in the <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#60"><tt>load</tt></a>
   method, which calls <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#67"><tt>registerMode</tt></a>,
   to add the mode with its localized name.  There is also a <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#984">default list of
modes</a>,
   which will come into play later.
</p>
<p>When the user chooses to <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#200">cycle the mode</a>,
   it calls the <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#250">setter for <tt>mode</tt></a>,
   passing it the modename, which comes from the <tt>_modeNames</tt> list
   (which contains both the defaults and any newly-registered modes).  Then,
   in the setter, if the mode is a default mode, it will fail <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#254">the if-test</a>,
   and get the localized name from the “bundle_messenger” string bundle.  If
   it’s a newly-registered mode, they will have passed in a localized name
   which we will have stored in <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#178"><tt>this._modeDisplayNames</tt></a>,
   and so we will <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#255">use that</a>.
</p>
<p>The point of the bug is to switch the label-and-two-buttons to a dropdown
   menu, so at this point I think we should start with an empty
   <tt>menulist</tt> in the XUL, and in the <tt>load</tt> method add
   <tt>menuitems</tt> corresponding to the values in the <tt>_modeNames</tt>
   array.  Then, in the <tt>registerMode</tt> and <a href="http://mxr.mozilla.org/comm-central/source/mail/base/content/folderPane.js#187"><tt>unregisterMode</tt></a>
   methods, we should add and remove new menuitems, which I’m hoping will just
   automatically show up in the dropdown.  Finally, we need to change the
   setter for <tt>mode</tt> to not calculate the new name, but just select the
   appropriate menuitem set the <tt>mode</tt> attribute on the
   <tt>_treeElement</tt>, and call <tt>_rebuild()</tt>.  At that point, I
   think we’re done, but only time will tell.
</p>
<p><small>Okay, so this was really posted on Dec 22<sup>nd</sup>, but I wanted
   to back-date it so as not to bump Amy’s “Welcome” post off the top a mere
   day after she posted it.</small>
</p></div>
<div class="storyFoot">[Posted at 16:45 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/folderModes.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Thu, 10 Dec 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="Experiments" href="http://weblog.latte.ca/blake/tech/opengl/Experiments.html"><b>Experiments in OpenGL (on the iPhone 3GS).</b></a>
<div class="storyCategory">[/tech/opengl]</div></div>
<div class="storyBody"><p>While I was at the Toronto iPhone Tech Talks, I attended the OpenGL ES
   sessions by <a href="http://twitter.com/funnest">Allan Schaffer</a>.  Seeing the
   “Shock” demo was really inspiring, and caused me to want to try my
   hand at some simple OpenGL Shader demos.
</p>
<p>The base XCode OpenGL ES Application template sets you up pretty
   nicely for some simple experimentation, the only things that gave me
   any trouble were:
</p>
<ol>
 <li><p>remembering to set the identifier to ca.latte.whatever so that I
   could build, and
</p>

 </li>

 <li><p>remembering that the OpenGL ES 2.0 path only ran on the device, so
   of course none of the changes I was making were showing up on the
   simulator<sup id="fnr1-669272592"><a href="#fn1-669272592">1</a></sup>, and finally
</p>

 </li>

 <li><p>Figuring out that depth was position.w, and not position.z.  (Did I
   mention that I’m a bit of a newbie at this?)
</p>

 </li>
</ol>
<p>Anyways, after it was all up and running, I made the x and w
   co-ordinates vary on a different period than the y co-ordinate, and
   now the square moves around in 3 dimensions in a pleasing (to me) way.
</p>
<p><img src="/images/blake/iTouch/OpenGL/1-square.jpg" title="A square, that’s all." alt="A pretty square."/>
</p>
<p>Since this is intended for me to play around with shaders, I’m not
   going to bother updating the OpenGL ES 1.0 code path, but if you’ve
   got an iPhone 3GS, or a 3rd generation iTouch, feel free to grab the
   code at <a href="http://bitbucket.org/bwinton/opengl/">BitBucket</a>, and play
   around.  I'll be adding branches and tags and keeping it updated as I
   play with new stuff.
</p>

<div class="footnote"><hr/><ol>
 <li id="fn1-669272592"><p><a href="http://twitter.com/runmad">Rune</a> let me know that Open GL ES
   2.0 is supported in the latest version of the simulator.  I guess I
   must have been testing with an earlier version of the SDK, or XCode,
   or something.<a href="#fnr1-669272592" class="footnoteBackLink" title="Jump back to footnote 1 in the text">&#8617;</a>
</p>

 </li>
</ol>
</div></div>
<div class="storyFoot">[Posted at 13:16 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/opengl/Experiments.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Wed, 28 Oct 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="firstCommit" href="http://weblog.latte.ca/blake/tech/thunderbird/firstCommit.html"><b>More hurray!</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p><a href="http://weblog.latte.ca/blake/tech/thunderbird/FirstPatch">A while ago</a> I had my
   first patch to Thunderbird committed.
</p>
<p><a href="http://hg.mozilla.org/releases/comm-1.9.1/pushloghtml?startdate=2009-10-28+11%3A00&amp;enddate=2009-10-28+11%3A20">Today</a> I pushed my first patch, all by myself.
</p>
<p>It’s kind of exciting, having checkin privileges.  It means that I
   don’t have to wait for someone else to check in my changes once
   they’re accepted.  But on the downside, it means that I’m the one who
   has to do the commit, and watch the <a href="http://tinderbox.mozilla.org/showbuilds.cgi?tree=Thunderbird3.0">Tinderbox</a>, and
   if anything goes wrong, I’m even more on the hook than I previously
   was.  (Well, that last part isn’t really true, but I feel way more
   nervous than when I could just add “checkin-needed” to the bug, and
   not worry about it anymore.)  And basically there’s just a lot of new
   stuff for me to keep track of, and figure out.  But since anything I
   do is going to show up in the official history, I need to figure it
   out <em>before</em> I do it, which always adds a little pressure, which in
   this case is probably a good thing.
</p></div>
<div class="storyFoot">[Posted at 14:57 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/firstCommit.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Sat, 26 Sep 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="buildingFast" href="http://weblog.latte.ca/blake/tech/thunderbird/buildingFast.html"><b>Building Thunderbird Faster</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>I’m always looking for ways to speed up my Mozilla build, since it allows
   me to test my changes even quicker.  I was really excited when I found out
   about <tt>make -s tier_app</tt>, since it sped up my compiles by a huge
   amount.
</p>
<div class="codehilite"><pre>make
real    10m22.630s
user    4m28.072s
sys     1m27.807s
</pre></div>
<p>vs.
</p>
<div class="codehilite"><pre>make -s tier_app
real    0m14.426s
user    0m6.502s
sys     0m3.957s
</pre></div>
<p>But yesterday, on IRC, I heard about <tt>libs_tier_app</tt>, which is ever
   faster, if you haven’t changed any IDL files (which I usually don’t).
</p>
<div class="codehilite"><pre>make -s libs_tier_app
real    0m9.407s
user    0m5.440s
sys     0m3.065s
</pre></div>
<p>Okay, it’s not nearly as good as going from 10 and a half minutes to 15
   seconds, but a 30% (or is it 50%) speedup is still nothing to sneer at.
</p></div>
<div class="storyFoot">[Posted at 13:57 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/buildingFast.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Wed, 23 Sep 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="3.0b4" href="http://weblog.latte.ca/blake/tech/thunderbird/3.0b4.html"><b>Thunderbird 3.0 beta 4!</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>I’ve been doing <a href="http://moxie.fligtar.com/thunderbird/3.0b4-blockers//sort:bugsFixed">a lot of work</a>
   recently, in preparation for the next (and last!) beta of Thunderbird 3,
   and I’m happy to announce that <a href="http://ccgi.standard8.plus.com/blog/archives/270">it was released</a> yesterday!
</p>
<p><img src="/images/blake/TB3.0b4.png" title="The Update Notification." alt="Update now!"/>
</p>
<p>The reviews from <a href="http://lifehacker.com/5365214/thunderbird-3-beta-4-available-for-download">LifeHacker</a>
   and <a href="http://arstechnica.com/open-source/reviews/2009/09/hands-on-thunderbird-3-beta-4-hatches-with-improved-search.ars">Ars Technica</a>
   have been positive, which is always gratifying to see on something you’ve
   spent a lot of time on.
</p>
<p>For more information, check out the <a href="https://developer.mozilla.org/en/Thunderbird_3_for_users">Thunderbird 3 for
Users</a> page, or
   the <a href="http://www.mozillamessaging.com/en-US/thunderbird/3.0b4/releasenotes/">Release Notes</a> for
   beta 4.
</p></div>
<div class="storyFoot">[Posted at 15:21 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/3.0b4.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Mon, 21 Sep 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="pbranch" href="http://weblog.latte.ca/blake/tech/thunderbird/pbranch.html"><b>More notes on Mercurial.</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>Recently, I made some changes to <a href="http://weblog.latte.ca/blake/tech/thunderbird/mercurial">my work flow</a> to get around
   some slight annoyances.  Specifically, I switched from using <a href="http://mercurial.selenic.com/wiki/MqExtension">mq</a> to using <a href="http://arrenbrecht.ch/mercurial/pbranch/">pbranch</a>.  The features that pbranch
   gives me that mq didn’t basically boil down to two main things;
   sharing, and tracking.
</p>
<p>With pbranch, it’s way easier for me to share my changes, both with
   other people, and with myself in a virtual machine.  It <em>is</em> possible
   to share the patch with mq, by cloning the patch repo if I remembered
   to run qinit -C, but with pbranch all I have to do is clone the main
   repo, and my changes are right there, waiting for me.
</p>
<p>For tracking, when I’m nearing the end of a patch, and it mostly
   works, I get really nervous if I can’t check in my changes.  With mq,
   I set up an alias to let me commit the patch queue, so that I could go
   back, but it was really hard to tell what I had changed between any
   two commits, since it was showing me the diff of my diffs.  And so I
   didn’t use it as much as I would like to.  With pbranch, I just commit
   the code, like I want to, and it keeps track of what the patch should
   look like.
</p>
<p>So, my day-to-day workflow now looks more like this:<br/>
   If I’m working on a bug that I’ve already got a patch started for, I
   cd to the appropriate branch, type <tt>hg pgraph</tt> to see where I
   am, and <tt>hq update branchname</tt> to get to the pbranch I want to
   work on.  Then I make my changes, and when I’m happy with the results
   of <tt>hg diff</tt>, I type <tt>hg commit</tt> to put the changes into
   the pbranch.  After that, I use <tt>hg pdiff &gt;
   ../branch-name-bugnum-description.diff</tt> to get a patch that I can
   upload to bugzilla.  At this point, I usually load the patch into Vim,
   and search for some of the mistakes I’ve made in the past.
   (<tt>/^+.*[[:space:]]+$</tt>, and <tt>/dump</tt> caught a lot of my
   initial mistakes.  Now I’ve moved on to things that are tougher to
   check for, like putting open-parens on a new line instead of on the
   previous line.)  I usually go through a couple of cycles of <tt>hg
   commit</tt>/<tt>hg pdiff …</tt> before I’m happy with the patch.  Once
   I am, I don’t have to type anything before I upload it, since it’s
   already committed.
</p></div>
<div class="storyFoot">[Posted at 11:48 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/pbranch.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Mon, 14 Sep 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="vms" href="http://weblog.latte.ca/blake/tech/thunderbird/vms.html"><b>Another reason to use Mercurial (or Git or Bazaar)</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>A lot of the code I write for <a href="http://mozillamessaging.com/">Thunderbird</a>
   has to work on <a href="http://www.mozillamessaging.com/en-US/thunderbird/all.html">all</a> the platforms
   it supports.  Since I don’t own a <a href="http://www.ubuntu.com/">Linux</a> or
   <a href="http://www.microsoft.com/windows/windows-7">Windows</a> box, and don’t really
   want to waste the hard drive space on my <a href="http://www.apple.com/ca/macbookpro/specs.html">MacBook Pro</a> with a dual- or triple-boot
   setup, I’ve decided to install the other operating systems on virtual
   machines.  (I’ve chosen <a href="http://www.virtualbox.org/">VirtualBox</a>, because
   it’s free, and I’m cheap.  As an added bonus, it works quite well, too.)
</p>
<p>If I was forced to use a centralized version control system, this would
   lead to a bunch of pain, since I wouldn’t want to check in a half-finished
   patch, but I would still really want to see what changes I made for one OS,
   to try and figure out what changes I need to make for the others.  And I
   would want to be able to keep a record of what I did, step by step, so that
   I could undo stuff if it turned out to be a bad idea.  (Hey, that sounds
   like a perfect task for a version control system!  ;)
</p>
<p>Since Mozilla uses <a href="http://mercurial.selenic.com/">Mercurial</a>, I didn’t
   have to deal with any of that.  I had my repository on the host machine,
   which I had cloned from the main repo, and I just cloned it into each of
   the virtual machines.  Whenever I started a VM, I pulled the latest set of
   changes from the host machine; As I fixed stuff on that platform, I
   committed to the repository on the virtual machine; And before I shut down
   the VM, I pushed my changes back to the host machine.  When I wanted to see
   which changes I made to get things working for the platform, it was easy,
   and propagating those changes to the other virtual machines was also easy.
</p>
<p>When people talk about the advantages of distributed version control, a lot
   of the time they mention being able to still commit your changes when
   you’re on an airplane, and sharing in-progress changes with other people,
   but for people like me who do mainly self-contained stuff and don’t fly
   anywhere, supporting multi-platforms with virtual machines and still being
   able to track my changes might just be the killer feature.
</p></div>
<div class="storyFoot">[Posted at 12:12 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/vms.html">link and comments</a> (2 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Mon, 03 Aug 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="twitterFail" href="http://weblog.latte.ca/blake/tech/twitterFail.html"><b>That can’t be good.</b></a>
<div class="storyCategory">[/tech]</div></div>
<div class="storyBody"><p>I don’t know what happened there, but it doesn't look quite right to me.
   <img src="/images/blake/twitterFail.png" title="What happened to twitter?!?" alt="WTF?"/>
   Well, it’s fixed now, so I guess no harm, no foul, right?
</p></div>
<div class="storyFoot">[Posted at 12:42 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/twitterFail.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Tue, 21 Jul 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="3.0b3" href="http://weblog.latte.ca/blake/tech/thunderbird/3.0b3.html"><b>Thunderbird 3.0 beta 3 shipped!</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p><a href="http://www.mozillamessaging.com/en-US/about/press/archive/2009-07-21-01">It’s true</a>,
   after a lot of hard work, and a few hard decisions, the first version of
   Thunderbird that has code of mine in it has shipped.  Dan Mosedale has
   <a href="http://weblogs.mozillazine.org/dmose/archives/2009/07/thunderbird_30b3_shipped.html">some comments</a>
   on what’s changed.  If you like Thunderbird, please download it, give it a try,
   and let me know what you think!
</p>
<p>On a more personal note, the thing I did on this release that I’m the most
   proud of was to add a button that lets you reply to a mailing list.
</p>
<p><img src="/images/blake/ReplyToList3.0b3.png" title="The Reply-To-List Button." alt="Reply to a mailing list"/>
</p>
<p>I’m proud of it because it feels like a neat-but-still-usable UI, and because
   it is one more step on the road to getting people to change their mailing lists
   to <a href="http://woozle.org/~neale/papers/reply-to-still-harmful.html">not munge the Reply-To header</a>.  (With this
   patch, you are given the option of replying to the list, or the author.  Unless
   the list has set the Reply-To to point to the list, in which case you can only
   mail the list.)
</p>
<p>A couple of the other areas I worked on for this release were updating the
   Activity Manager so that it didn’t hang when you clicked “Clear Now”, and
   so that it merged a bunch of move/copy/delete notifications into a single
   notification that told you how many messages had been processed; and fixing
   a some layout and logic bugs in the Autoconfig dialog (which you get to
   from “File » New » Mail Account (Quick Setup)…”).  Yeah, the Autoconfig
   dialog is still kind of ugly, but it’s better now than it used to be, and
   I’m working on making it prettier for beta 4.
</p></div>
<div class="storyFoot">[Posted at 21:13 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/3.0b3.html">link and comments</a> (1 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Tue, 07 Jul 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="jobAtMomo" href="http://weblog.latte.ca/blake/employment/jobAtMomo.html"><b>My first couple of days at Mozilla Messaging.</b></a>
<div class="storyCategory">[/employment]</div></div>
<div class="storyBody"><p>A few weeks ago I started a new full-time contract at <a href="http://mozillamessaging.com/">Mozilla
Messaging</a> (a.k.a. the people who brought you
   Thunderbird).  I meant to post this on the Wednesday after I started, but
   didn’t get around to it until now.  So, here you go, my notes from just
   after I started a new job.
</p>
<p>It has been a pretty crazy couple of days, both because I’m not that used
   to working for a full 8 hours on one thing, and because I’m at the point
   where there’s still so much to learn that I could spend all my time
   researching stuff, and never get anything done.
</p>
<p>But even with all the stuff for me to learn, I feel like I’ve made a fair
   bit of progress.  There were a few bugs assigned to me, based on <a href="http://hg.mozilla.org/comm-central/rev/98a7de404c08">a
previous patch</a>, as
   well as a couple of things left to do to get <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=45715">the feature</a> working, so I jumped
   right in to those.  After I had new patches up for review on all of those
   bugs, I talked with <a href="http://clarkbw.net/blog/">Bryan Clark</a> about what bugs
   I should tackle next.  He and <a href="http://ascher.ca/blog/">David Ascher</a> both
   suggested that the new <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=autoconfig">automatic mail server config</a> dialog could use a
   bit of love.
</p>
<p>This morning, I did some investigation on group email addresses for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=496440">one of
the bugs</a> I’m working
   on, and took a look at how the autoconfig dialog was put together so that I
   wouldn’t sound like I was completely lost in the meeting.  (XUL, CSS, and
   Javascript.  No surprises there.  :)  Then, after the <a href="https://wiki.mozilla.org/Thunderbird/StatusMeetings/2009-06-09">Status
Meeting</a>,
   Bryan and I chatted a bit about what the various bugs were that he had
   assigned to me, and what sort of things I might look into to try and fix
   them.  A few hours later, I had a fix for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=490105">one of them</a>, and applied a similar
   fix to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=490106">another</a>.  (As
   an aside, you’ve got to love the 3 hour investigation which ends up being a
   9-character change.  At least while investigating the bug, I learned a lot
   about <a href="https://developer.mozilla.org/en/XUL/hbox">hboxes</a>, <a href="https://developer.mozilla.org/en/XUL/vbox">vboxes</a>, <a href="https://developer.mozilla.org/en/XUL/Attribute/flex">flexes</a>, <a href="https://developer.mozilla.org/en/XUL/grid">grids</a>, and <a href="https://developer.mozilla.org/en/XUL/description">descriptions</a>, which will hopefully
   come in handy in future bugs.  :)  Finally, I ended the day by reading a
   review of a patch I submitted on Monday morning, making some tweaks to my
   code, and resubmitting it.
</p>
<p>The final thing that amazes me is that each day is taking up pretty much a
   full page of my log book, which is <em>way</em> more than usual.  Most of the days
   last month got a line or two.  Really full days would maybe get half a
   page.  But yesterday and today were a solid page, chock full of
   information, each.  I wonder how long this trend will continue.  I hope it
   keeps on going like this for a long time.
</p></div>
<div class="storyFoot">[Posted at 00:04 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/employment/jobAtMomo.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Mon, 06 Jul 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="soy" href="http://weblog.latte.ca/blake/random/soy.html"><b>An odd coincidence?</b></a>
<div class="storyCategory">[/random]</div></div>
<div class="storyBody"><p>I have a theory.  (No, it’s not bunnies.)  One of my favourite foods is soy
   beans.  I love it both because they’re tasty, and because they’re so
   changeable.  I mean, what other substance can be used to make a hard white
   solid (tofu), and a viscous black liquid (soy sauce)?  Hey, waitaminnute.
   “Soy beans” are oil!  It’s all just different names for petrochemicals!
</p></div>
<div class="storyFoot">[Posted at 10:50 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/random/soy.html">link and comments</a> (4 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Tue, 30 Jun 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="mercurial" href="http://weblog.latte.ca/blake/tech/thunderbird/mercurial.html"><b>How I use Mercurial (and the MQ extension).</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>I started working for <a href="http://www.mozillamessaging.com">Mozilla Messaging</a> a
   while ago, and since <a href="http://blog.codekills.net/">David Wolever</a> <a href="http://twitter.com/wolever/status/2394705659">asked
me</a> how I used Mercurial and the
   MQ extension, I thought I would put up some notes on how I’m currently using
   them in my day-to-day work.  Of course, the stuff I’m doing now is a little
   different than what I’ve done in any of my previous jobs, so I’m not sure how
   useful any of the following will be to anyone who isn’t contributing to an open
   source project.
</p>
<p>First, let’s talk a little bit about how I have my Work directory set up.  The
   first thing I did when I started working on the Thunderbird source code was to
   pull down a clean copy of the source into a directory named “src-base”.  The
   purpose of that directory is to always contain a clean copy of the upstream
   source code so that when I want to update the various branches I have (five, at
   last count), I only need to download the changes from the Mozilla repo once,
   and I can then propagate them from src-base to the other branches.  I got the
   idea to do that from the Bazaar-NG developers, and I think it has helped to
   keep my bandwidth usage down.  It might cause a problem if I was sharing my
   branches, but since Thunderbird seems to revolve around submitting patches to
   bugzilla, it works out pretty well.
</p>
<p>The next thing I did was to clone src-base into a directory named
   “add-reply-list-button” (because I was writing a patch to add a Reply-To-List
   button :), go into that directory, and type <tt>hg qinit -c</tt> to create an
   mq repository, and put the mq repository itself under version control.  (I
   didn’t actually do that the first time, and was quite annoyed that I couldn’t
   revert changes I had made in my patch queue.)  The other part of that is that
   I’ve aliased <tt>mq</tt> to <tt>hg -R $(hg root)/.hg/patches</tt>.  This lets
   me type <tt>mq commit</tt> to commit the changes to the patch.
</p>
<p>So, now we’re at my day-to-day work.  If I’m working on a bug that I’ve already
   got a patch started for, I cd to the appropriate branch, type <tt>hg
   qseries</tt> to see where I am, and <tt>hq qpush</tt> or <tt>hg qpop</tt> to
   get to the patch I want to work on.  Then I make my changes, and when I’m happy
   with the results of <tt>hg diff</tt>, I type <tt>hg qrefresh</tt> to put the
   changes into the patch.  After that, I use <tt>hg qdiff &gt;
   ../branch-name-bugnum-description.diff</tt> to get a patch that I can upload to
   bugzilla.  At this point, I usually load the patch into Vim, and search for
   some of the mistakes I’ve made in the past.  (<tt>/^+.*[[:space:]]+$</tt>, and
   <tt>/dump</tt> caught a lot of my initial mistakes.  Now I’ve moved on to
   things that are tougher to check for, like putting open-parens on a new line
   instead of on the previous line.)  I usually go through a couple of cycles of
   <tt>hg qrefresh</tt>/<tt>hg qdiff …</tt> before I’m happy with the patch.  Once
   I am, I type <tt>mq commit -m "Updated patch to fix foo and bar."</tt> to save
   the state of the patch, and then I upload it.
</p></div>
<div class="storyFoot">[Posted at 22:31 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/mercurial.html">link and comments</a> (3 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Fri, 29 May 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="FirstPatch" href="http://weblog.latte.ca/blake/tech/thunderbird/FirstPatch.html"><b>Hurray!  (A technical diversion.)</b></a>
<div class="storyCategory">[/tech/thunderbird]</div></div>
<div class="storyBody"><p>It took a while, but my <a href="http://hg.mozilla.org/comm-central/rev/98a7de404c08">first patch to Thunderbird</a> was committed today!
</p>
<div class="codehilite"><pre>changeset:   2727:98a7de404c08
user:        Blake Winton &lt;bwinton@latte.ca&gt;
date:        Fri May 29 10:35:37 2009 +0100
summary:     Bug 45715 - &quot;&quot;Reply to List&quot; [button/(context) menu item]&quot;
             [r=mkmelin,sr=bienvenu,ui-review=clarkbw]
</pre></div>
<p>The patch started off by adding a “Reply to List” button to the message
   header pane as seen below, but after some discussion, the scope was
   expanded to change the “Reply” button to “Reply All” or “Reply to List”,
   depending on the message you’re currently viewing.
</p>
<p><img src="https://bug45715.bugzilla.mozilla.org/attachment.cgi?id=364625" title="Reply to List" alt="First cut of the Reply to List button"/>
</p>
<p>Of course, there’s still some things I’ve got to add, but those can go in a
   separate patch, which will be much smaller, and so much easier to get
   reviewed and committed.  And once it is, we might be able to close a
   <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=45715">9-year old bug</a>,
   which would be pretty sweet.
</p></div>
<div class="storyFoot">[Posted at 10:25 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/thunderbird/FirstPatch.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Thu, 16 Apr 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="Fixie" href="http://weblog.latte.ca/blake/random/biking/Fixie.html"><b>My old/new bike.</b></a>
<div class="storyCategory">[/random/biking]</div></div>
<div class="storyBody"><p><a href="/images/blake/bike/fixie/Bike_l.jpg"><img
    src="/images/blake/bike/fixie/Bike_s.jpg"
    title="My new bike!" alt="The new Fixie." align="right"/></a>
</p>
<p>I did something new today.  A while ago, I had bought a 10-speed Bianchi
   for $30 at a garage sale, with the intention of converting it into a
   fixed-gear/single-speed bike to tootle around on.  Well, today, I took it
   down to <a href="http://bikechain.utoronto.ca/" title="Bikechain at U of T">Bikechain</a>,
   and talked to Steve, who sent me on a merry goose chase picking up various
   parts.  Once I had gotten a new wheel, tire, and tube and biked back to
   Biekchain, Steve and I put it on the bike, checked the alignment of the
   cogs and chain, and then I had to head out to buy a new rear cog, and a
   lock wheel…
</p>
<p>Sadly, my bike didn’t have a functional rear wheel anymore, so I had to
   walk down to <a href="http://www.ucycle.com/" title="My local-ish cycle
shop">Urbane Cyclist</a> to buy the cog and lock.  I ended up with a 52:19 ratio, which is
   harder to start on than the gear ratio I use to start, but isn’t too bad,
   and doesn’t go as fast as the gear ratio I use to go fast, but again isn’t
   too bad.  Given those two things, I figure it’s pretty close to perfect for
   my style and level of riding.  When I got the cog and lock ring back to
   <a href="/images/blake/bike/fixie/BikeAndMe_l.jpg"><img
    src="/images/blake/bike/fixie/BikeAndMe_s.jpg"
    title="I like it so…" alt="Me and my Fixie." align="left"/></a>
   Bikechain, we put them on the new rear wheel, hooked everything up, ran
   into the obligatory problems, fixed them, and finally I was good to go, so
   I did!  The first trip I took was a fairly short one, from U of T over to
   the <a href="http://code.davidjanes.com/blog/2009/04/15/coffee-and-iphone-tomorrow/">Dark Horse Cafe</a> at
   Queen and Spadina.
</p>
<p>The second trip was from Queen and Spadina back home, which was a little
   longer.  I learned a few things from that trip, but let me start off with
   something I didn’t learn.  I had test-ridden a fixed gear bike before, so I
   had already been almost bumped off by trying to coast, and this time around
   I was expecting it.  So, now on to the things I did learn.
</p>
<br clear="all"/>

<ul>
 <li>
     Stopping is hard.  It’s not that I can’t stop.  I’ve got both brakes and
       pedals.  The problem is stopping with one of the pedals in a decent
       position to start from when I want to start.  The other problem is that I
       really want to coast when I come to the end of a stop, and that totally
       doesn’t work.
 </li>
</ul>
<p><a href="/images/blake/bike/fixie/Carry_l.jpg"><img
    src="/images/blake/bike/fixie/Carry_s.jpg"
    title="I can carry it." alt="My favourite feature." align="right"/></a>
</p>
<ul>
 <li><p>I can carry it!  (As you can see over on the right there.)  My commuter
     bike is a good ride, and very solid, but damn is it ever heavy,
     especially after I loaded it up with accessories like a rear rack, and
     panniers, and water bottles.  The fixie is simple, clean, and light
     enough to carry all over the place.
</p>

 </li>

 <li><p>The fixie is slower than my commuter bike.  Not just slower for the
     obvious reason (because I don’t have a higher gear to switch to), but
     it’s also slower for me to start, because I don’t have a lower gear to
     switch to.  It’s really kind of strange, since one of the things I seem
     to be really good at is starting really quickly from a dead stop.  Well,
     that used to be one of the things I was really good at.  On the fixie,
     not so much.
</p>

 </li>

 <li><p>Even though it’s slower I found that the fixie was a far smoother ride.
     Thinking about it a little more, perhaps because it’s slower.  Since it
     takes me so much longer to stop and start, I found myself slowing down
     earlier to try and conserve as much momentum as I could.
</p>

 </li>

 <li><p>All in all, I think that the new bike is going to be really good for me.
     It’ll slow me down, and calm me down, which are two things that I think I
     could use.  I can also feel how it’s changing the way I ride, making it
     more smooth, controlled, and thoughtful; keeping my legs moving to give
     me more exercise and stop them from seizing up; teaching me how to lift
     my butt off the seat to go over speed bumps while continuing to pedal.
</p>

 </li>
</ul>
<p>It’s fun.  A lot of fun.  I’m glad I finally got the conversion done, and
   I’m really looking forward to riding it.
</p>
<br clear="all"/></div>
<div class="storyFoot">[Posted at 22:29 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/random/biking/Fixie.html">link and comments</a> (3 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Mon, 23 Mar 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="tooManyRobots" href="http://weblog.latte.ca/blake/tech/iTouch/tooManyRobots.html"><b>Too many robots!  A newbie lesson about alertView:clickedButtonAtIndex:</b></a>
<div class="storyCategory">[/tech/iTouch]</div></div>
<div class="storyBody"><p>(With thanks to <a href="http://twitter.com/bunnyhero/">Bunnyhero</a>, both for the
   title, and the inspiration to get blogging again.)
</p>
<p>As you can probably guess, if you’ve read Bunnyhero’s <a href="http://www.bunnyhero.org/2009/03/23/too-many-monkeys-a-newbie-lesson-about-viewdidload/">blog post</a>, I recently learned that the AlertView delegate method
   <tt>alertView:clickedButtonAtIndex:</tt> can be called <em>multiple times
for one AlertView</em>, much to my surprise.
</p>
<p>And here’s how I found that out.  A couple of weeks ago, I ran across a
   bug in my still-in-development iPhone game.  I was displaying an alert
   when the game ended, and when the user clicked “Okay” it would go to the
   next level.  And it all seemed fine until one day, when instead of
   clicking the “Okay” button, I hit the home button to exit the game while
   the dialog was displayed, and the next time I entered the app, there
   were, like, 40 robots where I was expecting 8!
</p>
<p>As a favour to a <a href="http://pyre.third-bit.com/blog/">friend of mine</a> who’s
   a prof, I let the bug sit until I could debug the code in front of a
   room full of undergrads, as a part of <a href="https://stanley.cdf.toronto.edu/drproject/csc301-2009-01">the software engineering class</a> he teaches.
   (The whole experience turned out to not only be something that I wished
   I could have seen when I was an undergrad, but also something really fun
   to do from the the industry-type person side of things!  Anyone who has
   a laptop, and some code with a small bug that they don’t mind showing to
   a bunch of students should <em>really</em> give it a try!).  Debugging the
   problem led me not to the archiver/unarchiver as I was expecting, but
   instead to the observation that when I hit the home button, my delegate
   method was being called up to 5 times!
</p>
<p>This is why I saw way too many robots, because I was advancing 4 more
   levels than I should have been.  And so when I re-entered the game, it
   happily put me on level 5-ish, instead of level 2.
</p>
<p>The fix was fairly simple, if slightly inelegant.  I merely added in a
   flag to tell me when I was handling an alert, and would only advance the
   level when I thought I had popped the alert up.  (Now that I write it, I
   wonder if I can set the alert’s delegate to nil when I’m done handling
   it instead.  Thoughts, anyone?)
</p></div>
<div class="storyFoot">[Posted at 21:55 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/iTouch/tooManyRobots.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Wed, 18 Feb 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="sevenThings" href="http://weblog.latte.ca/blake/random/sevenThings.html"><b>Seven Things You Probably Didn’t Know About Me</b></a>
<div class="storyCategory">[/random]</div></div>
<div class="storyBody"><p>My life, such as it is, is pretty much an open book.  I’m not a very
   complicated person, so I don’t know if I can find seven things that the
   average reader of this blog probably doesn’t know about me.
</p>
<p>Still, that’s no reason not to try.  So, here we go.
</p>
<ol>
 <li><p>I’ve had two jobs that didn’t pay me.  After the first, I swore that if
      an employer didn’t pay me again, I would quit, but this last time they
      laid me off before I found out that I wasn’t getting paid.  The most
      recent company swears that they’re trying to get me my money, but I’m
      not going to hold my breath.
</p>

 </li>

 <li><p>I hated country music from the first time I heard Billy Ray (father of
      Miley) Cyrus until Elizabeth Campbell sent me a CD full of the good
      stuff.  So now the only kind of music I don’t like is “New Country”.
      And Schönberg.  <em>Der Mondfleck</em> sucks.
</p>

 </li>

 <li><p>I know enough Visual Basic to write a compiler for it, but you will
      never <em>ever</em> see it on any of my resumes.  <em>Ever</em>!  My policy is to only
      put on my resume things that I would enjoy working with on a day-to-day
      basis, and VB definitely isn’t one of those things.
</p>

 </li>

 <li><p>I am almost every link but for one in the first 5 pages of Google
      results for “Blake Winton”.  I guess that’s one of the benefits of being
      on the Internet for 17 years.  (Well, kinda.  Amy has been online as
      long as I have, but doesn’t show up until page 8 of the results for her
      name, mainly because of the Unicorns-riding-fairies artist who shares
      her name.)
</p>

 </li>

 <li><p>There’s a quarter of a cow in our downstairs freezer.  Well, quite a bit
      less now that Amy and I have eaten a bunch of it.  We split half a cow
      with some friends, and it arrived pre-chopped up, so we’ve been having
      at least one beef dinner per week, and often two.
</p>

 </li>

 <li><p>I download, watch, and enjoy, American Idol.  Less so, now that we’re
      out of the “Simon says snarky things to really bad singers”, and into
      the “Simon says snarky things to Ryan”, but it’s still enjoyable.  (Go
      Alexis Grace!)
</p>

 </li>

 <li><p>My first hard drive wasn’t actually 5 Meg, as I like to claim.  My
      father bought two hard drives, and took the 5 Meg one to the office,
      leaving the 10 Meg one at home.  The story about having 11 Meg of RAM is
      true, though.
</p>

 </li>
</ol>
<p>Okay, that’s my seven.  There were a few more I could think of, but I’m
   glad <a href="http://blog.codekills.net/archives/50-Seven-Things.html">David</a>
   didn’t run across the 25-things-about-you version, since then I would have
   had no choice but to resort to things you probably don’t want to know about
   me.
</p>
<p>In the tradition of disbelieving in bad luck, I will now tag no-one, thus
   breaking the chain.  (Although, if any of you are feeling verbose, feel
   free to pick up the meme and post a list of your own.)
</p></div>
<div class="storyFoot">[Posted at 21:30 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/random/sevenThings.html">link and comments</a> (2 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Wed, 11 Feb 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="couchInvoice" href="http://weblog.latte.ca/blake/tech/couchInvoice.html"><b>Creating invoices with CouchDB.</b></a>
<div class="storyCategory">[/tech]</div></div>
<div class="storyBody"><p>A while ago I (and the rest of the company I worked for) was laid off, so I
   was forcibly thrust into the world of consulting.  It’s been quite a
   change, keeping track of my hours and sending out invoices for the work I
   do.  And it’s that second point that I want to talk a little more about.
</p>
<p>Perhaps I’m too picky, but there seemed to be a fatal flaw with all the
   online invoicing tools I tried.  One didn’t allow enough clients for me on
   the free plan.  (Yes, I am that cheap, especially when I’ve just been laid
   off.)  Another would have allowed the client to dispute the invoice.  I
   mean, really.  This is the invoice.  You don’t get to dispute it.  Or at
   least, I don’t particularly want to make it easy for you.  So I ended up
   using an <a href="http://1timetracking.com/">online time tracker</a>, and left the
   invoice creation step until later.
</p>
<p>Well, later rolled around, and I really kinda wanted to get paid, so I
   downloaded a report of my hours <a href="http://1timetracking.com/#feature_tour">as a csv file</a>, and whipped up a quick Python
   script to parse it, and import it into a locally running copy of CouchDB.
</p>
<p>The python script looked like this:
</p>
<table><tr><td class="linenos"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36</pre></td><td class="code"><div class="codehilite"><pre><span class="k">import</span> <span class="nn">couchdb.client</span>
<span class="k">import</span> <span class="nn">csv</span>
<span class="k">import</span> <span class="nn">path</span>

<span class="n">server</span> <span class="o">=</span> <span class="n">couchdb</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">Server</span><span class="p">(</span><span class="s">&#39;http://localhost:5984/&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="s">&#39;timelog&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">server</span><span class="p">:</span>
    <span class="n">db</span> <span class="o">=</span> <span class="n">server</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s">&#39;timelog&#39;</span><span class="p">)</span>

<span class="n">db</span> <span class="o">=</span> <span class="n">server</span><span class="p">[</span><span class="s">&#39;timelog&#39;</span><span class="p">]</span>
<span class="k">print</span> <span class="n">db</span>

<span class="k">def</span> <span class="nf">cleanup</span><span class="p">():</span>
    <span class="c"># Clear out old rows.</span>
    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">db</span><span class="p">:</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">row</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;_&quot;</span><span class="p">):</span>
            <span class="k">del</span> <span class="n">db</span><span class="p">[</span><span class="n">row</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">input</span><span class="p">(</span> <span class="n">docName</span> <span class="p">):</span>
    <span class="k">print</span> <span class="n">docName</span>
    <span class="nb">input</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span> <span class="n">docName</span> <span class="p">)</span>
    <span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictReader</span><span class="p">(</span> <span class="nb">input</span> <span class="p">)</span>
    <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
        <span class="n">row</span><span class="p">[</span><span class="s">&#39;Import Doc Name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">docName</span>
        <span class="n">row</span><span class="p">[</span><span class="s">&#39;Import Doc Row&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
        <span class="k">if</span> <span class="s">&#39;Client Name&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">row</span><span class="p">:</span>
          <span class="n">row</span><span class="p">[</span><span class="s">&#39;Client Name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;Client1&quot;</span>
        <span class="n">key</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">_</span><span class="si">%03d</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">docName</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
        <span class="k">print</span> <span class="s">&quot;  &quot;</span><span class="p">,</span> <span class="n">key</span>
        <span class="n">db</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">row</span>
        <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>

<span class="n">cleanup</span><span class="p">()</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">path</span><span class="p">(</span><span class="s">&quot;/Users/bwinton/Documents/Client1&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">base</span><span class="o">.</span><span class="n">files</span><span class="p">(</span><span class="s">&quot;*.csv&quot;</span><span class="p">):</span>
    <span class="nb">input</span><span class="p">(</span> <span class="nb">file</span> <span class="p">)</span>
</pre></div>
</td></tr></table><p>Pretty easy, eh?  After that, I had to create a couple of CouchDB views:
</p>
<table><tr><td class="linenos"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53</pre></td><td class="code"><div class="codehilite"><pre><span class="c">// hoursPerDay</span>
<span class="nx">map</span><span class="o">=</span><span class="k">function</span><span class="p">(</span><span class="nx">doc</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">key</span> <span class="o">=</span> <span class="p">[</span>
    <span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Employee name&#39;</span><span class="p">]</span><span class="o">,</span>
    <span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Client Name&#39;</span><span class="p">]</span><span class="o">,</span>
    <span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Date of work&#39;</span><span class="p">]</span><span class="o">,</span> 
  <span class="p">];</span>
  <span class="nx">emit</span><span class="p">(</span> <span class="nx">key</span><span class="o">,</span> <span class="nx">doc</span> <span class="p">);</span>
<span class="p">};</span>
<span class="nx">reduce</span><span class="o">=</span><span class="k">function</span> <span class="p">(</span><span class="nx">tag</span><span class="o">,</span> <span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">sum</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span>
  <span class="nx">temp</span> <span class="o">=</span> <span class="p">[]</span>
  <span class="k">for</span><span class="p">(</span> <span class="k">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="nx">values</span><span class="p">.</span><span class="nx">length</span><span class="o">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">)</span> <span class="p">{</span>
    <span class="nx">sum</span> <span class="o">+=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="s1">&#39;Time in hours&#39;</span><span class="p">]);</span>
    <span class="nx">temp</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
      <span class="s1">&#39;Order&#39;</span><span class="o">:</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="s1">&#39;Import Doc Row&#39;</span><span class="p">]</span><span class="o">,</span>
      <span class="s1">&#39;Description&#39;</span><span class="o">:</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="s1">&#39;Description&#39;</span><span class="p">]</span><span class="o">,</span>
      <span class="s1">&#39;Time&#39;</span><span class="o">:</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="s1">&#39;Time in hours&#39;</span><span class="p">]</span><span class="o">,</span>
      <span class="s1">&#39;Type&#39;</span><span class="o">:</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="s1">&#39;Activity Type&#39;</span><span class="p">]</span><span class="o">,</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="nx">temp</span> <span class="o">=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">sort</span><span class="p">(</span><span class="k">function</span><span class="p">(</span><span class="nx">a</span><span class="o">,</span><span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">a</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">a</span><span class="p">[</span><span class="s1">&#39;Order&#39;</span><span class="p">])</span>
    <span class="nx">b</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">b</span><span class="p">[</span><span class="s1">&#39;Order&#39;</span><span class="p">])</span>
    <span class="k">return</span> <span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span>
  <span class="p">})</span>
  <span class="k">return</span> <span class="p">[</span><span class="nx">sum</span><span class="o">,</span> <span class="nx">temp</span><span class="p">];</span>
<span class="p">};</span>

<span class="c">// totalHours</span>
<span class="c">// This view is just to save me re-calculating this value every time</span>
<span class="c">// I call the page, because it should only change when we add a new</span>
<span class="c">// document.</span>
<span class="nx">map</span><span class="o">=</span><span class="k">function</span><span class="p">(</span><span class="nx">doc</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">key</span> <span class="o">=</span> <span class="p">[</span>
    <span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Employee name&#39;</span><span class="p">]</span><span class="o">,</span>
    <span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Client Name&#39;</span><span class="p">]</span><span class="o">,</span>
    <span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Date of work&#39;</span><span class="p">]</span><span class="o">,</span> 
  <span class="p">];</span>
  <span class="nx">emit</span><span class="p">(</span> <span class="nx">key</span><span class="o">,</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">doc</span><span class="p">[</span><span class="s1">&#39;Time in hours&#39;</span><span class="p">])</span> <span class="p">);</span>
<span class="p">};</span>
<span class="nx">reduce</span><span class="o">=</span><span class="k">function</span><span class="p">(</span><span class="nx">keys</span><span class="o">,</span> <span class="nx">values</span><span class="o">,</span> <span class="nx">rereduce</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">function</span> <span class="nx">sum</span><span class="p">(</span> <span class="nx">values</span> <span class="p">)</span>
  <span class="p">{</span>
    <span class="nx">retval</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="nx">values</span><span class="p">.</span><span class="nx">length</span><span class="o">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="nx">retval</span> <span class="o">+=</span> <span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">retval</span><span class="o">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="nx">sum</span><span class="p">(</span><span class="nx">values</span><span class="p">);</span>
<span class="p">};</span>
</pre></div>
</td></tr></table><p>it was a quick snippet of HTML:
</p>
<table><tr><td class="linenos"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35</pre></td><td class="code"><div class="codehilite"><pre><span class="nt">&lt;html&gt;</span>
  <span class="nt">&lt;head&gt;&lt;title&gt;</span>Time Log<span class="nt">&lt;/title&gt;</span>
    <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href=</span><span class="s">&quot;style/blueprint.css&quot;</span> <span class="na">type=</span><span class="s">&quot;text/css&quot;</span><span class="nt">&gt;</span>
    <span class="nt">&lt;script&gt;</span>
      <span class="c">// Set up some variables.</span>
      <span class="nx">months</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;2009-02&quot;</span> <span class="p">]</span>
      <span class="nx">users</span> <span class="o">=</span> <span class="p">{</span>
        <span class="s2">&quot;Blake Winton&quot;</span><span class="o">:</span><span class="p">{</span>
          <span class="nx">invoiceDates</span> <span class="o">:</span> <span class="p">[</span> <span class="s2">&quot;March 1st, 2009.&quot;</span><span class="p">]</span><span class="o">,</span>
          <span class="nx">address</span> <span class="o">:</span> <span class="p">[</span><span class="s2">&quot;16 Forman Avenue&quot;</span><span class="o">,</span>
                     <span class="s2">&quot;Toronto, ON, M4S 2R2&quot;</span><span class="o">,</span>
                     <span class="s2">&quot;bwinton@latte.ca&quot;</span><span class="p">]</span>
        <span class="p">}};</span>
    <span class="nt">&lt;/script&gt;</span>
    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;script/bwTimesheet.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
  <span class="nt">&lt;/head&gt;</span>
  <span class="nt">&lt;body&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">&quot;prepend-1&quot;</span><span class="nt">&gt;&lt;b&gt;</span>Blake Winton<span class="nt">&lt;/b&gt;&lt;br/&gt;</span>
    16 Forman Avenue<span class="nt">&lt;br/&gt;</span>
    Toronto, ON, M4S 2R2<span class="nt">&lt;br/&gt;</span>
    bwinton@latte.ca<span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">&quot;prepend-1&quot;</span><span class="nt">&gt;&lt;b&gt;</span>Invoice Number:<span class="nt">&lt;/b&gt;</span>
      XX-<span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;invoiceNum&quot;</span><span class="nt">&gt;</span>000<span class="nt">&lt;/span&gt;&lt;br/&gt;</span>
    <span class="nt">&lt;b&gt;</span>Date:<span class="nt">&lt;/b&gt;</span> <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;invoiceDate&quot;</span><span class="nt">&gt;</span>March 5th, 1973.<span class="nt">&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</span>

    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;prepend-1 span-1&quot;</span><span class="nt">&gt;&lt;b&gt;</span>To:<span class="nt">&lt;/b&gt;&lt;/div&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;span-22 last&quot;</span><span class="nt">&gt;</span>
    Client Name<span class="nt">&lt;br/&gt;</span>
    16 Client Address<span class="nt">&lt;/div&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">&quot;span-24&quot;</span><span class="nt">&gt;</span><span class="ni">&amp;nbsp;</span><span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;p&gt;&lt;span</span> <span class="na">id=</span><span class="s">&quot;timesheet&quot;</span><span class="nt">&gt;</span>Timesheet loading...<span class="nt">&lt;/span&gt;</span>
      <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;summary&quot;</span><span class="nt">&gt;</span>Summary loading...<span class="nt">&lt;/span&gt;</span>
    <span class="nt">&lt;/p&gt;</span>
  <span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</pre></div>
</td></tr></table><p>and Javascript:
</p>
<table><tr><td class="linenos"><pre>  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131</pre></td><td class="code"><div class="codehilite"><pre><span class="c">// Get a default month, if one wasn’t passed in.</span>
<span class="nx">month</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">url</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;month&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="nx">month</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;undefined&#39;</span><span class="p">)</span>
<span class="p">{</span>
  <span class="nx">month</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span><span class="o">;</span>
<span class="p">}</span>
<span class="nx">month</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">month</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span> <span class="nx">month</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">month</span> <span class="o">&gt;=</span> <span class="nx">months</span><span class="p">.</span><span class="nx">length</span> <span class="p">)</span>
<span class="p">{</span>
  <span class="nx">month</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="p">}</span>
<span class="nx">invoiceNumInt</span> <span class="o">=</span> <span class="nx">month</span><span class="o">+</span><span class="mi">1</span><span class="o">;</span>
<span class="nx">month</span> <span class="o">=</span> <span class="nx">months</span><span class="p">[</span><span class="nx">month</span><span class="p">];</span>

<span class="c">// Get a default user, if one wasn’t passed in.</span>
<span class="c">// Yeah, I’ve defaulted it to me.  ;)</span>
<span class="nx">user</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">url</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;user&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;undefined&#39;</span><span class="p">)</span>
<span class="p">{</span>
  <span class="nx">user</span> <span class="o">=</span> <span class="s2">&quot;Blake Winton&quot;</span><span class="o">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">user</span> <span class="k">in</span> <span class="nx">users</span><span class="p">))</span>
<span class="p">{</span>
  <span class="nx">user</span> <span class="o">=</span> <span class="s2">&quot;Blake Winton&quot;</span><span class="o">;</span>
<span class="p">}</span>

<span class="c">// Figure out when to start and end the invoice.</span>
<span class="nx">invoiceDates</span> <span class="o">=</span> <span class="nx">users</span><span class="p">[</span><span class="nx">user</span><span class="p">].</span><span class="nx">invoiceDates</span><span class="o">;</span>
<span class="nx">invoiceDateStr</span> <span class="o">=</span> <span class="nx">invoiceDates</span><span class="p">[</span><span class="nx">invoiceNumInt</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
<span class="nx">start</span> <span class="o">=</span> <span class="p">[</span><span class="nx">user</span><span class="o">,</span> <span class="nx">client</span><span class="o">,</span> <span class="nx">month</span><span class="o">+</span><span class="s2">&quot;-01&quot;</span><span class="p">];</span>
<span class="nx">end</span> <span class="o">=</span> <span class="p">[</span><span class="nx">user</span><span class="o">,</span> <span class="nx">client</span><span class="o">,</span> <span class="nx">month</span><span class="o">+</span><span class="s2">&quot;-31&quot;</span><span class="p">];</span>

<span class="c">// Why, oh why, doesn’t Javascript have printf?</span>
<span class="k">function</span> <span class="nx">zeroPad</span><span class="p">(</span><span class="nx">num</span><span class="o">,</span><span class="nx">count</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">var</span> <span class="nx">numZeropad</span> <span class="o">=</span> <span class="nx">num</span> <span class="o">+</span> <span class="s1">&#39;&#39;</span><span class="o">;</span>
  <span class="k">while</span><span class="p">(</span><span class="nx">numZeropad</span><span class="p">.</span><span class="nx">length</span> <span class="o">&lt;</span> <span class="nx">count</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="nx">numZeropad</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span> <span class="o">+</span> <span class="nx">numZeropad</span><span class="o">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="nx">numZeropad</span><span class="o">;</span>
<span class="p">}</span>

<span class="c">// Update the header, with the address, invoice number, and date.</span>
<span class="k">function</span> <span class="nx">updateHeader</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">var</span> <span class="nx">address</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#address&quot;</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
  <span class="nx">address</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span> <span class="s2">&quot;&lt;b&gt;&quot;</span><span class="o">+</span><span class="nx">user</span><span class="o">+</span><span class="s2">&quot;&lt;/b&gt;&lt;br/&gt;&quot;</span> <span class="p">);</span>
  <span class="k">for</span> <span class="p">(</span><span class="k">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="nx">users</span><span class="p">[</span><span class="nx">user</span><span class="p">].</span><span class="nx">address</span><span class="p">.</span><span class="nx">length</span><span class="o">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">var</span> <span class="nx">line</span> <span class="o">=</span> <span class="nx">users</span><span class="p">[</span><span class="nx">user</span><span class="p">].</span><span class="nx">address</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
    <span class="nx">address</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span> <span class="nx">line</span> <span class="o">+</span> <span class="s2">&quot;&lt;br/&gt;&quot;</span> <span class="p">);</span>
  <span class="p">}</span>

  <span class="k">var</span> <span class="nx">invoiceNum</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#invoiceNum&quot;</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
  <span class="nx">invoiceNum</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span> <span class="nx">zeroPad</span><span class="p">(</span> <span class="nx">invoiceNumInt</span><span class="o">,</span> <span class="mi">3</span> <span class="p">));</span>

  <span class="k">var</span> <span class="nx">invoiceDate</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#invoiceDate&quot;</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
  <span class="nx">invoiceDate</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span> <span class="nx">invoiceDateStr</span> <span class="p">);</span>
  <span class="nx">updateTimesheet</span><span class="p">();</span>
<span class="p">}</span>

<span class="c">// Update the timesheet, with hours and descriptions.</span>
<span class="k">function</span> <span class="nx">updateTimesheet</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">var</span> <span class="nx">timesheet</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#timesheet&quot;</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
  <span class="k">var</span> <span class="nx">dbs</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">couch</span><span class="p">.</span><span class="nx">db</span><span class="p">(</span><span class="s2">&quot;timelog&quot;</span><span class="p">).</span><span class="nx">view</span><span class="p">(</span><span class="s2">&quot;invoice/hoursPerDay&quot;</span><span class="o">,</span><span class="p">{</span>
    <span class="nx">group</span><span class="o">:</span> <span class="kc">true</span><span class="o">,</span>
    <span class="nx">startkey</span><span class="o">:</span> <span class="nx">start</span><span class="o">,</span>
    <span class="nx">endkey</span><span class="o">:</span> <span class="nx">end</span><span class="o">,</span>
    <span class="nx">success</span><span class="o">:</span> <span class="k">function</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">{</span>
      <span class="nx">table</span> <span class="o">=</span> <span class="s2">&quot;&lt;div class=&#39;span-20 prepend-1 last&#39;&gt;&lt;table class=&#39;timelog&#39;&gt;&quot;</span><span class="o">;</span>
      <span class="nx">rowNum</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
      <span class="nx">response</span> <span class="o">=</span> <span class="nx">r</span><span class="p">[</span><span class="s1">&#39;rows&#39;</span><span class="p">]</span>
      <span class="k">for</span> <span class="p">(</span><span class="k">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">response</span><span class="p">.</span><span class="nx">length</span><span class="o">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">var</span> <span class="nx">record</span> <span class="o">=</span> <span class="nx">response</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
        <span class="k">var</span> <span class="nx">date</span> <span class="o">=</span> <span class="nx">record</span><span class="p">[</span><span class="s1">&#39;key&#39;</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
        <span class="k">var</span> <span class="nx">total</span> <span class="o">=</span> <span class="nx">record</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
        <span class="k">var</span> <span class="nx">entries</span> <span class="o">=</span> <span class="nx">record</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">][</span><span class="mi">1</span><span class="p">];</span>
        <span class="nx">table</span> <span class="o">+=</span> <span class="s2">&quot;&lt;tr class=&#39;row&quot;</span><span class="o">+</span><span class="nx">rowNum</span><span class="o">+</span><span class="s2">&quot;&#39;&gt;&lt;td&gt;&quot;</span> <span class="o">+</span>
        <span class="nx">date</span> <span class="o">+</span> <span class="s2">&quot;&lt;/td&gt;&lt;td&gt;&quot;</span> <span class="o">+</span>
        <span class="nx">total</span> <span class="o">+</span> <span class="s2">&quot;h&lt;/td&gt;&quot;</span><span class="o">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="k">var</span> <span class="nx">j</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="nx">j</span> <span class="o">&lt;</span> <span class="nx">entries</span><span class="p">.</span><span class="nx">length</span><span class="o">;</span> <span class="nx">j</span><span class="o">++</span> <span class="p">)</span>
        <span class="p">{</span>
          <span class="k">if</span> <span class="p">(</span><span class="nx">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
          <span class="p">{</span>
            <span class="nx">table</span> <span class="o">+=</span> <span class="s2">&quot;&lt;tr class=&#39;row&quot;</span><span class="o">+</span><span class="nx">rowNum</span><span class="o">+</span><span class="s2">&quot;&#39;&gt;&lt;td/&gt;&lt;td/&gt;&quot;</span><span class="o">;</span>
          <span class="p">}</span>
          <span class="nx">table</span> <span class="o">+=</span> <span class="s2">&quot;&lt;td&gt;&quot;</span> <span class="o">+</span> <span class="nx">entries</span><span class="p">[</span><span class="nx">j</span><span class="p">][</span><span class="s1">&#39;Time&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;h - &quot;</span> <span class="o">+</span>
            <span class="nx">entries</span><span class="p">[</span><span class="nx">j</span><span class="p">][</span><span class="s1">&#39;Description&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;&lt;/td&gt;&lt;/tr&gt;&quot;</span><span class="o">;</span>
          <span class="nx">rowNum</span> <span class="o">+=</span> <span class="mi">1</span><span class="o">;</span>
          <span class="nx">rowNum</span> <span class="o">%=</span> <span class="mi">2</span><span class="o">;</span>
        <span class="p">}</span>
      <span class="p">}</span>
      <span class="nx">table</span> <span class="o">+=</span> <span class="s2">&quot;&lt;/table&gt;&lt;/div&gt;&quot;</span><span class="o">;</span>
      <span class="nx">timesheet</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span> <span class="nx">table</span> <span class="p">);</span>
      <span class="nx">updateSummary</span><span class="p">();</span>
    <span class="p">}</span>
  <span class="p">})</span>
<span class="p">};</span>

<span class="c">// And finally, update the important stuff.</span>
<span class="c">// The total hours, rate, and amount owed.</span>
<span class="k">function</span> <span class="nx">updateSummary</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">var</span> <span class="nx">dbs</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">couch</span><span class="p">.</span><span class="nx">db</span><span class="p">(</span><span class="s2">&quot;timelog&quot;</span><span class="p">).</span><span class="nx">view</span><span class="p">(</span><span class="s2">&quot;invoice/totalHours&quot;</span><span class="o">,</span><span class="p">{</span>
    <span class="nx">startkey</span><span class="o">:</span> <span class="nx">start</span><span class="o">,</span>
    <span class="nx">endkey</span><span class="o">:</span> <span class="nx">end</span><span class="o">,</span>
    <span class="nx">success</span><span class="o">:</span> <span class="k">function</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">{</span>
      <span class="nx">summary</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#summary&quot;</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
      <span class="nx">content</span> <span class="o">=</span> <span class="s2">&quot;&lt;p class=&#39;span-20 prepend-1 last&#39;&gt;&quot;</span><span class="o">;</span>
      <span class="k">if</span> <span class="p">(</span> <span class="nx">r</span><span class="p">[</span><span class="s1">&#39;rows&#39;</span><span class="p">].</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span>
      <span class="p">{</span>
        <span class="nx">content</span> <span class="o">+=</span> <span class="s2">&quot;No data available.&quot;</span><span class="o">;</span>
      <span class="p">}</span>
      <span class="k">else</span>
      <span class="p">{</span>
        <span class="nx">value</span> <span class="o">=</span> <span class="nx">r</span><span class="p">[</span><span class="s1">&#39;rows&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">];</span>
        <span class="nx">content</span> <span class="o">+=</span> <span class="s2">&quot;&lt;b&gt;Total hours:&lt;/b&gt; &quot;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s2">&quot;&lt;br/&gt;&quot;</span> <span class="o">+</span>
          <span class="s2">&quot;&lt;b&gt;Rate:&lt;/b&gt; $&quot;</span> <span class="o">+</span> <span class="nx">rate</span> <span class="o">+</span> <span class="nx">currency</span> <span class="o">+</span><span class="s2">&quot;/hour.&lt;br/&gt;&quot;</span> <span class="o">+</span>
          <span class="s2">&quot;&lt;b&gt;Sub-total:&lt;/b&gt; $&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">value</span><span class="o">*</span><span class="nx">rate</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&lt;br/&gt;&quot;</span> <span class="o">+</span>
          <span class="s2">&quot;&lt;b&gt;Tax (GST @ 5%):&lt;/b&gt; $&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">value</span><span class="o">*</span><span class="mi">5</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&lt;br/&gt;&quot;</span> <span class="o">+</span>
          <span class="s2">&quot;&lt;b&gt;Total Payable:&lt;/b&gt; $&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">value</span><span class="o">*</span><span class="p">(</span><span class="nx">rate</span><span class="o">+</span><span class="mi">5</span><span class="p">)).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&lt;br/&gt;&quot;</span>
          <span class="p">}</span>
          <span class="nx">content</span> <span class="o">+=</span> <span class="s2">&quot;&lt;/p&gt;&quot;</span><span class="o">;</span>
          <span class="nx">summary</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span> <span class="nx">content</span> <span class="p">);</span>
    <span class="p">}</span>
  <span class="p">});</span>
<span class="p">};</span>

<span class="c">// When the document is ready, kick off the updates.</span>
<span class="nx">$</span><span class="p">(</span><span class="k">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">updateHeader</span><span class="p">();</span>
<span class="p">});</span>
</pre></div>
</td></tr></table><p>And we’re done.  Not to sound too much like an infomercial, but with <a href="http://jquery.com/">JQuery</a>, <a href="http://www.blueprintcss.org/">Blueprint</a>, <a href="http://couchdb.apache.org/">CouchDB</a>, and <a href="http://www.python.org/">Python</a>, it took me
   only 255 lines of code to get a decent-enough-quality invoice that I could save
   it as a PDF, send to the client, and get paid.  In fact, the client liked it
   enough (or just wanted things to be standard enough) that they asked that the
   other consultant on the project use the same template, so I had to spend some
   time taking my original invoice script and editing it to support more than one
   user.  Either way, I would call it a success.
</p></div>
<div class="storyFoot">[Posted at 22:10 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/couchInvoice.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Mon, 02 Feb 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="vim" href="http://weblog.latte.ca/blake/tech/vim.html"><b>Home again…</b></a>
<div class="storyCategory">[/tech]</div></div>
<div class="storyBody"><p>A while ago, I downloaded Aquamacs, an emacs port for OSX, and tried
   to switch to it as my default editor.  I mainly did it because I
   wanted an editor I could add functionality to, à la <a href="http://steve.yegge.googlepages.com/effective-emacs">Steve Yegge</a>.  I used it for a
   while, and got fairly proficient at it.  There were a lot of things
   about it I really liked, like the <a href="http://jblevins.org/projects/markdown-mode/">Markdown mode</a>, and the ability to edit
   files <a href="http://jeremy.zawodny.com/blog/archives/000983.html">on a remote host</a>, and the way I
   could write small functions in <a href="http://www.gnu.org/software/emacs/manual/html_mono/elisp.html">elisp</a> and use
   them to make me more productive.
</p>
<p>But while it worked, and worked well, I didn’t really write all that
   much extra elisp, and whenever I did, I didn’t really enjoy it.  So
   the other day, when I found myself <a href="http://weblog.jamisbuck.org/2005/4/10/text-editing-dilemma">reading a weblog</a> about the
   lack of a good graphical text editor on OSX, I found myself agreeing
   with him.  So when I read <a href="http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim">a later article</a> on how the
   author had finally switched back to vim, I thought that I might give
   vim another chance.
</p>
<p>Well, it turns out that vim is actually pretty close to a perfect text
   editor for me.  It’s got <a href="http://plasticboy.com/markdown-vim-mode/">Markdown support</a>, <a href="http://www.petersblog.org/node/466">remote file editing</a>, and not only can I write
   functions for it, I can <a href="http://www.vim.org/htmldoc/if_pyth.html">write them</a> in
   <a href="http://python.org/">Python</a>!  As an example, here’s Steve Yegge’s
   blog-check function in vim/python:
</p>
<table><tr><td class="linenos"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16</pre></td><td class="code"><div class="codehilite"><pre><span class="k">function</span><span class="p">!</span> BlogCheck<span class="p">()</span>
  python <span class="p">&lt;&lt;</span> END
<span class="k">import</span> <span class="nn">re</span>
<span class="k">import</span> <span class="nn">vim</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span> <span class="s">r&quot;\s&quot;</span> <span class="p">)</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">vim</span><span class="o">.</span><span class="n">current</span><span class="o">.</span><span class="n">buffer</span><span class="p">:</span>
  <span class="n">line</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span> <span class="s">&quot;&quot;</span><span class="p">,</span> <span class="n">line</span> <span class="p">)</span>
  <span class="n">count</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">if</span> <span class="n">count</span> <span class="o">&lt;=</span> <span class="mi">5000</span><span class="p">:</span>
  <span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Okay so far&quot;</span>
<span class="k">else</span><span class="p">:</span>
  <span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Dude, too long&quot;</span>
<span class="k">print</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">:  </span><span class="si">%d</span><span class="s"> chars, </span><span class="si">%d</span><span class="s"> words&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">count</span><span class="o">/</span><span class="mi">5</span><span class="p">)</span>
END
<span class="k">endfunction</span>
</pre></div>
</td></tr></table></div>
<div class="storyFoot">[Posted at 15:48 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/vim.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Tue, 13 Jan 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="freeWifi" href="http://weblog.latte.ca/blake/tech/freeWifi.html"><b>Okay, this is cool.</b></a>
<div class="storyCategory">[/tech]</div></div>
<div class="storyBody"><p>I found myself downtown today, with nothing really to do between 3:30
   and 6:30.  I suppose I could have headed over to U of T, but it seemed
   like sort of a long way to go just to connect to the internet and come
   all the way back again.  So instead of making the trek, or wasting two
   tokens, I took advantage of the 2 hours of free WiFi that comes with
   my Starbucks card, and stayed near Yonge, drinking green tea with a
   little honey, and investigating a few bugs for work.  After it runs
   out (in another 31 minutes), I think I'm going to pack up, and walk
   north to my next appointment, grabbing some dinner on the way.  If I'm
   right, that should put me right where I need to be, right when I need
   to be there.
</p>
<p>Ah, if only everything in my life could fall into place this easily.
   (The upgrade to Aquamacs 1.6 that I just did also worked out really
   well.  Maybe today is just my day for doing stuff!)
</p></div>
<div class="storyFoot">[Posted at 16:49 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/tech/freeWifi.html">link and comments</a> (0 comments) </div>
</div>
</div>
</div>
<div class="blosxomDayDiv">
<div class="blosxomDate">Fri, 09 Jan 2009</div>
<div class="story">
<div class="xfolkentry">
<div class="storyTitle"><a class="taggedlink" name="thoughts" href="http://weblog.latte.ca/blake/employment/thoughts.html"><b>Things on my mind.</b></a>
<div class="storyCategory">[/employment]</div></div>
<div class="storyBody"><p>I was chatting with a friend and former co-worker of mine today, and
   asked him why I was never a part of the group guiding where the
   company was going.  (Okay, I actually asked why I was never a part of
   the management, but in retrospect that was the wrong question, for
   reasons detailed below.  I should have asked the question I said
   above.)  His answer basically boiled down to “You never wanted to be.”
   One of the things he mentioned was that when I traded salary for extra
   vacation days (something I was fairly proud of thinking of, since it
   makes me an easier sell to the CFO, and the two are pretty much equal,
   if you’re allowed to cash out unused vacation days), it indicated that
   my priorities lay more with my family than with the company, with the
   unspoken implication that that attitude isn’t one that will lead to a
   position of power within the company.  That initial assumption led to
   a series of misunderstandings, and miscommunications, until I was
   effectively shut out of helping to guide the company.
</p>
<p>I guess that’s fair enough, kinda, but it’s a shame that people think
   that having interests outside of the office means that I’m somehow
   less interested in the success of the company.  Particularly since I
   didn’t take the vacation days, and was always intending on cashing
   them out.  So, for my next job, I think I’m going to take that option
   off the table, since I didn’t use the vacation days anyways.  (I had
   27 days built up when I was laid off!)
</p>
<p>I also asked him what I could do to get into management next time, but
   I’m not really sure that’s really where I want to be.  I know a few
   people who have moved into management, and then found it hard to get a
   job when they were laid off.  Along the same lines, I still believe
   I’m a far better architect and coder than manager, and so it’s sort of
   foolish for a company to hire me for my managerial skills when my
   coding skills are far superior.  And I really <em>really</em> like
   programming.  <strong>Really</strong>.  With the spare time I had after I was laid
   off, I wrote code for an iPhone game.  For fun I read up on
   programming languages I haven’t seen before, and solve <a href="http://projecteuler.net/">Project
Euler</a> problems with them.  But I don’t
   know if there’s a way to parlay my architecture and coding prowess
   into the ability to help guide a company, since that seems to be the
   exclusive province of people who manage other people.  (Of course, my
   work on <a href="http://www.basieproject.org">Basie</a> last term also has me
   wondering if I’m actually a mediocre manager, or if I may be better at
   it than I always thought I was.)
</p>
<p>I suppose there’s always one way to find out how good a manager/team
   lead I am, and I expect I’ll start moving that direction in my next
   job.  I can always write code on evenings and weekends, right?  Well,
   either way, it’s not something I’ll worry about until I get another
   job.  And certainly not something I should be worrying about this
   late at night.
</p></div>
<div class="storyFoot">[Posted at 22:22 by <span class="vcard"><a class="url fn" href="http://bwinton.latte.ca/">Blake Winton</a></span>] <a href="http://weblog.latte.ca/blake/employment/thoughts.html">link and comments</a> (1 comments) </div>
</div>
</div>
</div>
  </div>
  <div class="footer">
   <div class="footBox">
    <div class="footTitle">Categories:</div><br />
    <a href="http://weblog.latte.ca/">/</a> (627)<br /><a href="http://weblog.latte.ca/amy">amy/</a> (329)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/books">books/</a> (81)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/_2005">_2005/</a> (31)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/_2006">_2006/</a> (13)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/_2007">_2007/</a> (6)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/_2008">_2008/</a> (6)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/_2009">_2009/</a> (23)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/_2010">_2010/</a> (1)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/books/children">children/</a> (1)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/career">career/</a> (4)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/diversions">diversions/</a> (36)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/everythingelse">everythingelse/</a> (92)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/food">food/</a> (10)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/girls">girls/</a> (22)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/girls/positiveParenting">positiveParenting/</a> (3)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/houseandhome">houseandhome/</a> (38)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/houseandhome/garden">garden/</a> (5)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/houseandhome/reno">reno/</a> (18)<br />&#160;&#160;&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/houseandhome/reno/deck">deck/</a> (12)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/letters">letters/</a> (3)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/news">news/</a> (6)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/running">running/</a> (16)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/stuff">stuff/</a> (3)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/unsolicited advice">unsolicited advice/</a> (9)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/amy/unsolicited advice/food">food/</a> (2)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/whingeing">whingeing/</a> (5)<br />&#160;&#160;<a href="http://weblog.latte.ca/amy/writing">writing/</a> (2)<br /><a href="http://weblog.latte.ca/blake">blake/</a> (142)<br />&#160;&#160;<a href="http://weblog.latte.ca/blake/camera">camera/</a> (2)<br />&#160;&#160;<a href="http://weblog.latte.ca/blake/employment">employment/</a> (9)<br />&#160;&#160;<a href="http://weblog.latte.ca/blake/family">family/</a> (8)<br />&#160;&#160;<a href="http://weblog.latte.ca/blake/random">random/</a> (51)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/random/biking">biking/</a> (29)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/random/bread">bread/</a> (1)<br />&#160;&#160;<a href="http://weblog.latte.ca/blake/reviews">reviews/</a> (3)<br />&#160;&#160;<a href="http://weblog.latte.ca/blake/tech">tech/</a> (69)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/basie">basie/</a> (2)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/bzr">bzr/</a> (3)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/drproject">drproject/</a> (2)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/iTouch">iTouch/</a> (9)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/mac">mac/</a> (3)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/opengl">opengl/</a> (1)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/pEdit">pEdit/</a> (1)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/progect">progect/</a> (1)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/python">python/</a> (2)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/scheme">scheme/</a> (3)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/thunderbird">thunderbird/</a> (9)<br />&#160;&#160;&#160;&#160;<a href="http://weblog.latte.ca/blake/tech/weblog">weblog/</a> (7)<br /><a href="http://weblog.latte.ca/callOuts">callOuts/</a> (3)<br /><a href="http://weblog.latte.ca/charity">charity/</a> (2)<br /><a href="http://weblog.latte.ca/cordelia">cordelia/</a> (51)<br />&#160;&#160;<a href="http://weblog.latte.ca/cordelia/conversations">conversations/</a> (1)<br /><a href="http://weblog.latte.ca/delphine">delphine/</a> (94)<br />&#160;&#160;<a href="http://weblog.latte.ca/delphine/conversations">conversations/</a> (26)<br />&#160;&#160;<a href="http://weblog.latte.ca/delphine/pictures">pictures/</a> (8)<br />&#160;&#160;<a href="http://weblog.latte.ca/delphine/sleeping">sleeping/</a> (1)<br />&#160;&#160;<a href="http://weblog.latte.ca/delphine/writes">writes/</a> (2)<br /><a href="http://weblog.latte.ca/woody">woody/</a> (3)
   </div>
   <div class="footBox">
    <div class="footTitle">Links:</div><br />
     Local<br/>
     <ul class="sidebar">
      <li><a href="http://weblog.latte.ca/2004/01/15#about">About Blog-o!</a></li>
      <li><a href="http://arbrown.latte.ca/">Amy’s home page</a></li>
      <li><a href="http://bwinton.latte.ca/">Blake’s home page</a></li>
      <li><a href="http://delphine.latte.ca/">Delphine’s home page</a></li>
      <li><a href="http://baby.latte.ca/">Cordelia’s home page</a></li>
      <li><a href="http://arbrown.latte.ca/me.html">About Amy</a></li>
      <li><a href="http://arbrown.latte.ca/reading.html">Amy’s Book Log</a></li>
     </ul>
     Amy’s Journals<br/>
     <ul class="sidebar">
      <li><a href="http://www.tantastik.org/">Tan</a></li>
      <li><a href="http://www.darn-tootin.com/">Rob</a></li>
      <li><a href="http://www.whatsthefuss.com/">Fussy</a></li>
      <li><a href="http://www.eileene.net/">Iko</a></li>
      <li><a href="http://www.xeney.com/">Beth</a></li>
      <li><a href="http://mayaroo.diary-x.com/">mayaroo</a></li>
      <li><a href="http://fluff328.diaryland.com/">Ellie</a></li>
      <li><a href="http://www.analecta.net/">Stacey</a></li>
      <li><a href="http://www.hashai.com/">Anna Beth</a></li>
      <li><a href="http://leontinemay.blogspot.com/">Leontine</a></li>
      <li><a href="http://littleowl.com/thursday/">Other Beth</a></li>
      <li><a href="http://www.aproposofnothing.net/apropos/">Sasha</a></li>
     </ul>
     Amy’s Fun<br/>
     <ul class="sidebar">
      <li><a href="http://movie-reviews.colossus.net/movies.html">James
          Berardinelli's New Movie Reviews page</a></li>
      <li><a href="http://www.theusuals.net">The Usual Suspects</a></li>
     </ul>
    <a href="http://twitter.com/amyrhoda">amyrhoda's Twitter</a> (caching for another 0:15:22)<br />
<ul class="sidebar">
<li>Early morning camp registration a success!</li>
<li>.@Jeffrey_Donovan I'm only sad Burn Notice won't be on again for ages. What a fantastic show!</li>
<li>@michelleknudsen Fairy Friends! That was you! I loved that book. And you're the Fish and Frog lady too! That's so cool. #unabashedfangirl</li>
<li>Can't remember who recommended Economy Gastronomy - I love it! Thanks! Wish they had N. Americanized the measurements, though.</li>
<li><a href="http://twitter.com/CopperLeafSt/status/10248237577">@CopperLeafSt</a> Yeah, that's the one! Wish me luck!</li>
<li>I'm all prepared for tomorrow morning's Toronto Parks and Rec clusterfuck, when every mom in the city calls the same phone number at once.</li>
<li><a href="http://twitter.com/caffekat/status/10188081791">@caffekat</a> Because she sounds like a horrific character.</li>
<li>Someone was asking about apps that dim background applications, for Windows: http://tinyurl.com/7s2jeq They probably don't follow me, tho.</li>
</ul>

    <a href="http://del.icio.us/bwinton">bwinton's Del.icio.us</a> (caching for another 0:45:22)<br />
<a href="http://del.icio.us/network?add=bwinton">Add me to your network</a><br/>
<ul class="sidebar">
<li><img src="http://markdownr.com/favicon.ico" height="16" width="16"/><a href="http://markdownr.com/">Markdownr</a><br/>Yeah, I should figure out how to do something like this for my blog posts.</li>
<li><img src="https://wiki.mozilla.org/favicon.ico" height="16" width="16"/><a href="https://wiki.mozilla.org/Raindrop/Install">Raindrop/Install - MozillaWiki</a><br/>It's like all the cool stuff I've worked with, all mashed together.</li>
<li><img src="http://www.adamatomic.com/favicon.ico" height="16" width="16"/><a href="http://www.adamatomic.com/canabalt/">Canabalt Widescreen!</a><br/></li>
<li><img src="http://www.canabalt.com/favicon.ico" height="16" width="16"/><a href="http://www.canabalt.com/">Canabalt!</a><br/></li>
<li><img src="http://arrenbrecht.ch/favicon.ico" height="16" width="16"/><a href="http://arrenbrecht.ch/mercurial/pbranch/index.htm">Patch Branches for Mercurial (pbranch)</a><br/>pbranch is the new mq!</li>
</ul>

    <a href="http://twitter.com/bwinton">bwinton's Twitter</a> (caching for another 0:15:23)<br />
<ul class="sidebar">
<li>(For @runmad) I predict "Tue Mar  9 18:18:55 2010" as the Tweetie 2 unlock time.  (Ah, math.)</li>
<li><a href="http://twitter.com/herhighnessness/status/10235037232">@herhighnessness</a> 16 Gigs, and whaddya get?  Another day older and deeper in debt.</li>
<li><a href="http://twitter.com/adamgoucher/status/10234274876">@adamgoucher</a> A house, but neither of them are as expensive as a hozse, whatever that may be.</li>
<li><a href="http://twitter.com/EccentricFlower/status/10229624528">@EccentricFlower</a> I care, for what that's worth.</li>
<li><a href="http://twitter.com/jeff_lamarche/status/10228399425">@jeff_lamarche</a> Heh.  America: driving efficiency in all things!  :)</li>
<li>Also, for those of you who might want to try mixed-mode commuting, bikes aren't allowed on the subway between 6:30 and 9:30.</li>
<li><a href="http://twitter.com/mdhughes/status/10227870223">@mdhughes</a> If Americans were just more violent, how would you explain http://twitter.com/pilky/status/10227672030 ?</li>
<li><a href="http://twitter.com/pilky/status/10227914893">@pilky</a> Exactly!  Like, it's legal for me to shoot you if I think you might be dangerous.  Or look at me funny.  Or cause I want to.  :)</li>
<li><a href="http://twitter.com/pilky/status/10227672030">@pilky</a> (Also, as a Canadian, it amuses me that my opinions in the previous two discussions are split between yours and @mdhughes's.)</li>
<li><a href="http://twitter.com/pilky/status/10227672030">@pilky</a> Right, and those gun-related homicides were all the law-abiding home-owners shooting all the burglers.  ;)</li>
</ul>

   </div>

   <div class="footBox">
    <div class="footTitle">Archives:</div>
    <!-- div style="text-align:center">
     <table class="blosxomCalendar">
<tr>
<td align="left"><a href="http://weblog.latte.ca/2009/Nov">&lt;</a></td>
<td colspan="5" align="center" class="blosxomCalendarHead">December 2009</td>
<td align="right"><a href="http://weblog.latte.ca/2010/Jan">&gt;</a></td>
</tr>
<tr><td class="blosxomCalendarWeekHeader">Su</td><td class="blosxomCalendarWeekHeader">Mo</td><td class="blosxomCalendarWeekHeader">Tu</td><td class="blosxomCalendarWeekHeader">We</td><td class="blosxomCalendarWeekHeader">Th</td><td class="blosxomCalendarWeekHeader">Fr</td><td class="blosxomCalendarWeekHeader">Sa</td></tr>
<tr><td class="blosxomCalendarEmpty">&#160;</td><td class="blosxomCalendarEmpty">&#160;</td><td class="blosxomCalendarCell"> 1</td><td class="blosxomCalendarCell"> 2</td><td class="blosxomCalendarCell"> 3</td><td class="blosxomCalendarBlogged"><a href="http://weblog.latte.ca/2009/Dec/04"> 4</a></td><td class="blosxomCalendarCell"> 5</td></tr>
<tr><td class="blosxomCalendarCell"> 6</td><td class="blosxomCalendarCell"> 7</td><td class="blosxomCalendarCell"> 8</td><td class="blosxomCalendarCell"> 9</td><td class="blosxomCalendarBlogged"><a href="http://weblog.latte.ca/2009/Dec/10">10</a></td><td class="blosxomCalendarCell">11</td><td class="blosxomCalendarCell">12</td></tr>
<tr><td class="blosxomCalendarCell">13</td><td class="blosxomCalendarCell">14</td><td class="blosxomCalendarCell">15</td><td class="blosxomCalendarCell">16</td><td class="blosxomCalendarCell">17</td><td class="blosxomCalendarCell">18</td><td class="blosxomCalendarCell">19</td></tr>
<tr><td class="blosxomCalendarBlogged"><a href="http://weblog.latte.ca/2009/Dec/20">20</a></td><td class="blosxomCalendarBlogged"><a href="http://weblog.latte.ca/2009/Dec/21">21</a></td><td class="blosxomCalendarCell">22</td><td class="blosxomCalendarCell">23</td><td class="blosxomCalendarCell">24</td><td class="blosxomCalendarCell">25</td><td class="blosxomCalendarBlogged"><a href="http://weblog.latte.ca/2009/Dec/26">26</a></td></tr>
<tr><td class="blosxomCalendarCell">27</td><td class="blosxomCalendarCell">28</td><td class="blosxomCalendarBlogged"><a href="http://weblog.latte.ca/2009/Dec/29">29</a></td><td class="blosxomCalendarCell">30</td><td class="blosxomCalendarCell">31</td><td class="blosxomCalendarEmpty">&#160;</td><td class="blosxomCalendarEmpty">&#160;</td></tr>
</table>
    </div -->
    <div><a href="http://weblog.latte.ca/2010/Mar">2010-Mar</a><br />
<a href="http://weblog.latte.ca/2010/Feb">2010-Feb</a><br />
<a href="http://weblog.latte.ca/2010/Jan">2010-Jan</a><br />
<a href="http://weblog.latte.ca/2009/Dec">2009-Dec</a><br />
<a href="http://weblog.latte.ca/2009/Nov">2009-Nov</a><br />
<a href="http://weblog.latte.ca/2009/Oct">2009-Oct</a><br />
<a href="http://weblog.latte.ca/2009/Sep">2009-Sep</a><br />
<a href="http://weblog.latte.ca/2009/Aug">2009-Aug</a><br />
<a href="http://weblog.latte.ca/2009/Jul">2009-Jul</a><br />
<a href="http://weblog.latte.ca/2009/Jun">2009-Jun</a><br />
<a href="http://weblog.latte.ca/2009/May">2009-May</a><br />
<a href="http://weblog.latte.ca/2009/Apr">2009-Apr</a><br />
<a href="http://weblog.latte.ca/2009/Mar">2009-Mar</a><br />
<a href="http://weblog.latte.ca/2009/Feb">2009-Feb</a><br />
<a href="http://weblog.latte.ca/2009/Jan">2009-Jan</a><br />
<a href="http://weblog.latte.ca/2008/Dec">2008-Dec</a><br />
<a href="http://weblog.latte.ca/2008/Nov">2008-Nov</a><br />
<a href="http://weblog.latte.ca/2008/Oct">2008-Oct</a><br />
<a href="http://weblog.latte.ca/2008/Sep">2008-Sep</a><br />
<a href="http://weblog.latte.ca/2008/Aug">2008-Aug</a><br />
<a href="http://weblog.latte.ca/2008/Jul">2008-Jul</a><br />
<a href="http://weblog.latte.ca/2008/Jun">2008-Jun</a><br />
<a href="http://weblog.latte.ca/2008/May">2008-May</a><br />
<a href="http://weblog.latte.ca/2008/Apr">2008-Apr</a><br />
<a href="http://weblog.latte.ca/2008/Mar">2008-Mar</a><br />
<a href="http://weblog.latte.ca/2008/Feb">2008-Feb</a><br />
<a href="http://weblog.latte.ca/2008/Jan">2008-Jan</a><br />
<a href="http://weblog.latte.ca/2007/Dec">2007-Dec</a><br />
<a href="http://weblog.latte.ca/2007/Nov">2007-Nov</a><br />
<a href="http://weblog.latte.ca/2007/Oct">2007-Oct</a><br />
<a href="http://weblog.latte.ca/2007/Sep">2007-Sep</a><br />
<a href="http://weblog.latte.ca/2007/Aug">2007-Aug</a><br />
<a href="http://weblog.latte.ca/2007/Jul">2007-Jul</a><br />
<a href="http://weblog.latte.ca/2007/Jun">2007-Jun</a><br />
<a href="http://weblog.latte.ca/2007/May">2007-May</a><br />
<a href="http://weblog.latte.ca/2007/Apr">2007-Apr</a><br />
<a href="http://weblog.latte.ca/2007/Mar">2007-Mar</a><br />
<a href="http://weblog.latte.ca/2007/Feb">2007-Feb</a><br />
<a href="http://weblog.latte.ca/2007/Jan">2007-Jan</a><br />
<a href="http://weblog.latte.ca/2006/Dec">2006-Dec</a><br />
<a href="http://weblog.latte.ca/2006/Nov">2006-Nov</a><br />
<a href="http://weblog.latte.ca/2006/Oct">2006-Oct</a><br />
<a href="http://weblog.latte.ca/2006/Sep">2006-Sep</a><br />
<a href="http://weblog.latte.ca/2006/Aug">2006-Aug</a><br />
<a href="http://weblog.latte.ca/2006/Jul">2006-Jul</a><br />
<a href="http://weblog.latte.ca/2006/Jun">2006-Jun</a><br />
<a href="http://weblog.latte.ca/2006/May">2006-May</a><br />
<a href="http://weblog.latte.ca/2006/Apr">2006-Apr</a><br />
<a href="http://weblog.latte.ca/2006/Mar">2006-Mar</a><br />
<a href="http://weblog.latte.ca/2006/Feb">2006-Feb</a><br />
<a href="http://weblog.latte.ca/2006/Jan">2006-Jan</a><br />
<a href="http://weblog.latte.ca/2005/Dec">2005-Dec</a><br />
<a href="http://weblog.latte.ca/2005/Nov">2005-Nov</a><br />
<a href="http://weblog.latte.ca/2005/Oct">2005-Oct</a><br />
<a href="http://weblog.latte.ca/2005/Sep">2005-Sep</a><br />
<a href="http://weblog.latte.ca/2005/Aug">2005-Aug</a><br />
<a href="http://weblog.latte.ca/2005/Jul">2005-Jul</a><br />
<a href="http://weblog.latte.ca/2005/Jun">2005-Jun</a><br />
<a href="http://weblog.latte.ca/2005/May">2005-May</a><br />
<a href="http://weblog.latte.ca/2005/Apr">2005-Apr</a><br />
<a href="http://weblog.latte.ca/2005/Mar">2005-Mar</a><br />
<a href="http://weblog.latte.ca/2005/Jan">2005-Jan</a><br />
<a href="http://weblog.latte.ca/2004/Dec">2004-Dec</a><br />
<a href="http://weblog.latte.ca/2004/Nov">2004-Nov</a><br />
<a href="http://weblog.latte.ca/2004/Oct">2004-Oct</a><br />
<a href="http://weblog.latte.ca/2004/Sep">2004-Sep</a><br />
<a href="http://weblog.latte.ca/2004/Aug">2004-Aug</a><br />
<a href="http://weblog.latte.ca/2004/Jul">2004-Jul</a><br />
<a href="http://weblog.latte.ca/2004/May">2004-May</a><br />
<a href="http://weblog.latte.ca/2004/Apr">2004-Apr</a><br />
<a href="http://weblog.latte.ca/2004/Mar">2004-Mar</a><br />
<a href="http://weblog.latte.ca/2004/Feb">2004-Feb</a><br />
<a href="http://weblog.latte.ca/2004/Jan">2004-Jan</a><br />
<a href="http://weblog.latte.ca/2003/Nov">2003-Nov</a><br />
<a href="http://weblog.latte.ca/2003/Oct">2003-Oct</a><br />
<a href="http://weblog.latte.ca/2003/Sep">2003-Sep</a><br />
<a href="http://weblog.latte.ca/2003/Jul">2003-Jul</a><br />
<a href="http://weblog.latte.ca/2003/Mar">2003-Mar</a><br />
<a href="http://weblog.latte.ca/2003/Feb">2003-Feb</a><br />
<a href="http://weblog.latte.ca/2003/Jan">2003-Jan</a><br /></div>
   </div>
   <div class="footBox">
    <div class="footTitle">Blake's Wishlist:</div><br />
    <ul class="sidebar">
      <li><a
        href="http://www.amazon.ca/exec/obidos/ASIN/1430219483/adamgoucher-20/"
        >Coders at Work</a></li>
      <li><a
        href="http://www.amazon.ca/exec/obidos/ASIN/B000098XJQ/adamgoucher-20/"
        >Diablo II: Lord of Destruction expansion pack (for Mac)</a></li>
    </ul>
   </div>
   <div class="footBox">
    <div class="footTitle">Blake's Current Tunes:</div><br />
    <a href="http://www.last.fm/user/bwinton/">bwinton's current tunes (caching for another 0:45:23)</a><br />
<a href="http://www.last.fm/music/CBC+Radio+3/_/Paula%2B%2526%2BKarol%2B-%2BMother%2527s%2BStew">CBC Radio 3 - Paula &amp; Karol - Mother's Stew</a><br />
<a href="http://www.last.fm/music/CBC+Radio+3/_/Klarka+Weinwurm+-+Eastern+Snow">CBC Radio 3 - Klarka Weinwurm - Eastern Snow</a><br />
<a href="http://www.last.fm/music/Muse/_/Supermassive+Black+Hole">Muse - Supermassive Black Hole</a><br />
<a href="http://www.last.fm/music/Muse/_/Showbiz">Muse - Showbiz</a><br />
<a href="http://www.last.fm/music/Muse/_/Micro+Cuts">Muse - Micro Cuts</a><br />
<a href="http://www.last.fm/music/Muse/_/Forced+In">Muse - Forced In</a><br />
<a href="http://www.last.fm/music/Muse/_/Hate%2BThis%2B%2526%2BI%2527ll%2BLove%2BYou">Muse - Hate This &amp; I'll Love You</a><br />
<a href="http://www.last.fm/music/Muse/_/Time+Is+Running+Out">Muse - Time Is Running Out</a><br />
<a href="http://www.last.fm/music/Muse/_/Cave">Muse - Cave</a><br />
<a href="http://www.last.fm/music/Muse/_/Hoodoo">Muse - Hoodoo</a><br />

   </div>
   <div class="footBox">
    <div class="footTitle">Blake's Last 7 Bike Trips:</div><br />
    <table border="1">
     <tr><td>date</td><td>time</td><td>dist</td><td>ave</td><td>max</td><td>odo</td></tr>
      <tr><td>18/08</td><td>1.11.12</td><td>25.72</td><td>21.6</td><td>55.4</td><td>5036.5<!-- Good to be back on the bike again.--></td></tr><tr><td>19/08</td><td>0.59.27</td><td>22.53</td><td>22.7</td><td>55.7</td><td>5059.0<!-- --></td></tr><tr><td>20/08</td><td>1.01.09</td><td>22.57</td><td>22.1</td><td>54.6</td><td>5081.6<!-- --></td></tr><tr><td>22/08</td><td>1.05.32</td><td>24.97</td><td>22.8</td><td>55.3</td><td>5106.6<!-- --></td></tr><tr><td>25/08</td><td>1.30.39</td><td>27.35</td><td>18.1</td><td>58.0</td><td>5133.9<!-- --></td></tr><tr><td>26/08</td><td>1.06.22</td><td>25.00</td><td>22.6</td><td>55.3</td><td>5158.9<!-- --></td></tr><tr><td>27/08</td><td>0.59.41</td><td>22.94</td><td>23.0</td><td>55.5</td><td>5181.9<!-- Going up Mt. Pleasant is hard and unsatisfying.--></td></tr>
    </table>
    <img src="data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%D2%00%00%00%16%08%06%00%00%00%B5%E0%C2%E0%00%00%02%C3IDATx%9Cb%FC%CF0%0AF%C1%28%A0%14%00%00%00%00%FF%FFb%1Ah%07%0C%010Z%D6%8C%02%82%00%00%00%00%FF%FF%1A%94%19%89%F1%0C%C3%7F%06%0A%120%E3%19%86%FF0%8C%CD%1CR%C4%19%CF00P%E2%96Q%403%80%1E%27%03%1AG%00%00%00%00%FF%FF%82%A7%1C%12%F0%7FR%D51%9Ca%F8%0F%C3%84%F4C%D5%20%9BA%AC%7D%D8%F4cu%0B%B1%E2%B8%D4%0Er%3CT%DCI%B6%3F%90%E2%05%3D%FE%F0%C6%3D%B1%E1%83n%166%B3%D1%D24%03%00%00%00%FF%FF%C2j0.Ga%F3%00%21%C7%E0J%D8%D82%16%0E%B5%28%EA%09eH%7C%19%09%8B%1C%C9%E2%C4%16%08%94%60B%E6%13%19%3F%24%EB%C7%A6%0E%9F%7Fi%15%0E%E8%E9%0CK%DC%E3%8A%27%82nDN%97%B82%08z%7Cc3%1B%3Dm%00%00%00%00%FF%FFb%40W%84%AF%14%26PB%13%93%21pa%5C%19%8E%A0%3E%3C%91%40%13ql%F6%E3Kh%A4%14%008%12%0AF%CDNB%98c%D8O%28%D1%E1p%07Q%E9%04%9F%3F%09%85%03.%7B%89%88%07b%C2%04W%C1H%28%8D%E3%8Bo%149%00%00%00%00%FF%FF%22%AC%00w%C0bs%00%3E%07%D3%02%13%9D%91H%C5%C4%9ACb%C2FVGJ%C1%837aS%E0gR%0B%3F%BC%E9%84%88%F4A%A9%FD%C4%C6%136w%12%2C%1C%88%8C7%ACj%00%00%00%00%FF%FF%A2%24%01bu%00%1D3%11%D5%22%83%DAn%21%C1%1D%14%87%19%85%7E%269%ECH%B4%8F%90%FFh%95f0%CC%25%E4%06b%FD%87K%1E%00%00%00%FF%FF%A2%D8%B1T%8AP%AA%B8c%10d%24%92%DD0%C0n%A6u%E1G%8C%F9%E46%EB%A9%19%AED%87%03.5%00%00%00%00%FF%FF%A2d%F8%9B%11f%F6%28%40%80%FF%26%0C%8C%B4T%3F%DC%00%E3%99%A1%15%06%B8%DC%0A%00%00%00%FF%FF%A2%CA%3C%12%E3%19%86%FFC%290F%01%1C0%D28%EE%08%9AO%2B%BB%E9%9D%1E%01%00%00%00%FF%FF%1A%94%13%B2%24%82%D1%9Aq%14%0C8%00%00%00%00%FF%FF%1A%0E%19i%14P%00h%5Dr%8F%94%96%0A%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%1A6%19i%B4%9F6%0A%06%12%00%00%00%00%FF%FF%1A.%19i4%03%8D%02J%00%C5%83.%00%00%00%00%FF%FF%1A.%19i%14%8C%82%01%05%00%00%00%00%FF%FF%A24%23%8D%8E%98%8D%82Q%C0%C0%C0%00%00%00%00%FF%FF%A2%B8F%1A%2C%13j%83%C1%0D%A3%60%E4%02%00%00%00%00%FF%FF%1Am%DA%8D%82Q%C0%40yA%0C%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%03%00%C6%A2%F5%A5%84%D9%CC%F8%00%00%00%00IEND%AEB%60%82"/><br />
    <img src="data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%D2%00%00%00%16%08%06%00%00%00%B5%E0%C2%E0%00%00%02%2AIDATx%9Cb%FC%CF0%0AF%C1%28%A0%14%00%00%00%00%FF%FFb%1Ah%07%0Cv%C0x%86%E1%3F%E3%19%86%D1%F2f%14%E0%05%00%00%00%00%FF%FFb%19h%07%E0%02%B0%C4%FB%DF%84%81%91%12%FD0%80n%0E.%F3%29%B5w%14%D0%07%A0%C7%D3%40%C7%1B%00%00%00%FF%FF%229%23%11%EB%60%5C%1E%85%01%5C%FA%D1%D5%91%1A%40%84j%0F%5C%F2%C4%EA%1B%EC%19l%A8%B8%93%10%A0%96%3F%C8%CDp%84%F4%A1%A7%17%00%00%00%00%FF%FFb%A1u%C9Ll%C2%25%D6c%E8%80%DE%09%86TwSj%0F%A1%02%87V%F2%E8%EA%60%60%A0jpj7%AFq%F9%0BWAN%08%00%00%00%00%FF%FF%C2V%23%11%EB%60%98%3AF%1C%7CR%01%AD%FB%21%B8%CC%A7%96%BD%B8%FC%8F%CB%7Cb%D5%E1%0Ag%5C%EA%88%15%C7%05H%8D%7FB%E2%84%DCM%AE%BFp%01J%D3%21Y%00%00%00%00%FF%FF%22%A6i7R%3B%DA%D4NP%B8%E4%89%8D%F0%81%2Ah%E8%A5%7F%A8%D9%8B%02%00%00%00%00%FF%FFB%CEH%D4.%99G%01%7D%00%BD%C3%7B%A8%C6/M%DD%0D%00%00%00%FF%FF%1A%B4%A3v%C4%02F%86%FF%906%3A%03%E3%A0%E8%5C%23%B9%87%26%EAG%C1%C0%02X%7C%A17%24%00%00%00%00%FF%FF%1A%F2%19i%14%0Cm%40%AB%82%04W%82%A7%15%00%00%00%00%FF%FF%1A%9D%90%1D%05%A3%80%0A%00%00%00%00%FF%FF%A2%B8F%1A%2CM%13z%97%40%C3%05%D0%3A%FE%06K%FA%20%04%28M%3F%00%00%00%00%FF%FFb%A4%B4%076X%FA%28%83%C5%1D%A3%60h%02J%D3%0F%00%00%00%FF%FF%1Am%DA%8D%82Q%40%05%00%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%1A6%13%B2%A3%A3u%A3%60%20%01%00%00%00%FF%FF%1A6%19i%14%8C%02J%00%A5%051%00%00%00%FF%FF%1Am%DA%8D%82Q%40%05%00%00%00%00%FF%FF%1A%CDH%A3%60%14P%01%00%00%00%00%FF%FF%03%007d%B6%E6%B0.%AD%C9%00%00%00%00IEND%AEB%60%82"/>
   </div>
   <div class="footBox">
     <div class="footTitle">Metadata:</div><br />
     <a href="http://roughingit.subtlehints.net/pyblosxom"><img
       src="/images/pb_pyblosxom.png" alt="Get Blosxom!"
       /></a><br />
     <a href="http://creativecommons.org/licenses/by/1.0"><img
       alt="Creative Commons License" border="0"
       src="http://creativecommons.org/images/public/somerights.gif"
       /></a><br />
     This work is licensed under a<br />
     <a href="http://creativecommons.org/licenses/by/1.0">Creative
       Commons License</a>.
     <!--
     <rdf:RDF xmlns="http://web.resource.org/cc/"
       xmlns:dc="http://purl.org/dc/elements/1.1/"
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
       <Work rdf:about="">
         <license rdf:resource="http://creativecommons.org/licenses/by/1.0" />
       </Work>

       <License rdf:about="http://creativecommons.org/licenses/by/1.0">
         <requires rdf:resource="http://web.resource.org/cc/Attribution" />
         <permits rdf:resource="http://web.resource.org/cc/Reproduction" />
         <permits rdf:resource="http://web.resource.org/cc/Distribution" />
         <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
         <requires rdf:resource="http://web.resource.org/cc/Notice" />
       </License>
     </rdf:RDF>
     -->
   </div>
  </div>
  <div style="clear:both;"> 
  </div> 
  <script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
  </script>
  <script type="text/javascript">
    try {
      var pageTracker = _gat._getTracker("UA-5805429-2");
      pageTracker._trackPageview();
    } catch(err) {}</script>
 </body>
</html>

