<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Jonathan Lange</title>
	<link>http://mumak.net/planet/</link>
	<language>en</language>
	<description>Jonathan Lange - http://mumak.net/planet/</description>

<item>
	<title>Echo and Bounce: Finns and Greeks</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-8458027445530710030</guid>
	<link>http://life.mumak.net/2012/02/finns-and-greeks.html</link>
	<description>Following the resolutions in &lt;a href=&quot;http://life.mumak.net/2012/02/reading.html&quot;&gt;my last post on reading&lt;/a&gt;, I've finally finished two of the heavier books that I'd started: &lt;i&gt;The Art of Rhetoric&lt;/i&gt; by Aristotle, and &lt;i&gt;The Kalevala&lt;/i&gt;, a cycle of Finnish epic poetry. Some reflections:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;The Kalevala&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I actually only read the first volume, which is the first twenty songs&lt;/li&gt;&lt;li&gt;For what it is, it's surprisingly readable and engaging. Good stories, lots of vivid poetic images, even some humour&lt;/li&gt;&lt;li&gt;The introduction compared it to other great ancient epics, such as the Iliad&lt;/li&gt;&lt;li&gt;It's written in trochaic tetrameter (&lt;b&gt;tum&lt;/b&gt;-ti-&lt;b&gt;tum&lt;/b&gt;-ti-&lt;b&gt;tum&lt;/b&gt;-ti-&lt;b&gt;tum&lt;/b&gt;-ti) and translated that way too. That metre is particularly infectious and I found my internal monologue beating that way after reading a section&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;The Song of Hiawatha &lt;/i&gt;is written that way too, apparently inspired by &lt;i&gt;The Kalevala&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;I knew nothing about Finnish mythology and now I know next to nothing but here's some stuff:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;There's no pantheon and not many obvious gods, just one high God, &quot;Ukko&quot;&lt;/li&gt;&lt;li&gt;Most of the characters don't seem like ordinary men and women. The translation says &quot;heroes&quot;, which fits, but you need to think bigger than Odysseus or Achilles&lt;/li&gt;&lt;li&gt;Birch trees, some constellations, the moon and the sun all are persons, in some fashion&lt;/li&gt;&lt;li&gt;Mothers matter way more than fathers&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Really wish I knew more about its provenance. It's hard to tell how much is truly ancient, how much has been influenced by Christianity and how much was made up by the compiler.&lt;/li&gt;&lt;li&gt;Lots of singing. If you hated Tom Bombadil or the &lt;i&gt;Silmarillion&lt;/i&gt; (Mikey, I'm looking at you), then you should probably skip this one&lt;/li&gt;&lt;li&gt;I'm probably not going to read Volume 2 any time soon&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;i&gt;The Art of Rhetoric&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the first Aristotle I've ever read. I'm really interested in the subject, initially because I wanted to be conscious of when I'm using rhetorical tricks and when they are being used on me.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is more than just a series of tricks. It's about the philosophical and psychological underpinnings of persuasive speech: what kinds of arguments there are; how to come up with them; which ones are best suited for which purposes; what things work regardless of what kind of speech you are making; how emotions fit into things and so forth. What I had previously thought of as rhetoric – rhetorical style – is a smallish bit at the end.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a really tough, technical read. Lots and lots of it didn't stick, and I am sure it would repay a deeper study. The translator tries his best, and his introduction was helpful, but even he tended to be cumbersome. He once described something as being &quot;not inimitable&quot;. I don't know what that means.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even though it's really tough and technical, I was impressed by Aristotle. When I was growing up, I mostly knew of him as the guy who got science completely wrong and helped screw up the Middle Ages. Reading this, he comes across as very sharp, creative and interesting. Also, since he and the translator frequently refer to his other works, he comes across as very prolific. It's amazing how many different fields he contributed to. I realize this isn't exactly news.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It also makes me realize just how much cool stuff was going on in Classical Greece, and how modern much of it seems to me. I guess I'm late to this game too, but when I read things like this I feel as if our culture has this super-interesting older cousin with an excellent music collection who we never talk to because we can't be bothered. Or something.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wish I had a classical education, or at least that I could go off and study classics for a while. I really think I would learn things that would be useful today. Or perhaps our culture has absorbed everything that is useful or good or relevant about their culture and it would all be a mildly diverting exercise in academic self-gratification.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-8458027445530710030?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 20 Feb 2012 23:44:30 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.14 released</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-6777212250918592295</guid>
	<link>http://code.mumak.net/2012/02/testtools-0914-released.html</link>
	<description>&lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;testtools&lt;/a&gt;'s sister project, &lt;a href=&quot;https://launchpad.net/subunit&quot;&gt;subunit&lt;/a&gt;, was using a private API that we deleted in the 0.9.13 release.  This release restores that API in order to smooth out the upgrade path.&lt;br /&gt;&lt;br /&gt;If you don't use subunit, then this release won't matter very much to you.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6777212250918592295?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 16 Feb 2012 10:55:29 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Reading</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-5153784905380092065</guid>
	<link>http://life.mumak.net/2012/02/reading.html</link>
	<description>&lt;div&gt;A few quick reflections on my recent reading:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Have decided to apply kanban principles and limit my books in progress and my queue of next books&lt;/li&gt;&lt;li&gt;Have set myself a rule that I'm not going to start any new books until I've cleared off the ones on my bedside table and the ones in my &quot;In progress&quot; collection on my Kindle&lt;/li&gt;&lt;li&gt;Just finished &quot;I sleep in haysheds and corners&quot;. Some stories are better than others. I particularly liked the opening story for its Tasmaniana and Will Cox's story.&lt;/li&gt;&lt;li&gt;Also just finished &quot;Why Classical Music Still Matters&quot;. Many good ideas, but ultimately disappointing as the author insists on florid prose in the tradition of critical theory. This makes some points impenetrable and others seem like literary word games. Would love to read a book on this topic that was more direct.&lt;/li&gt;&lt;li&gt;I don't keep a reading log. Benny &amp;amp; Jean-Paul both do, and I was taught to by my old mentor Martin Chance, but I don't. I should. I want to. How does one start so late in the game? What format does one use?&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Also, I'm more active on &lt;a href=&quot;https://plus.google.com/115348217455779620753/posts&quot;&gt;Google&lt;/a&gt;+ these days than on my blog. You might want to follow me there.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-5153784905380092065?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 15 Feb 2012 12:15:14 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.13 released</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-5806693077249526681</guid>
	<link>http://code.mumak.net/2012/02/testtools-0913-released.html</link>
	<description>It has been a while, but &lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;testtools 0.9.13&lt;/a&gt; is finally out! Lots more matchers and bug fixes, as well as improved error reporting. Full release notes &lt;a href=&quot;https://launchpad.net/testtools/0.9/0.9.13&quot;&gt;on Launchpad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href=&quot;http://jameswestby.net/weblog&quot;&gt;James Westby&lt;/a&gt;, &lt;a href=&quot;http://grahambinns.com/&quot;&gt;Graham Binns&lt;/a&gt;, &lt;a href=&quot;https://launchpad.net/~frankban&quot;&gt;Francesco Banconi&lt;/a&gt; and &lt;a href=&quot;http://rbtcollins.wordpress.com/&quot;&gt;Robert Collins&lt;/a&gt; for making this release possible.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-5806693077249526681?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 06 Feb 2012 15:55:12 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Simple made easy</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-4903070032423248361</guid>
	<link>http://code.mumak.net/2012/02/simple-made-easy.html</link>
	<description>Rich Hickey did a great talk at Strange Loop called &quot;&lt;a href=&quot;http://www.infoq.com/presentations/Simple-Made-Easy&quot;&gt;Simple Made Easy&lt;/a&gt;&quot;. You should watch it.&lt;br /&gt;&lt;br /&gt;When I tried to explain the talk to someone, I stumbled a lot and it was obvious to me that I didn't really understand it. So I'm going through it again and turning it into a blog post, purely for my own gain.&lt;br /&gt;&lt;br /&gt;This is roughly the first half of the talk. Not much of my own analysis or opinion is inserted, and I've pretty much stuck with Hickey's illustrations and phrasings. Thus this post is pretty derivative. Oops.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Simple vs Easy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&quot;Simple&quot; means one thing, &quot;easy&quot; another. Simple is the opposite of complex. A thing is simple if it has no interleaving, if it has one purpose, one concept, one dimension, one task. Being simple does not imply one instance or one operation: it's about interleaving, not cardinality. Importantly, this means that simplicity is &lt;i&gt;objective&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Easy is the opposite of hard, or difficult. A thing is easy if it's near to hand, if it's easy to get at (location), if it's near to our understanding (familiarity) or skill set or if it's within our capabilities. This means that ease is&lt;i&gt; relative&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Speaking English is dead easy for me, but that doesn't mean that speaking English is intrinsically simple. I find French quite difficult. Little French children speak French all the time, and there's always a part of me that thinks, &quot;Boy, those kids are clever, being able to speak a foreign language at that age&quot;, but that's silly. It's easy for them, it lies near to them.&lt;br /&gt;&lt;br /&gt;This distinction between simple &amp;amp; easy is good one, and is useful in all sorts of areas. But how does it relate to software?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Constructs vs Artefacts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As programmers, when we make software we are working on &lt;i&gt;constructs&lt;/i&gt;: source code, libraries, language concepts and so forth. Rich contends that we focus on the ease of use of those constructs: How many lines of code? How much boilerplate? Will new developers be familiar with our technology?&lt;br /&gt;&lt;br /&gt;But all of this is secondary. What actually matters is the &lt;i&gt;artefact&lt;/i&gt;, the running programs that users actually use. Does it do what it's supposed to do? Does it do it well? Can we rely on it working well? Can we fix problems when they occur? Can we change it? You know, the interesting problems.&lt;br /&gt;&lt;br /&gt;Thus we need to be assessing our constructs – our code, our technology choices – based on the attributes of the artefacts that we'll create, not based on the experience of typing code in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Limits&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We can't make something reliable if we don't understand it. And, actually, everyone's understanding is pretty limited. We can all only hold a small number of things in our head at once.&lt;br /&gt;&lt;br /&gt;When things are complex, many parts are tied together by definition. You can't pull out just one piece and consider it because it's intertwined with other pieces. This creates an extra burden to understanding a system and thus makes it difficult to reason about the system.&lt;br /&gt;&lt;br /&gt;You do need to reason about a system, both to know what to change and to be able to do so without introducing defects. Tests, refactoring, rapid deployment and all that are great, but to make a change to the system safely &amp;amp; without fear still requires you to be able to reason about it. Every bug in your product that was found in the field passed the type checker and passed all of the tests.  Your type system doesn't tell you what change to make next in order to get the software you want any more than guard rails on a highway tell you how to get to Grandma's.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Speed&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Focusing on ease and ignoring simplicity means that you'll go really fast in the beginning, but will become slower and slower as the complexity builds.&lt;br /&gt;&lt;br /&gt;Focusing on simplicity will mean that you'll go slower in the beginning, because you'll have to do some work to simplify the problem space, but making sure that you only have intrinsic complexity means that your rate of development will remain at a high constant.&lt;br /&gt;&lt;br /&gt;There are no actual numbers for this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Complicating constructs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Many complicating constructs are available, familiar, succinctly described and easy to use. But none of that matters to end users. What matters is the complexity they yield. This complexity is &lt;i&gt;incidental&lt;/i&gt;, it's not intrinsic to the problem.&lt;br /&gt;&lt;br /&gt;If we build things simply, then the resulting system is easier to debug, easier to change and easier to understand.&lt;br /&gt;&lt;br /&gt;Compare a knitted castle to a castle made of Lego. The knitted castle might have been great fun to make, and might have been really easy if knitted using a loom and cutting edge knitting tools, but there's no way that it's easier to change than a Lego castle. It's not about the &lt;i&gt;ease of construction&lt;/i&gt;, it's about the &lt;i&gt;simplicity of the artefact&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How can we make software easier?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Well, we can install it to make it easier by location. We can learn it and try it to make it easier by familiarity. We can't do much about our capabilities though. If we want software to be easier to comprehend, we are going to have to bring it down to our level. We have to make it simpler.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Take Lisp as an example. It's hard for many people because they don't have a Lisp installed, or their editor doesn't support paren matching, but they can make it easier by installing a Lisp and getting a plugin for their editor. It's also hard because it's unfamiliar. Who'd have thought that parens could go on that side of the function? But you can gain that familiarity quickly enough.&lt;br /&gt;&lt;br /&gt;But parens in Lisp are used for functions and for grouping data. That's hard to get your head around, and that's because it's complex. It braids together two distinct notions.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-4903070032423248361?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 01 Feb 2012 13:50:38 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Undistract me</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-7007235897083396697</guid>
	<link>http://code.mumak.net/2012/01/undistract-me.html</link>
	<description>Here's a thing that happens a lot to me: I'm doing some work, and as part of that work I need to run a command in my terminal that takes a little while. I run the command, look at it for about a second and then switch to doing something else – checking email, perhaps. I get deeply involved in my email checking, and then about twenty minutes later I switch back to the terminal and see the command has finished. For all I know, it finished nineteen minutes ago, and I was just too engrossed to notice it.&lt;br /&gt;&lt;br /&gt;This is a big productivity sink for me, especially if the command happened to fail and need retrying. I'm not disciplined enough to just sit and watch the command, and I'm not prescient enough to add something to each invocation telling me when a command is done. What I want is something that alerts me whenever long running commands finish.&lt;br /&gt;&lt;br /&gt;Well, that thing now exists, thanks to &lt;a href=&quot;http://glyph.twistedmatrix.com/&quot;&gt;glyph&lt;/a&gt;'s &lt;a href=&quot;http://glyph.twistedmatrix.com/2006/11/bash-shell-is-now-fully-operational.html&quot;&gt;script that provides precmd and postcmd support to bash&lt;/a&gt; and a lot of help from &lt;a href=&quot;http://www.tenshu.net/&quot;&gt;Chris Jones&lt;/a&gt; of &lt;a href=&quot;http://www.tenshu.net/p/terminator.html&quot;&gt;Terminator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To use it right now:&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt; $ bzr co lp:~jml/+junk/shell-tools&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt; $ . shell-tools/long-running.bash&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt; $ notify_when_long_running_commands_finish_install&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;You'll see that if you run a command that takes over 30 seconds to complete, it will pop up a notification, which should hopefully take you away from whatever it was you are doing and back to the task at hand.&lt;br /&gt;&lt;br /&gt;If you &lt;a href=&quot;http://bazaar.launchpad.net/~jml/+junk/shell-tools/view/head:/long-running.bash&quot;&gt;look at the code&lt;/a&gt;, you'll see that it installs two hooks: &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;precmd&lt;/span&gt; and &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;preexec&lt;/span&gt;. &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;preexec&lt;/span&gt; runs just before the shell launches a command, and &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;precmd&lt;/span&gt; runs just before it prompts for the next command. Our &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;preexec&lt;/span&gt; stores when the command was launched and the &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;precmd&lt;/span&gt; checks to see if it finished within a certain time frame. If not, it sends out a notification.&lt;br /&gt;&lt;br /&gt;Currently, you'll get a notification when you finish reading a long document, since the command finishes a long time after the command starts. Obviously this isn't ideal. I think the fix is to only send notifications when the shell doesn't have focus. Unfortunately, that's a little tricky and I think is going to be highly terminal specific.&lt;br /&gt;&lt;br /&gt;Anyway, I'm a total shell newbie, so I'd love to know if there's any way this could be done better.  Also let me know if you find this useful, or you know of someone who has already done this.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-7007235897083396697?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 23 Jan 2012 17:44:37 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: What are my projects?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-8212227942183096608</guid>
	<link>http://code.mumak.net/2011/12/what-are-my-projects.html</link>
	<description>Launchpad doesn't really have any good mechanism for letting you review a list of &quot;your&quot; projects.&lt;br /&gt;&lt;br /&gt;That's partly because there are a lot of different ways that it &lt;i&gt;could&lt;/i&gt; do it. You could be the maintainer of a project, or its driver, or its bug supervisor, or you might have commit access to its trunk branch. All of this could be direct, or through membership of a team. It's tough.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since it's that time of year when I review my projects, responsibilities, goals and the like and start to figure out what I want to do next year, I want to figure out what are my projects on Launchpad.&lt;br /&gt;&lt;br /&gt;Luckily, Launchpad has an API. I can't use it to figure out what projects I'm the maintainer of, but I can use it to figure out &lt;a href=&quot;http://paste.ubuntu.com/783038/&quot;&gt;what trunk branches I have commit access to&lt;/a&gt;.  The link has the Python code for the script.&lt;br /&gt;&lt;br /&gt;Really, Launchpad should allow me to curate my own list of projects, with input to that list coming from all of the sources mentioned above, as well as arbitrarily selecting projects.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-8212227942183096608?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 26 Dec 2011 04:54:40 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: pyflakes update</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-470633188402716824</guid>
	<link>http://code.mumak.net/2011/11/pyflakes-update.html</link>
	<description>Thanks to &lt;a href=&quot;http://radix.twistedmatrix.com/&quot;&gt;radix&lt;/a&gt;, &lt;a href=&quot;http://as.ynchrono.us/&quot;&gt;exarkun&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://as.ynchrono.us/&quot;&gt;dash&lt;/a&gt;, my branch to &lt;a href=&quot;http://pypi.python.org/pypi/pyflakes&quot;&gt;pyflakes&lt;/a&gt; to warn about duplicate definitions of classes finally landed. I did the work a year ago as an outrage-powered, opportunistic fix after I saw a co-worker struggle with tests weirdly not failing (Turned out it was a huge test module and there was another class at the bottom with the same name). I'm very happy to see it landed.&lt;br /&gt;&lt;br /&gt;For those who haven't been paying attention, official pyflakes development is now taking place on &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; as part of the &lt;a href=&quot;http://launchpad.net/divmod.org&quot;&gt;divmod.org&lt;/a&gt; project. The trunk of that project now has the best version of pyflakes known to man.&lt;br /&gt;&lt;br /&gt;pyflakes is the best static Python checker. It's fast, and has very few false positives.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: &lt;/b&gt;A couple of people have asked me about &lt;a href=&quot;https://launchpad.net/pyflakes&quot;&gt;lp:pyflakes&lt;/a&gt;. It's dead. It died when the divmorg.org trac instance died ages ago. Don't use it. To get pyflakes or any other divmod project, use &lt;a href=&quot;https://launchpad.net/divmod.org&quot;&gt;lp:divmod.org&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-470633188402716824?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 21 Nov 2011 14:29:05 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Automatic packaging update</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-2586467635191977316</guid>
	<link>http://code.mumak.net/2011/11/automatic-packaging-update.html</link>
	<description>I just blogged on developer.ubuntu.com about &lt;a href=&quot;http://developer.ubuntu.com/2011/11/automatic-packaging-progress/&quot;&gt;the work we're doing with automatic packaging&lt;/a&gt;. Read it!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2586467635191977316?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 10 Nov 2011 12:40:33 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: How to feel better (or, some tips on refactoring)</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-6888679017330633879</guid>
	<link>http://code.mumak.net/2011/11/how-to-feel-better-or-some-tips-on.html</link>
	<description>&lt;span style=&quot;background-color: transparent;&quot;&gt;A few months back I gave a lightning talk at the &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; Thunderdome about how I do refactoring.  It's very opinionated, and mostly applies to big, old code bases, but worth writing up anyway.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;The core idea here is that very few things make me feel as good as deleting code. I love cleaning up code and the clean code base that results, and I'm sure that many others feel like me. As such, this is a guide on how to feel better.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Know your enemy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;“Functionality is an asset, code is a liability”. Truer words were never spoken. Every line of code is a potential source of bugs and a barrier to understanding, and thus carries a maintenance cost.&lt;br /&gt;&lt;br /&gt;Maintain an awareness of things that need refactoring. Here's a quick and incomplete list:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;unused code – this can be deleted&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;boilerplate – this should become a function or class&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;wrong documentation – these should be updated&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;two ways of doing something – perhaps there should be one&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;bad names – change them to something that makes you think less&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;2. Keep a &quot;yak stack&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;background-color: transparent;&quot; href=&quot;http://projects.csail.mit.edu/gsb/old-archive/gsb-archive/gsb2000-02-11.html&quot;&gt;Yak shaving&lt;/a&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; is &quot;any seemingly pointless activity which is actually necessary to solve a problem which solves a problem which, several levels of recursion later, solves the real problem you're working on.&quot; (&lt;a href=&quot;http://catb.org/jargon/html/Y/yak-shaving.html&quot;&gt;Jargon File&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A few of us have extended the concept beyond the &quot;actually necessary&quot; to include anything that's making the task at hand more difficult and less fun but is not worth fixing &lt;i&gt;right&lt;/i&gt; now. Hence the yak stack. Here's how it works:&lt;br /&gt;&lt;br /&gt;Whenever you come across something in your code base that is difficult to understand or that slows you down: make a note of it. When you've finished the task at hand, fix the problem. If you encounter other things that slow you down, write them down. Work through the list.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Every option is wrong&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In a big, old code base, there are probably many, many areas that need refactoring.  Don't worry about which is the &quot;best&quot; place to start – there is no best place.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Start from green, stay green&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Never, ever refactor while your tests are failing. Refactoring is about changing the shape of code while preserving its behaviour. It's much harder to be sure you're keeping the behaviour if you are comparing one set of thirty tracebacks with another set of thirty tracebacks. Better to compare a passing (&quot;green&quot;) test run with another passing test run.&lt;br /&gt;&lt;br /&gt;Run tests frequently. More often then you think you should. Commit often – think of it like quick save in a tough level of a video game. It frees you up to experiment more and means you have less in your head at any one time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Do not nest&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't begin a refactoring while you are in the middle of another refactoring. If you find you must, use tools like '&lt;a href=&quot;http://doc.bazaar.canonical.com/beta/en/user-guide/shelving_changes.html&quot;&gt;bzr shelve&lt;/a&gt;' to store your current diff and then work from the clean head of your branch.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Keep moving, leave a trail&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't get bogged down in details, otherwise you'll never finish. Literally. Someone will come along and distract you and before you know it, three months will pass and your refactoring branch will be full of conflicts. If you see something you are unsure of, mark it with a XXX or a FIXME or a TODO or whatever works for you and then continue with what you are doing.&lt;br /&gt;&lt;br /&gt;Tools like '&lt;a href=&quot;http://launchpad.net/difftodo&quot;&gt;bzr todo&lt;/a&gt;' can make it really easy to check to see if you've added any XXX comments.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. Translate tests with care&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As said above, refactoring is about changing the shape of code while preserving its behaviour. When you update tests, you risk changing your definition of the system's behaviour – so be careful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. Confront uncertainty with destruction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you see some code and you are not sure if it's needed, delete it. Doesn't matter if it's a whole function or just an odd line. If you have a test suite, and it was important, that will catch the failure. If you have version control, and it was important, one of your collaborators will notice and revert the change.&lt;br /&gt;&lt;br /&gt;If it was important and neither of these happened, then your whole project has learned something new about itself, and that's probably worth the hassle. (Oh, add tests &amp;amp; better docs after this happens.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;9. Good grep tools&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Remember that symbols aren't only referenced from files that match *.py.  In big code bases there are often other sorts of files that refer to symbols in the main code. In Launchpad, for example, we have ZCML and doctest files that refer to symbols. When you want to know how something is used or you want to rename something, make sure you use a grep command that actually finds everything.&lt;br /&gt;&lt;br /&gt;Ideally, you should be able to run this command faster than you can think about wanting to do it.&lt;br /&gt;&lt;br /&gt;Personally, I use 'bzr grep' a lot. Others recommend 'ack'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10. There will be failures&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mentally prepare yourself for the fact that the first two or three full test runs after your refactoring will fail.  This is especially important for code bases that have multi-hour test run times.&lt;br /&gt;&lt;br /&gt;If you think this way, then you won't be as discouraged when it actually happens.&lt;br /&gt;&lt;br /&gt;&lt;b style=&quot;background-color: transparent;&quot;&gt;11. Finish the job&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Busy people refactoring a big code base are often tempted to apply a refactoring to only a single part.  For example, some useful function is extracted from repeated boilerplate in a few other functions. However, many, many other instances in the code base continue to use the repeated boilerplate.&lt;br /&gt;&lt;br /&gt;This is &lt;i&gt;almost&lt;/i&gt; worse than just leaving the repeated boilerplate.  There are now two idiomatic ways of doing the activity.  Further, other developers who work on other parts of the code base probably won't find out about it, and might end up repeating your refactoring. Ugh. How is anyone new expected to get to grips with this code?&lt;br /&gt;&lt;br /&gt;Similarly, if a class, function or concept is renamed, rename it everywhere, especially in the documentation.&lt;br /&gt;&lt;br /&gt;It's difficult and often tedious, but it really is worth taking refactorings to completion. Apply them to the whole code base, or not at all.&lt;br /&gt;&lt;br /&gt;Note that I'm referring to completeness, not perfection. If you block on perfection, you never get anything useful done. If you aim for frequent incremental improvements, you soar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;12. Read these books&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I highly recommend &quot;&lt;a href=&quot;http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1320430812&amp;amp;sr=1-1&quot;&gt;Refactoring&lt;/a&gt;&quot; by Martin Fowler and &quot;&lt;a href=&quot;http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1320430812&amp;amp;sr=1-1&quot;&gt;TDD by Example&lt;/a&gt;&quot; by Kent Beck. I stole many of these ideas from them.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Over to you&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This was very much just a dump of how I do refactoring when hacking on Launchpad. I'm always keen to learn more, and would love to hear about what works for you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6888679017330633879?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 04 Nov 2011 18:29:19 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Outcomes of meetings</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-3890973149374779102</guid>
	<link>http://life.mumak.net/2011/10/outcomes-of-meetings.html</link>
	<description>At Canonical, we normally work in a distributed environment. As such, when we do get together, it's either for intense, multiple day meetings or intense, multiple day hacking sessions. Either way, there's a bunch of useful talk and progress, and this often needs to get written up.&lt;br /&gt;&lt;br /&gt;While minutes and daily reports are a barrel of fun, for actually &lt;i&gt;doing&lt;/i&gt; things and telling others how much you've done, you only really need to record three types of thing:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Next Actions – what you're going to do next, and who's going to do it&lt;/li&gt;&lt;li&gt;Decisions – you've had discussions and come to conclusions, what were they?&lt;/li&gt;&lt;li&gt;Achievements – things that actually got done during the meeting / hacking session&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;You can remember these with the convenient acronym, NADA.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-3890973149374779102?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 13 Oct 2011 15:24:23 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Time isn't money</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-3706170793491244667</guid>
	<link>http://life.mumak.net/2011/09/time-isnt-money.html</link>
	<description>&lt;a href=&quot;http://www.economist.com/economics-a-to-z/m#node-21529761&quot;&gt;According to The Economist&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Money has three main qualities:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;as a medium of exchange, buyers can give it to sellers to pay for goods and services; &lt;/li&gt;&lt;li&gt;as a unit of account, it can be used to add up apples and oranges in some common value;&lt;/li&gt;&lt;li&gt;as a store of value, it can be used to transfer purchasing power into the future.&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;Can time be a medium of exchange? I guess sort of, but it's a little like barter for services. Much better to use money for that.&lt;br /&gt;&lt;br /&gt;I guess it can be used as a unit of account. It took me as long to write this as it takes me to fold my laundry and clean my room. Learning French to conversational levels might take as much time as playing through Arkham Asylum and the next Assassin's Creed. Useful things to know.&lt;br /&gt;&lt;br /&gt;Turns out you can't store time though. Those few minutes of spare time you have can't be put into a time bank and then redeemed for extra spare time in the future. It goes stale very quickly.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-3706170793491244667?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 28 Sep 2011 10:19:31 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.12 out</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-6056092545256978331</guid>
	<link>http://code.mumak.net/2011/09/testtools-0912-out.html</link>
	<description>&lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;testtools&lt;/a&gt; 0.9.12 has just been released!&lt;br /&gt;&lt;br /&gt;It's a huge release, this one. We normally try to release much more frequently, but for this release I wanted to wait until &lt;a href=&quot;https://bugs.launchpad.net/testtools/+bugs?field.tag=unicode&amp;amp;field.status=Fix+Released&quot;&gt;all of our known unicode handling bugs were fixed&lt;/a&gt;. Today, &lt;a href=&quot;https://launchpad.net/~gz&quot;&gt;Martin [gz]&lt;/a&gt; finished off his &lt;a href=&quot;https://code.launchpad.net/~gz/testtools/unprintable-assertThat-804127/+merge/72641&quot;&gt;heroic branch&lt;/a&gt; to fix up &lt;a href=&quot;http://testtools.readthedocs.org/en/latest/for-test-authors.html#matchers&quot;&gt;&lt;code&gt;assertThat&lt;/code&gt;&lt;/a&gt;, and I figured it was time to release.&lt;br /&gt;&lt;br /&gt;In addition to all of the unicode fixes, we've really cleaned up the way test failures are displayed. A lot of the boilerplate around the traceback has been removed, a lot of levels of the stack are gone (although you can get them back if you want), and &lt;code&gt;assertThat&lt;/code&gt; is way less repetitive. This all really adds up. If you're using an old release, you want to upgrade right now. Honest.&lt;br /&gt;&lt;br /&gt;For me, this release is the one where using &lt;a href=&quot;http://testtools.readthedocs.org/en/latest/for-test-authors.html#matchers&quot;&gt;matchers&lt;/a&gt; becomes really and properly fun. As such, all of our &lt;code&gt;assertFoo&lt;/code&gt; methods are now implemented in terms of matchers.&lt;br /&gt;&lt;br /&gt;Of course, we have our usual raft of fixes, helpers and new matchers too. The &lt;a href=&quot;https://launchpad.net/testtools/0.9/0.9.12&quot;&gt;full changelog&lt;/a&gt; is on Launchpad.&lt;br /&gt;&lt;br /&gt;In addition to Martin [gz], thanks to &lt;a href=&quot;https://launchpad.net/~kampka&quot;&gt;Christian Kampka&lt;/a&gt;, &lt;a href=&quot;https://launchpad.net/~lifeless&quot;&gt;Robert Collins&lt;/a&gt; and &lt;a href=&quot;http://canonical.com/&quot;&gt;Canonical&lt;/a&gt; for making this release what it is.&lt;br /&gt;&lt;br /&gt;If you're new to testtools, it's basically a way to do serious, &lt;a href=&quot;http://testtools.readthedocs.org/en/latest/overview.html&quot;&gt;tasteful unit testing in Python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Documentation lives at &lt;a href=&quot;http://testtools.readthedocs.org/en/latest/&quot;&gt;http://testtools.readthedocs.org/en/latest/&lt;/a&gt;.&lt;br /&gt;PyPI: &lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;http://pypi.python.org/pypi/testtools&lt;/a&gt;&lt;br /&gt;All development takes place on Launchpad: &lt;a href=&quot;https://launchpad.net/testtools&quot;&gt;https://launchpad.net/testtools&lt;/a&gt;&lt;br /&gt;Join us on #python-testing on Freenode&lt;br /&gt;&lt;br /&gt;We don't currently have a release PPA, but we do have a &lt;a href=&quot;https://launchpad.net/~testing-cabal/+archive/archive&quot;&gt;daily builds PPA&lt;/a&gt;. The trunk is kept stable using &lt;a href=&quot;http://mumak.net:8080/job/testtools/&quot;&gt;Jenkins&lt;/a&gt;, so it's fairly safe to use.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6056092545256978331?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 14 Sep 2011 11:01:19 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Date picked!</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-1796760596162020855</guid>
	<link>http://life.mumak.net/2011/09/date-picked.html</link>
	<description>For all of those readers who might be interested, and foreign friends who might be in London at the time, let it be known that Joliette &amp;amp; I have picked the date of our wedding. Let it be May 12th, 2012.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-1796760596162020855?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 13 Sep 2011 21:24:36 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Engaged!</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-7797613771162160979</guid>
	<link>http://life.mumak.net/2011/09/engaged.html</link>
	<description>A couple of weekends ago, Joliette and I were on holiday in Barcelona, visiting our friends Jamu &amp;amp; Jenn.&lt;br /&gt;&lt;br /&gt;While we were there, the four of us walked up to the top of Tibidabo, a mountain overlooking Barcelona. We walked to the very top where Joliette and I separated from our hosts to take a closer look at the church. After looking around at its interior a bit, we went outside. I drew Joliette aside underneath some trees away from the crowds, got down on one knee and asked her to marry me.&lt;br /&gt;&lt;br /&gt;She said yes.&lt;br /&gt;&lt;br /&gt;And then I started breathing again, and gave her the ring that I had been carrying around like a fool in &quot;Europe's pickpocketing capital&quot;.&lt;br /&gt;&lt;br /&gt;Since then, we've told our families, announced on Facebook and are mere hours away from deciding on a date. Wedding planning has begun in earnest. As Joliette's family is mostly in America, and mine is mostly in Australia, and we're marrying in London, we have our work cut out for us.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-7797613771162160979?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 10 Sep 2011 13:36:59 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: doctest really isn't very good</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-4657676752238884840</guid>
	<link>http://code.mumak.net/2011/09/doctest-really-isnt-very-good.html</link>
	<description>&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;I just got sick of trying to decode obtuse doctest diff errors when using NORMALIZE_WHITESPACE and ELLIPSIS options. Although doctest gives you hooks to do something about this, it's really hard to actually write the logic.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;See, NORMALIZE_WHITESPACE also normalizes line breaks, and '...' can match across multiple lines. That means that you can't take a line-based approach, which makes it really hard to clean up a diff. Anyway, here's my attempt: &lt;/span&gt;&lt;a href=&quot;https://code.launchpad.net/~jml/testtools/better-doctest-output-checker/+merge/74842&quot;&gt;https://code.launchpad.net/~jml/testtools/better-doctest-output-checker/+merge/74842&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;It's a pain, because both of them would be very useful without their line-spanning behaviour. I guess without the line-spanning behaviour of '...' there'd be no way to indicate multiple lines of crap in output.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;My suggestion in the mean time? Don't use doctest.&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-4657676752238884840?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 09 Sep 2011 17:39:48 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Progress on auto packaging</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-7623468891540815290</guid>
	<link>http://code.mumak.net/2011/08/progress-on-auto-packaging.html</link>
	<description>Instead of a junk branch, the auto packaging code now has &lt;a href=&quot;https://launchpad.net/pkgme-binary&quot;&gt;a proper home on Launchpad&lt;/a&gt;. I've filed bugs for all of the things that I could think of that were wrong with it. Actually, that's a lie. When I spot something wrong in code or behaviour I make a note, usually a XXX comment. The bugs up there are the ones I got from grepping my notes.&lt;br /&gt;&lt;br /&gt;Anyway, minor rant on effective use of brain and the gift of literacy aside, I've also done a &lt;a href=&quot;https://wiki.ubuntu.com/AutomagicBinaryPackaging&quot;&gt;reasonably detailed specification&lt;/a&gt;. It's been a long time since I've done a spec this technical &amp;amp; detailed, but I hope it works out. If you have any comments or questions, ask here or on the spec itself.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-7623468891540815290?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 23 Aug 2011 18:09:54 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Coffee</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-7980979254156665292</guid>
	<link>http://life.mumak.net/2011/08/coffee.html</link>
	<description>I'm not a morning person. At all. I really don't like waking up, or indeed doing anything before 11am. Sadly, not being possessed of a fortune and thus able to live life at the mellow tempo of my choosing, I have to put up with it.&lt;br /&gt;&lt;br /&gt;I've been doing an experiment to see if I can hate waking up less. The idea is to give up coffee and all other drinks with caffeine and see if I can draw from my own latent energy. After all, most of the &quot;buzz&quot; that regular coffee drinkers get is actually the relief of the withdrawal symptoms that they've developed over night. Or so I'm told.&lt;br /&gt;&lt;br /&gt;Last week I gradually cut down my coffee drinking from &quot;way too much&quot; to &quot;two shots of espresso&quot; to &quot;one shot&quot; and then to no coffee at all. No tea, no coke, no other sources of caffeine besides the occasional square of dark chocolate.&lt;br /&gt;&lt;br /&gt;I had major headaches on day two of the &quot;two shots&quot; stage, and felt mildly lethargic most of the week. Especially had a great deal of trouble focusing.&lt;br /&gt;&lt;br /&gt;The weekend was my first &quot;no coffee&quot; days. Mild headaches &amp;amp; severe lethargy. No need to focus. Thanks to a very patient Joliette for two great days.&lt;br /&gt;&lt;br /&gt;This week, the headaches and the lack of focus have been pretty tough. Today I've been headache free but very much craving a coffee as a way to signal, &quot;right, time to knuckle down &amp;amp; get to it&quot;. The focus-fog seems to be worst in the late morning and best in the afternoon.&lt;br /&gt;&lt;br /&gt;I've also been going to sleep earlier, although I've been doing more exercise, which may be a part of that.&lt;br /&gt;&lt;br /&gt;I'm still waiting for the day when I bounce right out of bed, eager to face the world, and for a day where my brain focuses like it does on caffeine. I'm hoping the day turns up next week, because I'm definitely going to have a &lt;i&gt;cortado&lt;/i&gt; or three when I'm in Barcelona.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-7980979254156665292?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Aug 2011 18:09:26 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: How dependency guessing works</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-8249439675228752696</guid>
	<link>http://code.mumak.net/2011/08/how-dependency-guessing-works.html</link>
	<description>Although in my &lt;a href=&quot;http://code.mumak.net/2011/08/automagic-packaging-of-binary-apps-for.html&quot;&gt;last post&lt;/a&gt; I talked about our proof of concept tool, I didn't actually explain how to use it. That's mostly because it's not quite ready to be used by others. There's a good reason.&lt;br /&gt;&lt;br /&gt;The most interesting thing that &lt;a href=&quot;https://code.launchpad.net/~jml/+junk/pkgme-binary&quot;&gt;pkgme-binary&lt;/a&gt; does is to guess the dependencies of an application given only its tarball. The way it does this is by finding all of the ELF objects (executables, shared libraries etc.), reading the symbols from them, and figuring out the packages based on those.&lt;br /&gt;&lt;br /&gt;Canny readers are already thinking, &quot;Yes, that is what dpkg-shlibdeps does&quot; – which is true. As some background, Debian packages that export symbols for linking also provide explicit metadata about those symbols and what versions they appear in, in order to allow Debian packagers to figure out dependencies easily using dpkg-shlibdeps. Fascinating reading can be found in the &lt;a href=&quot;http://www.debian.org/doc/debian-policy/ch-sharedlibs.html&quot;&gt;Debian policy manual&lt;/a&gt;, a &lt;a href=&quot;http://wiki.debian.org/Projects/ImprovedDpkgShlibdeps&quot;&gt;spec on improving dpkg-shlibdeps&lt;/a&gt; and &lt;a href=&quot;http://wiki.debian.org/UsingSymbolsFiles&quot;&gt;the guide on using the new symbol files&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Unfortunately, dpkg-shlibdeps can only query packages that are installed on your system. If you have a binary with symbols that are not provided by any library on your system, you cannot use it to calculate dependencies. Debian (or the Debian flavour of your choosing) might have a perfectly good package to satisfy that dependency, but you won't be able to find it.&lt;br /&gt;&lt;br /&gt;So, to do dependency guessing properly, you need to have a database mapping symbols back to packages. Debian already has something like this in its &lt;a href=&quot;http://qa.debian.org/cgi-bin/mole/seedsymbols/&quot;&gt;mole database&lt;/a&gt;. Ubuntu doesn't have anything like this that I know about.&lt;br /&gt;&lt;br /&gt;Assembling and maintaining such a database is pretty much a simple matter of programming, but it's still work that I wanted to avoid for the proof-of-concept. Instead, I used the mole database in Debian for the calculations. That means we'll get wrong answers for Ubuntu, but it demonstrates that the concept works.&lt;br /&gt;&lt;br /&gt;Since I have a copy of that mole database locally, and since it's about 1.5GB, I'm not distributing it with the branch. Which means that the &lt;a href=&quot;https://code.launchpad.net/~jml/+junk/pkgme-binary&quot;&gt;automagic binary packaging branch&lt;/a&gt; won't actually work for you.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-8249439675228752696?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 18 Aug 2011 12:18:20 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Automagic packaging of binary apps for Ubuntu</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-1398343073462714935</guid>
	<link>http://code.mumak.net/2011/08/automagic-packaging-of-binary-apps-for.html</link>
	<description>For the last few weeks I've been working on a tool to automagically package binary applications for Ubuntu. The idea is that anyone who wants to distribute a binary app on Ubuntu should be able to do so without having to learn how to package it.&lt;br /&gt;&lt;br /&gt;I've used &lt;a href=&quot;http://pkgme.net/&quot;&gt;pkgme&lt;/a&gt; to build a proof-of-concept: which you can look at here: &lt;a href=&quot;https://code.launchpad.net/~jml/+junk/pkgme-binary&quot;&gt;lp:~jml/+junk/pkgme-binary&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Or, you can watch the demo:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;clear: both; text-align: center;&quot; class=&quot;separator&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Right now, the tool assumes that the tarball:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;is an application&lt;/li&gt;
&lt;li&gt;contains ELF objects that can be scanned for symbols, which determine the dependencies&lt;/li&gt;
&lt;li&gt;has one main executable file&lt;/li&gt;
&lt;li&gt;that its contents can be copied into &lt;code&gt;/opt/$PACKAGE/&lt;/code&gt; and can be run from there by an ordinary user&lt;/li&gt;
&lt;li&gt;comes with a JSON file specifying extra metadata&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Our hope is that 90% of the binary applications we get will meet these requirements.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The plan is to take this proof-of-concept and turn it into something that will run server-side behind the &lt;a href=&quot;http://developer.ubuntu.com/&quot;&gt;Ubuntu Developer Portal&lt;/a&gt;. Next steps are to spec it out, create a project, start filing bugs and fix the bugs I already know about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Watch this space for more updates.&lt;br /&gt;&lt;br /&gt;Thanks to James Westby and Adam Conrad for their help in doing the proof-of-concept and to the dozen or so people who helped me get the darn screencast out.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-1398343073462714935?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 18 Aug 2011 11:57:39 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: launchpadlib helper</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-2910216578274245847</guid>
	<link>http://code.mumak.net/2011/08/launchpadlib-helper.html</link>
	<description>I often need to muck around in a Python interpreter to figure out what I need to do with &lt;a href=&quot;https://help.launchpad.net/API&quot;&gt;Launchpad's API&lt;/a&gt;. As it is, I write out the same commands over and over.&lt;br /&gt;&lt;br /&gt;Since repetition is a stupid boring job that we should force machines to do while they are still subservient, I wrote &lt;a href=&quot;http://paste.ubuntu.com/657088/&quot;&gt;a harness&lt;/a&gt; that, when run, gives you a Python interpreter and a few useful objects for playing with the Launchpad API.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ./lpharness.py &lt;br /&gt;lp:     authenticated Launchpad object&lt;br /&gt;me:     logged in user&lt;br /&gt;anon:   anonymous Launchpad object&lt;br /&gt;errors: launchpadlib.errors&lt;br /&gt;uris:   launchpadlib.uris&lt;br /&gt;&lt;br /&gt;pprint: pretty printer&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; pprint(list(me.searchTasks(status='In Progress')))&lt;br /&gt;[&amp;lt;bug_task at https://api.launchpad.net/1.0/launchpad/+bug/240067&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/launchpad/+bug/418932&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/hydrazine/+bug/535414&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/hydrazine/+bug/574981&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/hydrazine/+bug/612641&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/tarmac/+bug/683351&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/wikkid/+bug/695232&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/launchpad/+bug/721166&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/ensemble/+bug/728320&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/bughugger/+bug/731075&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/tarmac/+bug/807785&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/pkgme/+bug/809447&amp;gt;,&lt;br /&gt; &amp;lt;bug_task at https://api.launchpad.net/1.0/ubuntu-archive-tools/+bug/805634&amp;gt;]&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Script: &lt;a href=&quot;http://paste.ubuntu.com/657088/&quot;&gt;http://paste.ubuntu.com/657088/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You are free to do whatever you like with it. I hope that someone puts it into some useful, &lt;i&gt;maintained&lt;/i&gt;, centralized place for doing stuff with Launchpad. Perhaps launchpadlib itself.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2910216578274245847?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 02 Aug 2011 11:05:11 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Ubuntu on my iMac</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-9168568010788487059</guid>
	<link>http://code.mumak.net/2011/07/ubuntu-on-my-imac.html</link>
	<description>Long time readers will know of my attempts to get Ubuntu running on my iMac. Now that I'm working within the Ubuntu Engineering team at Canonical, I figured it would be a good time to try again.&lt;br /&gt;&lt;br /&gt;Installing natively fails on 11.04 in the same way that it failed on 10.10: the installer sends output to the Mini DisplayPort rather than the actual screen. I don't have an external monitor that I can hook up to the DisplayPort, so that's pretty much that.&lt;br /&gt;&lt;br /&gt;I can still run a VM, right? VirtualBox is pretty good, and I got me a running install of Ubuntu with the Unity shell without too much fuss. Problem comes with keyboard configuration. The literal keypresses Cmd+H and Cmd+Q are not passed through to the guest OS. With a Dvorak layout these become Cmd+D and Cmd+&quot;, and if one maps Cmd to Meta then you cannot easily kill-word in Emacs. That means for me to have a useful environment, I'd have to make do with Super and Meta swapped around from the usual PC layout.&lt;br /&gt;&lt;br /&gt;VM Fusion doesn't have this problem and has a nicer UI, but I can't run Unity or compiz under it. This makes Ubuntu feel really old and clunky, and I'd rather not do that.&lt;br /&gt;&lt;br /&gt;Parallels, well, at this point I'm running out of the will.&lt;br /&gt;&lt;br /&gt;Think I'll settle on VirtualBox for the time being.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-9168568010788487059?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 10 Jul 2011 13:52:30 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Super powers</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-2538693943100929212</guid>
	<link>http://life.mumak.net/2011/07/super-powers.html</link>
	<description>It used to be that if you asked me which super-power I wanted, I would tell you, &quot;instantaneous, effortless, accurate, error-free teleportation&quot;. Something very much like &lt;a href=&quot;http://www.imdb.com/title/tt0489099/&quot;&gt;Jumper&lt;/a&gt;, except with fewer determined foes and better acting. After all, that would mean no more flights, no more uphill walks, no more being late, no more forgetting things and plenty more holidays.&lt;br /&gt;&lt;br /&gt;But recently, I've changed my mind. I want to be &lt;i&gt;Video Game Man&lt;/i&gt;. I want the super-powers that every video game character actually has that aren't even treated as super-powers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Infinite stamina: &lt;/b&gt;Practically every video game character can run, jump, climb and fight forever without becoming tired, experiencing fatigue or slowing down in any way. This would make kickboxing much easier.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Self-sustaining:&lt;/b&gt; No need to eat, drink or sleep. Well, maybe if I got injured I could eat an apple to cure me. Think of the time saved.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pause:&lt;/b&gt; When things get too confusing or fast-paced, or when a difficult decision must be made, I could pause and take as much time as I wanted to think about it. Of course, it would only be thinking.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Quick save, quick load:&lt;/b&gt; Attempt difficult situations over and over again. Accidental death would not be a problem. Negotiations could be optimized. Future knowledge could be used to enhance past decisions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Friend or foe: &lt;/b&gt;Know instantly who the bad guys are. No more moral ambiguity for me, thank you very much!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Know thyself:&lt;/b&gt; Clear knowledge of all of my own capabilities – no more &lt;a href=&quot;http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect&quot;&gt;Dunning-Kruger effect&lt;/a&gt; for me! – and also of my own status, health, wealth etc. Always obvious what I could improve and how much I could improve.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Maps:&lt;/b&gt; Always knowing where I am, and where I need to go.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unbreakable: &lt;/b&gt;Although I could be injured, it would be impossible to break my limbs, blind me, deafen me, or even slow me down. No possible accident could reduce or remove any of my innate capabilities.&lt;br /&gt;&lt;br /&gt;Looking over this list, I'm reminded of &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Culture&quot;&gt;The Culture&lt;/a&gt;, a utopia designed by Iain M. Banks and the little I know of the &lt;a href=&quot;http://gamification.org/wiki/Gamification_Books/Reality_Is_Broken&quot;&gt;Reality is Broken&lt;/a&gt; meme. Which reminds me, most reader of this blog should look at &quot;&lt;a href=&quot;http://www.slideshare.net/dings/dont-play-games-with-me-promises-and-pitfalls-of-gameful-design&quot;&gt;Don't Play Games With Me&lt;/a&gt;&quot;.&lt;br /&gt;&lt;br /&gt;Oh, and if you're able to get me that teleporting gig, I guess I could be convinced to settle for that.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-2538693943100929212?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 03 Jul 2011 10:56:34 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Leaving Launchpad, going to work on Ubuntu</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-2853274017358241093</guid>
	<link>http://code.mumak.net/2011/06/leaving-launchpad-going-to-work-on.html</link>
	<description>After four and a half years of working on &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt;, I'm moving on within Canonical, taking a &lt;a href=&quot;http://t.co/R37ybBu&quot;&gt;position&lt;/a&gt; on the Ubuntu Engineering team, working to get more and better apps on &lt;a href=&quot;http://ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I am very excited about the change, but also a little sad, since it will mean leaving what has been &lt;i&gt;the&lt;/i&gt; best team I've worked on.  They are a wonderful bunch of people who not only get a lot of great stuff done, but consistently surprise me with their constant drive to get better at what they do.&lt;br /&gt;&lt;br /&gt;Over the last couple of years, we have changed the way we are organized so that we can focus on building a small number of features at a time, the features that we do churn out are much, much better, we are rolling out new versions of Launchpad multiple times a week and we are actually paying off technical debt.&lt;br /&gt;&lt;br /&gt;And they've needed to: Launchpad is a massive, ambitious application.  I've never worked on something so big that aims to do so much, and with so few people actually hacking on it.&lt;br /&gt;&lt;br /&gt;I still care a lot about Launchpad, It's crammed with potential and has so much to offer the open source world. It's going to be hard for me to move on.&lt;br /&gt;&lt;br /&gt;But, wow, what a place to move on to, and what a time to do it. Ubuntu is aiming to go from about 20 million users to about 200 million, and to do that is going to need way, way more apps than they have now.  To do &lt;i&gt;that&lt;/i&gt;, we'll need a spiffing developer programme, and that's where I come in. I'll be loading up on information, plans and more concrete goals in a couple of week's time in Dublin, and will share them as I can.&lt;br /&gt;&lt;br /&gt;Oh, and if you want to guide the world's &lt;a href=&quot;https://launchpad.net/&quot;&gt;best open source development collaboration platform&lt;/a&gt; into the future, do drop me or &lt;a href=&quot;https://launchpad.net/~flacoste&quot;&gt;Francis Lacoste&lt;/a&gt; a line.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2853274017358241093?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 20 Jun 2011 11:10:17 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.11 released</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-6063895291654576682</guid>
	<link>http://code.mumak.net/2011/06/testtools-0911-released.html</link>
	<description>While I slept, &lt;a href=&quot;https://launchpad.net/~lifeless&quot;&gt;Robert Collins&lt;/a&gt; released &lt;a href=&quot;http://pypi.python.org/pypi/testtools/0.9.11&quot;&gt;testtools 0.9.11&lt;/a&gt;. This release is mostly a bug fix release, but the fixes are very much worthwhile.&lt;br /&gt;&lt;br /&gt;In particular, &lt;a href=&quot;https://launchpad.net/~gz&quot;&gt;Martin [gz]&lt;/a&gt; got our Python 3 support going again, &lt;a href=&quot;http://gavinpanella.com/&quot;&gt;Gavin Panella&lt;/a&gt; fixed up a dodgy Matcher and fixed a bug in how we feed information from fixtures into test results.&lt;br /&gt;&lt;br /&gt;Also in this release, &lt;a href=&quot;https://launchpad.net/~tcole&quot;&gt;Tim Cole&lt;/a&gt; and &lt;a href=&quot;http://sourcefrog.net/&quot;&gt;Martin Pool&lt;/a&gt; made their first ever patches, for which they have my hearty thanks and congratulations. (The congratulations are also hearty.)&lt;br /&gt;&lt;br /&gt;As always, it's just so darn &lt;i&gt;pleasant&lt;/i&gt; to see so many fine people working together to make an open source project work.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6063895291654576682?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 12 Jun 2011 13:08:41 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.10 released</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-210307413493105982</guid>
	<link>http://code.mumak.net/2011/04/testtools-0910-released.html</link>
	<description>There was a bug in testtools 0.9.9 that prevented it from being easy_installed. Tres Seaver has fixed this bug, and I've rolled out a new release: &lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;testtools 0.9.10&lt;/a&gt;. Sorry for the inconvenience folks.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-210307413493105982?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 11 Apr 2011 12:44:58 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.9 released</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-3946464801057171567</guid>
	<link>http://code.mumak.net/2011/04/testtools-099-released.html</link>
	<description>&lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;testtools&lt;/a&gt; 0.9.9 has been released today. For me, the twin pillars of this release have been our &lt;a href=&quot;http://readthedocs.org/docs/testtools/en/latest/&quot;&gt;vast documentation improvements&lt;/a&gt; and &lt;a href=&quot;http://readthedocs.org/docs/testtools/en/latest/for-test-authors.html#matchers&quot;&gt;the new matchers&lt;/a&gt;, which make it very, very easy to make meaningful assertions about complex objects. Well worth checking out.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks to Christian Kampka, Robert Collins, Aaron Bentley, Jelmer Vernooij and Michael Hudson-Doyle their contributions.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-3946464801057171567?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 08 Apr 2011 12:00:17 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: mdz on listening to users</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-782473392010164529</guid>
	<link>http://code.mumak.net/2011/03/mdz-on-listening-to-users.html</link>
	<description>&lt;a href=&quot;http://mdzlog.alcor.net/&quot;&gt;Matt Zimmerman&lt;/a&gt; writes about whether we should &lt;a href=&quot;http://mdzlog.alcor.net/2011/03/07/listening-to-users/&quot;&gt;listen to users&lt;/a&gt;. It's a great post, and you should read it, but the summary is:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you want inspiration for a new product, don't listen to users, watch them&lt;/li&gt;&lt;li&gt;To test whether a product is a good fit, ask users for feedback and listen to it&lt;/li&gt;&lt;li&gt;If you want to incrementally improve an existing offering, don't listen, gather data&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I'm over-simplifying, you should read the original post. I also wonder whether it should be &quot;when is it safe to not act on user feedback&quot;, rather than &quot;not listening&quot; per se.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-782473392010164529?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 08 Mar 2011 09:02:09 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Sun day</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-8866658195285082227</guid>
	<link>http://life.mumak.net/2011/02/sun-day.html</link>
	<description>Winter is dragging on in London. There's a tree outside my window, perhaps I've told you about it before. When I first moved here a year and a half ago, its branches were bare and through the gaps between the ends I could see a dead building made of black and glass and a solid grey sky. It's like that now. Every time I look out my window I hope to see flowers budding or leaves growing, telling me that Spring is really here.&lt;br /&gt;&lt;br /&gt;It's odd to care so much about it, and to look for those signs. In Australia, so many plants are evergreen, and you have to be as far south as Tasmania for seasons to mean much. Flower buds and singing birds are the sort of metaphors you read in books and have to be explained to you, in much the way that the rain-in-a-dry-land metaphors in the Bible have to be explained to the British.&lt;br /&gt;&lt;br /&gt;I've spent the morning replying to personal correspondence, most of which has been sitting in a virtual drawer for months and months. I confess that a part of me saw it as a duty that had to be done, but that part quickly shrivelled once I actually started to re-read and reply to the emails. What I dreaded from a distance as a chore quickly became a pleasure when up close, and I truly am blessed to have such friends.&lt;br /&gt;&lt;br /&gt;Now there are lazy Sunday chores to do before I'm off to church. Cleaning, organizing, reviewing lists, making lists and carefully avoiding becoming lost in code, books or video games.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-8866658195285082227?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 20 Feb 2011 13:41:37 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Twitter</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-1052939387863045612</guid>
	<link>http://life.mumak.net/2011/02/twitter.html</link>
	<description>There are a lot of interesting people on Twitter, and it seems like a good way to be part of a broader conversation. I quite like the short format of Facebook status update, so it figures that tweeting should come naturally.&lt;br /&gt;&lt;br /&gt;The problem is I always slide off Twitter like a sock off a warm glass window (try it sometime!). I just can't stick to it. Anyone else had this problem? Is it a tech thing or an attitude thing? Am I better off leaving it alone?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-1052939387863045612?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 02 Feb 2011 12:11:00 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Music is too hard</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-410101800974954324</guid>
	<link>http://code.mumak.net/2011/02/music-is-too-hard.html</link>
	<description>It's way too hard to keep all of my music stored on one machine in a lossless format, have it backed up to another machine, synced to my iPod in MP3 and have it pleasingly playable on my OS X computer. Way too hard. Really.&lt;br /&gt;Especially since fixes to track listings and so forth seem to vanish like smoke in the breeze. Banshee and Rhythmbox both pretend to help, but that's only so they can mess with my life more.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-410101800974954324?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 02 Feb 2011 12:04:01 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: The time is out of joint</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-5306936714534312274</guid>
	<link>http://life.mumak.net/2011/01/time-is-out-of-joint.html</link>
	<description>I mentioned a while ago how it felt like I'd been living in some pretty big times. Since then, subjective time has been torn out of the shoulder socket of habit and things have been in a bit of a mess. A good mess, but a mess nevertheless. There's nothing for it but to recount what's happened.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Buckets of fun were had over Christmas. I spent the Eve and the Day with Ian and Rowan, two friends from church who shared a wonderfully family-like Christmas with me. Ro even made a stocking with my name on it. I lost every single board game I played, but there was nice port. I also got a chance to have a video call with most of my Tasmanian family. Funny to think that was the first time I saw my parents in over a year.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that, I returned home and played video games for a week solid, while Joliette and practically everyone else were away. &lt;i&gt;Enslaved &lt;/i&gt;is very good, and &lt;i&gt;Batman: Arkham Asylum&lt;/i&gt; is even better, but you probably knew that already.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Square-eye fun ended, the new year rolled around and I packed my bags and went to Dallas for three weeks. Now, there are many fine people who live in Dallas, many of whom have been kind to me. But it's a hole.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Granted, I spent most of the time in a hotel in conference rooms without natural sunlight talking about some of the more arcane aspects of distributed open source software development, but even so, it's not one of my top ten favourite cities. In each of &lt;i&gt;those&lt;/i&gt; cities, you do not need a car to cross the street.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first week in Dallas was spent doing the &lt;a href=&quot;http://paizo.com/pathfinderRPG&quot;&gt;single geekiest thing&lt;/a&gt; that has ever been done in that city. Our old group from Tassie was re-formed, along with special guest James Whelan. My monk kicked arse.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eventually, after both play and work were done, I left Dallas (yay!) and went home to London. Jetlag has thrown the time out of joint in a different way, although if I had more discipline I would recover faster. Returning to kickboxing after six weeks out of practice is an exercise in humility, as was watching some of the clips from my grading session.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J &amp;amp; I went to see Hamlet on Wednesday. It's my first time watching it on stage, and the first performance J has ever seen. I was very pleased. I had forgotten just how good it is. The production emphasised the constant surveillance of the Danish court, Kinnear played the Dane as a hyper-sensitive introvert who shields himself with wit, and &lt;a href=&quot;http://www.nationaltheatre.org.uk/59912/company-members/david-calder.html&quot;&gt;Calder&lt;/a&gt; did an excellent Polonius.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Driving goes well. After warming up a bit I seemed to be as good as I was six weeks ago. Apparently, I've just got to master maneuvres, roundabouts and the motorway before I'm ready for my test.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, did my first ever yoga class yesterday. I was expecting it to be challenging because I'm not very flexible. It turned out to be challenging because I'm not very strong. I'm surprised that the male yoga practitioners I know don't look substantially beefier, to be honest. Also, I hadn't expected to break a sweat. Nice that there wasn't much of a &quot;spiritual&quot; element to that, as there are certain teachings that I cannot submit to nor appear to submit to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it, I think. Hope all is going well with you.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-5306936714534312274?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 30 Jan 2011 12:28:46 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Expressing agreement and disagreement numerically</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-2760044447945880562</guid>
	<link>http://code.mumak.net/2011/01/expressing-agreement-and-disagreement.html</link>
	<description>There's a habit within Canonical on expressing agreement and disagreement numerically. If we agree with something someone says in email or IRC, we'll often say &quot;+1&quot;, which means &quot;I agree!&quot; or &quot;if we were to vote about this, you would have my vote&quot;. I sometimes hear people actually say the words &quot;plus one&quot; in conversation.&lt;br /&gt;&lt;br /&gt;Some have extrapolated from this to say &quot;-1&quot; to mean &quot;I disagree&quot;, which is a pretty natural thing to do. However, it confuses me a lot.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;You see, the &quot;+1&quot; thing is a little bit like the &lt;a href=&quot;http://httpd.apache.org/dev/guidelines.html&quot;&gt;Apache voting system&lt;/a&gt;, which I met in my early days of open source, back when I lurked on the Subversion development mailing list. The voting rules there were burned into my mind, and I foolishly assume that they are equally fundamental to everyone else.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In the Apache system, &quot;-1&quot; means &quot;veto&quot;, which is a very strong way of disagreeing. When people on the Launchpad say &quot;-1&quot;, I never really know what they mean. I don't blame them, &quot;-1&quot; is a bit of a silly way of vetoing a proposal. I bet if keyboards had a key for ∞, there'd be a much more sensible way.&lt;br /&gt;&lt;br /&gt;I guess the moral of the story is, &quot;ambiguous shorthand is ambiguous&quot;.&lt;br /&gt;&lt;br /&gt;Incidentally, how does the Apache voting system work out in practice these days?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2760044447945880562?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 25 Jan 2011 18:02:02 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Larval prototype for Launchpad dashboards</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-818956548715443266</guid>
	<link>http://code.mumak.net/2010/12/larval-prototype-for-launchpad.html</link>
	<description>I mentioned &lt;a href=&quot;http://code.mumak.net/2010/11/and-then-what.html&quot;&gt;a while ago&lt;/a&gt; that I really want to see something like a dashboard in Launchpad, some kind of view that shows you everything that you &lt;i&gt;must&lt;/i&gt; do, everything that you are waiting on from others and all of your current work-in-progress. Launchpad could do this really well, since it has rich, inter-linked data about what's going on and since it can show you this information for all of your projects.&lt;br /&gt;&lt;br /&gt;Today, I knocked up a very quick-and-dirty prototype for this. It shows all of the work-in-progress for a person across all of Launchpad, grouped by project.&lt;br /&gt;&lt;br /&gt;The code lives at &lt;a href=&quot;https://code.launchpad.net/~jml/+junk/whip&quot;&gt;lp:~jml/+junk/whip&lt;/a&gt; and you can see examples of &lt;a href=&quot;http://people.canonical.com/~jml/jml-wip.html&quot;&gt;my work-in-progress&lt;/a&gt; and &lt;a href=&quot;http://people.canonical.com/~jml/jelmer-wip.html&quot;&gt;jelmer's work-in-progress&lt;/a&gt; online. You should be able to make your own with './bin/whip $LP-NAME &amp;gt; wip.html'. Note that there'll be some PYTHONPATH shenanigans.&lt;br /&gt;&lt;br /&gt;Hackers, I'd love to see if you could turn this prototype into a web-app, or even a page on Launchpad. There's a NOTES file in there with whatever ideas I've had.&lt;br /&gt;&lt;br /&gt;Designers, there's got to be a better way of showing this data than what I've picked. Take a look at the examples and see what you can turn them into.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-818956548715443266?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 23 Dec 2010 16:09:57 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Big times</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-6533668566788807721</guid>
	<link>http://life.mumak.net/2010/12/big-times.html</link>
	<description>We've had some big times over the last couple of weeks.&lt;br /&gt;&lt;br /&gt;Two weeks ago, my mind was focused on grading, on the day when I would be tested to see if I would be awarded a blue belt for kick-boxing. Everything reminded me of grading, or was bad because it might harm my chances, or was good because it would help, or was too big to think about before grading. All plans and thoughts passed through the nexus of that cold Sunday morning in a large indoor dojo.&lt;br /&gt;&lt;br /&gt;On the day, I felt this strange mix of confidence and uncertainty. I was healthy, I had trained hard, I knew all of the techniques, my teachers said I was ready and I &lt;i&gt;really&lt;/i&gt; wanted that belt, but I had never done anything this physically demanding or &quot;sporty&quot; before and I didn't know if some rebel part of my mind would tell me to quit half-way through.&lt;br /&gt;&lt;br /&gt;The grading was hard, but I passed. I've been awarded my blue belt, and I have to say that there are few achievements of which I am more proud.&lt;br /&gt;&lt;br /&gt;If all I'd done over the last two weeks had been to get this belt, it would have been a big two weeks.&lt;br /&gt;&lt;br /&gt;But of course, I also went ice skating. It's not the first time I've been in ice skates on a rink, but it's the first time I've actually &lt;i&gt;skated&lt;/i&gt; in those ice skates on a rink. It's fun, but it's stressful in the same way learning to drive in London is stressful, something is always veering out in front of you daring you to maim it with your beginner's ignorance.&lt;br /&gt;&lt;br /&gt;I have also done my woefully late Christmas shopping, a great Pyrrhic victory in which I lost hours and sterling and self-respect. I wish I had a better knack of demonstrating affection through the giving of gifts.&lt;br /&gt;&lt;br /&gt;Christmas shopping, ice skating, kick-boxing, what else? Oh yes, Barcelona. Joliette and I spent the week there with friends and it was wonderful. I got a little ill during the middle of it, which meant that we lolled about indoors as much as we strolled about outside. Even so, we saw some great things.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Sagrada_familia&quot;&gt;Sagrada Familía&lt;/a&gt; has been renovated since I last saw it. All of the interior scaffolding has been taken down and inside it's almost complete. To describe it would only be to belittle it. We were speechless and amazed for ten full minutes after we crossed the threshold.&lt;br /&gt;&lt;br /&gt;There's more, of course. Over the last couple of weeks I've walked among ancient wonders, seen Herbie Hancock play live, heard beautiful and pure voices sing carols at the Royal Albert Hall, had an actual decent plate of eggs benedict in London and drank a mug of the most chocolatey hot chocolate that ever was.&lt;br /&gt;&lt;br /&gt;Sadly, I never got to try the panther milk.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-6533668566788807721?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 22 Dec 2010 20:11:02 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools 0.9.8 released</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-8798343538771109683</guid>
	<link>http://code.mumak.net/2010/12/testtools-098-released.html</link>
	<description>The announcement is a few days late, but I thought that you'd like to know that &lt;a href=&quot;http://pypi.python.org/pypi/testtools&quot;&gt;testtools 0.9.8&lt;/a&gt; has been released.&lt;br /&gt;&lt;br /&gt;This is one of our biggest releases, we have fixed &lt;a href=&quot;https://launchpad.net/testtools/0.9/0.9.8&quot;&gt;a lot of bugs&lt;/a&gt;, added experimental support for running tests inside Twisted's reactor and added a stack of new matchers and convenience methods. It's well worth upgrading.&lt;br /&gt;&lt;br /&gt;We've also got some good stuff in the pipeline, including a full re-working of our documentation, better error messages and still more matchers.&lt;br /&gt;&lt;br /&gt;The &quot;more matchers&quot; thing is significant. More and more people are starting to use testtools because of the way our matchers let them build domain-specific assertions with rich, useful error messages. We continue to get contributions for basic matchers and for new ways of combining matchers. Also, projects like James Westby's &lt;a href=&quot;https://launchpad.net/soupmatchers&quot;&gt;soupmatchers&lt;/a&gt; show just how useful matchers can be. It makes me think that eventually matchers will become part of the normal way that people write tests in Python.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href=&quot;https://launchpad.net/~lifeless&quot;&gt;Robert Collins&lt;/a&gt;, &lt;a href=&quot;https://launchpad.net/~gz&quot;&gt;Martin [gz]&lt;/a&gt;, &lt;a href=&quot;https://launchpad.net/~jelmer&quot;&gt;Jelmer Vernooij&lt;/a&gt;, &lt;a href=&quot;https://launchpad.net/~mwhudson&quot;&gt;Michael Hudson-Doyle&lt;/a&gt; and &lt;a href=&quot;https://launchpad.net/~james-w&quot;&gt;James Westby&lt;/a&gt; for making this our best release ever.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-8798343538771109683?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 22 Dec 2010 19:19:03 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools bug update</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-2898476574400586653</guid>
	<link>http://code.mumak.net/2010/12/testtools-bug-update.html</link>
	<description>Hello &lt;a href=&quot;https://launchpad.net/testtools&quot;&gt;testtools&lt;/a&gt; fans.&lt;br /&gt;&lt;br /&gt;If you are wondering what all the recent bug mail was about, wonder no more, for I shall explain. Thus.&lt;br /&gt;&lt;br /&gt;We're using only three different levels of importance for testtools bugs: Critical, Medium and Wishlist. Critical is reserved for release blockers: regressions, test failures and other disasters. Medium is for genuine defects and other things that we think are important. Wishlist is for everything else. I think of them as Critical, Important and Someday.&lt;br /&gt;&lt;br /&gt;All of this is in preparation for the 0.9.8 release, which promises to be a doozy.  Stay tuned.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2898476574400586653?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 10 Dec 2010 23:03:10 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: A theory</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-1136994186362806220</guid>
	<link>http://life.mumak.net/2010/12/theory.html</link>
	<description>Anyone else notice how December has sneaked up on us this year? Normally it just stands there, proud, forbidding and distant, waiting for us to come to it. This time though, December has thrown off its gaudy robes, donned a black ski mask and starting running silently through bushes and backflipping over rooftops  in order to trap us in a &lt;i&gt;stealth ninja attack&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;I have a theory.  I don't actually think December is some kind of rogue assassin months with training in the mystical arts – that would be silly.  I think that the G8 has been secretly selling off bits of October to the Chinese government.&lt;br /&gt;&lt;br /&gt;Think about it. Everyone knows that October has thirty-one days, because otherwise there wouldn't be a Halloween, but it always &lt;i&gt;feels&lt;/i&gt; like it should be a thirty day month.  Winter came early this year. Why? Because there were actually fewer days in October to separate it from Summer.  A day here, a day there, sliced off, packaged and sent to China where they use it to dissipate some of the excess energy from their over-heated economy.&lt;br /&gt;&lt;br /&gt;All I'm saying is, don't be surprised when next year you are sitting back, feeling all smug and self-congratulatory in your August armchair and then BAM! it's mid-November and you are wondering what just happened to the year and trying to figure out when you'll find time to do your Christmas shopping.&lt;br /&gt;&lt;br /&gt;Don't ask me how it works, I'm not a Communist.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-1136994186362806220?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 01 Dec 2010 12:10:23 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Lots on my mind</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-3242270889654668152</guid>
	<link>http://life.mumak.net/2010/11/lots-on-my-mind.html</link>
	<description>I just got back from three hours of kick-boxing, and am pretty exhausted – &quot;cream crackered&quot; as they say over here.  It's the first time I've been in over a week, since I had a cold for much of last week.&lt;br /&gt;&lt;br /&gt;Apart from the obvious physical demands, kick-boxing is quite demanding mentally, at least to the beginner. It's a little bit like being a beginner at driving, in that there are many things you have to remember to do correctly &lt;i&gt;all of the time, &lt;/i&gt;there is no time at which you can forget any of them.&lt;br /&gt;&lt;br /&gt;You have to keep your guard up at all times, fists clenched at your temples. Your fists have to be clenched properly and tightly with the thumb tucked away over the fingers. You must keep shuffling: moving around, bouncing, bobbing, weaving at all times – even when listening to instructions.  But you mustn't shuffle during a combo.  During the combo, pivot for reverse punches, hook punches, uppercuts, side kicks and roundhouses, but stay straight for front kicks, jabs and back hands. Ki-ai (i.e. shout, for me it's sort of a &quot;Tsuh!&quot; sound) at the end of your combo. Keep shuffling. Don't punch or kick too hard, just &quot;sting&quot; the pad / sparring partner.  Return hands to guard as quickly as possible after a punch.&lt;br /&gt;&lt;br /&gt;It's a lot to keep in mind.  The nice thing is that, like driving, more and more of it becomes automatic as you keep doing it. Still, I'm a bit worried that I'll have a brain-related failure during my grading on Sunday week.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-3242270889654668152?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 29 Nov 2010 23:42:42 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Work-in-progress</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-3391351292189569029</guid>
	<link>http://life.mumak.net/2010/11/work-in-progress.html</link>
	<description>I've been thinking more recently about keeping the amount of work I have in progress to a minimum.  Having a small number of things on the go at once means that you actually finish those things quicker, and finishing things is great.&lt;br /&gt;&lt;br /&gt;GTD isn't great at helping me do this, because new projects just go onto my projects list and new actions on my actions list. What I really need is a backlog, a list of projects that are queued up waiting for me to finish one of my current projects.&lt;br /&gt;&lt;br /&gt;This is a little like the someday/maybe list of GTD, feels at least to me to be conceptually different.&lt;br /&gt;&lt;br /&gt;Any other personal organization geeks thought about this? Any tips?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-3391351292189569029?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 29 Nov 2010 12:44:37 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools manuals</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-8521044137381894020</guid>
	<link>http://code.mumak.net/2010/11/testtools-manuals.html</link>
	<description>I wrote a whole pile of documentation for &lt;a href=&quot;https://launchpad.net/testtools&quot;&gt;testtools&lt;/a&gt; over the weekend. You can read it &lt;a href=&quot;http://mumak.net/testtools/docs/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I would very much appreciate it if you could read over the docs there and tell me if anything is unclear, wrong or otherwise unhelpful.  Telling me what's good would also be appreciated.&lt;br /&gt;&lt;br /&gt;Please leave whatever feedback you have either as comments on this post or on the &lt;a href=&quot;https://code.launchpad.net/~jml/testtools/more-doc-improvements/+merge/42045&quot;&gt;merge proposal&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-8521044137381894020?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 29 Nov 2010 00:31:59 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Envy and equality</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-1501202357207297699</guid>
	<link>http://life.mumak.net/2010/11/envy-and-equality.html</link>
	<description>&lt;blockquote&gt;&lt;/blockquote&gt;Just came across this post that I had started a while ago and never finished. I thought it was interesting enough to share.&lt;br /&gt;&lt;br /&gt;I &lt;s&gt;recently&lt;/s&gt; watched &lt;a href=&quot;http://www.ted.com/talks/alain_de_botton_a_kinder_gentler_philosophy_of_success.html&quot;&gt;Alain de Botton talk about a gentler, kinder success&lt;/a&gt;, and I recommend that you do the same.&lt;br /&gt;&lt;br /&gt;I was surprised to hear echoes of earlier writing in his arguments. Indeed, it showed remarkable discipline to be able to talk about the great role that chance plays in personal success without quoting &lt;a href=&quot;http://www.biblegateway.com/passage/?search=Ecclesiastes%209:11&amp;amp;version=NIV&quot;&gt;Ecclesiastes 9:11&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De Botton also discussed envy. Envy, he argues, is largely created by a belief in equality. I think he's right, and that he's right to say it. However, I could have sworn I read a similar thing in something C. S. Lewis wrote, and it turns out I did: &lt;a href=&quot;http://screwtapeblogs.wordpress.com/2009/06/30/screwtape-proposes-a-toast/&quot;&gt;Screwtape Proposes a Toast&lt;/a&gt;. It is one of Lewis's poorer pieces where he writes about the English education system and small government and other claptrap under the guise of writing about the human spiritual condition.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lewis's essay feels horribly dated and rather cantankerous. De Botton's talk is friendly and witty and warm. Ecclesiastes is beautiful, concise and somewhat disheartening. True things stay true, and bear repeating in new ways and new contexts.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-1501202357207297699?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 28 Nov 2010 11:53:15 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Tests that print stuff</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-585021321744005463</guid>
	<link>http://code.mumak.net/2010/11/tests-that-print-stuff.html</link>
	<description>Tests that print stuff to stdout or stderr annoy me.  They make a successful test run much less satisfying to watch, and they clutter logs when you are trying to debug a failure.&lt;br /&gt;&lt;br /&gt;Launchpad has quite a few tests that print stuff.  I was going to fix them up today, but I've got a Launchpad branch in progress and I've promised myself that I'll have only one in progress at a time. Besides, the build is broken.&lt;br /&gt;&lt;br /&gt;Anyway, I've written a quick hack that lets you analyze a &lt;a href=&quot;http://launchpad.net/subunit&quot;&gt;subunit&lt;/a&gt; stream to &lt;a href=&quot;http://paste.ubuntu.com/536731/&quot;&gt;see which tests print stuff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To get a subunit stream including the output itself:&lt;br /&gt;&lt;pre&gt;$ gzip -dc testtools-experiment-r11753.subunit.gz | grep -v time: |  python tests-with-output.py&lt;/pre&gt;&lt;br /&gt;To get a list of the tests:&lt;br /&gt;&lt;pre&gt;$ gzip -dc testtools-experiment-r11753.subunit.gz |  python tests-with-output.py  | subunit-ls --no-passthrough&lt;/pre&gt;&lt;br /&gt;For those interested, Launchpad has roughly one hundred such tests.&lt;br /&gt;&lt;br /&gt;As with my last post, I'm left with the feeling that subunit is great but needs a lot more polish.  I guess my next step is to figure out how to upstream these.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-585021321744005463?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 26 Nov 2010 16:01:35 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Boiling kettles, unit tests and data</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-5946692681757841858</guid>
	<link>http://code.mumak.net/2010/11/boiling-kettles-unit-tests-and-data.html</link>
	<description>The Launchpad test suite takes way too long to run: somewhere between three and four hours.  Incidentally, &lt;a href=&quot;http://rbtcollins.wordpress.com/&quot;&gt;Rob&lt;/a&gt; has just started &lt;a href=&quot;https://dev.launchpad.net/LEP/PersistenceLayer&quot;&gt;some work&lt;/a&gt; that ought to make it run a lot faster, for which I am truly thankful.  Anyway, over the last three (almost four!) years, I've watched the test suite run many, many times, waiting for it to finish or at least reveal a failure.&lt;br /&gt;&lt;br /&gt;It has been easy to see that not all tests are created equal. Some are very slow, others are very fast. &lt;a href=&quot;http://code.mumak.net/2009/09/layers-are-terrible.html&quot;&gt;Zope's terrible layer mechanism&lt;/a&gt; means that these are often grouped together: slow with slow, fast with fast. Watching the test suite churn away for the umpteenth time made me wonder, exactly how are the tests distributed over time.&lt;br /&gt;&lt;br /&gt;Luckily, thanks to &lt;a href=&quot;https://launchpad.net/subunit&quot;&gt;subunit&lt;/a&gt;, a &lt;a href=&quot;http://paste.ubuntu.com/536368/&quot;&gt;bit of Python glue&lt;/a&gt;, and OpenOffice it's really easy to get a picture:&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; align=&quot;center&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: auto; margin-right: auto;&quot; href=&quot;http://people.canonical.com/~jml/Tests-finished-each-minute.png&quot;&gt;&lt;img src=&quot;http://people.canonical.com/~jml/Tests-finished-each-minute.png&quot; height=&quot;427&quot; border=&quot;0&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot; class=&quot;tr-caption&quot;&gt;Graph of how many Launchpad tests are run in each minute of the test run&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;That's a graph of the number of tests that complete within each minute of the Launchpad test suite run.  What it means is that you are more likely to see an actual test result if you watch at a random time during the first half of the test run. It also means that we have a relatively small number of very slow tests.&lt;br /&gt;&lt;br /&gt;Sometimes these graphs are more useful at lower granularity, so I made this one:&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; align=&quot;center&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: auto; margin-right: auto;&quot; href=&quot;http://people.canonical.com/~jml/Tests-finished-each-ten-minutes.png&quot;&gt;&lt;img src=&quot;http://people.canonical.com/~jml/Tests-finished-each-ten-minutes.png&quot; height=&quot;374&quot; border=&quot;0&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot; class=&quot;tr-caption&quot;&gt;Graph of how many Launchpad tests are run in each ten minute block of the test run&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;And this one:&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; align=&quot;center&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: auto; margin-right: auto;&quot; href=&quot;http://people.canonical.com/~jml/Tests-finished-each-hour.png&quot;&gt;&lt;img src=&quot;http://people.canonical.com/~jml/Tests-finished-each-hour.png&quot; height=&quot;390&quot; border=&quot;0&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot; class=&quot;tr-caption&quot;&gt;Graph of how many Launchpad tests are run in each hour block of the test run&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The &lt;a href=&quot;http://people.canonical.com/~jml/testtools-experiment-r11753.subunit.gz&quot;&gt;raw data&lt;/a&gt; is taken from a successful run of one of my recent branches. If you download it and open it up, you'll see that the subunit output includes a large number of &quot;time:&quot; statements. Each of these indicates that all subunit statements following it should be considered as taking place at the time given in the original statement.&lt;br /&gt;&lt;br /&gt;I used a &lt;a href=&quot;http://paste.ubuntu.com/536368/&quot;&gt;small Python script &lt;/a&gt;to generate the CSVs, running it like this:&lt;br /&gt;&lt;pre&gt;gzip -dc testtools-experiment-r11753.subunit.gz | python test-distribution.py 60 &amp;gt; /home/jml/Desktop/tests-each-minute.csv&lt;/pre&gt;&lt;br /&gt;Where &quot;60&quot; is the number of seconds of granularity.&lt;br /&gt;&lt;br /&gt;It was about twenty minutes work all up, and subunit made much of it dead simple. subunit has its flaws, but it's a really good idea.&lt;br /&gt;&lt;br /&gt;That said, I can't help but feel that it should have been less work. Partly, subunit should have a way to convert data to a format more amenable to analysis by third party tools. Mostly though, those third party tools ought to exist and be known to me.&lt;br /&gt;&lt;br /&gt;I can easily imagine a tool where I wouldn't have to run the script each time to get a different level of granularity, but rather I could use a slider in a UI and watch the graph update itself in real time. That would be cool, and relatively easy. How come nobody has done that yet?&lt;br /&gt;&lt;br /&gt;Also, although OpenOffice's graphing thing is fairly nice, why isn't there a better tool? One that makes it easier to share graphs as images on the web without having to take crummy screenshots.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-5946692681757841858?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 26 Nov 2010 13:34:23 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
        <enclosure url="http://people.canonical.com/~jml/testtools-experiment-r11753.subunit.gz" length="" type="text/html"/>
</item>
<item>
	<title>Mere Code: Big or small?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-2615899947330150713</guid>
	<link>http://code.mumak.net/2010/11/big-or-small.html</link>
	<description>I've been thinking a bit about whether it is better to have one big code base that has a lot of different components and features, or whether there should be many small code bases that each do one thing well.&lt;br /&gt;&lt;br /&gt;I don't have any answers, but perhaps these half-formed thoughts will help: positive, negative and interesting things about having many small related projects. These thoughts are mostly inspired by working on a bunch of different testing-related projects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Positive&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&quot;Do one thing and do it well&quot;&lt;/li&gt;&lt;li&gt;Enforces a certain kind of interface discipline&lt;/li&gt;&lt;li&gt;Avoids/postpones scaling problems with big projects&lt;/li&gt;&lt;ul&gt;&lt;li&gt;test suite run times&lt;/li&gt;&lt;li&gt;documentation navigation&lt;/li&gt;&lt;li&gt;bug triage&lt;/li&gt;&lt;li&gt;forking mailing lists etc.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Newcomers only need to &quot;buy in&quot; to one idea at a time&lt;/li&gt;&lt;li&gt;Aligns with conceptual understanding of the problem&lt;/li&gt;&lt;li&gt;Better separation of commit privs etc&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Negative&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Release overhead&lt;/li&gt;&lt;li&gt;Duplication of infrastructure&lt;/li&gt;&lt;ul&gt;&lt;li&gt;buildbot / hudson / pqm&lt;/li&gt;&lt;li&gt;bug tracker&lt;/li&gt;&lt;li&gt;mailing list&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Duplication of license / copyright games&lt;/li&gt;&lt;li&gt;Harder for newcomers to see the big picture&lt;/li&gt;&lt;li&gt;Problems caused by interactions between different versions&lt;/li&gt;&lt;li&gt;Depending on multiple libraries is a pain on many platforms&lt;/li&gt;&lt;li&gt;Lag with commit privs etc&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Interesting&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Perhaps smaller &amp;amp; self-contained means easier to upstream&lt;/li&gt;&lt;li&gt;Some projects like adding only small dependencies, other projects like adding few dependencies&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Do these make sense? What would you add?&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Twisted is in a sense the opposite of the small/many paradigm, in that it includes a great deal of extra features along with its core.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2615899947330150713?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 24 Nov 2010 16:12:24 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Learning to drive</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-7144740666668707612</guid>
	<link>http://life.mumak.net/2010/11/learning-to-drive.html</link>
	<description>I've been eligible to apply for a driving license for a little over a decade now, but I still haven't got one.  Partly it's because of an unusual schooling, partly because I've lived in walking or public transport distance of everywhere I wanted to go, partly because I just don't get off on cars the way some do but mostly because I'm lazy.&lt;br /&gt;&lt;br /&gt;However, driving is an important life skill, since a decade is long enough and since not having a car is a pain when I visit Tasmania, I am learning to drive.&lt;br /&gt;&lt;br /&gt;Of course, this means learning to drive &lt;i&gt;in London. &lt;/i&gt;Here's something of how it goes.&lt;br /&gt;&lt;br /&gt;I wake up at a time carefully calculated to be as late as possible, but to give me enough time to consume and absorb my usual pot of coffee before the lesson starts. I leave the house and look around to discover whether today is going to be a driving in fog day or a driving in the rain day. I then turn up the mews and carefully navigate the maze of construction work (at one point vaulting a guard rail) just so my driving instructor can pick me up in a spot that's outside of the congestion zone.&lt;br /&gt;&lt;br /&gt;As he pulls up in the middle of the busy main road just off Paddington station, I dive into the tiny car, shake his hand and we drive off to the canals some four or five minutes away. Then we swap around, I take the wheel and do my best to enjoy two of the more stressful hours of my week.&lt;br /&gt;&lt;br /&gt;I spend those hours in a constant state of crisis management. London grew up for people, horses and carts, not automobiles, so the streets are winding and narrow. This is partly what I love about the city, but it does make learning to drive that much harder.&lt;br /&gt;&lt;br /&gt;The roads have lanes in much the same way that Britain has a constitution: they exist; they are not written down; they are generally followed and your safest bet is to do the same thing as whoever comes before you.&lt;br /&gt;&lt;br /&gt;A two-way street inevitably has cars parked along both sides, making it wide enough for only one care at a time. Halfway through there will be some kind of road works, just beyond which a mother will be pushing a pram out to cross the street. If I manage to dodge the road works and heroically save the child's life, a delivery van will reverse out of its parking spot to cross both of the lanes. Then there are the buses and cyclists and cab drivers who are all deliberately trying to get me to have an accident.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;The real highlight is when I get to enjoy the freedom of the open road: no traffic, no obstructions, just me zooming along at a reckless thirty miles an hour (50km/h). I tell you, I feel almost giddy.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Though each week I'm getting a little bit better. I'm really hoping to be able to do the test and pass before I head to Australia this April, so I can pootle along the Southern Outlet behind the logging trucks and find my way into the comforts of Hobart.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-7144740666668707612?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 21 Nov 2010 13:43:04 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: &quot;Don't Make Me Think&quot;, thoughts for Launchpad</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-5911681985360108488</guid>
	<link>http://code.mumak.net/2010/11/dont-make-me-think-thoughts-for.html</link>
	<description>I just read &lt;a href=&quot;http://www.amazon.co.uk/Dont-Make-Think-Usability-Circle-Com/dp/0789723107&quot;&gt;Don't Make Me Think&lt;/a&gt;, by &lt;a href=&quot;http://www.sensible.com/&quot;&gt;Steve Krug&lt;/a&gt;. It's a good book. Sadly, I read it over a fairly long chunk of time so a lot of the punch has been spread out.&lt;br /&gt;&lt;br /&gt;Here are my thoughts about how we can apply some of the ideas to Launchpad.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tighten up our visual design&lt;/b&gt;&lt;br /&gt;Launchpad doesn't look &lt;i&gt;too&lt;/i&gt; bad, I don't think, but it could look a whole lot better.  Doing that would cover over other sins, make people more comfortable and is just the right thing to do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Error recovery &amp;amp; undoability&lt;/b&gt;&lt;br /&gt;We're not great at this. You can't rename teams, you can't rename PPAs, you can't rename branches that other branches  are stacked on. You can't delete bug tasks. Many forms just say &quot;Invalid value&quot; when you enter bad input.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keep up with the user testing&lt;/b&gt;&lt;br /&gt;We do a fair chunk of user testing, mostly thanks to Matthew Revell. We should do it more often, and more readily.  Also, we should wave some kind of magic wand that makes it easier for developers to observe the user tests as they happen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Home page&lt;/b&gt;&lt;br /&gt;Make it better.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Remove more stuff&lt;/b&gt;&lt;br /&gt;Way too often in our design discussions, we talk about adding stuff to the page: widgets, links, explanatory text. We should lean toward removing before we add. Especially with text: fewer words. Be suspicious when the solution to a usability problem is &quot;more documentation&quot;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Discuss things less&lt;/b&gt;&lt;br /&gt;Sometimes, we really do talk too much about whether a thing should be one way or it should be another.  Krug leads me to believe that most of things we agonize about aren't actually the things that are important to users.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-5911681985360108488?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Nov 2010 15:29:25 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: What else have you got?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-5963020816598578485</guid>
	<link>http://code.mumak.net/2010/11/what-else-have-you-got.html</link>
	<description>I recently mentioned some of the &lt;a href=&quot;http://code.mumak.net/2010/11/what-to-do-what-to-do.html&quot;&gt;very important things we're doing on Launchpad&lt;/a&gt; (performance, privacy, derived archives and desktop integration) and some of the equally &lt;a href=&quot;http://code.mumak.net/2010/11/still-going.html&quot;&gt;important things that we're &lt;i&gt;still&lt;/i&gt; doing&lt;/a&gt; (making links, importing upstream translations, daily builds). We've also got a few other things on the hob.&lt;br /&gt;&lt;br /&gt;In particular, there's some corking great work going on in making our &lt;b&gt;build farm more scalable&lt;/b&gt;. The build farm is used for building &lt;a href=&quot;http://ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt;, PPAs, building recipes and doing upstream translation imports, so it's a critical part of our infrastructure. We've been working to make better use of the machines we have, and make sure that we don't actually degrade in performance as we add more machines. There's also been a lot of good work here in making the code more understandable and robust.&lt;br /&gt;&lt;br /&gt;Since we're now using the build farm for more things that just building packages, we've had to give the UI some love, particularly in making &lt;b&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/GeneralBuildHistories&quot;&gt;generalized build histories&lt;/a&gt;&lt;/b&gt; for the builders. This just means making builder and archive pages on Launchpad show all of the builds nicely, regardless of what type of build they are. We're kind of finished here, we just need that lousy &lt;a href=&quot;https://launchpad.net/~jml&quot;&gt;product strategist&lt;/a&gt; to get around to reviewing the feature.&lt;br /&gt;&lt;br /&gt;On the bug tracker, we're adding a new facility that will &lt;b&gt;disable the automatic duplicate detection on a package-by-package basis&lt;/b&gt;. The dupe finder is one of my favourite parts of Launchpad, and I would never disable it for anything I do. However, the packages that take care of providing sound, graphics and networking get a lot of bugs that have the same symptoms but are actually completely different, and only an expert can tell them apart. In these cases, auto dupe detection does more harm than good, so we're providing a way to turn it off.&lt;br /&gt;&lt;br /&gt;Perhaps most excitingly of all the &quot;non-core&quot; work, we're working on giving you &lt;b&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/BetterBugSubscriptionsAndNotifications&quot;&gt;far more control over your bug mail&lt;/a&gt;&lt;/b&gt;. Launchpad has long been known for sending way too much email. We're changing that.&lt;br /&gt;&lt;br /&gt;There's also some great stuff being done outside the Launchpad team:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/DKIMAuthenticatedMail&quot;&gt;DKIM-based mail authentication&lt;/a&gt; (aka &quot;Change bug statuses from GMail&quot;)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/ForkingLPServe&quot;&gt;Pre-forking lp-serve&lt;/a&gt; (aka &quot;Shave two seconds off every bzr push to Launchpad&quot;)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/BugzillaComponents&quot;&gt;Bugzilla components&lt;/a&gt; (aka &quot;One step closer to smooth upstreaming of bugs&quot;)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.launchpad.net/Code/MergeQueues/LEP&quot;&gt;&lt;b&gt;Branch merge queues&lt;/b&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And that's all of the stuff that's going on in Launchpad, as far as I know.  Actually, there's a fair bit of work going on to make it so we can deploy Launchpad way more often and work on features for as long as we want without exposing them to unsuspecting users. And we're also working on simplifying our branch landing machinery.  But that's it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you can see, there are a lot of things.  That means that progress on any one thing is much slower than anyone would like.  However, progress is being made.  Give us a few months and we might be working on only three things at once, rather than over a dozen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, if you're keen on following Launchpad development, you can join #launchpad-dev on Freenode, or our &lt;a href=&quot;https://launchpad.net/~launchpad-dev&quot;&gt;developer mailing list&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Coming soon: ideas for the not-so-distant future.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit:&lt;/b&gt; Oops! Forgot merge queues.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-5963020816598578485?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 18 Nov 2010 18:16:16 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Reviewing specs, rock on!</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-7351628089833191406</guid>
	<link>http://code.mumak.net/2010/11/reviewing-specs-rock-on.html</link>
	<description>I just finished reviewing a bunch of &lt;a href=&quot;https://dev.launchpad.net/LEP&quot;&gt;LEP&lt;/a&gt;s, which are the specs Launchpadders write for doing new feature work. I've been looking at a bunch of the &lt;a href=&quot;https://dev.launchpad.net/LEP/PrivateProjectsAndDistributions&quot;&gt;privacy&lt;/a&gt; LEPs and one on &lt;a href=&quot;https://dev.launchpad.net/Code/MergeQueues/LEP&quot;&gt;merge queues&lt;/a&gt;.  It's been great to see such good, clear thinking, and also to see people thinking and writing in terms of constraints and requirements (&quot;What do we want? Why?&quot;) instead of implementation or potential solutions.&lt;br /&gt;&lt;br /&gt;Basically I've got a bunch of scribbled-on bits of paper right now. Tomorrow I'm going to update the wiki &amp;amp; schedule calls with the developers so we can kick them along.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-7351628089833191406?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 18 Nov 2010 18:14:40 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Things difficult and easy about kickboxing</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-5580408169825770102</guid>
	<link>http://life.mumak.net/2010/11/things-difficult-and-easy-about.html</link>
	<description>A few months ago I started &lt;a href=&quot;http://www.kbkickboxing.co.uk/&quot;&gt;kickboxing in London&lt;/a&gt; (terrible website, great people). I go to a great school that meets in various church halls and gyms around central London. It's not boxxercising or tai-bo or whatever, but actual kicking-people-in-the-head kickboxing.&lt;br /&gt;&lt;br /&gt;Of course, I don't actually kick people in the head. Unless they are really short. And our school is &quot;semi-contact&quot; – we hit people as lightly as we can get away with.&lt;br /&gt;&lt;br /&gt;Some things are harder than I expected, surprisingly so:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bouncing around on the spot (&quot;keep shuffling!&quot;) while keeping guard up&lt;/li&gt;&lt;li&gt;kicking; it's hard work!&lt;/li&gt;&lt;li&gt;remembering whether to attack or defend during sparring drills&lt;/li&gt;&lt;li&gt;fitting all your gear into one bag&lt;/li&gt;&lt;li&gt;remembering to put your mouth guard in &lt;i&gt;before&lt;/i&gt; putting on gloves&lt;/li&gt;&lt;li&gt;doing your ki-ai through a mouth guard&lt;/li&gt;&lt;li&gt;untangling hand wraps that have just been through the washing machine&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Here's what has been surprisingly easy:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;getting into the training session and forgetting about my day&lt;/li&gt;&lt;li&gt;actually keeping it up&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I've been genuinely surprised by how much I'm enjoying it and how friendly the teachers and other students are. I'm aiming for my first belt in December, and have strange mix of fear, excitement and determination churning around in me.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll keep you posted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS. Apologies for the long hiatus. Hope I'm back now.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-5580408169825770102?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 16 Nov 2010 18:36:02 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Having an extra feature never hurts, rebutted</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-1326114780847820374</guid>
	<link>http://code.mumak.net/2010/11/having-extra-feature-never-hurts.html</link>
	<description>On the Launchpad user list, we're having a bit of a chat about whether &lt;a href=&quot;https://lists.launchpad.net/launchpad-users/msg06098.html&quot;&gt;or not to remove team polls&lt;/a&gt;.  One commenter suggested that &quot;having an extra feature never hurts&quot;. &lt;a href=&quot;http://curtis.hovey.name/&quot;&gt;Curtis&lt;/a&gt;'s &lt;a href=&quot;https://lists.launchpad.net/launchpad-users/msg06110.html&quot;&gt;reply&lt;/a&gt; is so good I want to quote it here in full:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;Actually, It always hurts. It is always bad:&lt;br /&gt;&lt;br /&gt;     1. The bad UI experience reflects poorly on all Launchpad.&lt;br /&gt;     2. A user tried to mess with URLs to avoid the UI and caused an&lt;br /&gt;        oops. I spent a couple days fixing an issue that I personally do&lt;br /&gt;        not think should ever have been a priority. Certainly there are&lt;br /&gt;        at least a 1000 more important bugs than the oops, but we&lt;br /&gt;        believe oopses are always high priority.&lt;br /&gt;     3. Pages are slower to load because the application looks for poll&lt;br /&gt;        data.&lt;br /&gt;     4. We must update the code as libraries and infrastructure changes.&lt;br /&gt;     5. We need to triage and retriage all the poll bugs.&lt;br /&gt;     6. We need to answer user questions on Lp Answers and IRC.&lt;br /&gt;&lt;br /&gt;It is better that Launchpad provides 5 really great features than to&lt;br /&gt;provide 10 mediocre features. I prefer to remove the feature, but if the&lt;br /&gt;community believes that it is important, we might work on this in the&lt;br /&gt;upcoming Launchpad bugjam to close as many bugs as possible in a week. I&lt;br /&gt;cannot foresee this feature being compelling in the net two years&lt;br /&gt;without a contributor dedicating time to it.&lt;br /&gt;&lt;br /&gt;The situation is eloquently stated by Antoine de Saint-Exupéry&lt;br /&gt;&lt;br /&gt;        A designer knows he has achieved perfection not when there is&lt;br /&gt;        nothing left to add, but when there is nothing left to take&lt;br /&gt;        away.&lt;/pre&gt;&lt;/blockquote&gt; That is all.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-1326114780847820374?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 16 Nov 2010 18:10:14 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: And then what?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-3847341220313994951</guid>
	<link>http://code.mumak.net/2010/11/and-then-what.html</link>
	<description>By now, you know where Launchpad is at.  You know what &lt;a href=&quot;http://code.mumak.net/2010/11/what-to-do-what-to-do.html&quot;&gt;our top priorities&lt;/a&gt; are, you know the &lt;a href=&quot;http://code.mumak.net/2010/11/still-going.html&quot;&gt;other important stuff that we're still working on&lt;/a&gt;, you know &lt;a href=&quot;http://code.mumak.net/2010/11/what-else-have-you-got.html&quot;&gt;the other bits and pieces we've got going&lt;/a&gt;.  You might even know why.&lt;br /&gt;&lt;br /&gt;What you might not know, and what this post hopes to tell you, is what we are &lt;i&gt;thinking&lt;/i&gt; about right now.  Humans are plan-making creatures, and product strategists perhaps more so than most.  What follows is a brief description of the half-formed thoughts and plans that I have for Launchpad. (Also, have I mentioned the &lt;a href=&quot;http://dev.launchpad.net/RoadMap&quot;&gt;roadmap&lt;/a&gt; yet?)&lt;br /&gt;&lt;br /&gt;Strategically speaking, there are two major approaches we can take to our work on Launchpad.  The first is working on things that bring new users and new projects to us.  This would mean finding something that we can provide that alternatives don't and potential users want, &lt;i&gt;or&lt;/i&gt; assuming that we already have such a thing, find the blockers that stop people from using Launchpad and remove them (the blockers, not the people).&lt;br /&gt;&lt;br /&gt;For example, if we thought that open source developers wanted their hosting site, say, to be part of the semantic web, we could go and do that and be relatively confident that no one else will.  That would be finding a competitive advantage.&lt;br /&gt;&lt;br /&gt;Or, to take another example, we could say that our awesome bug tracker, our translation support and daily builds are heaps plenty good advantages, but people don't use Launchpad because we only have full support for one VCS and we provide no place to host a project shop-front web site.  That would mean adding Git, Subversion and Mercurial support, and adding some kind of wiki / webhosting.  Personally, I find this much more appealing than semantic web shenanigans.&lt;br /&gt;&lt;br /&gt;All of that's one strategic approach: attract new users.  There's another major approach that we could take: make things better for our current users. All things considered, I think I want to take the second approach.&lt;br /&gt;&lt;br /&gt;There's so much we could do here, partly because Launchpad itself is so broad.  Some key things stand out though.&lt;br /&gt;&lt;br /&gt;First, there is a cluster of problems related to the way that people approach the website.  Although we tout cross-project collaboration as one of our big things, we don't make it particularly easy.  We need to provide each user and each team with a view that shows them all of the things that are interesting to them across all of Launchpad.  In fact, we probably need to give them two views: one that's historical and chronological, and another that's forward looking and more dashboard-like. In my head, I've been thinking of this as &lt;b&gt;walls&lt;/b&gt; (ala Facebook) and &lt;b&gt;dashboards&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;If we dig into this, there'll be other changes: better, fairer karma; more social interaction; better person, project and team pages; a &quot;waiting for&quot; section in the dashboard so you can see who to hassle; a better experience for new users; and probably death to the home page for users who've got accounts. Lots of goodness here.&lt;br /&gt;&lt;br /&gt;Second, it's becoming increasingly clear that blueprints are a good idea with a sub-standard implementation.  Persuaded largely by Matthew Paul Thomas, I think that we should merge the blueprint tracker with the bug tracker to make a &lt;b&gt;&lt;a href=&quot;http://dev.launchpad.net/IssueTracker&quot;&gt;combined issue tracker&lt;/a&gt;&lt;/b&gt;.  A lot of people get worried when I say this, because they really like blueprints and they understand that bugs and blueprints are actually two different things.  Please don't worry.  There will almost certainly always be something in Launchpad like a blueprint or specification that is visibly different from a bug.  However, I think we ought to change what lists they appear in, what statuses they have and many other things.  The loss of distinctiveness will be more than made up for with an increase in capability.&lt;br /&gt;&lt;br /&gt;Third, the way we &lt;b&gt;search&lt;/b&gt; and the way we display results of searches needs to be revamped to be faster and more flexible.  I want to see easy forms, a good search string mini-language, sexy URLs, searches that can be saved and shared.&lt;br /&gt;&lt;br /&gt;There's so much more that we could do, that we ought to do: make mailing lists rock; inline commenting on merge proposals; eliminate all of the silly &quot;refresh this page&quot; business that we still have; go to series and milestones with a sharp axe and a clear conscience; provide top-notch tools for QA teams; show way more cool stuff based on our data; make filing bugs upstream a complete no-brainer; clean up the terminology we use for naming things; provide an event sending interface for launchpadlib so that people don't have to poll. I could go on for a very long time.&lt;br /&gt;&lt;br /&gt;I call out the three things above – cross-project views, merging bugs and blueprints and better search – because I think they are things that will make Launchpad better for absolutely everyone who uses it.  In particular, done right, good cross-project views turns a weakness into a strength. It takes the vast, daunting size of Launchpad and instead turns it into a huge realm of opportunity.&lt;br /&gt;&lt;br /&gt;Now, none of this is fixed in concrete.  There's still plenty of time to discuss, plan out, change our minds and what not.  But it's what's in my head right now.&lt;br /&gt;&lt;br /&gt;That's it.  Right now, we're working on &lt;b&gt;privacy&lt;/b&gt;, &lt;b&gt;performance&lt;/b&gt;, &lt;b&gt;derived archives&lt;/b&gt; and &lt;b&gt;desktop integration&lt;/b&gt; as our top priorities.  We're still plugging away at &lt;b&gt;daily builds&lt;/b&gt; and &lt;b&gt;making links&lt;/b&gt; between distributions and upstreams, and we're working on a host of useful, important things.  In the future, if my plans go as … planned, then we'll have &lt;b&gt;dashboards&lt;/b&gt;, activity &lt;b&gt;walls&lt;/b&gt;, a &lt;b&gt;combined issue tracker&lt;/b&gt; and excellent &lt;b&gt;search&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;What do you think?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-3847341220313994951?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 16 Nov 2010 15:03:34 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Make it really easy to fix bugs on Ubuntu</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-5509376237445701457</guid>
	<link>http://code.mumak.net/2010/11/make-it-really-easy-to-fix-bugs-on.html</link>
	<description>One of the best things that anyone ever said was, &quot;not enough gets said about the importance of abandoning crap&quot;. Mr Glass was probably talking about writing, but his words could well have been aimed squarely at any well-established software development process.&lt;br /&gt;&lt;br /&gt;Right now, it's too hard to &lt;a href=&quot;http://people.canonical.com/~dholbach/Fixing%20a%20bug.png&quot;&gt;fix a bug in Ubuntu&lt;/a&gt;. There are &lt;a href=&quot;https://blueprints.edge.launchpad.net/ubuntu/+spec/ubuntutheproject-community-n-improve-fixing-a-bug-workflow&quot;&gt;a lot of things that we can do&lt;/a&gt; to make it easier, let me tell you about mine.&lt;br /&gt;&lt;br /&gt;If you see a small bug in a program on your desktop, you want to something like this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Figure out what package it's in&lt;/li&gt;&lt;li&gt;Look for an existing bug, if not file one&lt;/li&gt;&lt;li&gt;Get the source&lt;/li&gt;&lt;li&gt;Build it, try to reproduce the bug&lt;/li&gt;&lt;li&gt;Actually fix the bug&lt;/li&gt;&lt;li&gt;Test to see that it's actually fixed&lt;/li&gt;&lt;li&gt;Submit it then shepherd it through whatever processes come next&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Much of this is monkey work if you know how to do it, or incomprehensible arcana if you don't. Either way, it's important that we abandon (or &lt;i&gt;automate&lt;/i&gt;) this essentially uninteresting work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In that spirit, at UDS I wrote a script that a lot of us have been talking about for a long time. I called it &lt;a href=&quot;https://launchpad.net/start-hacking&quot;&gt;start-hacking&lt;/a&gt;, because I am terrible at names and wanted to make a project. Right now, when you run the script on your Ubuntu desktop, your cursor becomes a cross-hair. When you click on an application, start-hacking will tell you the source package that the application belongs to and where you can get the source (both Ubuntu source and latest upstream if available).  It's very simple, but that's because it builds on a very large amount of work that Canonical has done, mostly through Launchpad and Apport.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eventually, we want to make the script a much more beautiful application that gets you a built, runnable copy of any Ubuntu application or library in a test environment.  Our goal is to make fixing a typo (or typo-level bug) as fast and as smooth as possible for any application on the desktop.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All we need is a bit of time and a few volunteers.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-5509376237445701457?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 15 Nov 2010 14:36:53 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Ubuntu in a VM on OS X?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-7255218901755952582</guid>
	<link>http://code.mumak.net/2010/11/ubuntu-in-vm-on-os-x.html</link>
	<description>I'm trying to get Ubuntu 10.10 running in a VM on my iMac. It mostly works with either VirtualBox or VMWare Fusion, but I can't get 3D acceleration working. Under VirtualBox, I can get compositing happening, but it's very slow. Under VMWare Fusion, Ubuntu won't even acknowledge that I have a 3D card. Help.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit:&lt;/b&gt; If you can point me to a &lt;i&gt;working&lt;/i&gt; guide for dual booting Ubuntu on the iMac 27&quot;, then that would also be great.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-7255218901755952582?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 06 Nov 2010 11:28:52 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Still going</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-6860127223498869081</guid>
	<link>http://code.mumak.net/2010/11/still-going.html</link>
	<description>Last post, I talked about the &lt;a href=&quot;http://code.mumak.net/2010/11/what-to-do-what-to-do.html&quot;&gt;top priorities for Launchpad development right now&lt;/a&gt;: performance, privacy, derivative distributions and desktop integration. In this post, I want to talk about the other things that we are doing, and why we are doing them at all.&lt;br /&gt;&lt;br /&gt;In September last year, we decided that we needed to put a lot of work into something that is at the core of the very idea of Launchpad: bridging the gap between Linux distributions (specifically Ubuntu) and upstream open source projects. Launchpad has been intended from the very beginning to smooth out and accelerate collaboration between these two areas of endeavour.&lt;br /&gt;&lt;br /&gt;Much of that work has already been done, but we have three initiatives still going: &lt;b&gt;making links, &lt;/b&gt;&lt;b&gt;daily builds &lt;/b&gt;and &lt;b&gt;importing upstream translations&lt;/b&gt;.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Making links&lt;/b&gt; is all about making it incredibly to add useful, usable information about package / upstream relationships. Launchpad has always had the ability to store such information, but now it's much, much easier to use because of a whole suite of changes: automatic suggestions for upstream / distro links; simplified project configuration; automatic linking to projects when marking a bug as upstream; just-in-time project registration etc. There are a few more bugs to go before we're happy to call it done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Daily builds&lt;/b&gt; are a very cool feature that's still in beta. You provide us with a &quot;recipe&quot; that tells Launchpad how to combine branches into something resembling a source package, then we take that recipe, assemble the source package, build it and then publish it into a PPA of your choice. Then, if the branches change, we'll provide a new build each day. The feature mostly works right now – Project Neon are using it to get &lt;a href=&quot;https://launchpad.net/~project-neon/+archive/ppa&quot;&gt;nightly builds of Amarok&lt;/a&gt; – but the UI needs polish, there are a few system-level &lt;a href=&quot;https://bugs.launchpad.net/launchpad-code/+bug/669703&quot;&gt;glitches&lt;/a&gt; and we're &lt;a href=&quot;https://bugs.launchpad.net/launchpad-code/+bug/608450&quot;&gt;asking questions&lt;/a&gt; about the recipe format. I'll be posting later about how to get involved with the beta.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Importing upstream translations&lt;/b&gt; into Ubuntu makes it much easier for Ubuntu to be the best-translated Linux distribution ever. Right now it's already possible to import translations from upstream projects into Launchpad. Soon those translations will be imported directly into the equivalent Ubuntu packages too, which means that Ubuntu translators can choose to use the upstream translation or instead provide a better one. Before we can do that, we'll need to do some scalability work. After that's done, we'll also want to do some UI work to make it very easy to connect the Ubuntu package translations to the imported upstream translations.&lt;br /&gt;&lt;br /&gt;All in all, three very neat initiatives to bring Ubuntu and its upstreams closer together.&lt;br /&gt;&lt;br /&gt;So that's it right? What with &lt;b&gt;performance&lt;/b&gt;, &lt;b&gt;derivative distributions&lt;/b&gt;, &lt;b&gt;privacy&lt;/b&gt; and &lt;b&gt;desktop integration&lt;/b&gt; as well as &lt;b&gt;making links, &lt;/b&gt;&lt;b&gt;daily builds &lt;/b&gt;and &lt;b&gt;importing upstream translations&lt;/b&gt;, the Launchpad team must have its plate full? Indeed not! Stay tuned, and I'll let you know what other things we are currently working on, as well as the future plans that are bubbling away.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6860127223498869081?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 04 Nov 2010 17:24:19 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: What to do, what to do</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-1742120750897841262</guid>
	<link>http://code.mumak.net/2010/11/what-to-do-what-to-do.html</link>
	<description>One of the many things I love about going to UDS is the opportunity to talk to so many different people about  a relatively small set of things. Having the same conversation over again from various angles helps jostle a few lazy thoughts into rank, allowing the now ordered thoughts to execute a disciplined march on the bastion of uncertainty. That is, explaining what I'm thinking makes my thinking clearer. Rather selfishly, I'd like to start explaining here what I've been thinking recently.&lt;br /&gt;&lt;br /&gt;The most important things for Launchpad development right now are &lt;b&gt;performance&lt;/b&gt;, &lt;b&gt;derivative distributions&lt;/b&gt;, &lt;b&gt;privacy&lt;/b&gt; and &lt;b&gt;desktop integration&lt;/b&gt;. Everything else we want to do is less important than any of these. I used to include &lt;b&gt;software center support&lt;/b&gt;, but we've done that already, all the others are in progress.&lt;br /&gt;&lt;br /&gt;A faster and more snappy Launchpad will make the lives of all of our existing users happy, whether they are dentists hacking in their spare time or field engineers in Taipei. Improving &lt;b&gt;performance&lt;/b&gt; makes the user experience better by having less of it.&lt;br /&gt;&lt;br /&gt;Ubuntu is being shipped by default on more and more devices. Each version of Ubuntu on those devices can quite legitimately be thought of as a &lt;b&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/DerivativeDistributions&quot;&gt;derivative distribution&lt;/a&gt;&lt;/b&gt;. We want to give our hardware enablement teams the same top-notch tools that our platform teams get to use. Also in the highly competitive world of device manufacturing, many things need to be kept secret, so Launchpad needs to get its &lt;b&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/BetterPrivacy&quot;&gt;privacy&lt;/a&gt; &lt;/b&gt;act together.&lt;br /&gt;&lt;br /&gt;Finally, I'm convinced that developing apps and fixing bugs in Ubuntu needs to be as easy and smooth as possible. I'm also convinced, alongside the Ubuntu One folk, that we can do some pretty neat things when we integrate the desktop and the web. Thus I've been pushing for a long time to improve Launchpad's &lt;b&gt;&lt;a href=&quot;https://dev.launchpad.net/LEP/DesktopWideLaunchpadIntegration&quot;&gt;desktop integration&lt;/a&gt;&lt;/b&gt;. Unlike the others it's not an immediate need, but I think the work we do now will pay off very quickly.&lt;br /&gt;&lt;br /&gt;All of these four things are in progress right now. I'd love to write more about some of the other things we have in progress and about my own dim picture of the future, but this is enough for one post.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-1742120750897841262?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 03 Nov 2010 09:03:05 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Echo and Bounce: Inboxen</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-1647806379173166054.post-8812310821845164772</guid>
	<link>http://life.mumak.net/2010/11/inboxen.html</link>
	<description>&lt;div&gt;I have a bunch of places where all of the input into my life gets funneled:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;My Gmail inbox&lt;/li&gt;&lt;li&gt;My physical in-tray&lt;/li&gt;&lt;li&gt;Files on my desktop&lt;/li&gt;&lt;li&gt;Files in &quot;Downloads&quot;&lt;/li&gt;&lt;li&gt;My Remember the Milk inbox&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Every day I empty every one of these.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1647806379173166054-8812310821845164772?l=life.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 02 Nov 2010 15:16:43 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: Launchpad and UDS-N</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-9138221405633969660</guid>
	<link>http://code.mumak.net/2010/11/launchpad-and-uds-n.html</link>
	<description>Yesterday I got back from the &lt;a href=&quot;http://summit.ubuntu.com/&quot;&gt;Ubuntu Developer Summit&lt;/a&gt; where hundreds of people got together to plan the next release of Ubuntu, the &quot;Natty Narwhal&quot;.&lt;br /&gt;&lt;br /&gt;For Natty, the Ubuntu Platform team have five foci:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Unity&lt;/li&gt;&lt;li&gt;2D Experience&lt;/li&gt;&lt;li&gt;Software Center&lt;/li&gt;&lt;li&gt;Testing&lt;/li&gt;&lt;li&gt;Community contributions&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;If you have a problem with these, &lt;a href=&quot;http://theravingrick.blogspot.com/2010/10/this-is-it.html&quot;&gt;talk to the hand&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We on the Launchpad team want to do everything we can to help Ubuntu achieve these goals.  Partly, this will be by continuing to make Launchpad a joy to use.  However we'll probably be able to offer some specific help with the last three foci: Software Center; testing and community contributions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't know of any concrete actions yet – I've yet to trawl through the many blueprints to find them – but for the next few months, I'm hoping that Launchpad developers will be watching for opportunities to help make Natty the best release ever.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-9138221405633969660?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 02 Nov 2010 14:23:01 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: The art is long, the life short</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-5079092028867046001</guid>
	<link>http://code.mumak.net/2010/10/art-is-long-life-short.html</link>
	<description>I love the energy at UDS.  I wish I could go away from it and sit down and do nothing but hack for three months so I could finish all of the little, awesome things that Launchpad could do.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-5079092028867046001?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 28 Oct 2010 19:41:09 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>
<item>
	<title>Mere Code: testtools compatibility</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5733547231775030285.post-3969666303775069191</guid>
	<link>http://code.mumak.net/2010/10/testtools-compatibility.html</link>
	<description>We've recently been getting a few bugs filed on &lt;a href=&quot;https://launchpad.net/testtools&quot;&gt;testtools&lt;/a&gt; about compatibility with various versions of Python. I really want to support as many versions as I can, but I simply don't have them on my system.&lt;br /&gt;&lt;br /&gt;What resources are available to me if I want to set up a Hudson instance or similar that runs testtools tests against Python 2.4, 2.5, 2.6, 2.7, 3.0 and 3.1? A Windows run would also be nice.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-3969666303775069191?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 25 Oct 2010 11:37:55 +0000</pubDate>
	<author>noreply@blogger.com (jml)</author>
</item>

</channel>
</rss>

