<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-5733547231775030285</id><updated>2008-08-19T09:31:03.235+10:00</updated><title type='text'>Mere Code</title><link rel='alternate' type='text/html' href='http://code.mumak.net/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://code.mumak.net/atom.xml'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-246790443235994368</id><published>2008-08-18T13:21:00.005+10:00</published><updated>2008-08-18T13:52:28.738+10:00</updated><title type='text'>Flow, Interruptions and Gold-Titanium Alloys</title><content type='html'>As I mentioned earlier, I've just had a very productive and fun weekend of hacking on &lt;a href="https://launchpad.net/testresources"&gt;testresources&lt;/a&gt;. But why was it so good?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fast Commits&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Because I was working offline using Bazaar, I could make commits to testresources and they'd be done before I could Alt-Tab back to Emacs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fast Tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It takes about 0.15 seconds to run the test suite. This meant I was running it all the time, which in turn meant that I was totally certain about whether the code worked all the time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clarity of Purpose&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I knew where I was and where I wanted to go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No Rabbit Holes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The testresources code base is small enough that it is nearly impossible to get distracted by &lt;span style="font-style: italic;"&gt;other&lt;/span&gt; systemic defects. If there is such a defect, it's probably the one that you're working on right now. This might be another way of saying...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No Blockers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wasn't waiting on anyone to do anything. There weren't any other bugs that needed to get fixed before I could continue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No Integration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The system is about as self-contained as it gets. No signals, subprocesses or sockets: just Python. The only dependency is pyunit3k, which is small, robust, well-tested and also pretty darn self-contained.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No Interruptions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wasn't answering questions on IRC, taking Skype calls, handling incoming email, doing the washing, checking Facebook, catching up on my blogs, watching a film or wrestling a bear. "Fast Commits" and "Fast Tests" probably fall into this category too.&lt;br /&gt;&lt;br /&gt;In other words:&lt;br /&gt;&lt;blockquote&gt;There is nothing except this. There's no art opening, no charity, nothing to sign. There's the next mission, and nothing else.  &lt;/blockquote&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/08/flow-interruptions-and-gold-titanium.html' title='Flow, Interruptions and Gold-Titanium Alloys'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=246790443235994368' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/246790443235994368'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/246790443235994368'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-3620018535113229223</id><published>2008-08-18T11:11:00.004+10:00</published><updated>2008-08-18T11:50:03.492+10:00</updated><title type='text'>testresources: fresh blood</title><content type='html'>Last weekend I spent a bunch of timing hacking on &lt;a href="https://launchpad.net/testresources"&gt;testresources&lt;/a&gt; with &lt;a href="http://robertcollins.net/"&gt;Rob&lt;/a&gt; over at &lt;a href="https://launchpad.net/%7Eraof"&gt;Chris&lt;/a&gt;'s place. testresources is an extension to unittest that allows tests to specify the resources they use declaratively, so that these resources can be cleanly shared between tests. On Saturday, we talked a bit about direction and decided on some goals. On Sunday, &lt;a href="https://code.launchpad.net/%7Ejml/testresources/tests-meaning-cleanup/+merge/767"&gt;I got busy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The idea isn't particularly new: zope.testing has had "layers" for a long time. The key differences between testresources and Zope layers are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can use more than one TestResource. You can only use one layer. Allowing tests to specify many resources makes it easier to use only the resources that you need, which in turn makes for a faster test suite.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A test that uses testresources can be used independently of other testresources machinery. With layers, you pretty much need the whole shebang. This means that you can use testresources with trial, bzr, nose, tribunal or unittest.TextTestRunner.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Layers have magical inheritance stuff. testresources has no magic.&lt;/li&gt;&lt;li&gt;Layers do some work in subprocesses to accommodate some setUps that can have no tearDown. testresources doesn't know what a process is.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That said, I'm mainly familiar with layers from Zope 3.2—they may have changed since then.&lt;br /&gt;&lt;br /&gt;testresources itself is somewhat old. Rob hacked up the first version about three years ago and little has happened to it since. I've always agreed with the approach, but have also had a few qualms about implementation details that made me reluctant to use it or to recommend it. Now, it's well on its way to being something that I can trust and perhaps, love.&lt;br /&gt;&lt;br /&gt;If you are interested, check out &lt;a href="https://code.launchpad.net/%7Ejml/testresources/tests-meaning-cleanup"&gt;my branch&lt;/a&gt; or at least flick through the &lt;a href="http://bazaar.launchpad.net/%7Ejml/testresources/tests-meaning-cleanup/annotate/77?file_id=todo-20080817122443-kaikqdedcg57lr4v-1"&gt;TODO&lt;/a&gt; file.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/08/testresources-fresh-blood.html' title='testresources: fresh blood'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=3620018535113229223' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3620018535113229223'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3620018535113229223'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7623350122185148360</id><published>2008-07-25T15:38:00.002+10:00</published><updated>2008-07-25T15:52:28.793+10:00</updated><title type='text'>Cool Launchpad/Bazaar hack</title><content type='html'>If you push a lot of Bazaar branches to Launchpad, you might want to add something like this to your .bazaar/locations.conf:&lt;pre&gt;[/home/jml/Code]&lt;br /&gt;public_branch = lp:~jml&lt;br /&gt;public_branch:policy = appendpath&lt;br /&gt;push_location = lp:~jml&lt;br /&gt;push_location:policy = appendpath&lt;br /&gt;&lt;/pre&gt;Once it's there, 'bzr push' will Just Work... as long as you want it to do something like:&lt;pre&gt;jml@rhino:~$ cd ~/Code/&lt;a href="https://launchpad.net/pyunit3k" title="What is pyunit3k?"&gt;pyunit3k&lt;/a&gt;/trunk&lt;br /&gt;jml@rhino:~/Code/pyunit3k/trunk$ bzr push&lt;br /&gt;Using saved location: lp:~jml/pyunit3k/trunk&lt;br /&gt;No new revisions to push.&lt;br /&gt;&lt;/pre&gt;So if I've got a branch in &lt;code&gt;~/Code/&amp;lt;project-name&amp;gt;/&amp;lt;branch-name&amp;gt;&lt;/code&gt;, it'll be published at &lt;code&gt;https://launchpad.net/~jml/&amp;lt;project-name&amp;gt;/&amp;lt;branch-name&amp;gt;&lt;/code&gt;. This is only a default, of course: you can override it for a given branch by doing:&lt;pre&gt;bzr push --remember &amp;lt;new_location&amp;gt;&lt;/pre&gt;Or you can override it for a bunch of branches by hacking locations.conf.&lt;br /&gt;&lt;br /&gt;Neat huh?</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/07/cool-launchpadbazaar-hack.html' title='Cool Launchpad/Bazaar hack'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7623350122185148360' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7623350122185148360'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7623350122185148360'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-4536070818872098294</id><published>2008-07-07T17:00:00.003+10:00</published><updated>2008-07-07T18:22:37.506+10:00</updated><title type='text'>I Love Data</title><content type='html'>At work, we recently started to graph the time it takes to access a branch in Launchpad via SSH, both on our staging and production servers.&lt;br /&gt;&lt;br /&gt;I love this so much. Having this data is &lt;span style="font-style: italic;"&gt;liberating&lt;/span&gt;. It's like turning on a light in a dark room: suddenly I can go from uncertain, careful, hesitant steps to bold, confident strides.&lt;br /&gt;&lt;br /&gt;In fact, the metaphor stretches further. This new light has revealed objects of interest (that is, spikes in the time taken) that I wasn't aware of before. I need to know how long these spikes last, how they correlate with load on the system and so forth. Soon there'll be more graphs, and I'll be able to correlate them and analyze them and suck on their delicious, numerical marrow (the light metaphor long abandoned).&lt;br /&gt;&lt;br /&gt;Regardless of whether it's liberating illumination or nourishing, savoury meat, this new graph makes me wonder why I don't chart other things I care about. Having such graphs would help me see the &lt;span style="font-style: italic;"&gt;impact&lt;/span&gt; of my actions. I could chart things like my bank balance, my waistline or the number of Latin words I learned this week. Then I could answer questions like "do I spend more on Tuesdays?" or "can I afford this iPod/cake/gerund?". This is important, because when I am tempted with a sleek/delicious/perplexing iPod/cake/gerund, I fall back on my own judgment. I think it's time to confess, dear reader, that my own judgment isn't very good. And yet I continue to trust it.&lt;br /&gt;&lt;br /&gt;The reason I don't have such graphs is that they are inconvenient to maintain. A graph of branch access times is &lt;span style="font-style: italic;"&gt;easy&lt;/span&gt;. All you need to do is describe how to get the measurement, and then do a bit of once-off set up. If you want to graph your body weight, you need to get on the scales at a fixed time and then look at the dial and adjust for parallax and then write a number down somewhere and maybe note down whether this is before or after a meal and then take the number and then add it to a spreadsheet. Most online banking sites I've seen are even &lt;span style="font-style: italic;"&gt;less&lt;/span&gt; convenient than this.&lt;br /&gt;&lt;br /&gt;Getting data on life is hard, but for programming it's easy. What things do you care about on your project? Features, user experience, how fast bugs get fixed? Can you quantify these things? Can you make a pretty picture out of it? If so, do it now! Post your answers here, set up something like&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; &lt;a href="http://cricket.sourceforge.net/"&gt;Cricket&lt;/a&gt; and then profit!&lt;br /&gt;&lt;br /&gt;P.S. I can't believe I got to the end of this post without saying how awesome the Canonical sysadmins are. Let me correct that now. The Canonical sysadmins are heck of awesome. They could &lt;a href="http://cdn-www.i-am-bored.com/media/95709_mordoranim8.gif"&gt;simply walk into Mortor&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/07/i-love-data.html' title='I Love Data'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=4536070818872098294' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4536070818872098294'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4536070818872098294'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-6225331854382219297</id><published>2008-07-03T16:17:00.004+10:00</published><updated>2008-07-05T20:39:55.980+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Somebody Do This Please</title><content type='html'> &amp;lt;jml&amp;gt; What's the difference between &lt;a href="http://gobby.0x539.de/trac/"&gt;Gobby&lt;/a&gt; and a &lt;a href="http://moinmo.in/" title="Moin Moin"&gt;wiki&lt;/a&gt;?&lt;br /&gt;&amp;lt;mwh&amp;gt; NAT</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/07/somebody-do-this-please_9690.html' title='Somebody Do This Please'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=6225331854382219297' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6225331854382219297'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6225331854382219297'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-8089889730512879183</id><published>2008-07-01T09:09:00.000+10:00</published><updated>2008-07-05T19:24:05.478+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>GMail feature request</title><content type='html'>First, where should I make these requests?&lt;br /&gt;&lt;br /&gt;Second, I'd like to be able to open my GMail without seeing all the new mail in my inbox. Very often, I open up GMail just to look up some fact that I've forgotten, or to put a date to a particular event. Seeing new mail and an unempty inbox distracts me, leading me down a rabbit hole of processing.&lt;br /&gt;&lt;br /&gt;I guess a GreaseMonkey hack wouldn't be &lt;em&gt;too&lt;/em&gt; hard.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/gmail-feature-request.html' title='GMail feature request'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=8089889730512879183' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8089889730512879183'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8089889730512879183'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-6587088400853659934</id><published>2008-06-23T20:12:00.000+10:00</published><updated>2008-07-05T19:24:06.516+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>2008</title><content type='html'>&lt;h1 color="#ff0000"&gt;&lt;blink&gt;Firefox 3 is awesome!&lt;/blink&gt;&lt;/h1&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/2008.html' title='2008'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=6587088400853659934' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6587088400853659934'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6587088400853659934'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2877195152772565777</id><published>2008-06-13T15:23:00.000+10:00</published><updated>2008-07-05T19:24:07.559+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Really Satisfying</title><content type='html'>I have just returned from the shops with a Snickers bar. The packet says that one out of every six Snickers bars will instantly win me a free Snickers bar.&lt;br /&gt;&lt;br /&gt;So, &lt;em&gt;statistically speaking&lt;/em&gt;, how many Snickers bars do I have? Show working.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/really-satisfying.html' title='Really Satisfying'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2877195152772565777' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2877195152772565777'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2877195152772565777'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7643804025471441798</id><published>2008-06-13T14:37:00.000+10:00</published><updated>2008-07-05T19:24:08.610+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Aren't code reviews great?</title><content type='html'>Ben Sussman-Collins writes about &lt;a href="http://blog.red-bean.com/sussman/?p=96"&gt;programmer insecurity&lt;/a&gt; and how a lot of programmers dread having others see their code.&lt;br /&gt;&lt;br /&gt;Some of the &lt;a href="http://jcalderone.livejournal.com"&gt;best&lt;/a&gt; &lt;a href="http://robertcollins.net"&gt;programmers&lt;/a&gt; &lt;a href="http://radix.twistedmatrix.com"&gt;I've&lt;/a&gt; &lt;a href="http://sourcefrog.net"&gt;worked&lt;/a&gt; &lt;a href="http://glyph.twistedmatrix.com"&gt;with&lt;/a&gt; &lt;a href="http://python.net/crew/mwh/"&gt;are&lt;/a&gt; in love with code reviews, and all great writers have editors. (The "linked list" is in no way exhaustive.)  Personally, I see reviews as being a great opportunity to learn.&lt;br /&gt;&lt;br /&gt;Sussman-Collins also writes about how distributed version control can exacerbate the "isolated genius" problem by shielding ones code from the public eye. This is definitely a big potential drawback of DVCS, but one that's largely mitigated by a culture of short-lived branches and &lt;a href="https://code.launchpad.net"&gt;an easy-to-use public registry of all branches for a project&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/aren-code-reviews-great.html' title='Aren&amp;#39;t code reviews great?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7643804025471441798' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7643804025471441798'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7643804025471441798'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-622417601081979853</id><published>2008-06-13T11:29:00.000+10:00</published><updated>2008-07-05T20:09:04.829+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bazaar'/><title type='text'>Another Bazaar story</title><content type='html'>I'm currently hacking away on Launchpad's support for "&lt;a href="http://jam-bazaar.blogspot.com/2008/05/this-week-in-bazaar_29.html"&gt;stacked branches&lt;/a&gt;", something that will really make Launchpad's codehosting a joy to use.&lt;br /&gt;&lt;br /&gt;At the moment, I'm writing some tests that require a user to login. This was becoming a bit cumbersome, until I remembered something: Tim has recently landed some code to make this easy. But how do I get these changes without messing up all of the work I'm doing now? bzr shelve to the rescue!&lt;br /&gt;&lt;br /&gt;'shelve' interactively goes through each change you've made to your current working tree and allows you to decide whether to keep a change or shelve it. It comes with a twin command 'unshelve', which lets you interactively restore your changes.&lt;br /&gt;&lt;br /&gt;In this case, I don't even care about the interactivity, so here's what I did:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Shelve my changes&lt;br /&gt;bzr shelve --all&lt;br /&gt;# Fetch the latest trunk&lt;br /&gt;cd ../trunk&lt;br /&gt;bzr pull&lt;br /&gt;# Merge it into my branch&lt;br /&gt;cd ../stacking&lt;br /&gt;bzr merge ../trunk&lt;br /&gt;bzr ci -m "Merge in changes from trunk to get login testing improvements."&lt;br /&gt;# Restore my changes&lt;br /&gt;bzr unshelve --all&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The 'shelve' command comes with the &lt;a href="http://launchpad.net/bzrtools"&gt;bzrtools&lt;/a&gt; plugin, and I am basically in love with it.&lt;br /&gt;&lt;br /&gt;As a parting shot, I should mention that things like bzrtools aren't accidents. They are natural and inevitable when you have &lt;a href="http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html"&gt;good APIs&lt;/a&gt; in a &lt;a href="http://python.org"&gt;high-level language&lt;/a&gt; and a &lt;a href="http://bazaar-vcs.org/WritingPlugins"&gt;very nice plugin system&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And now I'm off to keep working on this branch.&lt;br /&gt;&lt;br /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/another-bazaar-story.html' title='Another Bazaar story'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=622417601081979853' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/622417601081979853'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/622417601081979853'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7465383142016112088</id><published>2008-06-05T11:17:00.000+10:00</published><updated>2008-07-05T20:09:10.945+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Real Life</title><content type='html'>Inspired by &lt;a href="http://mikeylynch.blogspot.com"&gt;Mikey&lt;/a&gt;, I've set up my own &lt;a href="http://life.mumak.net"&gt;real-life blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've done this one using Blogger's "upload to remote server" feature. It looks nice, has the features I need and means less WordPress &amp;amp; PHP. I'm hoping to migrate this sucker to the same technology.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/real-life.html' title='Real Life'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7465383142016112088' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7465383142016112088'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7465383142016112088'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-3847165362970608763</id><published>2008-06-02T13:28:00.001+10:00</published><updated>2008-07-05T20:40:04.743+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Neat Bazaar feature</title><content type='html'>Ever find yourself working away on a branch, enjoying yourself and getting just a little carried away? Maybe you're working on a feature and you notice and fix a bug that's not strictly related to that feature.&lt;br /&gt;&lt;br /&gt;If you catch yourself in time, there's a nice little feature in Bazaar that can help with this: &lt;code&gt;bzr merge --uncommitted&lt;/code&gt;. It will merge in the changes that you've made to your working tree but haven't committed yet.&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cd some-feature-branch&lt;br /&gt;&lt;br /&gt;... hack hack hack ... oops!&lt;br /&gt;&lt;br /&gt;$ cd ..&lt;br /&gt;&lt;br /&gt;$ bzr branch trunk bug-fix-2357&lt;br /&gt;&lt;br /&gt;$ cd bug-fix-2357&lt;br /&gt;&lt;br /&gt;$ bzr merge --uncommitted ../some-feature-branch&lt;br /&gt;&lt;br /&gt;$ bzr ci -m "Fix up bug 2357. Found this while working on some-feature."&lt;br /&gt;&lt;br /&gt;$ bzr send&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Don't know what &lt;code&gt;bzr send&lt;/code&gt; does? Trust me, you want to find out.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/06/neat-bazaar-feature_9205.html' title='Neat Bazaar feature'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=3847165362970608763' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3847165362970608763'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3847165362970608763'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-1749283964198347471</id><published>2008-04-21T11:39:00.000+10:00</published><updated>2008-07-05T20:09:13.534+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>What I meant</title><content type='html'>&lt;a href="http://z3p.tumblr.com/"&gt;z3p&lt;/a&gt; recently &lt;a href="http://z3p.tumblr.com/post/32324725"&gt;blogged about&lt;/a&gt; a comment I made in &lt;a href="http://twistedmatrix.com/trac/ticket/2710"&gt;a code review&lt;/a&gt;. In the review, I linked to:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://74.54.212.169/2ERcULhJC81alpg64P4WN7Of_400.jpg" alt="The only measure of code quality is WTFs / minute" /&gt;&lt;br /&gt;&lt;br /&gt;That's a negative and grumpy way of phrasing an idea that I've come to value a lot: &lt;em&gt;good code expresses its intent clearly.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;When looking at a patch, the reviewer needs to understand two things: the intent of the code and the intent of each &lt;em&gt;change&lt;/em&gt; to the code. To be clear on the former, you need:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;intent-revealing names.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;good abstractions / interfaces.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;good, small tests.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;simple implementations where possible.[1]&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;docstrings where appropriate&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;comments where appropriate.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's not exhaustive, but it's in a rough order.&lt;br /&gt;&lt;br /&gt;To be clear on the intent of your change to code, you need:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Small patches.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;A good bug / spec with a good, short summary.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;A review request letter, summarizing your implementation strategy, any compromises you made, gaps in testing, future work etc.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's not exhaustive either. In #2037, I didn't understand the motivation for lots of the code, nor for some of the changes to the code.&lt;br /&gt;&lt;br /&gt;I'm indebted to &lt;a href="http://andrew.puzzling.org"&gt;Andrew Bennetts&lt;/a&gt; for teaching me that the first duty of a reviewer is to ensure that the code is clear and to &lt;a href="http://intellectronica.net/"&gt;Tom Berger&lt;/a&gt; for reminding me that compromises are worth noting.&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;[1] Actually, this reminds me of something I heard &lt;a href="http://en.wikipedia.org/wiki/Don_Carson"&gt;a preacher&lt;/a&gt; say, "before I give a sermon, I go through it, find everything clever, and take it out" (I paraphrase, not having a reference on hand).&lt;br /&gt;&lt;br /&gt;In as much as sermons and code should both be ego-free communications of ideas, I think this is sound advice for hackers.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/04/what-i-meant_20.html' title='What I meant'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=1749283964198347471' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/1749283964198347471'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/1749283964198347471'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-8216437880894786544</id><published>2008-04-21T11:04:00.000+10:00</published><updated>2008-07-05T20:40:06.940+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>bzr-removable</title><content type='html'>The plugin I talked about in a previous post is now at https://launchpad.net/bzr-removable. Please file bugs.&lt;br /&gt;&lt;br /&gt;Thanks to Michael Hudson and Daniel Watkins for submitting patches.&lt;br /&gt;&lt;br /&gt;You can get the plugin by typing 'bzr branch lp:bzr-removable' on the command line.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/04/bzr-removable_20.html' title='bzr-removable'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=8216437880894786544' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8216437880894786544'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8216437880894786544'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-8180273067340546851</id><published>2008-03-18T14:36:00.000+11:00</published><updated>2008-07-05T20:09:16.091+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>OK I lied</title><content type='html'>The next post is actually about a Bazaar plugin that I've now got ready to share. To get it, 'bzr branch lp:~jml/+junk/merged-branches'.&lt;br /&gt;&lt;br /&gt;Once you've got it, run 'bzr merged-branches' in the trunk of your project. It will then show you all branches in sibling directories that are safe to delete.  That is,&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;They have no uncommitted changes.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;They have no "unknown" files. (Files outside of version control that haven't been explicitly ignored.)&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;They have no shelved changes. The plugin will only check for this if it can find bzrtools.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The branch is now at the point where it works for me, but it still belongs in '+junk' — here's why:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;It assumes that you have a trunk branch in the same directory as all of your other branches.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It assumes that branches and working trees are the same thing.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It's called 'merged-branches' when it really means 'safe-to-delete'.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It doesn't make it easy to see why a branch is &lt;em&gt;not&lt;/em&gt; safe to delete.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It doesn't let you customize the conditions of the search. Maybe you want to see all branches with uncommitted changes.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Still, if you are like me and make a lot of branches, it's quite useful. I'll tolerate bugs, accept patches and welcome encouragement.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/03/ok-i-lied_17.html' title='OK I lied'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=8180273067340546851' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8180273067340546851'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/8180273067340546851'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-856842426077382069</id><published>2008-03-13T10:24:00.000+11:00</published><updated>2008-07-05T21:07:50.192+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bazaar'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>User Experience — When Reality Attacks</title><content type='html'>I've just got back from a hectic week in London, where members of the Bazaar community got together and thrashed out a bunch of important topics.&lt;br /&gt;&lt;br /&gt;We talked about "user experience" and how we all want Bazaar to be a joy to use. More than one person said that we have been focusing too much on features and performance instead of user experience. The term was never really pinned down, but it's fair to say that there are things other than convenience and speed that affect how users feel while using Bazaar and that we need to work on those things, once we figure out what they are.&lt;br /&gt;&lt;br /&gt;I think I might know the name of one of them: &lt;em&gt;errors&lt;/em&gt;. Next post: "Notes on error".</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/03/user-experience-when-reality-attacks_12.html' title='User Experience — When Reality Attacks'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=856842426077382069' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/856842426077382069'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/856842426077382069'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-3364492924699447727</id><published>2008-02-18T10:04:00.000+11:00</published><updated>2008-07-05T21:21:29.244+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Three-ways on Pidgin?</title><content type='html'>Dear Lazyweb,&lt;br /&gt;&lt;br /&gt;How do I initiate a three-way chat with Pidgin 2.2.1?&lt;br /&gt;&lt;br /&gt;jml</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/02/three-ways-on-pidgin.html' title='Three-ways on Pidgin?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=3364492924699447727' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3364492924699447727'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/3364492924699447727'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-6629816907072968862</id><published>2008-02-15T16:57:00.000+11:00</published><updated>2008-07-05T21:07:52.018+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>What I do all day</title><content type='html'>Kick-arse summary here: &lt;a href="http://news.launchpad.net/general/the-great-source-code-supermarket"&gt;The great source code supermarket. &lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/02/what-i-do-all-day_14.html' title='What I do all day'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=6629816907072968862' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6629816907072968862'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/6629816907072968862'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-4242706117573763571</id><published>2008-02-11T15:10:00.000+11:00</published><updated>2008-07-05T21:21:30.169+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>The Economist Index</title><content type='html'>&lt;em&gt;The Economist&lt;/em&gt; occasionally publishes a "Big Mac Index" — how much the world's favorite "burger" costs in each country, translated into a common currency.&lt;br /&gt;&lt;br /&gt;Why they don't publish an index of how much an issue of the Economist costs?  All of my issues have the price of the newspaper in lots of Asia-Pacific currencies. A small sample:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Australia, 9.39855 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Cambodia, 6.00 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;China, 10.43655 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Hong Kong, 7.6917 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;India, 5.0522 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Japan, 10.70535 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;New Zealand, 8.6669 USD&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Can anyone tell me why the price varies so much?</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2008/02/economist-index_10.html' title='The Economist Index'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=4242706117573763571' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4242706117573763571'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/4242706117573763571'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2664744142478569103</id><published>2007-12-10T12:43:00.000+11:00</published><updated>2008-07-05T21:07:53.865+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>WoW account temporarily suspended</title><content type='html'>Howdy Partners,&lt;br /&gt;&lt;br /&gt;My World of Warcraft account is temporarily suspended for silly administrative reasons. I'm not in any rush to clear those up, so don't expect to see me on Khaz'goroth or Frostmourne any time soon.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;&lt;br /&gt;jml</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/12/wow-account-temporarily-suspended_09.html' title='WoW account temporarily suspended'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2664744142478569103' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2664744142478569103'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2664744142478569103'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2253350668000150768</id><published>2007-11-15T02:02:00.000+11:00</published><updated>2008-07-05T21:07:55.625+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Obligatory</title><content type='html'>Not using Facebook anymore.&lt;br /&gt;&lt;br /&gt;Have fun kids.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/11/obligatory_8590.html' title='Obligatory'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2253350668000150768' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2253350668000150768'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2253350668000150768'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-5546272330234125045</id><published>2007-10-23T12:40:00.000+10:00</published><updated>2008-07-05T21:07:56.934+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Fake Plastic Tests</title><content type='html'>Ever wondered what's the difference between a &lt;code&gt;FakeReactor&lt;/code&gt;, a &lt;code&gt;StubReactor&lt;/code&gt; and a &lt;code&gt;MockReactor&lt;/code&gt;? Find out in this brief article on &lt;a href="http://mumak.net/test-doubles"&gt;test doubles&lt;/a&gt;.&lt;br /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/fake-plastic-tests_22.html' title='Fake Plastic Tests'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=5546272330234125045' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5546272330234125045'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5546272330234125045'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-2851328684107820408</id><published>2007-10-16T18:15:00.000+10:00</published><updated>2008-07-05T21:07:57.826+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>The most retentive thing I've done</title><content type='html'>&lt;img src="http://tusk.mumak.net/Blog-20071016/Retentive-Pens-2.jpg" alt="I labelled my pens" title="I'm still not sure about publishing this" width="400" /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/most-retentive-thing-i-done_16.html' title='The most retentive thing I&amp;#39;ve done'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=2851328684107820408' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2851328684107820408'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/2851328684107820408'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-7143752197387030539</id><published>2007-10-16T18:09:00.000+10:00</published><updated>2008-07-05T21:07:58.785+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Cracked Mac</title><content type='html'>OK, I've started with this whole &lt;q&gt;photography&lt;/q&gt; thing, I might as well run with it.&lt;br /&gt;&lt;br /&gt;My Mac cracked:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://tusk.mumak.net/Blog-20071016/Cracked-Laptop-2.jpg" alt="Cracked Macbook" title="Designed by Apple in California" /&gt;</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/cracked-mac.html' title='Cracked Mac'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=7143752197387030539' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7143752197387030539'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/7143752197387030539'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5733547231775030285.post-5261835241457980208</id><published>2007-10-16T18:06:00.000+10:00</published><updated>2008-07-05T21:07:59.680+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Uncategorized'/><title type='text'>Around like Grover</title><content type='html'>What's up hep-cats?&lt;br /&gt;&lt;br /&gt;I've been travelling around the world, weaving in and out of timezones like Jason Bourne navigates facial expressions. Last week's adventure took me to tropical Dunedin — the southiest outpost of Canonical Ltd. (I'm trying to get a mention on &lt;a href="http://itre.cis.upenn.edu/~myl/languagelog/"&gt;Language Log&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Those few Hobartians who keep reading will notice that Dunedin, well, umm... here's a photo:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://tusk.mumak.net/Blog-20071016/Dunedin-View.jpg" alt="View of Dunedin" title="Dunedin during rush hour" width="600" /&gt;&lt;br /&gt;&lt;br /&gt;Pay careful attention to the hills in the background.</content><link rel='alternate' type='text/html' href='http://code.mumak.net/2007/10/around-like-grover.html' title='Around like Grover'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5733547231775030285&amp;postID=5261835241457980208' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://code.mumak.net/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5261835241457980208'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5733547231775030285/posts/default/5261835241457980208'/><author><name>jml</name><uri>http://www.blogger.com/profile/11400080716012026985</uri><email>noreply@blogger.com</email></author></entry></feed>