<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Twisted</title>
	<!--<link rel="self" type="text/atom" href=""/>-->
	<link rel="alternate" type="text/html" href="http://planet.twistedmatrix.com/"/>
	<id></id>
	<updated>2008-07-20T23:12:57+00:00</updated>
	<generator uri="http://www.planetplanet.org/">http://intertwingly.net/code/venus/</generator>

	<entry>
		<title>Stephen Thorne: Trace that route</title>
		<link rel="alternate" type="text/html" href="http://shiny.thorne.id.au/2008/07/trace-that-route.html"/>
		<id>tag:blogger.com,1999:blog-21652080.post-813655058721478356</id>
		<updated>2008-07-20T01:31:21+00:00</updated>
		<content type="html">&lt;pre&gt;$ traceroute6 mirror.ipv6.internode.on.net&lt;br /&gt;traceroute6 to mirror.ipv6.internode.on.net (2001:44b8:8020:7a80::20) from 2001:44b8:61::e3, 30 hops max, 12 byte packets&lt;br /&gt; 1  2001:44b8:61::e2  87.049 ms  89.126 ms  125.079 ms&lt;br /&gt; 2  vl67.cor1.adl6.internode.on.net  98.27 ms  77.689 ms  77.303 ms&lt;br /&gt; 3  mirror.internode.on.net  109.942 ms  177.193 ms  148.519 ms&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Huzzah. Internode is now running a tunnel broker. :)</content>
		<author>
			<name>Stephen Thorne (noreply@blogger.com)</name>
			<uri>http://shiny.thorne.id.au/</uri>
		</author>
	</entry>

	<entry>
		<title>Christopher Armstrong: Joss Whedon Writes Stuff</title>
		<link rel="alternate" type="text/html" href="http://radix.twistedmatrix.com/2008/07/joss-whedon-writes-stuff.html"/>
		<id>tag:blogger.com,1999:blog-18669215.post-8391796615611633966</id>
		<updated>2008-07-19T03:54:36+00:00</updated>
		<content type="html">Check out &lt;a href=&quot;http://drhorrible.com/&quot;&gt;Dr. Horrible's Sing-Along Blog&lt;/a&gt;. It's a video musical. It's by Joss Whedon, famous Hollywood &lt;a href=&quot;http://drhorrible.com/plan.html&quot;&gt;writer/director/terrorist&lt;/a&gt;. It's free to watch on that web site until Sunday, July 20th, 2008. After that you'll be able to purchase it for a nominal fee.&lt;br /&gt;&lt;br /&gt;Here are some things which he said about this project that I think are cool.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The idea was to make it on the fly, on the cheap – but to make it. To turn out a really thrilling, professionalish piece of entertainment specifically for the internet. To show how much could be done with very little. To show the world there is another way. To give the public (and in particular you guys) something for all your support and patience. And to make a lot of silly jokes. Actually, that sentence probably should have come first. &lt;/blockquote&gt;...&lt;blockquote&gt;It’s time for the dissemination of the artistic process. Create more for less. You are the ones that can make that happen.&lt;/blockquote&gt;</content>
		<author>
			<name>Christopher Armstrong (noreply@blogger.com)</name>
			<uri>http://radix.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Glyph Lefkowitz: Don't Call It Blogging</title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/glyph/~3/338044536/dont-call-it-blogging.html"/>
		<id>tag:blogger.com,1999:blog-8729083.post-3256819710328519369</id>
		<updated>2008-07-17T13:11:54+00:00</updated>
		<content type="html">Despite my own impeccable credentials as an elite cyber-hacker, I am friends with a number of people who are bewildered by the profusion of different technologies that the internet now affords us to interact.  I recently had a conversation where someone was just confused by the whole &quot;blogging&quot; thing.  Why do people blagoblog on the intertron?  What is the point?  I'm a prolific &quot;blogger&quot; myself, I guess, but I found myself sympathizing as I tried to explain.&lt;br /&gt;&lt;br /&gt;I'm a huge fan of the &lt;i&gt;activity&lt;/i&gt; of blogging, but I have never liked the &lt;i&gt;word&lt;/i&gt;, &quot;blogging&quot;.  I never really understood why until I was attempting to explain what it's all about.&lt;br /&gt;&lt;br /&gt;For thousands of years — well, okay I don't have any citations of &lt;i&gt;exactly&lt;/i&gt; how long, due to the evolution of English as a language, but, for a really long time — we've had one word for the activity of &quot;blogging&quot;.  We called it &lt;i&gt;writing&lt;/i&gt;.  That's all you're doing when you're blogging.&lt;br /&gt;&lt;br /&gt;If we were to describe the activity of a Sumerian scribe pressing symbols into soft clay, we'd say they were writing on that clay.  An ancient Egyptian putting words onto a sheet of papyrus: they are writing.  Similarly, we don't typically have separate words for &quot;scrolling&quot;, &quot;codexing&quot;, &quot;booking&quot;, &quot;newspapering&quot;, &quot;magazining&quot;, and so on.  Each new technology for moving writing around didn't need a new verb.  So why has &quot;blogging&quot; gotten one?&lt;br /&gt;&lt;br /&gt;I think there is a good reason this term exists, but that reason doesn't justify the term, it provides a warning, and a reason to try to actively resist the term and just say &quot;writing&quot;.  The web is a more radical and democratizing shift in publishing technology than any of the ones which preceded it, so publishing on the web (especially automated publishing, as on a blog) affords a feedback cycle where the author and the audience are effectively peers.  In fact, the nature of the terms &quot;author&quot; and &quot;audience&quot; has changed; formerly a description of social classes, the people who produce and the people who consume, they have been re-framed as roles within an individual conversation.  You might be the audience when you're reading someone else's blog, but ten minutes later you can easily reverse that relationship with that author as you're writing your own.  This extremely rapid cycle has given a wholly new quality to the style of many blogs, unseen in any prior form of written media.&lt;br /&gt;&lt;br /&gt;So, why resist the term &quot;blogging&quot;?  It confuses the &lt;i&gt;possibilities&lt;/i&gt; that the medium presents with &lt;i&gt;conventions&lt;/i&gt; that it enforces.  Writing is a powerfully diverse art.  A lot of it's good, a lot of it's bad.  &quot;Blogging&quot;, however, is more specific, and unfortunately implies a sort of perpetual half-finished conversation.  It calls to mind a semi-private, informal, ephemeral, link-heavy style of extremely short-form writing.  This form has its masters: Tycho of Penny Arcade infamy leaps to mind immediately.  It also has a sea of mediocrity.  Statistically speaking, you can probably click the 'next blog' link at the top of this page for an immediate example.  I don't have a problem with any of this.  Even the &quot;mediocrity&quot; is just evidence of the degree to which this is empowering people: much of what I'd consider &quot;mediocre&quot; just isn't relevant to me, and isn't written &lt;i&gt;for&lt;/i&gt; me.&lt;br /&gt;&lt;br /&gt;But blogs can be, and are, so much more than that.  They are a disruptive technology in the world of publishing, where &lt;i&gt;any&lt;/i&gt; style of writing can easily be published, circulated, and promoted.  One can write an entire novel, serialized chapter-by-chapter as blog posts.  Many people have, in fact, done this already.  You don't even need to emulate older forms of writing to step outside the style implied by &quot;blogging&quot;.  The tools that the web affords — instant publishing, hyperlinks — are ideal for collaborative scientific research.  Hyperlinks take the work out of footnoting.&lt;br /&gt;&lt;br /&gt;Prominent web writers who I respect also seem to avoid the use of the term &quot;blog&quot;.  Joel Spolsky refers to other people's blogs, but the term &quot;blog&quot; does not appear anywhere describing &lt;i&gt;his&lt;/i&gt; site, despite the fact that there is quite a bit of self-descriptive text that refers to &quot;this site&quot;.  Paul Graham goes a step further, foregoing many traditional blog trappings and has a link that says, simply, &quot;Essays&quot;.  I wonder if it's for this reason.&lt;br /&gt;&lt;br /&gt;So, if you need to explain to someone who doesn't quite get what all the whole &quot;blogging&quot; thing is about, don't talk about social dynamics and the singularity and the mass popularization of media.  That's all great stuff, but it's a confusing distraction.  It's just like writing a book — or, more likely, a magazine.  Except you don't have to talk to a publisher.  And you don't have to have an editor.  And it's free.  And the publishing part doesn't actually take any time.  And it's accessible from anywhere in the world.  And you can read it on your cell phone.  When you stack up all the advantages, the lack of some bound paper doesn't seem like a big deal.&lt;br /&gt;&lt;br /&gt;If you find this explanation useful, feel free to point your relatives at this post.  Tell them that you saw it on my blog, but don't tell them I &lt;i&gt;blogged&lt;/i&gt; about it.  Tell them I &lt;i&gt;wrote&lt;/i&gt; about it.&lt;img src=&quot;http://feeds.feedburner.com/~r/glyph/~4/338044536&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>glyph (noreply@blogger.com)</name>
			<uri>http://glyph.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Duncan McGreggor: OSCON 2008</title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ElectricDuncan/~3/337412850/oscon-2008.html"/>
		<id>tag:blogger.com,1999:blog-8825992.post-1910657146163684189</id>
		<updated>2008-07-16T20:56:41+00:00</updated>
		<content type="html">&lt;div&gt;Hey all, thanks to a friend's amazingly generous offer, I'll be attending OSCON this year :-) I only have to pay for my airfare and food! I've contacted several people already who I know are going to be there (including &lt;a href=&quot;http://www.haynesandboone.com/people/bio.asp?empid=1508&quot;&gt;Van Lindberg&lt;/a&gt; of &lt;a href=&quot;http://www.haynesandboone.com/&quot;&gt;Haynes and Boone&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Bradley_M._Kuhn&quot;&gt;Bradley Kuhn&lt;/a&gt; of the &lt;a href=&quot;http://conservancy.softwarefreedom.org/&quot;&gt;SFC&lt;/a&gt; and the &lt;a href=&quot;http://www.softwarefreedom.org/&quot;&gt;SFLC&lt;/a&gt;), and look forward to meeting up with others. Leave a comment or email me if you're going to be there!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ElectricDuncan/~4/337412850&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Duncan McGreggor (noreply@blogger.com)</name>
			<uri>http://oubiwann.blogspot.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Itamar Shtull-Trauring: The Good War, or, The Most Famous Classic Blunder</title>
		<link rel="alternate" type="text/html" href="http://sikrit.info/archive/2008/7/13/1/"/>
		<id>http://sikrit.info/archive/2008/7/13/1/</id>
		<updated>2008-07-14T12:13:25+00:00</updated>
		<content type="html">&lt;p&gt;I'm reading some essays Chomsky wrote in the 1960s, about Vietnam... It's worth remembering that Vietnam was a liberal project, supported by two Democratic presidents. Here's &lt;a href=&quot;http://www.reuters.com/article/homepageCrisis/idUSISL33181._CH_.2400&quot;&gt;an update&lt;/a&gt; on the war our current batch of Democratic leaders can all believe in:&lt;/p&gt;

&lt;blockquote&gt;KABUL, July 9 (Reuters) - Foreign troops led by NATO and the U.S. military must exercise caution to avoid further civilian casualties while hunting militants in Afghanistan, or people will rise against them, lawmakers have warned.&lt;br /&gt;
&lt;br /&gt;
...
&lt;br /&gt;
&quot;They should not act like the former Soviet Union did in Afghanistan,&quot; the [Afghan upper house of parliament] said in a statement, the Anis daily newspaper reported.&lt;br /&gt;
&lt;br /&gt;
It was referring to the 10 years Soviet occupation of Afghanistan in the 1980s when Moscow's forces relied heavily on air raids in the war against guerrillas known as mujahideen, or Muslim holy fighters, causing widespread destruction and civilian deaths.&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From &lt;a href=&quot;http://www.washingtonpost.com/wp-dyn/content/article/2008/07/13/AR2008071301644.html&quot;&gt;today's Washington Post&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
Congress has quietly used fiscal 2008 legislation on military construction to signal that it plans on a long-term military presence in Afghanistan.&lt;br /&gt;
&lt;br /&gt;
In the recently approved supplemental funding bill for the Iraq and Afghanistan wars, legislators approved construction of a $62 million ammunition storage facility at Afghanistan's Bagram Air Base, where 12 planned &quot;igloos&quot; will support Army and Air Force needs. &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
In another sign that U.S. troops will be there a long time, the Army requested, and Congress provided, $41 million for a 30-megawatt power plant at Bagram. It is capable of generating enough electricity for a town of more than 20,000 homes.&lt;br /&gt;
&lt;/blockquote&gt;</content>
		<author>
			<name>Itamar Shtull-Trauring</name>
			<uri>http://sikrit.info</uri>
		</author>
	</entry>

	<entry>
		<title>Allen Short: PyMeta 0.3.0 Released</title>
		<link rel="alternate" type="text/html" href="http://washort.twistedmatrix.com/2008/07/pymeta-030-released.html"/>
		<id>tag:blogger.com,1999:blog-821809025523101711.post-1463697598136511385</id>
		<updated>2008-07-12T22:07:19+00:00</updated>
		<content type="html">Originally when I was implementing PyMeta I was &lt;i&gt;sure&lt;/i&gt; that the input stream implementation that the Javascript version used was inefficient. Rather than having a mutable object with methods for advancing and rewinding the stream, it has immutable objects with &quot;head&quot; and &quot;tail&quot; methods, which return the value at the current position and a new object representing the next position in the stream. All that allocation couldn't be healthy.&lt;br /&gt;&lt;img src=&quot;http://www.yellow5.com/pokey/archive/pokey51_1.gif&quot; /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Turns out I was wrong. I misunderstood the requirements for OMeta's input stream. Various operations require the ability to save a particular point in the stream and go back to it. To further complicate matters, arguments to rules are passed on the stream by pushing them onto the front, and rules that take arguments read them off of the stream. This is very handy for certain types of pattern matching, but it totally destroys any hope of simply implementing the input as a list and an index into it, because there has to be a way to uniquely identify values pushed onto the stream. If a value gets pushed onto the stream, is read from it, then another one is pushed on, both of them have the same predecessor, but they don't have the same stream position. It becomes more like a tree than a sequence. JS-OMeta handled this by just creating a new stream object for each argument. I didn't give up soon enough on my clever idea when initially implementing PyMeta, and it grew more complicated with each feature I implemented, involving a bunch of lists for buffering things and a complicated mark/rewind scheme. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;After writing a rather complicated grammar with PyMeta, I began to wonder if I could improve its speed. By this time I knew the JS version's algorithm was less complicated so I decided to try it out. It cut my grammar's unit tests' runtime from around 40 seconds to 4 seconds. Also, it &lt;a href=&quot;https://bugs.launchpad.net/pymeta/+bug/239344&quot;&gt;fixed a bug&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.yellow5.com/pokey/archive/pokey23_3.gif&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Moral of the story: I'm not going to try to implement clever optimizations until I understand the original version any more. :)&lt;br /&gt;&lt;br /&gt;I've released a version with this new input implementation. &lt;a href=&quot;https://launchpad.net/pymeta/+download&quot;&gt;Get it in the usual place.&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Allen Short (noreply@blogger.com)</name>
			<uri>http://washort.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Twisted Matrix Laboratories: June/July TSF Sponsored Development</title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~3/332072514/junejuly-tsf-sponsored-development.html"/>
		<id>tag:blogger.com,1999:blog-1267458971896358542.post-6407412283062388964</id>
		<updated>2008-07-10T21:02:47+00:00</updated>
		<content type="html">The second (of what should end up being many) round of TSF sponsored development has just wrapped up.  Like last time, this was two weeks of work by yours truly (with an afternoon of Glyph's time spent reviewing code to keep things moving).  This time around there were fewer tickets waiting to be reviewed when I got started, however there was still plenty of code to look at.  Over the full period, I reviewed:&lt;br /&gt;&lt;br /&gt;#1144 Documentation: twisted.internet.reactor does not appear in the API docs&lt;br /&gt;#1253 Create index.xhtml files for non-core doc trees&lt;br /&gt;#1255 Update copyrights in the man pages&lt;br /&gt;#1878 twisted.web.monitor traceback_ AttributeError: class IChangeNotified has no attribute '__class__'&lt;br /&gt;#1890 move examples from core into correct sub-packages&lt;br /&gt;#1900 Error in documentation online&lt;br /&gt;#2169 twisted.plugin documentation errors&lt;br /&gt;#2208 Standardize on the Python shebang line&lt;br /&gt;#2438 Get rid of references to maintainer email addresses from code&lt;br /&gt;#2552 broken links in intro.xhtml&lt;br /&gt;#2607 conch.checks.SSHPublicKeyDatabase calls os.seteuid/os.setegid even if it's not necessary&lt;br /&gt;#2716 Eliminate relative imports from twisted.conch&lt;br /&gt;#2815 Update VFS backends to an async interface&lt;br /&gt;#2821 create twistd plugin for vfs&lt;br /&gt;#2845 twisted.internet.thread._putResultInDeferred should be public&lt;br /&gt;#3182 Trivial typo in twisted.internet.protocol&lt;br /&gt;#3257 Rewrite twisted.web.static.File.directoryListing to not use woven&lt;br /&gt;#3269 curses.setupterm must only be called once per process&lt;br /&gt;#3300 twistd should support setting the syslog facility&lt;br /&gt;#3326 Typo in gtkmanhole.py&lt;br /&gt;&lt;br /&gt;Other tickets I worked on included:&lt;br /&gt;&lt;br /&gt;#1069 log observers that throw exceptions should not be removed&lt;br /&gt;#1152 xmlrpc.html doesn't describe how to return errors to the client&lt;br /&gt;#1291 Expose &quot;process exited&quot; hook on ProcessProtocol_ turning current processEnded into user-overriddable behavior&lt;br /&gt;#1493 static File web module doesn't support byte ranges&lt;br /&gt;#2303 Deprecate setUpClass and tearDownClass and_ if possible_ fix the subclassing behaviour.&lt;br /&gt;#2327 Intermittent failure in PB tests&lt;br /&gt;#2631 Update coding standard to indicate preference for TestCase methods which being with &quot;assert&quot; and which do not have an underscore in their name&lt;br /&gt;#2874 _sslverify.problemsFromTransport should be deprecated&lt;br /&gt;#3029 documentation for twisted.python.deprecate.deprecated is incomplete (and other sundries)&lt;br /&gt;#3059 twisted.internet.tcp.Client.getPeer incorrectly returns hostnames&lt;br /&gt;#3116 Errors in processEnded can cause processes to be eternally reaped&lt;br /&gt;#3159 t.i.utils process functions should have a default cwd of None_ not '.'&lt;br /&gt;#3218 SSL disconnection sometimes hangs indefinitely with pyOpenSSL 0.7&lt;br /&gt;#3255 Trial fails to display the line where the error occured in case of SyntaxError&lt;br /&gt;#3300 twistd should support setting the syslog facility&lt;br /&gt;#3301 superfluous local in AMP.__init__&lt;br /&gt;#3305 CR IAC ignored in TelnetClient&lt;br /&gt;#3306 twisted.test.test_ssl.StolenTCPTestCase has a number of defects&lt;br /&gt;#3339 mailmail raises an exception instead of giving an error message&lt;br /&gt;&lt;br /&gt;In particular, I spent a lot of time on #1291 which will make it possible to control child processes more precisely with Twisted by separating out the notification that a child process has actually exited from the notification that all of its file descriptors have been closed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to the SFC (&amp;lt;&lt;a href=&quot;http://conservancy.softwarefreedom.org/&quot;&gt;http://conservancy.softwarefreedom.org/&lt;/a&gt;&amp;gt;) and all of the sponsors  (&amp;lt;&lt;a href=&quot;http://twistedmatrix.com/trac/wiki/TSF/FoundingSponsors&quot;&gt;http://twistedmatrix.com/trac/wiki/TSF/FoundingSponsors&lt;/a&gt;&amp;gt;) who made this possible, as well as to all the other Twisted developers who helped out by writing or reviewing code.&lt;img src=&quot;http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~4/332072514&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://labs.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Glyph Lefkowitz: Conference FAIL</title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/glyph/~3/332264374/conference-fail.html"/>
		<id>tag:blogger.com,1999:blog-8729083.post-521601018318147043</id>
		<updated>2008-07-09T21:54:08+00:00</updated>
		<content type="html">Last night at a dinner with &lt;a href=&quot;http://radian.org/&quot;&gt;Ivan Krstić&lt;/a&gt; and &lt;a href=&quot;http://itamarst.org/&quot;&gt;Itamar Shtull-Trauring&lt;/a&gt;, we were all lamenting that too many (all?) software conferences focus specifically on positive results.  This is what you want, of course, if you treat a conference as purely a marketing venue.  However, most learning takes place based on something that someone did &lt;i&gt;wrong&lt;/i&gt; and then needed to correct, not something that they did right.&lt;br /&gt;&lt;br /&gt;All of the great software developers I know have at least one &lt;b&gt;great&lt;/b&gt; story of how a project they were working on was a complete disaster.  Often these projects are shielded from the public eye, since nobody wants to talk about failure.  So, how do we make a public discussion of these ideas socially acceptable?&lt;br /&gt;&lt;br /&gt;Thus, an idea was born: FAILcon.  The idea is simple: submitted talks and papers must be related to projects which failed in an interesting way.  The larger the better, of course — the bigger they are, the harder they fail — but anything that failed in an interesting way would be a valid subject for discussion.&lt;br /&gt;&lt;br /&gt;I'm writing about it so that it won't be forgotten, because I think it's a great idea.  But I doubt that any of us are going to organize a conference any time soon.  So please, steal this idea.  Does anyone out there with conference-organizing skills want to get something together based around the common theme of failure?&lt;img src=&quot;http://feeds.feedburner.com/~r/glyph/~4/332264374&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>glyph (noreply@blogger.com)</name>
			<uri>http://glyph.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Moshe Zadka: Upgrading to Ubuntu Hardy on my Lenovo 3000 N100</title>
		<link rel="alternate" type="text/html" href="http://moshez.wordpress.com/2008/07/09/upgrading-to-ubuntu-hardy-on-my-lenovo-3000-n100/"/>
		<id>http://moshez.wordpress.com/?p=134</id>
		<updated>2008-07-09T16:43:26+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Everything seemed to work, except for my wireless. Yes, big deal…&lt;/p&gt;
&lt;p&gt;After googling a little bit, I found it’s a bug in the new kernels. I rebooted and chose the “2.6.15″ kernel, and everything worked fine.&lt;/p&gt;
&lt;img src=&quot;http://feeds.wordpress.com/1.0/categories/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;img src=&quot;http://feeds.wordpress.com/1.0/tags/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/moshez.wordpress.com/134/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/moshez.wordpress.com/134/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/moshez.wordpress.com/134/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/moshez.wordpress.com/134/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/moshez.wordpress.com/134/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/moshez.wordpress.com/134/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=moshez.wordpress.com&amp;amp;blog=2210753&amp;amp;post=134&amp;amp;subd=moshez&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>moshez</name>
			<uri>http://moshez.wordpress.com</uri>
		</author>
	</entry>

	<entry>
		<title>Paul Swartz: Free Hugs Campaign</title>
		<link rel="alternate" type="text/html" href="http://z3p.tumblr.com/post/41620698"/>
		<id>http://z3p.tumblr.com/post/41620698</id>
		<updated>2008-07-09T15:25:10+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;br /&gt;Free Hugs Campaign</content>
		<author>
			<name>Paul Swartz</name>
			<uri>http://z3p.tumblr.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Paul Swartz: "Plaintiff has a great deal to say,
But it seems he skipped Rule 8(a).
His Complaint is too..."</title>
		<link rel="alternate" type="text/html" href="http://z3p.tumblr.com/post/41537247"/>
		<id>http://z3p.tumblr.com/post/41537247</id>
		<updated>2008-07-09T00:54:38+00:00</updated>
		<content type="html">“Plaintiff has a great deal to say,&lt;br /&gt;
But it seems he skipped Rule 8(a).&lt;br /&gt;
His Complaint is too long,&lt;br /&gt;
Which renders it wrong,&lt;br /&gt;
Please rewrite and refile today.”&lt;br /&gt;&lt;br /&gt; - &lt;em&gt;A federal judge responds to a lawsuit that was too long with a limerick (via &lt;a href=&quot;http://ap.google.com/article/ALeqM5gwgC5so08ZB2a29LlTlzWAeAFR0QD91PAQVG0&quot;&gt;The Associated Press&lt;/a&gt;)&lt;/em&gt;</content>
		<author>
			<name>Paul Swartz</name>
			<uri>http://z3p.tumblr.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Paul Swartz: Sliced bread 'a world first' | NEWS.com.au</title>
		<link rel="alternate" type="text/html" href="http://z3p.tumblr.com/post/41490851"/>
		<id>http://z3p.tumblr.com/post/41490851</id>
		<updated>2008-07-08T17:20:56+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.news.com.au/story/0,23599,23975434-5017303,00.html&quot;&gt;Sliced bread 'a world first' | NEWS.com.au&lt;/a&gt;: Happy (belated) birthday pre-sliced bread! It turned 80 on July 6th.</content>
		<author>
			<name>Paul Swartz</name>
			<uri>http://z3p.tumblr.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Kevin Turner (LJ): little bear's vegetable omelette</title>
		<link rel="alternate" type="text/html" href="http://keturn.livejournal.com/240743.html"/>
		<id>http://keturn.livejournal.com/240743.html</id>
		<updated>2008-07-08T02:28:53+00:00</updated>
		<content type="html">&lt;p&gt;It's that time of year again.  Does anyone want to join me for &lt;a href=&quot;http://www.davinci-days.org/&quot;&gt;da Vinci Days&lt;/a&gt; in Corvallis this year?  My current plans are to be there on Saturday the 19th.  (I have a thing in Keizer to be at on Sunday afternoon.)  Kinetic sculptures, human kaleidoscope, fun stuff.&lt;/p&gt;
&lt;p&gt;Let me know if you're interested in going.&lt;/p&gt;</content>
		<author>
			<name>Kevin Turner (LJ)</name>
			<uri>http://keturn.livejournal.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Paul Swartz: 1 Year Anniversary!</title>
		<link rel="alternate" type="text/html" href="http://z3p.tumblr.com/post/41361308"/>
		<id>http://z3p.tumblr.com/post/41361308</id>
		<updated>2008-07-07T20:04:31+00:00</updated>
		<content type="html">I didn’t note it when it happened, but 6/28 was the 1 year anniversary of working with the &lt;a href=&quot;http://www.getmiro.com/&quot;&gt;Participatory Culture Foundation&lt;/a&gt;.  I didn’t really know what to expect when I started with them, but it’s been an awesome ride so far.</content>
		<author>
			<name>Paul Swartz</name>
			<uri>http://z3p.tumblr.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: I Love Data</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/07/i-love-data.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-4536070818872098294</id>
		<updated>2008-07-07T08:22:37+00:00</updated>
		<content type="html">At work, we recently started to graph the time it takes to access a branch in Launchpad via SSH, both on our staging and production servers.&lt;br /&gt;&lt;br /&gt;I love this so much. Having this data is &lt;span style=&quot;font-style: italic;&quot;&gt;liberating&lt;/span&gt;. It's like turning on a light in a dark room: suddenly I can go from uncertain, careful, hesitant steps to bold, confident strides.&lt;br /&gt;&lt;br /&gt;In fact, the metaphor stretches further. This new light has revealed objects of interest (that is, spikes in the time taken) that I wasn't aware of before. I need to know how long these spikes last, how they correlate with load on the system and so forth. Soon there'll be more graphs, and I'll be able to correlate them and analyze them and suck on their delicious, numerical marrow (the light metaphor long abandoned).&lt;br /&gt;&lt;br /&gt;Regardless of whether it's liberating illumination or nourishing, savoury meat, this new graph makes me wonder why I don't chart other things I care about. Having such graphs would help me see the &lt;span style=&quot;font-style: italic;&quot;&gt;impact&lt;/span&gt; of my actions. I could chart things like my bank balance, my waistline or the number of Latin words I learned this week. Then I could answer questions like &quot;do I spend more on Tuesdays?&quot; or &quot;can I afford this iPod/cake/gerund?&quot;. This is important, because when I am tempted with a sleek/delicious/perplexing iPod/cake/gerund, I fall back on my own judgment. I think it's time to confess, dear reader, that my own judgment isn't very good. And yet I continue to trust it.&lt;br /&gt;&lt;br /&gt;The reason I don't have such graphs is that they are inconvenient to maintain. A graph of branch access times is &lt;span style=&quot;font-style: italic;&quot;&gt;easy&lt;/span&gt;. All you need to do is describe how to get the measurement, and then do a bit of once-off set up. If you want to graph your body weight, you need to get on the scales at a fixed time and then look at the dial and adjust for parallax and then write a number down somewhere and maybe note down whether this is before or after a meal and then take the number and then add it to a spreadsheet. Most online banking sites I've seen are even &lt;span style=&quot;font-style: italic;&quot;&gt;less&lt;/span&gt; convenient than this.&lt;br /&gt;&lt;br /&gt;Getting data on life is hard, but for programming it's easy. What things do you care about on your project? Features, user experience, how fast bugs get fixed? Can you quantify these things? Can you make a pretty picture out of it? If so, do it now! Post your answers here, set up something like&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt; &lt;a href=&quot;http://cricket.sourceforge.net/&quot;&gt;Cricket&lt;/a&gt; and then profit!&lt;br /&gt;&lt;br /&gt;P.S. I can't believe I got to the end of this post without saying how awesome the Canonical sysadmins are. Let me correct that now. The Canonical sysadmins are heck of awesome. They could &lt;a href=&quot;http://cdn-www.i-am-bored.com/media/95709_mordoranim8.gif&quot;&gt;simply walk into Mortor&lt;/a&gt;.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Duncan McGreggor: Native LoadBalancing for Twisted Apps</title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ElectricDuncan/~3/327632080/native-loadbalancing-for-twisted-apps.html"/>
		<id>tag:blogger.com,1999:blog-8825992.post-1731893800907898448</id>
		<updated>2008-07-05T21:51:40+00:00</updated>
		<content type="html">&lt;div&gt;Yesterday, right before midnight, I tagged the 1.1.0 release of txLoadBalancer on Launchpad after completing the last of the planned features. There are some pretty radical changes that have been developed for this release... and the coolest part  is this is just the beginning :-) (See the TODO if you don't believe me!)&lt;br /&gt;&lt;br /&gt;You can checkout from &lt;a href=&quot;https://code.launchpad.net/%7Eoubiwann/txloadbalancer/1.1.0&quot;&gt;lp:~oubiwann/txloadbalancer/1.1.0&lt;/a&gt; or download from &lt;a href=&quot;http://pypi.python.org/pypi/txLoadBalancer/&quot;&gt;PyPI&lt;/a&gt;. If you're a PyPI expert, I've got some questions for you at the end of this post... Been having some sucky experiences with PyPI lately :-(&lt;br /&gt;&lt;br /&gt;So here's what's going on with txLoadBalancer:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Improved API&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The biggest thing you'll notice if you've switching from PythonDirector is the massive overhaul the API has undergone. Things are cleaner and generally more modern, with a concise and well-defined module layout.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;New Load Balancing Algorithm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've added support for a weighted host scheduler. Given a weight that represents the frequency a host should be used, a host will be randomly selected, based on it's weight. For example, with two hosts, one having a weight of 1 and the other having a weight of 3, host 2 will be chosen about 75% of the time and host 1 will get about 25% of the requests.&lt;br /&gt;&lt;br /&gt;Right now, this algorithm has to make several calls to other parts of the code in order to get all the data it needs (it also builds some crazy iterators). As such, it's rather slow and performs poorly when compared to the very light-weight least-connections algorithm. That being said, the next release will include optimizations for the weighted scheduler that make use of a Twisted timer and caching.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Native Twisted Load-Balancing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's the sexiest part: you can now load-balance your Twisted application by using the txLB API; you don't even need to run the load-balancer as a separate app! This evolved as a feature after a conversation with an as-yet unnamed cloud hosting provider, a follow-up discussion with the &lt;a href=&quot;http://about.divmod.com/team.html&quot;&gt;Divmod team&lt;/a&gt;, and then some quiet  pondering about ways in which Twisted applications could be supported in cloud/grid/massively-multi-core architectures.&lt;br /&gt;&lt;br /&gt;The &quot;self load-balancing&quot; API in txLB is not a comlete solution for grid-hosting, but it is a first step in one direction (we've been discussing lots of others, too, including the use of our deployment tool).&lt;br /&gt;&lt;br /&gt;Before I show you how to use the self load-balancing API, let's take a quick look at a normal Twisted application service:&lt;br /&gt;&lt;pre&gt;from twisted.web import static, server&lt;br /&gt;from twisted.application import service, internet&lt;br /&gt;&lt;br /&gt;application = service.Application(&quot;Demo Web Server&quot;)&lt;br /&gt;web = server.Site('/home/oubiwann/public_html')&lt;br /&gt;service = internet.TCPServer(7001, web)&lt;br /&gt;service.setServiceParent(application)&lt;br /&gt;&lt;/pre&gt;You start that with the command &lt;span style=&quot;font-family: courier new;&quot;&gt;twistd -noy myweb.tac&lt;/span&gt;. For use with the next example, you can also start two more, one on port 7002 and the other on port 7003.&lt;br /&gt;&lt;br /&gt;Now here's what you do to make a self load-balanced app:&lt;br /&gt;&lt;pre&gt;from twisted.application import service&lt;br /&gt;&lt;br /&gt;from txlb import manager&lt;br /&gt;from txlb.model import HostMapper&lt;br /&gt;from txlb.schedulers import leastc&lt;br /&gt;from txlb.application.service import LoadBalancedService&lt;br /&gt;&lt;br /&gt;proxyServices = [&lt;br /&gt;  HostMapper(proxy='127.0.0.1:8080', lbType=leastc, host='host1',&lt;br /&gt;      address='127.0.0.1:7001'),&lt;br /&gt;  HostMapper(proxy='127.0.0.1:8080', lbType=leastc, host='host2',&lt;br /&gt;      address='127.0.0.1:7002'),&lt;br /&gt;  HostMapper(proxy='127.0.0.1:8080', lbType=leastc, host='host3',&lt;br /&gt;      address='127.0.0.1:7003'),&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;application = service.Application('Demo LB Service')&lt;br /&gt;pm = manager.proxyManagerFactory(proxyServices)&lt;br /&gt;lbs = LoadBalancedService(pm)&lt;br /&gt;lbs.setServiceParent(application)&lt;br /&gt;&lt;/pre&gt;As you would expect, you need to indicate the proxy host:port, the algorithm to use, and the hosts that are to be balanced. The host setup assumes that you have three services running on localhost ports 7001, 7002, and 7003. All that's needed now is to just run that code with the usual &lt;span style=&quot;font-family: courier new;&quot;&gt;twistd -noy myapp.tac&lt;/span&gt;.  Also, for demonstration purposes, this is a somewhat simplified example of what is possible.&lt;br /&gt;&lt;br /&gt;This may seem like a lot of extra work when compared to the simple web host above, but think about it: we're &lt;span style=&quot;font-style: italic;&quot;&gt;load-balancing&lt;/span&gt; here :-) This saves you from having to manage yet another application. With a few extra lines of code, you can keep it all in one place and have it manage itself.&lt;br /&gt;&lt;br /&gt;Note that this API is in development and continuing to improve. The example above is from code running in trunk. For the more verbose configuration that is in the 1.1.0 release, be sure to see &lt;span style=&quot;font-family: courier new;&quot;&gt;./bin/txlbWeb.tac&lt;/span&gt; from the source tarball. To play with the latest and greatest, you'll want to checkout the code here: &lt;a href=&quot;https://code.launchpad.net/%7Eoubiwann/txloadbalancer/main&quot;&gt;lp:txloadbalancer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Other Goodies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is some other good stuff in the release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can now ssh into a txLB instance and mainipulate the load-balancer in real time from an interactive Python interpreter.&lt;/li&gt;&lt;li&gt;You can change the proxy to listen on a different port while the application is running (no restart requred!).&lt;/li&gt;&lt;li&gt;Changes made to the configuration while running are no longer volatile; they are saved to disk (and your old config gets backed up).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Work from Apple, Inc. was included in this release, too (they use the old PythonDirector in their Calendaring server). This includes a bug fix and management socket feature.&lt;/li&gt;&lt;li&gt;There is a significant jump in performance between this release and the previous one. I believe this to be due to the separation of concerns in the API, but haven't yet confirmed that.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Coming Work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a lot of &lt;span style=&quot;font-style: italic;&quot;&gt;exciting&lt;/span&gt; features coming for txLB. Just to name a few:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;improved weighted algorithm&lt;/li&gt;&lt;li&gt;resources-based algorithm (a scheduler that determins the weight of a proxied host by memory, CPU, etc., utilization)&lt;/li&gt;&lt;li&gt;smarter proxied host failover and recovery&lt;/li&gt;&lt;li&gt;a heartbeat manager&lt;br /&gt;&lt;/li&gt;&lt;li&gt;txLB-powered application cloning (when started, an app will determine if it needs to run the clone as the managing load-balancer or simply as a proxied host)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;auto-discovery of balanced hosts&lt;/li&gt;&lt;li&gt;proxy fail-over (a balanced host taking over as manager in the event that the manager goes down)&lt;/li&gt;&lt;li&gt;ApacheMQ/Stomp integration&lt;/li&gt;&lt;li&gt;LDAP/RADIUS authentication&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Additionally, I'll be putting together some basic performance metrics contrasting Apache and load-balanced Twisted apps. I will also be comparing previous versions of txLB/PythonDirector with the latest release(s).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Problems with PyPI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I will close this post on a sad note: PyPI used to be an amazing experience for me (a couple years ago, when it was still being called &quot;cheeseshop&quot;). Everything worked as it was supposed to. This hasn't been the case when I've used it recently (over the past few months).&lt;br /&gt;&lt;br /&gt;For all that I say about PyPI, I allow for the fact that I may just be missing something, and it may be entirely my fault. That being said, I spent about 3 hours online last night combing though the SIG mail list, the bug list on sourceforge, and blog posts about setuptools and PyPI, and could find no answers to my questions. Well, with the possible exception of a bug report, but it doesn't look like it was confirmed by a PyPI team member, so I'm not sure if it's valid or not.&lt;br /&gt;&lt;br /&gt;Here are my issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When I upload my project using &lt;span style=&quot;font-family: courier new;&quot;&gt;python setup.py [sdist|bdist_egg] upload&lt;/span&gt;, no metadata defined in my &lt;span style=&quot;font-family: courier new;&quot;&gt;setup()&lt;/span&gt; function is presented on my package's PyPI page. When I click the metadata link, it's only got three sparse lines.&lt;/li&gt;&lt;li&gt;When I manually upload from the package's PKG-INFO itself, all the metadata is presented on the page as it should be, with the exception of the long description. It is in plain text instead of ReST (I am checking that it is valid ReST using distutils settings of &lt;span style=&quot;font-family: courier new;&quot;&gt;reporter.halt_level = 5&lt;/span&gt;, &lt;span style=&quot;font-family: courier new;&quot;&gt;reporter.report_level = 1&lt;/span&gt;, &lt;span style=&quot;font-family: courier new;&quot;&gt;settings.pep_references = False&lt;/span&gt;, and &lt;span style=&quot;font-family: courier new;&quot;&gt;settings.trim_footnote_reference_space = None&lt;/span&gt;; these are the same settings that Zope Corp uses to verify the ReST that it uploads to PyPI).&lt;/li&gt;&lt;li&gt;When I manually edit the long description in the form, I get the same thing: plain text, no ReST.&lt;/li&gt;&lt;li&gt;When I upload a package that is displayed properly on PyPI (such as &lt;a href=&quot;http://pypi.python.org/pypi/zc.twist&quot;&gt;zc.twist&lt;/a&gt;; uploaded as one of my projects by chaning the name), I get the same problem (this is why I think it might be something that &lt;span style=&quot;font-style: italic;&quot;&gt;I'm&lt;/span&gt; doing wrong...): no metadata, and when I upload the PKG-INFO manually, no ReST.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Why, oh why, cruel fates, does this not work any more?  I used to be able to upload to PyPI without any of these issues...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ElectricDuncan/~4/327632080&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Duncan McGreggor (noreply@blogger.com)</name>
			<uri>http://oubiwann.blogspot.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Paul Swartz: SimplyNoise.com - The best free white noise generator on the Internet.</title>
		<link rel="alternate" type="text/html" href="http://z3p.tumblr.com/post/41113624"/>
		<id>http://z3p.tumblr.com/post/41113624</id>
		<updated>2008-07-05T20:46:40+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.simplynoise.com/&quot;&gt;SimplyNoise.com - The best free white noise generator on the Internet.&lt;/a&gt;: Pretty simple Flash application which generates white noise right from your browser. Personally I like it at about 60%.</content>
		<author>
			<name>Paul Swartz</name>
			<uri>http://z3p.tumblr.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Tired Hippo</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/07/tired-hippo.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-6793167041085155927</id>
		<updated>2008-07-05T12:01:28+00:00</updated>
		<content type="html">&lt;blockquote&gt;Chronomancy... is generally a fictional and sensational school of magic. Although the school is based on quantum physics and certain scientific theories, there is no concrete evidence of the perfected use of time manipulation.&lt;/blockquote&gt;&lt;br /&gt;Thank you Wikipedia.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Five Years</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/09/five-years.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-358510319793773286</id>
		<updated>2008-07-05T11:21:31+00:00</updated>
		<content type="html">That's not quite how long it took &lt;a href=&quot;http://code.mumak.net/glyf.livejournal.com&quot;&gt;Glyph&lt;/a&gt; to write a post explaining what he meant when he told me that &lt;a href=&quot;http://glyf.livejournal.com/72505.html&quot;&gt;xUnit should use the visitor pattern instead of the composite pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm going to write a more detailed response later, God willing. I just wanted to flag the post and say thanks to Glyph for finally posting it — the &lt;a href=&quot;http://mumak.net/2007/08/20/let-the-beat-drop/&quot;&gt;hassling&lt;/a&gt; must have worked.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: The Economist Index</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/02/economist-index_10.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-4242706117573763571</id>
		<updated>2008-07-05T11:21:30+00:00</updated>
		<content type="html">&lt;em&gt;The Economist&lt;/em&gt; occasionally publishes a &quot;Big Mac Index&quot; — how much the world's favorite &quot;burger&quot; costs in each country, translated into a common currency.&lt;br /&gt;&lt;br /&gt;Why they don't publish an index of how much an issue of the Economist costs?  All of my issues have the price of the newspaper in lots of Asia-Pacific currencies. A small sample:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Australia, 9.39855 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Cambodia, 6.00 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;China, 10.43655 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Hong Kong, 7.6917 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;India, 5.0522 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Japan, 10.70535 USD&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;New Zealand, 8.6669 USD&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Can anyone tell me why the price varies so much?</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Three-ways on Pidgin?</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/02/three-ways-on-pidgin.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-3364492924699447727</id>
		<updated>2008-07-05T11:21:29+00:00</updated>
		<content type="html">Dear Lazyweb,&lt;br /&gt;&lt;br /&gt;How do I initiate a three-way chat with Pidgin 2.2.1?&lt;br /&gt;&lt;br /&gt;jml</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Merging New trunk Features to a Development Branch (redux)</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/09/merging-new-trunk-features-to.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-7272353249070931637</id>
		<updated>2008-07-05T11:08:02+00:00</updated>
		<content type="html">&lt;a href=&quot;http://oubiwann.blogspot.com/&quot;&gt;Oubiwann&lt;/a&gt; has &lt;a href=&quot;http://oubiwann.blogspot.com/2007/09/merging-new-trunk-features-to.html&quot;&gt;recently posted&lt;/a&gt; about the joys of using &lt;a href=&quot;http://divmod.org/trac/wiki/DivmodCombinator&quot;&gt;Combinator&lt;/a&gt; to do branch-based development using Subversion. I thought it'd be fun to do the same post, except this time with Bazaar.&lt;br /&gt;&lt;h3&gt;Background&lt;/h3&gt;&lt;br /&gt;You're working on a project called &quot;Project&quot;, you have a copy of the mainline branch (i.e. 'trunk') in your &lt;code&gt;src&lt;/code&gt; directory.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~$ cd ~/src/Project&lt;br /&gt;~/src/Project$ ls&lt;br /&gt;trunk&lt;/pre&gt;&lt;br /&gt;You want to implement a new feature, so you branch trunk to work on it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ bzr branch trunk viking-feature-836&lt;/pre&gt;&lt;br /&gt;Bazaar is a version control system, not a PYTHONPATH-managing system, so it doesn't maintain a global list of projects and the branches that are currently active for each project.&lt;br /&gt;&lt;br /&gt;Perhaps your company focuses on historical invasions of Britain. You decide to start work on another feature:&lt;br /&gt;lass objects.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ bzr branch trunk norman-feature-1066&lt;/pre&gt;&lt;br /&gt;You multi-task for a bit, until you finish 'viking-feature'. You decide to merge 'viking-feature-836' into trunk.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ cd trunk&lt;br /&gt;~/src/Project/trunk$ bzr merge ../viking-feature-836&lt;br /&gt;~/src/Project/trunk$ bzr ci&lt;/pre&gt;&lt;br /&gt;At this point, you begin to suspect that Bazaar treats branches as first-class objects. However, at this point, a developer on the obverse side of your continent calls you,&lt;br /&gt;&lt;br /&gt;&quot;Where's your viking feature? I need it to invade Britain!&quot;&lt;br /&gt;&lt;br /&gt;&quot;I've just put it into trunk. Have you got the latest copy?&quot;&lt;br /&gt;&lt;br /&gt;&quot;Yeah, I do, I just pulled from trunk.&quot;&lt;br /&gt;&lt;br /&gt;&quot;It's in trunk, you fool! ... Oh, wait, gimme a sec.&quot;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project/trunk$ bzr push&lt;br /&gt;Pushing to bzr+ssh://bzr.example.com/Project/trunk...&lt;br /&gt;~/src/Project/trunk$&lt;/pre&gt;&lt;br /&gt;&quot;Try now.&quot;&lt;br /&gt;&lt;h3&gt;Merging&lt;/h3&gt;&lt;br /&gt;OK, enough background, let's merge.&lt;br /&gt;&lt;br /&gt;Say you need some of the changes in trunk in order to finish work on your norman feature. No problems.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project$ bzr merge trunk norman-feature-1066&lt;br /&gt;~/src/Project$ bzr ci -m &quot;Merge from trunk.&quot;&lt;/pre&gt;&lt;br /&gt;It's hard not to feel smug at this point.&lt;br /&gt;&lt;br /&gt;Wait a second, you also want to look at the experimental branch that a friend is working on:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/src/Project/norman-feature-1066$ bzr merge bzr+ssh://yourfriend.example.com/branches/sealion-1946&lt;br /&gt;~/src/Project/norman-feature-1066$ bzr diff | less # better double check this one&lt;br /&gt;~/src/Project/norman-feature-1066$ bzr revert # nope, doesn't seem like a good idea&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;br /&gt;Bazaar treats branches as first-class objects and treats trunk just like any other branch. Although Combinator is great for branch-based development in Subversion, it is more complex and less flexible than doing branch-based development in Bazaar.&lt;br /&gt;&lt;br /&gt;With Combinator, you lose history when you merge in changes from trunk, with Bazaar you don't.&lt;br /&gt;&lt;br /&gt;With Combinator, you can only merge in changes from trunk, with Bazaar you can merge from any branch.&lt;br /&gt;&lt;br /&gt;With Combinator, merging from trunk leaves a bunch of changed files in the trunk checkout on your system (this has tripped me up more than once). With Bazaar, this doesn't happen.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: It's a Gibbon</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/09/it-gibbon.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-5557701058215689402</id>
		<updated>2008-07-05T11:08:01+00:00</updated>
		<content type="html">Over the weekend I upgraded my laptop to &lt;a href=&quot;http://www.ubuntu.com&quot;&gt;Ubuntu 7.10&lt;/a&gt; aka &quot;The Gutsy Gibbon&quot;.&lt;br /&gt;&lt;br /&gt;Obvious improvements include having Pidgin installed and a much superior version of Deskbar. There's also a swanky new panel to actually control display settings (dual monitor and all that jazz). Unfortunately, I can't quite get it to work just yet. My 22&quot; 1680x1058 LCD will just have to sit there, gathering dust :(&lt;br /&gt;&lt;br /&gt;In another weirdness, all of my fonts are suddenly much, much bigger. I had to resize everything down to 8 or 9 to make them sane.&lt;br /&gt;&lt;br /&gt;My &lt;a href=&quot;http://peadrop.com/blog/2007/01/06/pretty-emacs/&quot;&gt;pretty Emacs&lt;/a&gt; has also stopped working, but that's to be expected. It's a third-party package that hasn't yet been built for Gutsy.&lt;br /&gt;&lt;br /&gt;Other than that, seems to be a fairly routine upgrade. Is there anything exciting that I've missed?</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Around like Grover</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/10/around-like-grover.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-5261835241457980208</id>
		<updated>2008-07-05T11:07:59+00:00</updated>
		<content type="html">What's up hep-cats?&lt;br /&gt;&lt;br /&gt;I've been travelling around the world, weaving in and out of timezones like Jason Bourne navigates facial expressions. Last week's adventure took me to tropical Dunedin — the southiest outpost of Canonical Ltd. (I'm trying to get a mention on &lt;a href=&quot;http://itre.cis.upenn.edu/~myl/languagelog/&quot;&gt;Language Log&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Those few Hobartians who keep reading will notice that Dunedin, well, umm... here's a photo:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://tusk.mumak.net/Blog-20071016/Dunedin-View.jpg&quot; alt=&quot;View of Dunedin&quot; title=&quot;Dunedin during rush hour&quot; width=&quot;600&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Pay careful attention to the hills in the background.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Cracked Mac</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/10/cracked-mac.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-7143752197387030539</id>
		<updated>2008-07-05T11:07:58+00:00</updated>
		<content type="html">OK, I've started with this whole &lt;q&gt;photography&lt;/q&gt; thing, I might as well run with it.&lt;br /&gt;&lt;br /&gt;My Mac cracked:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://tusk.mumak.net/Blog-20071016/Cracked-Laptop-2.jpg&quot; alt=&quot;Cracked Macbook&quot; title=&quot;Designed by Apple in California&quot; /&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: The most retentive thing I've done</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/10/most-retentive-thing-i-done_16.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-2851328684107820408</id>
		<updated>2008-07-05T11:07:57+00:00</updated>
		<content type="html">&lt;img src=&quot;http://tusk.mumak.net/Blog-20071016/Retentive-Pens-2.jpg&quot; alt=&quot;I labelled my pens&quot; title=&quot;I'm still not sure about publishing this&quot; width=&quot;400&quot; /&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Fake Plastic Tests</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/10/fake-plastic-tests_22.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-5546272330234125045</id>
		<updated>2008-07-05T11:07:56+00:00</updated>
		<content type="html">Ever wondered what's the difference between a &lt;code&gt;FakeReactor&lt;/code&gt;, a &lt;code&gt;StubReactor&lt;/code&gt; and a &lt;code&gt;MockReactor&lt;/code&gt;? Find out in this brief article on &lt;a href=&quot;http://mumak.net/test-doubles&quot;&gt;test doubles&lt;/a&gt;.&lt;br /&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Obligatory</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/11/obligatory_8590.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-2253350668000150768</id>
		<updated>2008-07-05T11:07:55+00:00</updated>
		<content type="html">Not using Facebook anymore.&lt;br /&gt;&lt;br /&gt;Have fun kids.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: WoW account temporarily suspended</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2007/12/wow-account-temporarily-suspended_09.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-2664744142478569103</id>
		<updated>2008-07-05T11:07:53+00:00</updated>
		<content type="html">Howdy Partners,&lt;br /&gt;&lt;br /&gt;My World of Warcraft account is temporarily suspended for silly administrative reasons. I'm not in any rush to clear those up, so don't expect to see me on Khaz'goroth or Frostmourne any time soon.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;&lt;br /&gt;jml</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: What I do all day</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/02/what-i-do-all-day_14.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-6629816907072968862</id>
		<updated>2008-07-05T11:07:52+00:00</updated>
		<content type="html">Kick-arse summary here: &lt;a href=&quot;http://news.launchpad.net/general/the-great-source-code-supermarket&quot;&gt;The great source code supermarket. &lt;/a&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: User Experience — When Reality Attacks</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/03/user-experience-when-reality-attacks_12.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-856842426077382069</id>
		<updated>2008-07-05T11:07:50+00:00</updated>
		<content type="html">I've just got back from a hectic week in London, where members of the Bazaar community got together and thrashed out a bunch of important topics.&lt;br /&gt;&lt;br /&gt;We talked about &quot;user experience&quot; and how we all want Bazaar to be a joy to use. More than one person said that we have been focusing too much on features and performance instead of user experience. The term was never really pinned down, but it's fair to say that there are things other than convenience and speed that affect how users feel while using Bazaar and that we need to work on those things, once we figure out what they are.&lt;br /&gt;&lt;br /&gt;I think I might know the name of one of them: &lt;em&gt;errors&lt;/em&gt;. Next post: &quot;Notes on error&quot;.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: bzr-removable</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/04/bzr-removable_20.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-8216437880894786544</id>
		<updated>2008-07-05T10:40:06+00:00</updated>
		<content type="html">The plugin I talked about in a previous post is now at https://launchpad.net/bzr-removable. Please file bugs.&lt;br /&gt;&lt;br /&gt;Thanks to Michael Hudson and Daniel Watkins for submitting patches.&lt;br /&gt;&lt;br /&gt;You can get the plugin by typing 'bzr branch lp:bzr-removable' on the command line.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Neat Bazaar feature</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/06/neat-bazaar-feature_9205.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-3847165362970608763</id>
		<updated>2008-07-05T10:40:04+00:00</updated>
		<content type="html">Ever find yourself working away on a branch, enjoying yourself and getting just a little carried away? Maybe you're working on a feature and you notice and fix a bug that's not strictly related to that feature.&lt;br /&gt;&lt;br /&gt;If you catch yourself in time, there's a nice little feature in Bazaar that can help with this: &lt;code&gt;bzr merge --uncommitted&lt;/code&gt;. It will merge in the changes that you've made to your working tree but haven't committed yet.&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cd some-feature-branch&lt;br /&gt;&lt;br /&gt;... hack hack hack ... oops!&lt;br /&gt;&lt;br /&gt;$ cd ..&lt;br /&gt;&lt;br /&gt;$ bzr branch trunk bug-fix-2357&lt;br /&gt;&lt;br /&gt;$ cd bug-fix-2357&lt;br /&gt;&lt;br /&gt;$ bzr merge --uncommitted ../some-feature-branch&lt;br /&gt;&lt;br /&gt;$ bzr ci -m &quot;Fix up bug 2357. Found this while working on some-feature.&quot;&lt;br /&gt;&lt;br /&gt;$ bzr send&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Don't know what &lt;code&gt;bzr send&lt;/code&gt; does? Trust me, you want to find out.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Somebody Do This Please</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/07/somebody-do-this-please_9690.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-6225331854382219297</id>
		<updated>2008-07-05T10:39:55+00:00</updated>
		<content type="html">&amp;lt;jml&amp;gt; What's the difference between &lt;a href=&quot;http://gobby.0x539.de/trac/&quot;&gt;Gobby&lt;/a&gt; and a &lt;a href=&quot;http://moinmo.in/&quot; title=&quot;Moin Moin&quot;&gt;wiki&lt;/a&gt;?&lt;br /&gt;&amp;lt;mwh&amp;gt; NAT</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: OK I lied</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/03/ok-i-lied_17.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-8180273067340546851</id>
		<updated>2008-07-05T10:09:16+00:00</updated>
		<content type="html">The next post is actually about a Bazaar plugin that I've now got ready to share. To get it, 'bzr branch lp:~jml/+junk/merged-branches'.&lt;br /&gt;&lt;br /&gt;Once you've got it, run 'bzr merged-branches' in the trunk of your project. It will then show you all branches in sibling directories that are safe to delete.  That is,&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;They have no uncommitted changes.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;They have no &quot;unknown&quot; files. (Files outside of version control that haven't been explicitly ignored.)&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;They have no shelved changes. The plugin will only check for this if it can find bzrtools.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The branch is now at the point where it works for me, but it still belongs in '+junk' — here's why:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;It assumes that you have a trunk branch in the same directory as all of your other branches.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It assumes that branches and working trees are the same thing.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It's called 'merged-branches' when it really means 'safe-to-delete'.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It doesn't make it easy to see why a branch is &lt;em&gt;not&lt;/em&gt; safe to delete.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;It doesn't let you customize the conditions of the search. Maybe you want to see all branches with uncommitted changes.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Still, if you are like me and make a lot of branches, it's quite useful. I'll tolerate bugs, accept patches and welcome encouragement.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: What I meant</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/04/what-i-meant_20.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-1749283964198347471</id>
		<updated>2008-07-05T10:09:13+00:00</updated>
		<content type="html">&lt;a href=&quot;http://z3p.tumblr.com/&quot;&gt;z3p&lt;/a&gt; recently &lt;a href=&quot;http://z3p.tumblr.com/post/32324725&quot;&gt;blogged about&lt;/a&gt; a comment I made in &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/2710&quot;&gt;a code review&lt;/a&gt;. In the review, I linked to:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://74.54.212.169/2ERcULhJC81alpg64P4WN7Of_400.jpg&quot; alt=&quot;The only measure of code quality is WTFs / minute&quot; /&gt;&lt;br /&gt;&lt;br /&gt;That's a negative and grumpy way of phrasing an idea that I've come to value a lot: &lt;em&gt;good code expresses its intent clearly.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;When looking at a patch, the reviewer needs to understand two things: the intent of the code and the intent of each &lt;em&gt;change&lt;/em&gt; to the code. To be clear on the former, you need:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;intent-revealing names.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;good abstractions / interfaces.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;good, small tests.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;simple implementations where possible.[1]&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;docstrings where appropriate&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;comments where appropriate.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's not exhaustive, but it's in a rough order.&lt;br /&gt;&lt;br /&gt;To be clear on the intent of your change to code, you need:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Small patches.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;A good bug / spec with a good, short summary.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;A review request letter, summarizing your implementation strategy, any compromises you made, gaps in testing, future work etc.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;That's not exhaustive either. In #2037, I didn't understand the motivation for lots of the code, nor for some of the changes to the code.&lt;br /&gt;&lt;br /&gt;I'm indebted to &lt;a href=&quot;http://andrew.puzzling.org&quot;&gt;Andrew Bennetts&lt;/a&gt; for teaching me that the first duty of a reviewer is to ensure that the code is clear and to &lt;a href=&quot;http://intellectronica.net/&quot;&gt;Tom Berger&lt;/a&gt; for reminding me that compromises are worth noting.&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;[1] Actually, this reminds me of something I heard &lt;a href=&quot;http://en.wikipedia.org/wiki/Don_Carson&quot;&gt;a preacher&lt;/a&gt; say, &quot;before I give a sermon, I go through it, find everything clever, and take it out&quot; (I paraphrase, not having a reference on hand).&lt;br /&gt;&lt;br /&gt;In as much as sermons and code should both be ego-free communications of ideas, I think this is sound advice for hackers.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Real Life</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/06/real-life.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-7465383142016112088</id>
		<updated>2008-07-05T10:09:10+00:00</updated>
		<content type="html">Inspired by &lt;a href=&quot;http://mikeylynch.blogspot.com&quot;&gt;Mikey&lt;/a&gt;, I've set up my own &lt;a href=&quot;http://life.mumak.net&quot;&gt;real-life blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've done this one using Blogger's &quot;upload to remote server&quot; feature. It looks nice, has the features I need and means less WordPress &amp;amp; PHP. I'm hoping to migrate this sucker to the same technology.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Another Bazaar story</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/06/another-bazaar-story.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-622417601081979853</id>
		<updated>2008-07-05T10:09:04+00:00</updated>
		<content type="html">I'm currently hacking away on Launchpad's support for &quot;&lt;a href=&quot;http://jam-bazaar.blogspot.com/2008/05/this-week-in-bazaar_29.html&quot;&gt;stacked branches&lt;/a&gt;&quot;, something that will really make Launchpad's codehosting a joy to use.&lt;br /&gt;&lt;br /&gt;At the moment, I'm writing some tests that require a user to login. This was becoming a bit cumbersome, until I remembered something: Tim has recently landed some code to make this easy. But how do I get these changes without messing up all of the work I'm doing now? bzr shelve to the rescue!&lt;br /&gt;&lt;br /&gt;'shelve' interactively goes through each change you've made to your current working tree and allows you to decide whether to keep a change or shelve it. It comes with a twin command 'unshelve', which lets you interactively restore your changes.&lt;br /&gt;&lt;br /&gt;In this case, I don't even care about the interactivity, so here's what I did:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Shelve my changes&lt;br /&gt;bzr shelve --all&lt;br /&gt;# Fetch the latest trunk&lt;br /&gt;cd ../trunk&lt;br /&gt;bzr pull&lt;br /&gt;# Merge it into my branch&lt;br /&gt;cd ../stacking&lt;br /&gt;bzr merge ../trunk&lt;br /&gt;bzr ci -m &quot;Merge in changes from trunk to get login testing improvements.&quot;&lt;br /&gt;# Restore my changes&lt;br /&gt;bzr unshelve --all&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The 'shelve' command comes with the &lt;a href=&quot;http://launchpad.net/bzrtools&quot;&gt;bzrtools&lt;/a&gt; plugin, and I am basically in love with it.&lt;br /&gt;&lt;br /&gt;As a parting shot, I should mention that things like bzrtools aren't accidents. They are natural and inevitable when you have &lt;a href=&quot;http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html&quot;&gt;good APIs&lt;/a&gt; in a &lt;a href=&quot;http://python.org&quot;&gt;high-level language&lt;/a&gt; and a &lt;a href=&quot;http://bazaar-vcs.org/WritingPlugins&quot;&gt;very nice plugin system&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And now I'm off to keep working on this branch.&lt;br /&gt;&lt;br /&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Aren't code reviews great?</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/06/aren-code-reviews-great.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-7643804025471441798</id>
		<updated>2008-07-05T09:24:08+00:00</updated>
		<content type="html">Ben Sussman-Collins writes about &lt;a href=&quot;http://blog.red-bean.com/sussman/?p=96&quot;&gt;programmer insecurity&lt;/a&gt; and how a lot of programmers dread having others see their code.&lt;br /&gt;&lt;br /&gt;Some of the &lt;a href=&quot;http://jcalderone.livejournal.com&quot;&gt;best&lt;/a&gt; &lt;a href=&quot;http://robertcollins.net&quot;&gt;programmers&lt;/a&gt; &lt;a href=&quot;http://radix.twistedmatrix.com&quot;&gt;I've&lt;/a&gt; &lt;a href=&quot;http://sourcefrog.net&quot;&gt;worked&lt;/a&gt; &lt;a href=&quot;http://glyph.twistedmatrix.com&quot;&gt;with&lt;/a&gt; &lt;a href=&quot;http://python.net/crew/mwh/&quot;&gt;are&lt;/a&gt; in love with code reviews, and all great writers have editors. (The &quot;linked list&quot; is in no way exhaustive.)  Personally, I see reviews as being a great opportunity to learn.&lt;br /&gt;&lt;br /&gt;Sussman-Collins also writes about how distributed version control can exacerbate the &quot;isolated genius&quot; problem by shielding ones code from the public eye. This is definitely a big potential drawback of DVCS, but one that's largely mitigated by a culture of short-lived branches and &lt;a href=&quot;https://code.launchpad.net&quot;&gt;an easy-to-use public registry of all branches for a project&lt;/a&gt;.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Really Satisfying</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2008/06/really-satisfying.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-2877195152772565777</id>
		<updated>2008-07-05T09:24:07+00:00</updated>
		<content type="html">I have just returned from the shops with a Snickers bar. The packet says that one out of every six Snickers bars will instantly win me a free Snickers bar.&lt;br /&gt;&lt;br /&gt;So, &lt;em&gt;statistically speaking&lt;/em&gt;, how many Snickers bars do I have? Show working.</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

</feed>
