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

	<title>Planet Bazaar</title>
	<link rel="self" href="http://planet.bazaar.canonical.com/atom.xml"/>
	<link href="http://planet.bazaar.canonical.com/"/>
	<id>http://planet.bazaar.canonical.com/atom.xml</id>
	<updated>2010-03-15T10:45:14+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">2 year cadence for major releases: some progress</title>
		<link href="http://www.markshuttleworth.com/archives/290"/>
		<id>http://www.markshuttleworth.com/?p=290</id>
		<updated>2010-03-15T09:08:45+00:00</updated>
		<content type="html">&lt;p&gt;Even though the idea of formal alignment between the freezes of Debian and Ubuntu didn&amp;#8217;t hold, there has been some good practical collaboration between the maintainers of key subsystems. There are real benefits to this, because maintainers have a much more fruitful basis for sharing patches when they are looking at the same underlying version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Harmonization for Ubuntu 10.04 LTS and Debian Squeeze&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think this is where we stand now:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;Debian&lt;/td&gt;
&lt;td&gt;RHEL&lt;/td&gt;
&lt;td&gt;SLES&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kernel&lt;/td&gt;
&lt;td&gt;2.6.32 + drm-33&lt;/td&gt;
&lt;td&gt;2.6.32 + drm-33&lt;/td&gt;
&lt;td&gt;2.6.32&lt;/td&gt;
&lt;td&gt;2.6.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCC&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenOffice.org&lt;/td&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perl&lt;/td&gt;
&lt;td&gt;5.10.1&lt;/td&gt;
&lt;td&gt;5.10.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boost&lt;/td&gt;
&lt;td&gt;1.40&lt;/td&gt;
&lt;td&gt;1.40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I&amp;#8217;m sure there are inaccuracies, please help me keep this up to date, sabdfl on freenode is the best way to reach me. The RHEL and SLES numbers are third-hand, so up-to-date information would be appreciated.&lt;/p&gt;
&lt;p&gt;The actual release dates of Ubuntu LTS and Debian will vary of course, because of different priorities. And there&amp;#8217;s no requirement that the same base version be used for every major component &amp;#8211; there may well be differences allowing for different approaches. But where we do have it, we&amp;#8217;ll be able to collaborate much more effectively on bug fixes for key upstream pieces. If a lot of distributions pick the same base upstream version, it greatly increases the value of extended shared maintenance and point releases of that upstream.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why every two years?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Two years is a compromise between those who want 1 year releases for better support of cutting-edge hardware and those who want 7 year releases so their software stack doesn&amp;#8217;t change before their job description does &lt;img src=&quot;http://www.markshuttleworth.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;A whole-year multiple has several advantages. It means we can schedule the processes that are needed for collaboration at the same time of year whenever we need them &amp;#8211; unlike 1.5 or 2.5 year cycles. Three years was felt to be too long for hardware support. Two years is perceived to be the Goldilocks Cadence &amp;#8211; just right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What are the criteria for choosing a common base version?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In both the Ubuntu and Debian cases, we&amp;#8217;ll be making a release that we support for many years. So be looked for versions of key upstreams that will pass the test of time. Sometimes, that means they can&amp;#8217;t be too old, because they&amp;#8217;ll be completely obsolete or unmaintainable in the life of the release. And sometimes that means they can&amp;#8217;t be too young. In general, it would be better to be reviewing code that is already out there. But there are also lots of upstreams that do a credible job of release management, so we could commit to shipping a version that is not yet released, based on the reputation of the community it&amp;#8217;s coming from.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What if there&amp;#8217;s no agreement on a particular kernel, or X or component-foo?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will almost certainly diverge on some components, and that&amp;#8217;s quite OK. This is about finding opportunities to do a better job for upstreams and for users, not about forcing any distro to make a particular choice. If anyone feels its more important to them to use a particular version than another, they&amp;#8217;ll do that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open invitations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s really helpful to have upstreams and other distributions participate in this process.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re an upstream, kick off a thread in your mailing list or forums about this. Upstreams don&amp;#8217;t need to do anything different if they don&amp;#8217;t want to, we&amp;#8217;ll still just make the best choices we can. But embracing a two year cadence is the best way you have to be sure which versions of your software are going to be in millions of hands in the future &amp;#8211; it&amp;#8217;s a great opportunity to influence how your users will experience your work.&lt;/p&gt;
&lt;p&gt;Of course, we&amp;#8217;d also like to have more distributions at the table. There&amp;#8217;s no binding commitment needed &amp;#8211; collaboration is opportunistic. But without participating in the conversation one can&amp;#8217;t spot those opportunities! If you represent a distribution and are interested, then please feel free to contact me, or Matt Zimmerman, or anyone on the Debian release management team about it.&lt;/p&gt;
&lt;p&gt;I think this is a big win for the free software community. Many upstreams have said &amp;#8220;we&amp;#8217;d really like to help deliver a great stable release, but which distro should we arrange that around?&amp;#8221; Upstreams should not have to play favourites with distributions, and it should be no more work to support 10 distributions as to support one. If we can grow the number of distributions that embrace this cadence, the question becomes moot &amp;#8211; upstreams can plan around that  cycle knowing that many distributions will deliver their work straight to users.&lt;/p&gt;</content>
		<author>
			<name>Mark Shuttleworth</name>
			<uri>http://www.markshuttleworth.com</uri>
		</author>
		<source>
			<title type="html">Mark Shuttleworth</title>
			<subtitle type="html">Planetary perspectives</subtitle>
			<link rel="self" href="http://www.markshuttleworth.com/feed"/>
			<id>http://www.markshuttleworth.com/feed</id>
			<updated>2010-03-15T09:15:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The Bazaar Package Importer</title>
		<link href="http://jameswestby.net/weblog/ubuntu/16-bazaar-packge-importer.html"/>
		<id>http://jameswestby.net/weblog/ubuntu/16-bazaar-packge-importer</id>
		<updated>2010-03-14T18:55:00+00:00</updated>
		<content type="html">&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;The Bazaar package importer is a service that we run to allow people to use
Bazaar for Ubuntu development by importing any source package uploads in to
bzr. It's not something that most Ubuntu developers will interact with directly,
but is of increasing importance.&lt;/p&gt;
&lt;p&gt;I've spent a lot of time working in the background on this project, and while
the details have never been secret, and in fact the code has been available
for a while, I'm sure most people don't know what goes on. I wanted to rectify
that, and so started with some &lt;a class=&quot;reference external&quot; href=&quot;https://wiki.ubuntu.com/DistributedDevelopment/UnderTheHood&quot;&gt;wiki documentation&lt;/a&gt; on the internals. This post
is more abstract, talking about the archtecture.&lt;/p&gt;
&lt;p&gt;While it has a common pattern of requirements, and so those familiar with
the architecture of job systems will recognise the solution, the devil is in the
details. I therefore present this as a case-study of one such system that can
be used to constrast other similar sytstems as an aid to learning how differing
requirements affect the finished product.&lt;/p&gt;
&lt;div class=&quot;section&quot; id=&quot;the-problem&quot;&gt;
&lt;h1&gt;The Problem&lt;/h1&gt;
&lt;p&gt;For the &lt;a class=&quot;reference external&quot; href=&quot;https://wiki.ubuntu.com/DistributedDevelopment&quot;&gt;Ubuntu Distributed Development initative&lt;/a&gt; we have a need for a
process that imports packages in to bzr on an ongoing basis as they are
uploaded to Ubuntu. This is so that we can have a smooth transition rather
than a flag day where everyone switches. For those that are familiar with
them think Launchpad's code imports but with Debian/Ubuntu packages as the
source, rather than a foreign VCS.&lt;/p&gt;
&lt;p&gt;This process is required to watch for uploads to Debian and Ubuntu and trigger
a run to import that upload to the bzr branches, pushing the result to LP. It
should be fast, though we currently have a publication delay in Ubuntu that
means we are used to latencies of an hour, so it doesn't have to be greased
lightning to get acceptance. It is more important to be reliable, so that the
bzr branches can be assumed to be up to date, that is crucial for acceptance.&lt;/p&gt;
&lt;p&gt;It should also keep an audit trail of what it thinks is in the branches. As
we open up write access to the resulting branches to Ubuntu developers we can
not rely on the content of the branches not being tampered with. I don't expect
this will ever be a problem, but I wanted to ensure that we could at least detect
tampering, even if we couldn't know exactly what had happened by keeping private
copies of everything.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;the-building-blocks&quot;&gt;
&lt;h1&gt;The Building Blocks&lt;/h1&gt;
&lt;p&gt;The first building block of the solution is the import script for a single package.
You can run this at any time and it will figure out what is unimported, and do
the import of the rest, so you can trigger it as many times as you like without
worrying that it will cause problems. Therefore the requirement is only to trigger
it at least once when there has been an upload since the last time it was run, which
is a nicer requirement than &amp;quot;exactly once per upload&amp;quot; or similar.&lt;/p&gt;
&lt;p&gt;However, as it may import to a number of branches (both lucid and karmic-security
in the case of a security upload, say), and these must be consistent on Launchpad,
only one instance can run at once. There is no way to do atomic operations on sets
of branches on Launchpad, therefore we use locks to ensure that only one process
is running per-package at any one time. I would like to explore ways to remove this
requirement, such as avoiding race conditions by operating on the Launchpad branches
in a consistent manner, as this would give more freedom to scale out.&lt;/p&gt;
&lt;p&gt;The other part of the system is a driver process. We use separate processes so that
any faults in the import script can be caught in the supervisor process, with the
errors being logged. The driver process picks a package to import and triggers a run
of the script for it. It uses something like the following to do that:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
write_failure(package, &amp;quot;died&amp;quot;)
try:
    import(package)
except:
    write_failure(packge, stderr)
finally:
    remove_failure(package)
&lt;/pre&gt;
&lt;p&gt;write_failure creates a record that the package failed to import with a reason. This
provides a list of problems to work through, and also means that we can avoid trying
to import a package if we know it has failed. This ensures that previous failures are
dealt with properly without giving them a chance to corrupt things later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;queuing&quot;&gt;
&lt;h1&gt;Queuing&lt;/h1&gt;
&lt;p&gt;I said that the driver picks a package and imports it. To do this it simply queries
the database for the highest priority job waiting, dispatching the result, or
sleeping if there are no waiting jobs. It can actually dispatch multiple jobs in
parallel as it uses processes to do the work.&lt;/p&gt;
&lt;p&gt;The queue is filled by a couple of other processes triggered by cron. This is useful
as it means that further threads are not required, and there is less code running
in the monitor process, and so less chance that bugs will bring it down.&lt;/p&gt;
&lt;p&gt;The first process is one that checks for new uploads since the last check and adds a
job for them, see below for the details. The second is one that looks at the current
list of failures and retries some of them automatically, if the failure looks like it
was likely to be transient, such as a timeout error trying to reach Launchpad. It
only retries after a timeout of a couple of hours has elapsed, and also if that package
hasn't failed in that same way several times in a row (to protect against e.g. the data
that job is sending to LP causing it to crash and so give timeout errors.)&lt;/p&gt;
&lt;p&gt;It may be better to use an AMQP broker or a job server such as Gearman for this task,
rather that just using the database. However, we don't really need any of the more
advanced features that these provide, and already have some degree of loose-coupling,
so using fewer moving parts seems sensible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;reacting-to-new-uploads&quot;&gt;
&lt;h1&gt;Reacting to new uploads&lt;/h1&gt;
&lt;p&gt;I find this to be a rather neat solution, thanks to the Launchpad team. We use
the API for this, notably a method on IArchive called getPublishedSources().
They key here is the parameter &amp;quot;created_since_date&amp;quot;. We keep track of this and
pass it to the API calls to get the uploads since the last time we ran, and
then act on those. Once we processed them all then we update the stored
date and go around again.&lt;/p&gt;
&lt;p&gt;This has some nice properties, it is a poll interface, but has some things in
common with an event-based one. Key in my eyes is that we don't have to have
perfect uptime in order to ensure we never miss events.&lt;/p&gt;
&lt;p&gt;However, I am not convinced that we will never get a publication that appears
later than one that we have dealt with, but that reports an earlier time.
If this happens we would never see it. The times we use always come from
LP, so don't require synchronised clocks between the machine where this
runs and the LP machines, but it could still happen inside LP.
To avoid this I subtract a delta when I send the request, so assuming
the skew would not be greater than that delta we won't get hit. This does
mean that you repeatedly try and import the same things, but that
is just a mild inefficiency.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;synchronisation&quot;&gt;
&lt;h1&gt;Synchronisation&lt;/h1&gt;
&lt;p&gt;There is a synchronisation point when we push to Launchpad. Before and after
this critical period we can blow away what we are doing with no issues. During
it though we will have an inconsistent state of the world if we did that.
Therefore I used a protocol to ensure that we guard this section.&lt;/p&gt;
&lt;p&gt;As we know locking ensures that only one process runs at a time, meaning that
the only way to race is with &amp;quot;yourself.&amp;quot; All the code is written to assume
that things can go down at any time as I said, the supervisor catches this
and marks the failures, and even guards against itself dying. Therefore
when it picks back up and restarts the jobs that it was processing before
dying it needs to ensure that it wasn't in the critical section.&lt;/p&gt;
&lt;p&gt;To do this we use a three-phase commit on the audit data to accomany the push.
When we are doing the import we track the additions to the audit data separately
from the committed data. Then if we die before we reach the critical section
we can just drop it again, returning to the inital state.&lt;/p&gt;
&lt;p&gt;The next phase marks in the database that the critical section has begun. We then
start the push back. If we die here we know we were in the critical section and can
restart the push. Only once the push has fully completed do we move the new audit
data in to place.&lt;/p&gt;
&lt;p&gt;The next step cleans up the local branches, dying here means we can just carry
on with the cleanup. Finally the mark that we are in the critical section is
removed, and we are back to the start state, indicating that the last run was
clean, and any subsequent run can proceed.&lt;/p&gt;
&lt;p&gt;All of this means that if the processes go down for any reason, they will clean
up or continue as they restart as normal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;dealing-with-launchpad-api-issues&quot;&gt;
&lt;h1&gt;Dealing with Launchpad API issues&lt;/h1&gt;
&lt;p&gt;The biggest area of operational headaches I have tends to come from using the
Launchpad API. Overall the API is great to have, and generally a pleasure to
use, but I find that it isn't as robust as I would like. I have spent quite
some time trying to deal with that, and I would like to share some tips from
my experience. I'm also keen to help diagnose the issues further if any Launchpad
developers would like so that it can be more robust off the bat.&lt;/p&gt;
&lt;p&gt;The first tip is: partition the data. Large datasets combined with fluctuating
load may mean that you suddenly hit a timeout error. Some calls allow you to
partition the data that you request. For instance, getPublishedSources that
I spoke about above allows you to specify a distro_series parameter. Doing&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
distro.main_archive.getPublishedSources()
&lt;/pre&gt;
&lt;p&gt;is far far more likely to timeout than&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
for s in distro.series:
    distro.main_archive.getPublishedSources(distro_series=s)
&lt;/pre&gt;
&lt;p&gt;in fact, for Ubuntu, the former is guaranteed to timeout, it is a lot of data.&lt;/p&gt;
&lt;p&gt;This is more coding, and not the natural way to do it, therefore it would be
great if launchpadlib automatically partioned and recombined the data.&lt;/p&gt;
&lt;p&gt;The second tip is: expect failure. This one should be obvious, but the API doesn't
make it clear, unlike something like python-couchdb. It is a webservice, so you
will sometimes get HTTP exceptions, such as when LP goes offline for a rollout.
I've implemented randomized exponential backoff to help with this, as I tend
to get frequent errors that don't apparently correspond to service issues.
I very frequently see 502 return codes, on both edge and production, which I believe
means that apache can't reach the appservers in time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;summary&quot;&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p&gt;Overall, I think this architecture is good, given the synchronisation requirements
we have for pushing to LP, without those it could be more loosely coupled.&lt;/p&gt;
&lt;p&gt;The amount of day-to-day hand-holding required has reduced as I have learnt about
the types of issues that are encountered and changed the code to recognise and act
on them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
		<author>
			<name>James Westby</name>
			<uri>http://jameswestby.net/weblog</uri>
		</author>
		<source>
			<title type="html">James Westby</title>
			<link rel="self" href="http://jameswestby.net/weblog/?flav=rss20"/>
			<id>http://jameswestby.net/weblog/?flav=rss20</id>
			<updated>2010-03-15T10:45:12+00:00</updated>
			<rights type="html">Copyright 2006-2008 James Westby</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Dry Rub Barbeque Trout</title>
		<link href="http://jameswestby.net/weblog/food/04-dry-rub-barbeque-trout.html"/>
		<id>http://jameswestby.net/weblog/food/04-dry-rub-barbeque-trout</id>
		<updated>2010-03-14T16:23:00+00:00</updated>
		<content type="html">&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;Made this up after buying a nice piece of locally caught freshwater trout.
I think that it would be even better if you were to hot-smoke it.
Apply the rub between two and twelve hours before cooking.&lt;/p&gt;
&lt;p&gt;Mix up the following then rub on to the flesh of the fish (enough for
four servings):&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;1 tbsp sea/rock salt.&lt;/li&gt;
&lt;li&gt;1 tbsp black peppercorns crushed.&lt;/li&gt;
&lt;li&gt;1 tbsp ground cumin.&lt;/li&gt;
&lt;li&gt;1 tbsp ground coriander.&lt;/li&gt;
&lt;li&gt;2 tsp caraway seed.&lt;/li&gt;
&lt;li&gt;2 tsp dried tarragon.&lt;/li&gt;
&lt;li&gt;2 tsp dried thyme.&lt;/li&gt;
&lt;li&gt;2 tsp chilli powder.&lt;/li&gt;
&lt;li&gt;Zest of one lemon.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;To drizzle on top when cooked melt some butter in a pan, add the
juice of the lemon you used above, a pinch of salt, one crushed clove
of garlic, and a handful of chopped coriander. Simmer for a couple of
minutes.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>James Westby</name>
			<uri>http://jameswestby.net/weblog</uri>
		</author>
		<source>
			<title type="html">James Westby</title>
			<link rel="self" href="http://jameswestby.net/weblog/?flav=rss20"/>
			<id>http://jameswestby.net/weblog/?flav=rss20</id>
			<updated>2010-03-15T10:45:12+00:00</updated>
			<rights type="html">Copyright 2006-2008 James Westby</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Input overload</title>
		<link href="http://jelmer.vernstok.nl/blog/archives/252-Input-overload.html"/>
		<id>http://jelmer.vernstok.nl/blog/archives/252-guid.html</id>
		<updated>2010-03-13T23:05:19+00:00</updated>
		<content type="html">&lt;p&gt;During the last few months, despite filtering and thread-scoring, I'm having trouble keeping up with the continuous flood of emails that come my way. I'm now spending way too much of my time dealing with both email and other background noise (hello, web 2.0 services). To cope with this, I've now dropped off a couple dozen mailing lists, unsubscribed from a similar number of RSS feeds and left a few IRC channels. I'm slowly working working my way through the backlog of emails and merge requests that I still have to deal with. If you need me to participate in a mailing list discussion, please CC me.&lt;/p&gt;

&lt;p&gt;cp: Agalloch - Our Fortress Is Burning, pt. 1&lt;/p&gt;</content>
		<author>
			<name>Jelmer Vernooij</name>
			<email>nospam@example.com</email>
			<uri>http://jelmer.vernstok.nl/blog/</uri>
		</author>
		<source>
			<title type="html">Stationary Traveller</title>
			<subtitle type="html">On Free Software, travel and other random musings</subtitle>
			<link rel="self" href="http://jelmer.vernstok.nl/blog/feeds/index.rss2"/>
			<id>http://jelmer.vernstok.nl/blog/feeds/index.rss2</id>
			<updated>2010-03-15T05:15:10+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">launchpadlib gotchas</title>
		<link href="http://code.mumak.net/2010/03/launchpadlib-gotchas.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-3206607098642562632</id>
		<updated>2010-03-12T14:45:16+00:00</updated>
		<content type="html">I've shown you how to &lt;a href=&quot;http://code.mumak.net/2010/03/get-started-with-launchpadlib.html&quot;&gt;get started with launchpadlib&lt;/a&gt; and have shown a &lt;a href=&quot;http://code.mumak.net/2010/03/launchpadlib-powerup.html&quot;&gt;slightly more complex launchpadlib script&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Before I cry &lt;q&gt;The power is yours!&lt;/q&gt; and return to my home within the earth, I'm going to warn you about the things that can trip you up when using launchpadlib.&lt;br /&gt;&lt;h3&gt;Bugs&lt;/h3&gt;&lt;a href=&quot;https://bugs.launchpad.net/launchpadlib/&quot;&gt;launchpadlib&lt;/a&gt; has bugs. There are also bugs in &lt;a href=&quot;https://bugs.launchpad.net/lazr.restful&quot;&gt;lazr.restful&lt;/a&gt; and &lt;a href=&quot;https://bugs.launchpad.net/lazr.restfulclient&quot;&gt;lazr.restfulclient&lt;/a&gt; – two libraries that are core to launchpadlib's behaviour.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Welcome to software engineering.&lt;br /&gt;&lt;h3&gt;Documentation&lt;/h3&gt;It's &lt;a href=&quot;https://help.launchpad.net/API&quot;&gt;on the wiki&lt;/a&gt;, and it's good, but it could always be better. There's a page of &lt;a href=&quot;https://help.launchpad.net/API/Examples&quot;&gt; as well as a &lt;/a&gt;&lt;a href=&quot;https://help.launchpad.net/API/launchpadlib&quot;&gt;guide on launchpadlib&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;https://launchpad.net/+apidoc/&quot;&gt;reference documentation&lt;/a&gt; isn't written for Python programmers. It's written for REST programmers. Actually, it's not written at all but rather auto-generated from our source code. Sometimes this can be  confusing, and I frequently find myself consulting the &lt;a href=&quot;http://bazaar.launchpad.net/~launchpad-pqm/launchpad/db-devel/files&quot;&gt;Launchpad source code&lt;/a&gt; to get things done with the API.&lt;br /&gt;&lt;h3&gt;Error messages&lt;/h3&gt;I'm told this has got better with recent releases, but often when you get an error in launchpadlib, it looks like an HTTP error and you have very little help on how to  debug it. Unfortunately, I don't have an example ready.&lt;br /&gt;&lt;br /&gt;If you come across an error like this, file a bug and head straight to #launchpad-dev on freenode to get help.&lt;br /&gt;&lt;h3&gt;Potato programming&lt;/h3&gt;It's really easy to write code with launchpadlib that does this:&lt;pre&gt;  for thing in bunch_of_things:&lt;br /&gt;    thing.do_something_on_launchpad()&lt;br /&gt;&lt;/pre&gt;Code like this is really slow. It will do one round-trip per &lt;q&gt;thing&lt;/q&gt;, which can be quite expensive. Twisted folks sometimes call this &lt;q&gt;&lt;a href=&quot;http://divmod.org/trac/wiki/PotatoProgramming&quot;&gt;potato programming&lt;/a&gt;&lt;/q&gt;.&lt;br /&gt;&lt;h3&gt;Exposure&lt;/h3&gt;Not all of the code within Launchpad is exposed through the API. We have to expose things manually and we haven't done it all yet. Sorry.&lt;br /&gt;&lt;br /&gt;If you come across something that you want, then please &lt;a href=&quot;https://bugs.launchpad.net/launchpad/+filebug&quot;&gt;file a bug&lt;/a&gt; and tag it with &lt;q&gt;api&lt;/q&gt;.&lt;br /&gt;&lt;br /&gt;In general, exposing something of the API is really easy or almost impossible. If the thing you want falls into the first category, you can probably patch Launchpad yourself.&lt;br /&gt;&lt;h3&gt;Testing&lt;/h3&gt;Testing launchpadlib apps is hard. You do not want your unit tests to run against launchpad.net and running your own instance of Launchpad simply to run unit tests is masochistically stupid.&lt;br /&gt;&lt;br /&gt;I think the situation here has improved recently too, but I haven't heard much about it or explored it myself.&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;There you have it, all of the gotchas for writing code with launchpadlib. As you can see, it's not really any worse than writing for any Python library – I'm just being up-front with you because I like you.&lt;br /&gt;&lt;br /&gt;If any of these gotchas no longer apply, please correct me and I will shout your good news from the rooftops.&lt;br /&gt;&lt;br /&gt;Until then, happy hacking.&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-3206607098642562632?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Have you tried lptools?</title>
		<link href="http://code.mumak.net/2010/03/have-you-tried-lptools.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-7176896161811557970</id>
		<updated>2010-03-12T04:25:36+00:00</updated>
		<content type="html">Have you tried &lt;a href=&quot;https://edge.launchpad.net/lptools&quot;&gt;lptools&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;It's not at all officially associated with the Launchpad project, of course, but it's got a few nice things that you might want to look at, including:&lt;div&gt;&lt;ul&gt;&lt;li&gt;a milestone manipulator&lt;/li&gt;&lt;li&gt;a code review notifier, and&lt;/li&gt;&lt;li&gt;a milestone to iCal exporter&lt;/li&gt;&lt;/ul&gt;One of these days, I'd like for there to be an official, awesome Launchpad command-line client. As it is, I'm happy with the world of people making extensions to meet their needs.&lt;br /&gt;&lt;br /&gt;For other extensions, check out the &lt;a href=&quot;https://launchpad.net/lpx&quot;&gt;lpx project&lt;/a&gt; or our &lt;a href=&quot;http://help.launchpad.net/Clients&quot;&gt;list of clients&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-7176896161811557970?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Book Review : Designing Social Interfaces</title>
		<link href="http://theironlion.net/blog/2010/03/11/book-review-designing-social-interfaces/"/>
		<id>http://theironlion.net/blog/2010/03/11/book-review-designing-social-interfaces/</id>
		<updated>2010-03-12T00:05:45+00:00</updated>
		<content type="html">&lt;img alt=&quot;http://www.designingsocialinterfaces.com/images/book/book-cover_home.png&quot; src=&quot;http://www.designingsocialinterfaces.com/images/book/book-cover_home.png&quot; /&gt;
&lt;p&gt;I just finished reading &lt;a class=&quot;reference&quot; href=&quot;http://www.designingsocialinterfaces.com/&quot;&gt;Designing Social Interfaces&lt;/a&gt;.  The book is written by the creators of the &lt;a class=&quot;reference&quot; href=&quot;http://developer.yahoo.com/ypatterns/&quot;&gt;Yahoo! Pattern Library&lt;/a&gt;.  I had no knowledge of any such pattern library previous to reading this book, but I've really been exploring the idea of creating user experiences on the web that will bring in users and keep them happy (and not confused).  I think a lot of this interest has to do with &lt;a class=&quot;reference&quot; href=&quot;http://www.markshuttleworth.com/archives/162&quot;&gt;Canonical's current focus on design and usability&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The book is an O'Reilly book, but once it's opened, it certainly doesn't &lt;em&gt;feel&lt;/em&gt; like an O'Reilly book.  The pages are slicker than normal O'Reilly books (and I own many of them).  They're also in full color.  This is great for a user experience design book, since it's often hard to look at screenshots of web sites when they're in black and white.&lt;/p&gt;
&lt;p&gt;I soon realized that I was fascinated with the book itself.  When it comes to web design, there are a few staples (&lt;a class=&quot;reference&quot; href=&quot;http://www.amazon.com/Dont-Make-Me-Think-Usability/dp/0321344758&quot;&gt;Don't Make Me Think&lt;/a&gt; comes to mind), the books don't seem to be specific enough.  They usually just show good examples, but they don't show the &lt;em&gt;why&lt;/em&gt; of the good examples.  Designing User Interfaces &lt;em&gt;starts&lt;/em&gt; with the why, which is something I can really appreciate.&lt;/p&gt;
&lt;p&gt;As a developer, I also have a tendency to think in &amp;quot;design patterns.&amp;quot;  By presenting the interfaces as &amp;quot;patterns,&amp;quot; it was easy for me to start thinking up my own variations of those design patterns to work with my existing experiences and products.  This is probably what sealed the fate of this book.  It made me excited to re-design and re-think interfaces I've implemented (including &lt;a class=&quot;reference&quot; href=&quot;http://www.launchpad.net&quot;&gt;Launchpad&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I would &lt;em&gt;highly&lt;/em&gt; recommend this book for anyone doing front end work, whether it's just implementing existing designs or creating your own designs.  I've noticed that I now critique web interfaces with an eye I didn't have before I read this book.&lt;/p&gt;</content>
		<author>
			<name>Paul Hummer</name>
			<uri>http://theironlion.net/blog/</uri>
		</author>
		<source>
			<title type="html">The Iron Lion's Weblog</title>
			<subtitle type="html">Latest entries on Weblog</subtitle>
			<link rel="self" href="http://theironlion.net/blog/rss/"/>
			<id>http://theironlion.net/blog/rss/</id>
			<updated>2010-03-15T10:45:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">launchpadlib powerup</title>
		<link href="http://code.mumak.net/2010/03/launchpadlib-powerup.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-4852477932475774813</id>
		<updated>2010-03-11T05:59:39+00:00</updated>
		<content type="html">In my last post, I &lt;a href=&quot;http://code.mumak.net/2010/03/get-started-with-launchpadlib.html&quot;&gt;introduced launchpadlib&lt;/a&gt; and demonstrated a very simple script that uses it. In this post, I'd like to build on that a bit and show you how to do something actually interesting.&lt;br /&gt;&lt;br /&gt;In particular, I want to show you how to search for bugs, teach you a bit about Launchpad's internal data model and help you help yourself when it comes to figuring out Launchpad APIs.&lt;br /&gt;&lt;br /&gt;The script at &lt;a href=&quot;https://code.edge.launchpad.net/~jml/+junk/bugstats&quot;&gt;lp:~jml/+junk/bugstats&lt;/a&gt; is designed to tell you how good you are at filing bugs. It uses a very simple metric: out of the bugs that you've filed, how many actually have been fixed.&lt;pre&gt;$ ./bugstats.py ubuntu jml&lt;br /&gt;jml is 22.22% successful on bugs in Ubuntu&lt;br /&gt;$ ./bugstats.py launchpad-code jml&lt;br /&gt;jml is 47.63% successful on bugs in Launchpad Code&lt;/pre&gt;To do that, we need to:&lt;ol&gt;&lt;li&gt;get the &quot;project&quot; and person referred to on the command line&lt;/li&gt;&lt;li&gt;search for all fixed bugs filed by that person&lt;/li&gt;&lt;li&gt;search for all bugs in total by that same person&lt;/li&gt;&lt;li&gt;count them both&lt;/li&gt;&lt;li&gt;divide them&lt;/li&gt;&lt;li&gt;print them!&lt;/li&gt;&lt;/ol&gt;I say &quot;project&quot;, but I really should say &quot;pillar&quot;, which is the Launchpad technical term for a project (e.g. &quot;bzr&quot;), distribution (e.g. &quot;ubuntu&quot;) or project group (e.g. &quot;gnome&quot;). A pillar is anything in first part of Launchpad URL that isn't a person.&lt;br /&gt;&lt;br /&gt;We get the pillar and person like this:&lt;pre&gt;   pillar = launchpad.projects[pillar_name]&lt;br /&gt;  reporter = launchpad.people[reporter_name]&lt;/pre&gt;Pretty easy, huh? Now, how do we search for bug tasks?&lt;br /&gt;&lt;br /&gt;The first port of call is to go to the &lt;a href=&quot;https://launchpad.net/+apidoc&quot;&gt;Launchpad API reference&lt;/a&gt; page. I'm going to look for the string 'reporter', since that's the one thing I definitely know I want to find.&lt;br /&gt;&lt;br /&gt;Eventually, I found the &lt;code&gt;searchTasks&lt;/code&gt; method (named operation) that's on pillars and takes a &lt;code&gt;bug_reporter&lt;/code&gt; parameter and a &lt;code&gt;status&lt;/code&gt; parameter. It returns a collection of &lt;code&gt;bug_tasks&lt;/code&gt;, which are the objects that represent the rows in the table you see at the top of a bug page.&lt;br /&gt;&lt;br /&gt;I can find the bugtasks for the bugs I've reported that have been fixed by doing:&lt;pre&gt;   fixed_bugtasks = pillar.searchTasks(&lt;br /&gt;      bug_reporter=reporter, status=['Fix Released'])&lt;/pre&gt;It took me a while to figure out exactly how to spell &quot;Fix Released&quot;. I ended up using trial and error.&lt;br /&gt;&lt;br /&gt;Similarly, I can all the bugtasks for bugs I've filed by doing:&lt;pre&gt;   total_bugtasks = pillar.searchTasks(&lt;br /&gt;      bug_reporter=reporter,&lt;br /&gt;      status=[&lt;br /&gt;          &quot;New&quot;,&lt;br /&gt;          &quot;Incomplete&quot;,&lt;br /&gt;          &quot;Invalid&quot;,&lt;br /&gt;          &quot;Won't Fix&quot;,&lt;br /&gt;          &quot;Confirmed&quot;,&lt;br /&gt;          &quot;Triaged&quot;,&lt;br /&gt;          &quot;In Progress&quot;,&lt;br /&gt;          &quot;Fix Committed&quot;,&lt;br /&gt;          'Fix Released'])&lt;/pre&gt;I cheated a bit for that one and looked at the launchpad code to get a list of all bug statusus. The default for &lt;code&gt;searchTasks&lt;/code&gt; is to only return open bugs.&lt;br /&gt;&lt;br /&gt;Once we've got the collections of bug tasks, we need to get their counts. In an ideal world, it would be &lt;code&gt;len(total_bugtasks)&lt;/code&gt;, but sadly &lt;a href=&quot;https://bugs.edge.launchpad.net/launchpadlib/+bug/274074&quot;&gt;bug 274074&lt;/a&gt; means that &lt;code&gt;len&lt;/code&gt; is really, really slow here.&lt;br /&gt;&lt;br /&gt;Instead, I wrote this helper function:&lt;pre&gt;def length(collection):&lt;br /&gt;  # XXX: Workaround bug 274074. Thanks wgrant.&lt;br /&gt;  return int(collection._wadl_resource.representation['total_size'])&lt;/pre&gt;With that, I can calculate &amp;amp; print my success rate at filing bugs:&lt;pre&gt;   percentage = 100.0 * length(fixed_bugtasks) / length(total_bugtasks)&lt;br /&gt;  print &quot;%s is %.2f%% successful on bugs in %s&quot; % (&lt;br /&gt;      reporter.display_name, percentage, pillar.display_name)&lt;/pre&gt;Next up on the API, I'll talk about some of the gotchas and what you can do about them.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-4852477932475774813?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Get started with launchpadlib</title>
		<link href="http://code.mumak.net/2010/03/get-started-with-launchpadlib.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-6198000166834539317</id>
		<updated>2010-03-10T21:43:38+00:00</updated>
		<content type="html">In my spare time, I sometimes talk to people about how they can get started with launchpadlib hacking.&lt;br /&gt;&lt;br /&gt;launchpadlib is the Python client-side library that talks to Launchpad's own &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;REST&lt;/a&gt; API. It turns out that customize scripted control of a &lt;a href=&quot;https://launchpad.net/&quot;&gt;bug-tracker-code-hosting-translation-distribution-building-cross-project-collaboration thing&lt;/a&gt; is actually quite handy.&lt;br /&gt;&lt;br /&gt;If you want to get started hacking with launchpadlib, and you have Ubuntu, then install 'python-launchpadlib' now. I'm pretty sure you can also get it from PyPI.&lt;br /&gt;&lt;br /&gt;You can check that it works by running:&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;$ python&lt;br /&gt;&gt;&gt;&gt; import launchpadlib&lt;br /&gt;&gt;&gt;&gt; launchpadlib.__version__&lt;br /&gt;'1.5.1'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'll be assuming you're running 1.5.1 or later.&lt;br /&gt;&lt;br /&gt;I've written a very simple launchpadlib application that you can get with 'bzr branch lp:~jml/+junk/bugstats'. Each revision shows a meaningful launchpadlib script. You can get at the old revisions with 'bzr revert -r1' or 'bzr revert -r2' or '-r3'.&lt;br /&gt;&lt;br /&gt;Here's what the simplest launchpadlib script that I could think of looks like:&lt;br /&gt;&lt;pre&gt;import os&lt;br /&gt;import sys&lt;br /&gt;from launchpadlib.launchpad import Launchpad, STAGING_SERVICE_ROOT&lt;br /&gt;&lt;br /&gt;APP_NAME = 'jml-bug-stats'&lt;br /&gt;CACHE_DIR = os.path.expanduser('~/.launchpadlib/cache')&lt;br /&gt;SERVICE_ROOT = STAGING_SERVICE_ROOT&lt;br /&gt;&lt;br /&gt;launchpad = Launchpad.login_with(APP_NAME, SERVICE_ROOT, CACHE_DIR)&lt;br /&gt;print launchpad.bugs[1].title&lt;br /&gt;&lt;/pre&gt;(Adapted from r2 of the above branch).&lt;br /&gt;&lt;br /&gt;A few points.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We use &lt;code&gt;STAGING_SERVICE_ROOT&lt;/code&gt;, which means that we're pointing&lt;br /&gt;at &lt;a href=&quot;https://staging.launchpad.net/&quot;&gt;Launchpad's staging service&lt;/a&gt;,&lt;br /&gt;just in case we screw up any data.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;We give the application a name, when you run the application, launchpadlib&lt;br /&gt;opens up a browser window letting &lt;i&gt;you&lt;/i&gt; decide how far the application&lt;br /&gt;can act on &lt;i&gt;your&lt;/i&gt; behalf.&lt;/li&gt;&lt;li&gt;We provide a cache directory. Credentials, among other things, get stored&lt;br /&gt;here.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We then login and get an object that represents a Launchpad instance&lt;/li&gt;&lt;li&gt;Once we've got it, we look at the collection of bugs, get Bug #1 and then&lt;br /&gt;print the title&lt;/li&gt;&lt;/ul&gt;Very simple. To learn how to write this application, I looked at the main &lt;a href=&quot;https://help.launchpad.net/API&quot;&gt;Launchpad API help&lt;/a&gt; page, the&lt;br /&gt;&lt;a href=&quot;https://help.launchpad.net/API/Examples&quot;&gt;examples&lt;/a&gt; page and the &lt;a href=&quot;https://staging.launchpad.net/+apidoc&quot;&gt;reference documentation&lt;/a&gt;. You'll notice that I had to translate the reference documentation from REST-speak into Python-speak.&lt;br /&gt;&lt;br /&gt;Already you have enough to go exploring with the Launchpad API and think of cool things to do. A bunch of people are already doing &lt;a href=&quot;https://help.launchpad.net/Clients&quot;&gt;cool stuff&lt;/a&gt; and there are many &lt;a href=&quot;https://help.launchpad.net/API/Uses&quot;&gt;projects that use launchpadlib&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Next up, I hope to show you some more complex things you can do with the API.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6198000166834539317?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Monitor &amp;amp; keyboard</title>
		<link href="http://code.mumak.net/2010/03/monitor-keyboard.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-3149808529693543409</id>
		<updated>2010-03-08T23:27:54+00:00</updated>
		<content type="html">I want to get a shiny new monitor and keyboard. The monitor is for coding, writing docs, answering emails and watching films. The keyboard is for same. They'll both plug into my Thinkpad X200 for now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm tempted to get an Apple Cinema Display (but at such cost!). I don't know what keyboard I want. I think that the DAS keyboard I have isn't it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thoughts?&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-3149808529693543409?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Curiosities for March 2010</title>
		<link href="http://theironlion.net/blog/2010/03/07/curiosities-march-2010/"/>
		<id>http://theironlion.net/blog/2010/03/07/curiosities-march-2010/</id>
		<updated>2010-03-08T05:37:52+00:00</updated>
		<content type="html">&lt;p&gt;I bought lemonade and a granola bar from a sidewalk lemonade stand yesterday.  Yes, spring is here. This (&lt;em&gt;hopefully&lt;/em&gt;) means less computery time and more outsidery time. Yes, I just made up the word &amp;quot;outsidery.&amp;quot;  Coining new words should be part of my curiosities this month...&lt;/p&gt;
&lt;p&gt;As for actual things I want to explore:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;a class=&quot;reference&quot; href=&quot;https://jetpack.mozillalabs.com/&quot;&gt;Jetpack&lt;/a&gt; - Last month I switched back to Firefox from Chrome because Chrome just didn't hack it for me as a web developer.  One thing that Chrome had that I really liked was the extension mechanism. Basically. it was just some javascript.  Jetpack is an extension that provides similar support for Firefox.  After diving into Firefox extensions a few times and needing a lifeguard to get out, I thought I'd explore Jetpack to create simpler Firefox extensions.&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;reference&quot; href=&quot;http://developer.android.com/sdk/&quot;&gt;Android SDK&lt;/a&gt; - I offered to help a friend create an Android App.  No pay was involved, but I have been provided a more recent Android phone to replace my Android Dev Phone, so I actually have something of an obligation to complete and app for Android as opposed to just poking around in it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</content>
		<author>
			<name>Paul Hummer</name>
			<uri>http://theironlion.net/blog/</uri>
		</author>
		<source>
			<title type="html">The Iron Lion's Weblog</title>
			<subtitle type="html">Latest entries on Weblog</subtitle>
			<link rel="self" href="http://theironlion.net/blog/rss/"/>
			<id>http://theironlion.net/blog/rss/</id>
			<updated>2010-03-15T10:45:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Light: the new look of Ubuntu</title>
		<link href="http://www.markshuttleworth.com/archives/308"/>
		<id>http://www.markshuttleworth.com/?p=308</id>
		<updated>2010-03-04T19:26:13+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.jonobacon.org/2010/03/03/refreshing-the-ubuntu-brand/&quot;&gt;Jono Bacon&lt;/a&gt;, &lt;a title=&quot;Bye-bye Brown&quot; href=&quot;http://popey.com/blog/2010/03/03/bye-bye-brown/&quot;&gt;Alan Pope&lt;/a&gt;, and many others have written, yesterday we published &lt;a href=&quot;https://wiki.ubuntu.com/Brand&quot;&gt;a new visual story and style for Ubuntu&lt;/a&gt;. The core design work was lead by Marcus Haslam, Otto Greenslade and Dominic Edmunds, who are the three visual artists leading our efforts in the Canonical Design team. Once we had the base ideas in place we invited some anchor members of the Ubuntu Art community to a design sprint, to test that the concept had the legs to work with the full range of forums, websites, derivatives and other pieces of this huge and wonderful project. And apparently, it does!&lt;/p&gt;
&lt;p&gt;Here are some additional thoughts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Embracing both Ubuntu and Canonical&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the real challenges for us has been to find a branding and design strategy which spans the spectrum of audiences, forums and dialogues that we cover.  With Ubuntu, it&amp;#8217;s my specific dream to find a constructive blend of commercial and community interests, not only for Canonical but for other companies. That has made our design and branding work difficult &amp;#8211; the distinctive look of Ubuntu lent itself well to pure community messaging, but it was hard to do a brochure for Canonical data center services for Ubuntu on servers. We have not only Ubuntu, but also Kubuntu and an important range of derivatives that all have a role in our ecosystem.&lt;/p&gt;
&lt;p&gt;So we spent a lot of time trying to distill the requirements down into a set of three dimensions:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/design-dimensions.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-309&quot; title=&quot;design-dimensions&quot; src=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/design-dimensions.png&quot; alt=&quot;Dimensions for our visual language&quot; width=&quot;500&quot; height=&quot;220&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We found a set of ideas which each represent those spectrums, and which work together.&lt;/p&gt;
&lt;p&gt;For example, we identified a palette which includes both a fresh, lively Orange, and a rich, mature Aubergine, which work together. The use of Aubergine indicates Commercial involvement of one form or another, while Orange is a signal of community engagement. The Forums will use the Orange elements more strongly, and a formal product brochure, with descriptions of supporting services, would use more of the Aubergine.&lt;/p&gt;
&lt;p&gt;On the consumer/enterprise spectrum, we took inspiration from the aerospace industry, and identified a texture of closely spaced dots. When you see more of that, it means we&amp;#8217;re signalling that the story is more about the enterprise, less of that, and it&amp;#8217;s more about the consumer. Of course, there are cross-overs, for example when we are talking about the corporate desktop, where we&amp;#8217;ll use that closely space dot texture as a boundary area, or separator. We also identified shades of Aubergine that are more consumer, or more enterprise &amp;#8211; the darker shades mapping to a stronger emphasis on enterprise work.&lt;/p&gt;
&lt;p&gt;And on the end-user / engineer spectrum, we took inspiration from graph paper and engineering blue prints. When you see widely spaced patterns of dots, or outline images and figures, that&amp;#8217;s signalling that the content is more engineering-oriented than end-user oriented.&lt;/p&gt;
&lt;p&gt;And finally, we found a number of themes which enhanced and echoed those ideas. We use a warm gray supporting colour to give shape to pages and documents, and we built on the dots and circles to create a whole style for figures, illustrations and pictograms.&lt;/p&gt;
&lt;p&gt;The beauty of this is that we can now publish content that spans the full range, and we generally know when we start the design process what sorts of visual cues we want to be signalling. Instead of having these different mental domains fight with one another, we can now convey quite subtle collaboration between community and corporate, or work which is aimed at engineers and developers from enterprises as opposed to developers working with consumers. Time will tell how it shapes up, but for now I&amp;#8217;m celebrating the milestone and the efforts of the team that pulled it together. There&amp;#8217;s something there for everyone who wants to participate in the great hubbub of Ubuntuness that is our shared experience of free software.&lt;/p&gt;
&lt;p&gt;So, for example, here&amp;#8217;s a conference banner. The strong use of Aubergine suggests that it&amp;#8217;s more corporate messaging (Canonical is heavily involved). Orange is used here more as a highlight. The Aubergine is darker, and there&amp;#8217;s quite a lot of the fine dot pattern. Below the image is a set of scales showing where on those spectra this work is pitched.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/banner.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-310&quot; title=&quot;Example conference banner for Canonical&quot; src=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/banner.png&quot; alt=&quot;Cloud Banner&quot; width=&quot;630&quot; height=&quot;900&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As another example, here&amp;#8217;s a brochure with an emphasis on end-users who are thinking about adopting Ubuntu&amp;#8217;s cloud infrastructure. Again, the fine dot patterns suggests a more enterprise focus, as does the use of the dark aubergine. You can see the circle metaphor used in the quote callout.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/cloud-data-sheet.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-311&quot; title=&quot;Cloud Brochure&quot; src=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/cloud-data-sheet.png&quot; alt=&quot;&quot; width=&quot;630&quot; height=&quot;900&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;#8217;s a similar brochure, but with a more developer or engineering oriented focus: note the use of the graph-paper theme with wide spaced dots, and outline shapes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/cloud-engineering.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-312&quot; title=&quot;Cloud Engineering Brochure&quot; src=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/cloud-engineering.png&quot; alt=&quot;&quot; width=&quot;630&quot; height=&quot;900&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finally, here&amp;#8217;s an example of a brochure and CD cover for Ubuntu:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/cd.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-313&quot; title=&quot;Sample  CD styling with new Ubuntu visual treatments&quot; src=&quot;http://www.markshuttleworth.com/wp-content/uploads/2010/03/cd.png&quot; alt=&quot;&quot; width=&quot;630&quot; height=&quot;900&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see the idea is to signal a mix of both community and Canonical involvement in the message, addressing consumer audiences with a mix of developers and end-users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A new Ubuntu font&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We have commissioned a new font to be  developed both for the logo&amp;#8217;s of Ubuntu and Canonical, and for use in  the interface. The font will be called Ubuntu, and will be a modern  humanist font that is optimised for screen legibility. It will be  published under an open font license, and considered part of the trade  dress of Ubuntu, which will limit its relevance for software interfaces  outside of Ubuntu but leave it free for use across the web and in  printed documents.&lt;/p&gt;
&lt;p&gt;It will take a few months for the font to be  finalised, initial elements will be final in the next week which will be  sufficient for the logo and other bits and pieces, but I expect to see  that font widely used in 10.10. The work has been commissioned from  world-renowned fontographers &lt;a href=&quot;http://en.wikipedia.org/wiki/Dalton_Maag&quot;&gt;Dalton Maag&lt;/a&gt;, who  have expressed excitement at the opportunity to publish an open font and  also a font that they know will be used daily by millions of people.&lt;/p&gt;
&lt;p&gt;Initial  coverage will be Western, Arabic, Hebrew and Cyrillic character sets,  but over time we may be able to extend that to being a full Unicode  font, with great kerning and hinting for print and screen usage  globally.  We are considering an internship program, to support aspiring  fontographers from all corners of the world to visit London and work  with Dalton Maag to extend the font to their own regional glyph set.&lt;/p&gt;
&lt;p&gt;The critical test of the font is screen efficiency and  legibility, and its character and personality are secondary to its  fitness for that purpose. Nevertheless, our hope is that the font has a  look that is elegant and expresses the full set of values for both  Canonical and Ubuntu: adroitness, accountability, precision,  reliability, freedom and collaboration. We&amp;#8217;ll publish more as soon as we  have it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A good start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been an exciting process, but I have the sense that we are just getting started. The language will get richer, we will find new things that we want to communicate, and new treatments and visual themes that resonate well with these starting points. We&amp;#8217;ll find new ways to integrate this on the web, and on the desktop (look out for the two new themes, Radiance and Ambiance).  I hope we&amp;#8217;ll see the language being used to good effect across everything we do, both commercial and community oriented. There&amp;#8217;s a range of expression here that should be useful to artists across the spectrum. Let me know how it works for you.&lt;/p&gt;</content>
		<author>
			<name>Mark Shuttleworth</name>
			<uri>http://www.markshuttleworth.com</uri>
		</author>
		<source>
			<title type="html">Mark Shuttleworth</title>
			<subtitle type="html">Planetary perspectives</subtitle>
			<link rel="self" href="http://www.markshuttleworth.com/feed"/>
			<id>http://www.markshuttleworth.com/feed</id>
			<updated>2010-03-15T09:15:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Free Software is a Pyramid Scheme</title>
		<link href="http://theironlion.net/blog/2010/03/03/free-software-pyramid-scheme/"/>
		<id>http://theironlion.net/blog/2010/03/03/free-software-pyramid-scheme/</id>
		<updated>2010-03-04T00:29:04+00:00</updated>
		<content type="html">&lt;p&gt;Last week, I was asked to meet with a family member for lunch.  I went to venue
only to find that the family member was joined by other people.  Those other
people wanted me to get involved in network marketing.  People that aren't in
network marketing often refer to network marketing as a &amp;quot;pyramid scheme.&amp;quot;
Yeah, one of those, you know, where you alienate your family and friends trying
to get them to not only buy a product but to have them sell the product as
well.  I decided to decline the offer mostly because I'm a geek, not a
salesman.  I can't schmooze people; I'm direct and to the point.&lt;/p&gt;
&lt;p&gt;On my bike ride home from that appointment though, I realized that I &lt;em&gt;am&lt;/em&gt; a
salesman, and I think I'm a pretty good one.  The only difference is that I can
only &amp;quot;sell&amp;quot; the things I truly believe in.  One of those things is Free
Software.&lt;/p&gt;
&lt;p&gt;In 1999, I was a sophomore/junior in high school in a small podunk town.  I
don't remember a lot of my life then, but I do remember the computer lab
high school.  It had a T1 (lightning fast at the time) and hardly anyone at the
school knew anything about computers.  I guess you could say I was the man with
one eye in the land of the blind.&lt;/p&gt;
&lt;p&gt;With all that unused bandwidth, I had no choice but to start pirating software hand over fist.
I stumbled over a piece of software called &amp;quot;Red Hat Linux&amp;quot; which
sounded really geeky cool, and I had access to downloading all 8 cds (or
whatever it was).  I was such a pirate for downloading all those cds.  Man, I
was cool.&lt;/p&gt;
&lt;p&gt;Installing it was a pain, eventually leading to me getting a book called &amp;quot;Linux
for Dummies&amp;quot; before I really knew what to do.  I played around a bit, but
didn't really see the appeal of Linux over Windows.  There was nothing like
Visual Basic (a habit I'm ashamed to admit I developed during high school).  I
also wasn't a fan of the terminal.&lt;/p&gt;
&lt;p&gt;2001 came and I found myself buying a copy of Mandrake 8.1 from Best Buy.  It
was sexier than Red Hat, and seemed to have everything I wanted.
Unfortunately, I couldn't get my sound card to work, and every time I wanted to
install something that wasn't an rpm from the cd, I had to go build all sorts
of dependencies from source.  It was hopeless, but I trudged on for the geek
cred.&lt;/p&gt;
&lt;p&gt;That same year, I discovered Debian because someone else I knew was using it.
Debian was cool, because it had this apt-get thing that would help you install
things magically.  At this point, I took off.  Installing things was so easy
that I was always trying out new software.  I was showing it to other people.
I'd see people using a piece of Windows software and start talking about the
Free version I got from apt, and how much better it was.&lt;/p&gt;
&lt;p&gt;As time past, I started seeing the benefit of Free Software in everything.
I started talking to people about how they needed to embrace this idea of Free
Software.  There was light in my eyes when I told people they didn't need to be
slaves to software vendors; they had choice in how their computer worked.&lt;/p&gt;
&lt;p&gt;Over the years, I've helped many people convert their lifestyles to use more
Free Software in some capacity, whether it be through the use of OpenOffice, or
the big jump to Linux.  It's been rewarding and eductional for me, and it's
even better when those that I've helped turn around to help others.&lt;/p&gt;
&lt;p&gt;So, if I put this blog post to cheesy music on a DVD, sat you down and made you
watch it, would you join the Free Software Pyramid Scheme?  What if I promised
you that if you worked as hard as I did, you would make as much money as I have
convincing people to use Free Software?&lt;/p&gt;</content>
		<author>
			<name>Paul Hummer</name>
			<uri>http://theironlion.net/blog/</uri>
		</author>
		<source>
			<title type="html">The Iron Lion's Weblog</title>
			<subtitle type="html">Latest entries on Weblog</subtitle>
			<link rel="self" href="http://theironlion.net/blog/rss/"/>
			<id>http://theironlion.net/blog/rss/</id>
			<updated>2010-03-15T10:45:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Back from PyCon</title>
		<link href="http://code.mumak.net/2010/03/back-from-pycon.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-325373824797303769</id>
		<updated>2010-03-03T20:59:13+00:00</updated>
		<content type="html">I had a great time at PyCon 2010. The best part was definitely the &lt;a href=&quot;http://labs.twistedmatrix.com/2010/03/pycon-2010-sprint-report.html&quot;&gt;Twisted sprint&lt;/a&gt;, which gave me a long overdue opportunity to do some actual coding.&lt;br /&gt;&lt;br /&gt;Well, actually, I ended up spending a lot of the time organizing a release and writing &lt;a href=&quot;http://twistedmatrix.com/trac/wiki/ReleaseProcess&quot;&gt;process documents&lt;/a&gt;, so I didn't escape management as much as I would have liked.&lt;br /&gt;&lt;br /&gt;Now I'm back, planning on doing the &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/4290&quot;&gt;Twisted 10.0 release&lt;/a&gt; and working with &lt;a href=&quot;http://launchpad.net/~didrocks&quot;&gt;didrocks&lt;/a&gt; to get better &lt;a href=&quot;http://help.launchpad.net/API&quot;&gt;Launchpad integration&lt;/a&gt; with &lt;a href=&quot;http://launchpad.net/quickly&quot;&gt;Quickly&lt;/a&gt;, as my contribution to &lt;a href=&quot;http://www.jonobacon.org/2010/02/04/project-awesome-opportunity/&quot;&gt;Project Awesome Opportunity&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-325373824797303769?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Bazaar Explorer’s Killer Feature</title>
		<link href="http://bazaarvcs.wordpress.com/2010/03/01/bazaar-explorers-killer-feature/"/>
		<id>http://bazaarvcs.wordpress.com/?p=138</id>
		<updated>2010-03-01T06:33:10+00:00</updated>
		<content type="html">&lt;p&gt;Bazaar Explorer 1.0.0 hits the streets yesterday. It&amp;#8217;s now well entrenched in my Top 5 applications along with Firefox, Thunderbird and gvim &amp;#8211; I truly love using it. Some user docs are coming but in the meantime, here&amp;#8217;s a quick look at my favorite feature &amp;#8230; project-specific tools.&lt;/p&gt;
&lt;p&gt;The first time I opened a repository called &amp;#8220;bzr&amp;#8221;, Explorer guessed that I was working on the core Bazaar project and asked if I wanted to use the bzr &amp;#8220;Hat&amp;#8221;. I replied Yes. Now, every time I open a branch in that repository, my toolbox magically gets a &lt;em&gt;Bazaar Development&lt;/em&gt; section as shown below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://bazaarvcs.files.wordpress.com/2010/03/explorer-toolbox-for-bzr1.png&quot; alt=&quot;The Toolbox&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The first 3 actions take me to the Open Questions, New Bugs and Active Code Reviews for bzr on Launchpad. That lets me reply to support questions, triage new issues and review merge proposals. Clicking on Servers pops up a menu of bzr-related web sites I visit from time to time, the PQM bot that merges proposed changes to our mainline (if and only if all tests pass) and our Hudson continuous integration server (that runs our regression test suite on lots of  different operating systems).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://bazaarvcs.files.wordpress.com/2010/03/servers-menu.png&quot; alt=&quot;Servers for bzr&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Likewise, Docs pops up a menu of documentation I commonly use &amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://bazaarvcs.files.wordpress.com/2010/03/docs-menu.png&quot; alt=&quot;Docs for bzr&quot; /&gt;&lt;/p&gt;
&lt;p&gt;BTW, you don&amp;#8217;t need to be using a shared repository for Explorer to propose using a Hat for given location and its subdirectories. Opening a branch or checkout with the right name will work as well. If you don&amp;#8217;t want to use a Hat for a location, that&amp;#8217;s equally fine. Explorer will remember that fact and not ask you again.&lt;/p&gt;
&lt;p&gt;This feature isn&amp;#8217;t only for &amp;#8220;bzr&amp;#8221; development either. Explorer ships with around 20 hats for a variety of popular open source projects on Launchpad including MySQL, Inkscape, Gwibber, Mailman, GNOME Do and Launchpad itself. You can easily create your own as well by simply adding a hats/project-name/tools.xml file under your explorer configuration directory (e.g. ~/.bazaar/explorer). Here&amp;#8217;s a sample tools.xml file:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
&amp;lt;folder title=&quot;Tools&quot;&amp;gt;&lt;br /&gt;
&amp;lt;separator/&amp;gt;&lt;br /&gt;
&amp;lt;folder title=&quot;QBzr Development&quot;&amp;gt;&lt;br /&gt;
&amp;lt;toolset name=&quot;lp-devel&quot; project=&quot;qbzr&quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/folder&amp;gt;&lt;br /&gt;
&amp;lt;/folder&amp;gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
It might just be me but I find project-specific tools &lt;em&gt;mega&lt;/em&gt; cool: fast access to the places I need to visit, anytime I&amp;#8217;m working on a particular project. Explorer is and will remain an easy-to-use GUI application suitable for casual users of version control. My grand vision though is for it to evolve into a collaboration-centric, BYO editor IDE, suitable for hard-code developers like myself to spend most of their day in. Keeping the easy-vs-powerful balance right won&amp;#8217;t be easy but I&amp;#8217;m confident we can do it. Give it a try and let us know how it works for you!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/bazaarvcs.wordpress.com/138/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/bazaarvcs.wordpress.com/138/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/bazaarvcs.wordpress.com/138/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/bazaarvcs.wordpress.com/138/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/bazaarvcs.wordpress.com/138/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/bazaarvcs.wordpress.com/138/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/bazaarvcs.wordpress.com/138/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/bazaarvcs.wordpress.com/138/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/bazaarvcs.wordpress.com/138/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/bazaarvcs.wordpress.com/138/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=bazaarvcs.wordpress.com&amp;blog=6751622&amp;post=138&amp;subd=bazaarvcs&amp;ref=&amp;feed=1&quot; /&gt;Ian ClatworthyThe ToolboxServers for bzrDocs for bzr</content>
		<author>
			<name>Bazaar Developers</name>
			<uri>http://bazaarvcs.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Bazaar developers' blog</title>
			<subtitle type="html">News, announcements and comments from the developers of the Bazaar distributed version control system</subtitle>
			<link rel="self" href="http://bazaarvcs.wordpress.com/feed/"/>
			<id>http://bazaarvcs.wordpress.com/feed/</id>
			<updated>2010-03-08T09:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">February 2010 Exploration Report</title>
		<link href="http://theironlion.net/blog/2010/02/28/february-2010-exploration-report/"/>
		<id>http://theironlion.net/blog/2010/02/28/february-2010-exploration-report/</id>
		<updated>2010-03-01T02:48:44+00:00</updated>
		<content type="html">&lt;p&gt;Earlier this month, I &lt;a class=&quot;reference&quot; href=&quot;http://theironlion.net/blog/2010/02/01/february-2010-curiousities-and-adventures/&quot;&gt;posted about some technologies that I was curious about&lt;/a&gt;.  Here's my report:&lt;/p&gt;
&lt;div class=&quot;section&quot;&gt;
&lt;h1&gt;&lt;a id=&quot;tahoe-lafs&quot; name=&quot;tahoe-lafs&quot;&gt;Tahoe-LAFS&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I actually like the Tahoe community a lot; enough for me to want to contribute
to it.  Tahoe 1.6 was my first sponsored package into Lucid &lt;a class=&quot;reference&quot; href=&quot;http://theironlion.net/blog/2010/02/09/my-first-package/&quot;&gt;earlier this month&lt;/a&gt;, and I'd really
like to get together with other local Coloradoans and sprint on Tahoe.&lt;/p&gt;
&lt;p&gt;If you just want to see what Tahoe provides, you'll want to check out the &lt;a class=&quot;reference&quot; href=&quot;http://testgrid.allmydata.org:3567/&quot;&gt;Test
Grid&lt;/a&gt;.  It gives you a nice web
interface to explore Tahoe.  You can create directories, upload files, etc.&lt;/p&gt;
&lt;p&gt;The web interface wasn't enough for me.  I installed Tahoe, and then made a few
KVM virtual machines and set up my own test grid (albeit a crippled version,
as I was lazy and only wanted to set up the parts I to play with).  My
installation had some hiccups, but was incredibly happy to find that my &lt;cite&gt;tahoe
mv&lt;/cite&gt; and &lt;cite&gt;tahoe cp&lt;/cite&gt; were working.&lt;/p&gt;
&lt;p&gt;Being a web developer by day, I think the web interface could use a little more
love, and could be a bit sexier, but I suspect that the web interface isn't the
main way to add things to a Tahoe installation.&lt;/p&gt;
&lt;p&gt;I'd like to find some ways to contribute to Tahoe in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
&lt;h1&gt;&lt;a id=&quot;node-js&quot; name=&quot;node-js&quot;&gt;Node.js&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Node.js is a cute idea.  It's a web server for server side javascript.  It may
be a little perverted to say, but I really love javascript.  Sure, it has its
bad parts, but the good parts are pretty good.  Naturally, this meant that I
was curious to write server-side javascript.&lt;/p&gt;
&lt;p&gt;As I was working on it, I started writing a little web app.  I was handling
post data and stuff.  I was returning html.  Pretty soon I was writing a
templating engine and basically re-implementing
Django/Zope/Rails/Your-Web-Framework-of-Choice.  This really put me off,
because there are better existing tools to build web apps than building
something from scratch with Javascript (no matter how much I like Javascript).&lt;/p&gt;
&lt;p&gt;One thing I thought was funny was that my server side javascript was sending
javascript through in the response for the client to work with.  This is a
phonomenon I'd never encountered before: using the same language on the server
and the client.  It made me wonder what having python in the browser would be
like.&lt;/p&gt;
&lt;p&gt;I think I might play with Node.js again when I don't have to create an entire
framework around it.&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Paul Hummer</name>
			<uri>http://theironlion.net/blog/</uri>
		</author>
		<source>
			<title type="html">The Iron Lion's Weblog</title>
			<subtitle type="html">Latest entries on Weblog</subtitle>
			<link rel="self" href="http://theironlion.net/blog/rss/"/>
			<id>http://theironlion.net/blog/rss/</id>
			<updated>2010-03-15T10:45:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Announcing the NCLUG/BLUG Blog Planet</title>
		<link href="http://theironlion.net/blog/2010/02/28/announcing-nclugblug-blog-planet/"/>
		<id>http://theironlion.net/blog/2010/02/28/announcing-nclugblug-blog-planet/</id>
		<updated>2010-03-01T02:46:35+00:00</updated>
		<content type="html">&lt;p&gt;A few weeks back I pitched the idea of aggregating the blogs of members from the &lt;a class=&quot;reference&quot; href=&quot;http://www.nclug.org&quot;&gt;Northern Colorado Linux Users Group&lt;/a&gt; and the &lt;a class=&quot;reference&quot; href=&quot;http://lug.boulder.co.us&quot;&gt;Boulder Linux Users Group&lt;/a&gt; to their accompanying mailing lists.  Those members responded to me with interest, so I put together an aggregate site.&lt;/p&gt;
&lt;p&gt;With some help from &lt;a class=&quot;reference&quot; href=&quot;http://www.jafo.ca&quot;&gt;Sean&lt;/a&gt;, &lt;a class=&quot;reference&quot; href=&quot;http://www.nclug.org&quot;&gt;NCLUG&lt;/a&gt;, and &lt;a class=&quot;reference&quot; href=&quot;http://www.tummy.com&quot;&gt;Tummy.com&lt;/a&gt; (for hosting the NCLUG sites), I'm happy to announce the &lt;a class=&quot;reference&quot; href=&quot;http://planet.nclug.org&quot;&gt;Northern Colorado Linux Blogs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you're in the NCLUG or BLUG area and want your blog aggregated, feel free to send an email to paul [at] eventuallyanyway [dot] com.&lt;/p&gt;</content>
		<author>
			<name>Paul Hummer</name>
			<uri>http://theironlion.net/blog/</uri>
		</author>
		<source>
			<title type="html">The Iron Lion's Weblog</title>
			<subtitle type="html">Latest entries on Weblog</subtitle>
			<link rel="self" href="http://theironlion.net/blog/rss/"/>
			<id>http://theironlion.net/blog/rss/</id>
			<updated>2010-03-15T10:45:08+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Twisted 10.0.0pre1 released</title>
		<link href="http://code.mumak.net/2010/02/twisted-1000pre1-released.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-3047169740033600943</id>
		<updated>2010-02-22T13:59:52+00:00</updated>
		<content type="html">It's not going to work, it's not the final release, but I'm very pleased to announce that &lt;a href=&quot;http://people.canonical.com/~jml/Twisted&quot;&gt;Twisted 10.0.0pre1&lt;/a&gt; is available for testing.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Download it, test it, play with it and help us make 10.0 the best release ever!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a side note, this is hopefully the start of a much simpler, more automated &lt;a href=&quot;http://twistedmatrix.com/trac/wiki/ReleaseProcess&quot;&gt;release process&lt;/a&gt; and maybe even time-based releases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-3047169740033600943?l=code.mumak.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml</name>
			<email>noreply@blogger.com</email>
			<uri>http://code.mumak.net/</uri>
		</author>
		<source>
			<title type="html">Mere Code</title>
			<subtitle type="html">Hacking, Software Collaboration, Testing and Diverse Other Topics of General Interest to the Practicing Programmer</subtitle>
			<link rel="self" href="http://code.mumak.net/atom.xml"/>
			<id>tag:blogger.com,1999:blog-5733547231775030285</id>
			<updated>2010-03-12T14:45:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Trivial bugs</title>
		<link href="http://how-bazaar.blogspot.com/2010/02/trivial-bugs.html"/>
		<id>tag:blogger.com,1999:blog-7854892290437883216.post-4635564612705123741</id>
		<updated>2010-02-22T07:45:06+00:00</updated>
		<content type="html">This is just a quick note really.  One thing I've been trying to do more and more is to address simple bugs in a more timely manner.&lt;br /&gt;&lt;br /&gt;I use the tag &quot;&lt;a href=&quot;https://bugs.edge.launchpad.net/launchpad-code/+bugs?field.tag=trivial&quot;&gt;trivial&lt;/a&gt;&quot; to indicate to me that the bug is very simple to fix.  By this I mean that I should be able to have the fix and the test all written in under an hour, and normally under 30 minutes.&lt;br /&gt;&lt;br /&gt;Personally I'm (hopefully) fixing one trivial bug a day in addition to other work.  This way the simple bugs get some attention, and I get the feeling of accomplishing something when other things are in the pipeline that take longer to get completed.&lt;br /&gt;&lt;br /&gt;My scheduling of trivial bugs is somewhat arbitrary.  Often the most recently commented on trivial bug will get my attention.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7854892290437883216-4635564612705123741?l=how-bazaar.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tim Penhey (thumper)</name>
			<email>noreply@blogger.com</email>
			<uri>http://how-bazaar.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">How Bazaar</title>
			<link rel="self" href="http://how-bazaar.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-7854892290437883216</id>
			<updated>2010-02-22T07:45:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Yay Dell-with-Ubuntu down under</title>
		<link href="http://www.advogato.org/person/robertc/diary.html?start=145"/>
		<id>http://rbtcollins.wordpress.com/2010/02/15/yay-dell-with-ubuntu-down-under/</id>
		<updated>2010-02-15T06:12:02+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;Dell has been offering Ubuntu on selected models for a while. I had however nearly given up hope on being able to buy one, because they hadn&amp;#8217;t started doing that in Australia. I am very glad to see this has changed though &amp;#8211; check out their &lt;a href=&quot;http://www1.ap.dell.com/content/products/results.aspx/notebooks&quot;&gt;notebook page&lt;/a&gt;. Not all models yet, but a reasonable number have Ubuntu as an option.&lt;/p&gt;
&lt;p&gt;Yay!&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rbtcollins.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rbtcollins.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rbtcollins.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rbtcollins.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rbtcollins.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rbtcollins.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rbtcollins.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rbtcollins.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rbtcollins.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rbtcollins.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rbtcollins.wordpress.com&amp;blog=9305600&amp;post=242&amp;subd=rbtcollins&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Robert Collins</name>
			<uri>http://www.advogato.org/person/robertc/</uri>
		</author>
		<source>
			<title type="html">Advogato blog for robertc</title>
			<subtitle type="html">Advogato blog for robertc</subtitle>
			<link rel="self" href="http://advogato.org/person/robertc/rss.xml"/>
			<id>http://advogato.org/person/robertc/rss.xml</id>
			<updated>2010-03-15T10:45:04+00:00</updated>
		</source>
	</entry>

</feed>
