<?xml version="1.0" encoding="utf-8"?>
<!-- name="generator" content="pyblosxom/1.2.1 06/01/2005" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
<channel>
<title>ddaa bbloggs   </title>
<link>http://ddaa.net/blog/</link>
<description>Some free bits of software.</description>
<language>en</language>
<item>
    <title>Repositories, branches and trees</title>
    <link>http://ddaa.net/blog/bzr/repository-branch-tree.html</link>
    <description>&lt;p&gt;These are words you are sure to find in the documentation of any version control system. In &lt;a class=&quot;reference&quot; href=&quot;http://www.nongnu.org/cvs/&quot;&gt;CVS&lt;/a&gt;, &lt;a class=&quot;reference&quot; href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt; or &lt;a class=&quot;reference&quot; href=&quot;http://www.gnu.org/software/gnu-arch/&quot;&gt;GNU Arch&lt;/a&gt; they are very distinct objects. In &lt;a class=&quot;reference&quot; href=&quot;http://git.or.cz/&quot;&gt;git&lt;/a&gt; and &lt;a class=&quot;reference&quot; href=&quot;http://www.selenic.com/mercurial/&quot;&gt;Mercurial&lt;/a&gt;, they are conceptually distinct but are represented by a single object on disk.&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;In &lt;a class=&quot;reference&quot; href=&quot;http://bazaar-vcs.org/&quot;&gt;Bazaar&lt;/a&gt;, you can pick and choose, as separate or as conflated as you wish. This allows it to support configurations familiar to CVS and Subversion users, as well as the convenience of all-in-one trees.&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the simplest case, &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;init&lt;/span&gt;&lt;/tt&gt; creates a &lt;em&gt;standalone tree&lt;/em&gt;. A tree that contains a repository and a single branch, like this:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
my-tree
 | .bzr
 |  | repository
 |  | branch
 |  ` checkout
 | hello.c
 ` README
&lt;/pre&gt;
&lt;p&gt;You can also create a &lt;em&gt;shared repository&lt;/em&gt; for multiple branches to use the same storage. This save disk space and data copying. This is done with &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;init-repository&lt;/span&gt;&lt;/tt&gt;. And that looks like this:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
my-repo
 `.bzr
   ` repository
&lt;/pre&gt;
&lt;p&gt;Then you can start creating branches in the repository. Using commands like &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;my-tree&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;my-repo/my-branch&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
my-repo
 | .bzr
 |  ` repository
 ` my-branch
    | .bzr
    ` branch
&lt;/pre&gt;
&lt;p&gt;Note how my-branch neither contains a repository nor a working tree &lt;a class=&quot;footnote-reference&quot; href=&quot;#id2&quot; id=&quot;id1&quot; name=&quot;id1&quot;&gt;[1]&lt;/a&gt;. Other branches created in my-repo will use the same common storage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;table class=&quot;docutils footnote&quot; frame=&quot;void&quot; id=&quot;id2&quot; rules=&quot;none&quot;&gt;
&lt;colgroup&gt;&lt;col class=&quot;label&quot; /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign=&quot;top&quot;&gt;
&lt;tr&gt;&lt;td class=&quot;label&quot;&gt;&lt;a class=&quot;fn-backref&quot; href=&quot;#id1&quot; name=&quot;id2&quot;&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strike&gt; At least in bzr-0.13. In earlier versions, &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;init-repository&lt;/span&gt;&lt;/tt&gt; created by default a repository where the branches had trees. This behaviour was provided by &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;init-repository&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;--no-trees&lt;/span&gt;&lt;/tt&gt;. &lt;/strike&gt; At least up to bzr-0.13. Developers are considering to change the default of &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;init-repository&lt;/span&gt;&lt;/tt&gt; to create a repository where the branches have trees.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;To extract a tree from the repository, use a command like &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;--lightweight&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;my-repo/my-branch&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;my-light&lt;/span&gt;&lt;/tt&gt;. That would give you a so-called &lt;em&gt;lightweight checkout&lt;/em&gt;:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
my-light
 | .bzr
 |  | branch (reference)
 |  ` checkout
 | hello.c
 ` README
&lt;/pre&gt;
&lt;p&gt;The branch in a lightweight checkout is a special &lt;em&gt;branch reference&lt;/em&gt; that contains no actual data, just the URL of the actual branch in the repository.&lt;/p&gt;
&lt;p&gt;Note that, if you are so inclined, you can create a lightweight checkout from standalone tree.&lt;/p&gt;
&lt;p&gt;If you want to keep all your trees handy, and still benefit from the disk space and performance gains of using a repository, you can create the the repository using &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;init-repository&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;--trees&lt;/span&gt;&lt;/tt&gt;. Creating a branch in this repository would yield this result:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
my-repo
 | .bzr
 | ` repository
 ` my-branch
    | .bzr
    |  | branch
    |  ` checkout
    | hello.c
    ` README
&lt;/pre&gt;
&lt;p&gt;Note that you can also achieve this result by running &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;checkout&lt;/span&gt;&lt;/tt&gt; (no further argument) in a branch that does not already have a tree. Conversely, you can remove the tree from a branch using &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;remove-tree&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;So which combinations did we see?&lt;/p&gt;
&lt;blockquote&gt;
&lt;table border=&quot;1&quot; class=&quot;docutils&quot;&gt;
&lt;colgroup&gt;
&lt;col width=&quot;11%&quot; /&gt;
&lt;col width=&quot;17%&quot; /&gt;
&lt;col width=&quot;11%&quot; /&gt;
&lt;col width=&quot;60%&quot; /&gt;
&lt;/colgroup&gt;
&lt;thead valign=&quot;bottom&quot;&gt;
&lt;tr&gt;&lt;th class=&quot;head&quot;&gt;repo&lt;/th&gt;
&lt;th class=&quot;head&quot;&gt;branch&lt;/th&gt;
&lt;th class=&quot;head&quot;&gt;tree&lt;/th&gt;
&lt;th class=&quot;head&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign=&quot;top&quot;&gt;
&lt;tr&gt;&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;standalone tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;shared repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;repository branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;lightweight checkout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;repository checkout&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;Are other combinations meaningful?&lt;/p&gt;
&lt;blockquote&gt;
&lt;table border=&quot;1&quot; class=&quot;docutils&quot;&gt;
&lt;colgroup&gt;
&lt;col width=&quot;11%&quot; /&gt;
&lt;col width=&quot;17%&quot; /&gt;
&lt;col width=&quot;11%&quot; /&gt;
&lt;col width=&quot;60%&quot; /&gt;
&lt;/colgroup&gt;
&lt;thead valign=&quot;bottom&quot;&gt;
&lt;tr&gt;&lt;th class=&quot;head&quot;&gt;repo&lt;/th&gt;
&lt;th class=&quot;head&quot;&gt;branch&lt;/th&gt;
&lt;th class=&quot;head&quot;&gt;tree&lt;/th&gt;
&lt;th class=&quot;head&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign=&quot;top&quot;&gt;
&lt;tr&gt;&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;standalone branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;pure branch reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;???&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Standalone branches&lt;/em&gt; are self-contained branches without a tree. They are created by &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;push&lt;/span&gt;&lt;/tt&gt; when the push destination is on a remote URL (like sftp, ftp, http). The &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bzr&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;push&lt;/span&gt;&lt;/tt&gt; command does not update working trees at remote URLs to improve performance and to prevent the occurence of merge conflicts. So it may as well not create a tree in the first place..&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pure branch references&lt;/em&gt; are exotic, but they are actually useful. &lt;a class=&quot;reference&quot; href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; uses them to implement a &lt;a class=&quot;reference&quot; href=&quot;http://blogs.gnome.org/view/jamesh/2006/10/10/0&quot;&gt;redirection&lt;/a&gt; mechanism.&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;The last combination is a repository, without a branch, with a tree. I do not think it would be really useful, but I can imagine how it would work. That would be a lightweight checkout at the root of a shared repository.&lt;/p&gt;</description>
  </item>
<item>
    <title>Community Bazaar Hosting on Launchpad</title>
    <link>http://ddaa.net/blog/launchpad/bzr-hosting.html</link>
    <description>&lt;p&gt;You could &lt;a class=&quot;reference&quot; href=&quot;http://ddaa.net/blog/launchpad/basic-bzr&quot;&gt;already&lt;/a&gt; register &lt;a class=&quot;reference&quot; href=&quot;http://bazaar-vcs.org/FrontPage&quot;&gt;bzr&lt;/a&gt; branches on &lt;a class=&quot;reference&quot; href=&quot;https://launchpad.net&quot;&gt;Launchpad&lt;/a&gt;, provided you had
some web space to put them on. Now, you can host your bzr branches directly on
Launchpad.&lt;/p&gt;
&lt;p&gt;You can register a bzr branch you are hosting elsewhere using your web browser.
This is called an &lt;em&gt;external branch&lt;/em&gt;, and will be automatically mirrored on a
daily basis.&lt;/p&gt;
&lt;p&gt;To ask Launchpad to host a branch for you, use the bzr tool to connect
to the bazaar.launchpad.net SFTP server and upload your branch. This is
called a &lt;em&gt;hosted branch&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I have discussed external branches &lt;a class=&quot;reference&quot; href=&quot;http://ddaa.net/blog/launchpad/basic-bzr&quot;&gt;before&lt;/a&gt;. The rest of this article discusses
how to set up and use a hosted branch.&lt;/p&gt;
&lt;p&gt;For this recipe you will need:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;A Launchpad account. If you do not have one yet, you can &lt;a class=&quot;reference&quot; href=&quot;https://launchpad.net/+login&quot;&gt;register&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A Bazaar branch. If you do not have that yet, there are &lt;a class=&quot;reference&quot; href=&quot;http://bazaar-vcs.org/Tutorials&quot;&gt;tutorials&lt;/a&gt; to get you
started.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Branches are uploaded to Launchpad using the SFTP protocol. Authentication is
done using the SSH public key system. The Ubuntu wiki has a good &lt;a class=&quot;reference&quot; href=&quot;https://wiki.ubuntu.com/SSHHowto&quot;&gt;SSH
Howto&lt;/a&gt; covering &lt;a class=&quot;reference&quot; href=&quot;https://wiki.ubuntu.com/SSHHowto#public-key-auth&quot;&gt;public key&lt;/a&gt; authentication and &lt;a class=&quot;reference&quot; href=&quot;https://wiki.ubuntu.com/SSHHowto#ssh-agent&quot;&gt;ssh-agent&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you have a SSH public key, register it in Launchpad: go to your account
page, click on &lt;em&gt;SSH Keys&lt;/em&gt; in the top left corner, and enter your public key in
the form.&lt;/p&gt;
&lt;p&gt;To push a branch to Launchpad, you need three pieces of information.&lt;/p&gt;
&lt;ol class=&quot;arabic simple&quot;&gt;
&lt;li&gt;The name of your account: this is the last part of the URL of your account
page, and you can modify it in the &lt;em&gt;Personal details&lt;/em&gt; form accessible from
your account&apos;s page.&lt;/li&gt;
&lt;li&gt;The name of the Launchpad &lt;a class=&quot;reference&quot; href=&quot;https://launchpad.net/products&quot;&gt;product&lt;/a&gt; the branch belongs to. The name of the
product is the last part of the URL of the product page.&lt;/li&gt;
&lt;li&gt;The name of the branch to publish. This name must be unique for an owner and
product, but the same name can be used by different users in the same
product and by the same user in different products. If you have no idea,
&amp;quot;&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;dev&lt;/span&gt;&lt;/tt&gt;&amp;quot; is a good name for an all-purposes development branch.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the following examples, substitute &lt;em&gt;account&lt;/em&gt; with your account name,
&lt;em&gt;product&lt;/em&gt; with a product name, and &lt;em&gt;branch&lt;/em&gt; with the branch name.&lt;/p&gt;
&lt;p&gt;For convenience, you can record your Launchpad account name in your
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;~/.ssh/config&lt;/span&gt;&lt;/tt&gt; file, by adding the following lines:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
Host bazaar.launchpad.net
    User &lt;i&gt;account&lt;/i&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Then you can push a branch on Launchpad using the following command:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
  &lt;strike&gt;bzr push --create-prefix sftp://bazaar.launchpad.net/~&lt;i&gt;account&lt;/i&gt;/&lt;i&gt;product&lt;/i&gt;/&lt;i&gt;branch&lt;/i&gt;&lt;/strike&gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;small&gt;&lt;strong&gt;Update:&lt;/strong&gt; As Jamesh Henstridge &lt;a class=&quot;reference&quot; href=&quot;http://blogs.gnome.org/view/jamesh/2006/09/06/0&quot;&gt;reported&lt;/a&gt;, it is no longer necessary to use the
--create-prefix option when pushing to bazaar.launchpad.net. &lt;/small&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
  bzr push sftp://bazaar.launchpad.net/~&lt;i&gt;account&lt;/i&gt;/&lt;i&gt;product&lt;/i&gt;/&lt;i&gt;branch&lt;/i&gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;After the push, the branch appears on the Launchpad web site and you can use it
to set a title, description, and various other attributes of the branch. The
Launchpad page for the branch will be found at this URL:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strike&gt;&lt;code&gt;
https://launchpad.net/+people/&lt;i&gt;account&lt;/i&gt;/+branches/&lt;i&gt;product&lt;/i&gt;/&lt;i&gt;branch&lt;/i&gt;
&lt;/code&gt;&lt;/strike&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;small&gt;&lt;strong&gt;Update:&lt;/strong&gt; The URL structure of the web site changed, /+people/name was
replaced by /~people. &lt;/small&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;
https://launchpad.net/~&lt;i&gt;account&lt;/i&gt;/+branches/&lt;i&gt;product&lt;/i&gt;/&lt;i&gt;branch&lt;/i&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;After pushing, the branch data will be published at this URL, advertised on the
branch page:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;
http://bazaar.launchpad.net/~&lt;i&gt;account&lt;/i&gt;/&lt;i&gt;product&lt;/i&gt;/&lt;i&gt;branch&lt;/i&gt;.
&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strike&gt; There is some latency between the time a branch is pushed to SFTP and
the time when the data published by HTTP is updated. This latency is currently
one day, but new code will be deployed soon bringing this down to a few
minutes. &lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;strong&gt;Update:&lt;/strong&gt; The latency reduction work has been deployed &lt;/small&gt;&lt;/p&gt;
&lt;p&gt;It can be a few minutes between the time a branch is pushed to SFTP and the
time when the data published by HTTP is updated. Usually, this delay is two
minutes.&lt;/p&gt;
&lt;p&gt;Now, a more negative note, the things you &lt;em&gt;cannot&lt;/em&gt; currently do with branches
on Launchpad:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;Push to a &lt;em&gt;external branch&lt;/em&gt; that was registered on the Launchpad web site.&lt;/li&gt;
&lt;li&gt;Convert a branch between hosted and external. Once the branch is created, it
will either be mirrored from an external URL, or published from the SFTP
area.&lt;/li&gt;
&lt;li&gt;Use the bzr repository feature. At the moment, each hosted branch must be
self contained.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A branch can also be owned by a team, allowing multiple users to commit. More
on this next time!&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;strong&gt;Update:&lt;/strong&gt; James Henstridge talked about &lt;a class=&quot;reference&quot; href=&quot;http://blogs.gnome.org/view/jamesh/2006/08/17/1&quot;&gt;shared branches&lt;/a&gt; and Andrew
Bennetts emphasized how &lt;a class=&quot;reference&quot; href=&quot;http://andrew.puzzling.org/diary/2006/October/9/20061009&quot;&gt;Bazaar checkouts&lt;/a&gt; are useful. &lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to Malcolm Cleaton, James Henstridge, and Stuart Bishop for
proof-reading this article and suggesting numerous improvements.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;</description>
  </item>
<item>
    <title>Trying Xubuntu 6.06</title>
    <link>http://ddaa.net/blog/trying-xubuntu.html</link>
    <description>&lt;p&gt;These last few days I have given a serious try to &lt;a class=&quot;reference&quot; href=&quot;http://www.xfce.org/&quot;&gt;Xfce&lt;/a&gt;, the lightweight and
fast desktop environment. I used Xfce4 as provided by &lt;a class=&quot;reference&quot; href=&quot;https://wiki.ubuntu.com/Xubuntu&quot;&gt;Xubuntu&lt;/a&gt; 6.06.&lt;/p&gt;
&lt;p&gt;It all started with being annoyed with Evolution crashes and sluggishness. I
decided to give &lt;a class=&quot;reference&quot; href=&quot;http://www.mozilla.com/thunderbird/&quot;&gt;Thunderbird&lt;/a&gt; a serious try, and while I was trying to get the
most snappiness out of my desktop, I temporarily abandoned &lt;a class=&quot;reference&quot; href=&quot;http://www.gnome.org/&quot;&gt;Gnome&lt;/a&gt; for Xfce.&lt;/p&gt;
&lt;p&gt;First the good things: Xfce is &lt;em&gt;really&lt;/em&gt; snappy, it&apos;s not much in absolute
numbers, but having everything respond in tenths or hundredths of seconds has a
real effect on the overall feeling. For example, when browsing the Gnome menu,
there is a small delay (a few tenths of a second) between the selection of a
sub-menu item and the appearance of the sub-menu. In Xfce, everything feels
instantaneous. I also very much liked the way the Xfce panel behaves.&lt;/p&gt;
&lt;p&gt;I also liked &lt;a class=&quot;reference&quot; href=&quot;http://thunar.xfce.org/index.html&quot;&gt;Thunar&lt;/a&gt; a bit more than &lt;a class=&quot;reference&quot; href=&quot;http://www.gnome.org/projects/nautilus/&quot;&gt;Nautilus&lt;/a&gt;. It was one of those things that
felt really snappy and no-nonsense in small little ways that are hard to
describe. There was also many things that just worked, or looked like they
would just work if I needed them, but that I did not actually need during the
trial period, for example CD burning.&lt;/p&gt;
&lt;p&gt;One thing that bothered me at first was losing the calendar feature of the
Gnome clock applet. Clicking on the clock applet displays a small calendar with
information from the &lt;a class=&quot;reference&quot; href=&quot;http://www.gnome.org/projects/evolution/&quot;&gt;Evolution&lt;/a&gt; calendar. Happily, I was able to get the same
feature using the &amp;quot;orage clock applet&amp;quot;. Of course, it uses the calendaring
information of Orage, the Xfce calendar application, and not Evolution. I will
try to keep on using Orage in Gnome, even if only to keep Evolution at bay.&lt;/p&gt;
&lt;p&gt;The system monitor applets of Xfce are not as pretty as the Gnome System
Monitor applet. The network monitor applet does not provide a shortcut to the
network configuration application. Xfce has a weather applet, but it is not
smart enough to display the temperature on the side when in an horizontal
panel, so enabling temperature display always significantly increasing the
width of the enclosing panel. There also appears to be no way to bind a key to
the activation of the Xfce panel menu, or to operate the panels using the
keyboard.&lt;/p&gt;
&lt;p&gt;Xfce tends to force the user to deal a bit more with system internal: for
example, there is no UI to configure the keyboard switching applet, one has to
use the infamous &lt;a class=&quot;reference&quot; href=&quot;http://www.charvolant.org/~doug/xkb/&quot;&gt;xkb&lt;/a&gt; directly. Also, except for the window manager, there are
no canned desktop actions to bind to key commands, all desktop key bindings
must call into shell commands (like with &lt;a class=&quot;reference&quot; href=&quot;http://hocwp.free.fr/xbindkeys/xbindkeys.html&quot;&gt;xbindkeys&lt;/a&gt;). Also, the inability to
activate the panel menu from the keyboard forced me to use the &amp;quot;run command&amp;quot;
much more often than I do in Gnome.&lt;/p&gt;
&lt;p&gt;More troublesome were the window manager key bindings. I love to have excellent
control from the keyboard, and only use the mouse when I really have to.
&lt;a class=&quot;reference&quot; href=&quot;http://en.wikipedia.org/wiki/Metacity&quot;&gt;Metacity&lt;/a&gt; has excellent support to resize and move windows from the keyboard. I
was not really satisfied by the equivalent functionality of the Xfce window
manager. It is not possible to resize a window by extending it to the left or
top, only by extending to the right or bottom. Also, keyboard resizing and
moving of windows does not snap to other windows and screen borders like the
mouse operations do.&lt;/p&gt;
&lt;p&gt;Serious annoyances begun when I was unable to use &lt;a class=&quot;reference&quot; href=&quot;http://blogs.gnome.org/view/jamesh/2006/03/02/0&quot;&gt;gnome-gpg&lt;/a&gt;. I tried
enabling the &amp;quot;Run gnome services at startup&amp;quot; option of the Xfce session manager
and re-logging in, but it did not help. So tried using &lt;a class=&quot;reference&quot; href=&quot;https://savannah.gnu.org/faq/?group_id=5802&amp;amp;question=Download_Area_-_How_to_install_and_use_gpg-agent.txt&quot;&gt;gpg-agent&lt;/a&gt;, but gpg
reported &amp;quot;&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;gpg:&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;problem&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;disabling&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;use&lt;/span&gt;&lt;/tt&gt;&amp;quot; and asked for
the pass-phrase every time. I knew I could have dealt with the problem using
&lt;a class=&quot;reference&quot; href=&quot;http://www.vibe.at/tools/q-agent/&quot;&gt;quintuple-agent&lt;/a&gt;, but I postponed it.&lt;/p&gt;
&lt;p&gt;But the thing that really made me switch back to Gnome was the lack of keyboard
control for the sound volume. A lot of keyboards nowadays have special keys to
control or mute the speaker&apos;s volume, and Ubuntu&apos;s Gnome comes with complete
support for those, and even integration with &lt;a class=&quot;reference&quot; href=&quot;http://www.thinkwiki.org/wiki/Category:T42p&quot;&gt;my ThinkPad&apos;s&lt;/a&gt; BIOS-based volume
keys.&lt;/p&gt;
&lt;p&gt;Overall, I had a very good impression of Xfce. I loved the very pleasant
snappiness feeling, and the non-nonsense panel behaviour. I could deal with the
more &amp;quot;bare metal&amp;quot; aspects of the environment. I plan to give Xubuntu another
try some day, and hope that they have found a way to improve their keyboard
accessibility, and in particular the keyboard volume control.&lt;/p&gt;</description>
  </item>
<item>
    <title>lsprof meets KCachegrind</title>
    <link>http://ddaa.net/blog/python/lsprof-calltree.html</link>
    <description>&lt;p&gt;You can now visualize the output of the &lt;a class=&quot;reference&quot; href=&quot;http://codespeak.net/svn/user/arigo/hack/misc/lsprof&quot;&gt;lsprof&lt;/a&gt; Python profiler using
&lt;a class=&quot;reference&quot; href=&quot;http://kcachegrind.sourceforge.net/&quot;&gt;KCachegrind&lt;/a&gt;, an excellent visualization tool for profiling data.&lt;/p&gt;
&lt;p&gt;One useful feature of the &lt;a class=&quot;reference&quot; href=&quot;http://docs.python.org/lib/module-hotshot.html&quot;&gt;hotshot&lt;/a&gt; Python profiler is the existence of the
hotshot2calltree conversion filter, that produces output suitable for
KCachegrind. So after the &lt;a class=&quot;reference&quot; href=&quot;http://thread.gmane.org/gmane.comp.python.devel/73166&quot;&gt;s/hotshot/lsprof&lt;/a&gt; thread occured on the
python-devel mailing list, and that &lt;a class=&quot;reference&quot; href=&quot;http://bazaar.canonical.com/Bzr&quot;&gt;Bazaar-NG&lt;/a&gt; added support for lsprof, I
was itching to use KCachegrind with lsprof data.&lt;/p&gt;
&lt;p&gt;In good libre software style, I eventually scratched my itch and wrote &lt;a class=&quot;reference&quot; href=&quot;/patch/lsprof-calltree.patch&quot;&gt;a
patch&lt;/a&gt; to add calltree support to lsprof. The lsprof maintainers are welcome
to apply it.&lt;/p&gt;
&lt;p&gt;With lsprof and KCachegrind I was able to quickly identify a performance bug in
Bazaar-NG that should be easy to fix. The data generated by hotshot completely
misses that issue, at least when displayed by KCachegrind. I am not sure why.&lt;/p&gt;
&lt;p&gt;One thing I know for sure is that hotshot2calltree has a serious bug. It causes
KCachegrind to confuse multiple functions with the same name and from the same
Python file. That completely messes up the call graph and greatly reduces the
pertinence of the data.&lt;/p&gt;
&lt;p&gt;Specifically, the Bazaar-NG code uses two decorators, &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;needs_read_lock&lt;/span&gt;&lt;/tt&gt; and
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;needs_write_lock&lt;/span&gt;&lt;/tt&gt;, defined in the same module, which return closures of
local functions called &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;decorated&lt;/span&gt;&lt;/tt&gt;. Each decorator uses a different
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;decorated&lt;/span&gt;&lt;/tt&gt; function, but hostshot2calltree produces data that causes
KCachegrind to only see one &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;decorated&lt;/span&gt;&lt;/tt&gt; function. In the example I&apos;m looking
at, it&apos;s the one in the &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;needs_write_lock&lt;/span&gt;&lt;/tt&gt; decorator.&lt;/p&gt;
&lt;p&gt;KCachegrind seems to make C/C++ assumptions, and seems not to expect two
different functions with the same name and in the same file. My lsprof patch
works around the issue by including the Python module names and line numbers
into the function names in the calltree output. Incidentally, that also makes
for more informative names.&lt;/p&gt;</description>
  </item>
<item>
    <title>Basic Bazaar Support in Launchpad</title>
    <link>http://ddaa.net/blog/launchpad/basic-bzr.html</link>
    <description>&lt;p&gt;The initial &lt;a class=&quot;reference&quot; href=&quot;http://bazaar.canonical.com/Bzr&quot;&gt;bzr&lt;/a&gt; support in &lt;a class=&quot;reference&quot; href=&quot;http://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; finally got its last missing piece
bolted on.&lt;/p&gt;
&lt;p&gt;Those who had the chance to attend &lt;a class=&quot;reference&quot; href=&quot;https://wiki.ubuntu.com/UbuntuBelowZero&quot;&gt;UBZ&lt;/a&gt; may remember the presentation titled
&lt;em&gt;Launchpad Branch Management&lt;/em&gt; that &lt;a class=&quot;reference&quot; href=&quot;http://niemeyer.net/&quot;&gt;Gustavo&lt;/a&gt; and I performed, with the
assistance of an &lt;a class=&quot;reference&quot; href=&quot;http://flickr.com/photos/magicfab/58051841/&quot;&gt;innocent user&lt;/a&gt;. Okay, maybe you do not remember... The one
with the cows! You remember now? Right, so the functionality we demonstrated
there is finally live on Launchpad.&lt;/p&gt;
&lt;p&gt;During that presentation, we demonstrated some prototype code that allowed you
to do a few things in Launchpad:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;Browse for branches by product or people.&lt;/li&gt;
&lt;li&gt;Click the &amp;quot;Add Bazaar Branch&amp;quot; link, fill out a form with the URL of a bzr
branch and some descriptive information.&lt;/li&gt;
&lt;li&gt;Wait &amp;quot;some time&amp;quot; until all the daemons involved get around to the data. Right
now it takes about one day, but we will eventually lower the latency to a few
minutes.&lt;/li&gt;
&lt;li&gt;Watch as the Launchpad page for the branch now displays a small table with
the date, author and summary of the ten latest revisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s not all that impressive when told that way, but the presentation was
great, really, people loved the cows. And our innocent user managed pretty
well.&lt;/p&gt;
&lt;p&gt;What that really shows is that Launchpad knows bzr branches, and has some
critical infrastructure to deliver a bunch of really sexy features. For
example, it automatically mirrors your branch on &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bazaar.launchpad.net&lt;/span&gt;&lt;/tt&gt;. As
such, Launchpad can already behave as a directory and mirror for all the
decentralised development branches out there for your project. &lt;a class=&quot;footnote-reference&quot; href=&quot;#id2&quot; id=&quot;id1&quot; name=&quot;id1&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stay tuned, I will brag about the new and improved features as they roll out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;table class=&quot;docutils footnote&quot; frame=&quot;void&quot; id=&quot;id2&quot; rules=&quot;none&quot;&gt;
&lt;colgroup&gt;&lt;col class=&quot;label&quot; /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign=&quot;top&quot;&gt;
&lt;tr&gt;&lt;td class=&quot;label&quot;&gt;&lt;a class=&quot;fn-backref&quot; href=&quot;#id1&quot; name=&quot;id2&quot;&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Launchpad also has some other &amp;quot;small&amp;quot; features, like a bug tracker, an
on-line software translation service, and two flavours of kitchen sinks.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;</description>
  </item>
<item>
    <title>What it&apos;s like to work at Canonical</title>
    <link>http://ddaa.net/blog/work-at-canonical.html</link>
    <description>&lt;p&gt;Paul Graham recently wrote &lt;a class=&quot;reference&quot; href=&quot;http://www.paulgraham.com/opensource.html&quot;&gt;an essay&lt;/a&gt; titled &lt;em&gt;What Business Can Learn from
Open Source&lt;/em&gt;. One of things he talks about is how traditional &amp;quot;professionalism&amp;quot;
is actually quite harmful, and advocates decentralised work. As an employee of
&lt;a class=&quot;reference&quot; href=&quot;http://www.canonical.com&quot;&gt;Canonical&lt;/a&gt;, the company that created &lt;a class=&quot;reference&quot; href=&quot;http://www.ubuntu.com&quot;&gt;Ubuntu&lt;/a&gt; and is developing &lt;a class=&quot;reference&quot; href=&quot;http://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; and
&lt;a class=&quot;reference&quot; href=&quot;http://bazaar.canonical.com/&quot;&gt;Bazaar&lt;/a&gt;, I almost felt like this essay was talking about me. Working at
Canonical is quite a lot like what Paul Graham describes.&lt;/p&gt;
&lt;p&gt;The company has little in the way of actual office space. The development is
done by people scattered over four continents, most of them working at home.
Developers are recruited in the &lt;a class=&quot;reference&quot; href=&quot;http://www.gnu.org/philosophy/free-sw.html&quot;&gt;libre software&lt;/a&gt; community based on their
current and past activities, the basic hiring philosophy of the company is to
get people to work on what they would do for free. Of course, a paycheck always
comes with some associated tedium, and sometimes one has to work on totally
boring things.&lt;/p&gt;
&lt;p&gt;Canonical is an interesting company to work for, if only because the way work
actually gets done is quite similar to the way a community project would work.
The main communication tools are (in no specific order) e-mail, IRC chat,
wikis, and a decentralised version control system. Some people in the company
like to say that we work &amp;quot;pants free&amp;quot;. After all, when your office is next door
to your bedroom, there is little use for suits and ties.&lt;/p&gt;
&lt;p&gt;Even though &amp;quot;on the internet, &lt;a class=&quot;reference&quot; href=&quot;http://www.unc.edu/depts/jomc/academics/dri/idog.html&quot;&gt;nobody knows you are a dog&lt;/a&gt;&amp;quot; I can confidently
assert that all the Canonical staff at least looks and sounds &lt;em&gt;somewhat&lt;/em&gt; human.
The whole company congregates at least three times a year, for the Ubuntu
developers summit, and specific development groups attend additional &amp;quot;sprints&amp;quot;
as needed. Every time, the interesting question is &amp;quot;where?&amp;quot;. The whole-company
meetings I have attended were held in Oxford, Mataró and Sydney and I have
attended sprints in London (at Mark&apos;s flat) and Brazil (at &lt;a class=&quot;reference&quot; href=&quot;http://async.com.br/&quot;&gt;Async&lt;/a&gt; offices),
while others had sprints in Cape Town, Montreal, and probably a few other
places.&lt;/p&gt;
&lt;p&gt;Another fun thing in working for Canonical, is that it tends to elicit &amp;quot;Wow!&amp;quot;
reactions from some people, but the real nice thing is the people you get to
work with. That is really an elite company, with a lot of very bright hackers
and quite a few with excellent communication skills. Most people there also
tend to have quite interesting personalities or backgrounds. And also, we get
to go to night clubs with Mark Shuttleworth at the end of Ubuntu summits, and
sometimes we fly on his plane on our way to one conference or another.&lt;/p&gt;</description>
  </item>
<item>
    <title>A Look at Gobby</title>
    <link>http://ddaa.net/blog/gobby-first-look.html</link>
    <description>&lt;p&gt;For a couple of months now, I have been looking into implementing a
collaborative text editor similar to &lt;a class=&quot;reference&quot; href=&quot;http://www.codingmonkeys.de/subethaedit/&quot;&gt;SubEthaEdit&lt;/a&gt;, but &lt;a class=&quot;reference&quot; href=&quot;http://www.gnu.org/philosophy/free-sw.html&quot;&gt;libre&lt;/a&gt;. This personal
project is probably to take another direction now that I have discovered Gobby,
and found out that &lt;a class=&quot;reference&quot; href=&quot;#gobby-it-works&quot;&gt;it does work&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;section&quot; id=&quot;some-other-libre-collaborative-text-editors&quot;&gt;
&lt;h2&gt;&lt;a name=&quot;some-other-libre-collaborative-text-editors&quot;&gt;Some other libre collaborative text editors&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The initial research taught me about some related projects in the free software
world, in particular the &lt;a class=&quot;reference&quot; href=&quot;http://thread.gmane.org/gmane.editors.abiword.devel/17000&quot;&gt;Gnome Office Collab&lt;/a&gt; initiative that was discussed
on the Abiword developers mailing list. This discussion included a &lt;a class=&quot;reference&quot; href=&quot;http://thread.gmane.org/gmane.editors.abiword.devel/17275&quot;&gt;very
valuable post&lt;/a&gt; linking to the excellent computer science paper
[&lt;a class=&quot;reference&quot; href=&quot;http://citeseer.ist.psu.edu/sun98achieving.html&quot;&gt;sun98achieving&lt;/a&gt;] that was purportedly implemented by SubEthaEdit.&lt;/p&gt;
&lt;p&gt;But as far as &lt;a class=&quot;reference&quot; href=&quot;http://www.gnu.org/philosophy/free-sw.html&quot;&gt;libre&lt;/a&gt; collaborative text editors went, I did not find much.&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;The &lt;a class=&quot;reference&quot; href=&quot;http://students.olin.edu/2007/mcolyer/projects/collaborate/&quot;&gt;Collaborate&lt;/a&gt; application seemed like a good candidate, but it just did
not work correctly. Though the web page looks good, it&apos;s just an aborted
student project.&lt;/li&gt;
&lt;li&gt;The &lt;a class=&quot;reference&quot; href=&quot;http://www-mice.cs.ucl.ac.uk/multimedia/software/nte/&quot;&gt;Network Text Editor&lt;/a&gt; [&lt;a class=&quot;reference&quot; href=&quot;http://citeseer.csail.mit.edu/handley97network.html&quot;&gt;handley97network&lt;/a&gt;] appears more mature, but it&apos;s
an &lt;a class=&quot;reference&quot; href=&quot;http://en.wikipedia.org/wiki/Mbone&quot;&gt;MBone&lt;/a&gt; application and is all about making collaborative text editing work
with such an unreliable transport. That might make for good academic
publications, but that seems to me like the kind of contortions you would
only perform to fit within an imposed research program.&lt;/li&gt;
&lt;li&gt;At the time, I also noticed this intriguing &lt;a class=&quot;reference&quot; href=&quot;http://www.debian.org/&quot;&gt;Debian&lt;/a&gt; package, called
&lt;a class=&quot;reference&quot; href=&quot;http://packages.debian.org/testing/libs/libobby-1.0-0&quot;&gt;libobby-1.0&lt;/a&gt;. However, that did not seem to be actually used by something
and it had the annoying property of enforcing a centralised model. It turns
out that this is the core library used by Gobby.&lt;/li&gt;
&lt;li&gt;I have also recently been pointed at &lt;a class=&quot;reference&quot; href=&quot;http://ace.iserver.ch/&quot;&gt;ACE&lt;/a&gt;, a Java application.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;centralised-or-decentralised&quot;&gt;
&lt;h2&gt;&lt;a name=&quot;centralised-or-decentralised&quot;&gt;Centralised or decentralised?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What do I mean when I say: centralised model? In short, that means that all
editing actions goes through a central, fixed, server instead of being
transmitted among peers.&lt;/p&gt;
&lt;p&gt;Centralisation in a real-time collaborative environment is problematic: the
server network bandwidth can become a bottleneck, latency is increased as any
two users have to communicate through the server, and the editing session
cannot outlive the server. These problems are aggravated by the fact that the
server often runs on the workstation of one of the participants, who may want
to leave the editing session, and whose network connectivity may be less than
carrier-grade.&lt;/p&gt;
&lt;p&gt;When several people are collaborating on the same data over the internet, there
are technical challenges in ensuring that all users see the same document, and
that the changes appear to each user in a natural order. What makes the problem
difficult is that, if you want to provide smooth editing experience, you must
accept that different users may have slightly diverging document states.&lt;/p&gt;
&lt;p&gt;When you type a word in a collaborative text editor, you want the word to
appear immediately on your screen and then be sent to other participants in the
editing session. Then another user can type another word before receiving what
you typed, and that should also be displayed instantly on the other user&apos;s
screen. In that scenario, you and the other user&apos;s document state &lt;em&gt;diverge&lt;/em&gt; for
a short while. Among other things, the collaborative text editor must ensure
that everybody ends up with the same document state after a short while. That
is the &lt;strong&gt;convergence&lt;/strong&gt; problem.&lt;/p&gt;
&lt;p&gt;Other technical challenges of concurrent document editing include &lt;strong&gt;causality
preservation&lt;/strong&gt;, and &lt;strong&gt;intention preservation&lt;/strong&gt;. Causality preservation means
that if you type &amp;quot;Hello&amp;quot;, and a second user types &amp;quot;World&amp;quot; after seeing &amp;quot;Hello&amp;quot;,
then a third user must always see &amp;quot;Hello&amp;quot; appear &lt;em&gt;before&lt;/em&gt; &amp;quot;World&amp;quot;. Intention
preservation simply means that edits always have the desired effect, which is
not as simple as it sounds because document states may diverge.&lt;/p&gt;
&lt;p&gt;Convergence and causality preservation seem difficult to achieve without
arbitration. The usual solution to arbitration problems is to centralise the
system, a single &lt;strong&gt;server&lt;/strong&gt; process on a single computer decides in which order
things really happened and breaks ties. &lt;a class=&quot;reference&quot; href=&quot;http://en.wikipedia.org/wiki/Special_relativity&quot;&gt;Special relativity&lt;/a&gt; explains that two
causally independent events may appear to have occurred in different orders for
different observers, so it often looks like there is no way around
centralisation when arbitration is needed. But the &lt;a class=&quot;reference&quot; href=&quot;http://citeseer.ist.psu.edu/sun98achieving.html&quot;&gt;sun98achieving&lt;/a&gt; paper shows
that centralisation is not required for collaborative text editing, and
explains how to do without.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;the-need-for-a-decentralised-messaging-abstraction&quot;&gt;
&lt;h2&gt;&lt;a name=&quot;the-need-for-a-decentralised-messaging-abstraction&quot;&gt;The need for a decentralised messaging abstraction&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Centralisation, even if it problematic, avoids some other difficult problems.
The &lt;a class=&quot;reference&quot; href=&quot;http://citeseer.ist.psu.edu/sun98achieving.html&quot;&gt;sun98achieving&lt;/a&gt; paper makes a good job of explaining how to handle editing
operations, but it says nothing about session negotiation. In particular, if
you want to prevent two users from using the same nickname, or the same text
colour, or you want documents in the session to have unique names, you have a
difficult distributed resource management problem.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;reference&quot; href=&quot;http://www.spread.org/&quot;&gt;The Spread Toolkit&lt;/a&gt; solves a related problem, providing a messaging
abstraction for decentralised networks. Unfortunately, it is very oriented
towards clustering applications and requires that network participants be
declared in a configuration file. That makes it completely unsuitable for use
in a user friendly collaborative text editor. Also, its &lt;a class=&quot;reference&quot; href=&quot;http://www.spread.org/license/&quot;&gt;license&lt;/a&gt; has an
attribution clause that makes it &lt;a class=&quot;reference&quot; href=&quot;http://www.gnu.org/philosophy/bsd.html&quot;&gt;GPL-incompatible&lt;/a&gt;. However the Spread
Message Service Types look like they would be a good foundation for a generic
distributed messaging system.&lt;/p&gt;
&lt;p&gt;Another problem with decentralised collaborative text editing over the internet
is that to really reap the benefits of decentralisation in robustness and
performance, you need to build a &lt;a class=&quot;reference&quot; href=&quot;http://en.wikipedia.org/wiki/Mesh_network&quot;&gt;mesh&lt;/a&gt; of network connections which touches
another difficult research problem (pointers gladly accepted): the construction
of a robust mesh without going for a fully-connected network. In addition to
this theoretical problem, special care would be needed to transparently and
reliably establish connections to other session participants in the present of
&lt;a class=&quot;reference&quot; href=&quot;http://en.wikipedia.org/wiki/NAT&quot;&gt;NAT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My personal experiments were based on a decentralised model, and I got very
tangled into the distributed resource management problem. I think that before
we can have a usefully decentralised collaborative text editor, we will need a
good decentralised messaging abstraction that provides a foundation for
resource management and a transparent fault-resilient mesh network of peers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;gobby-it-works&quot;&gt;
&lt;h2&gt;&lt;a name=&quot;gobby-it-works&quot;&gt;Gobby, it works!&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A few days ago, a colleague pointed me at &lt;a class=&quot;reference&quot; href=&quot;http://gobby.0x539.de/&quot;&gt;Gobby&lt;/a&gt;. The collaborative text editor
from the &lt;a class=&quot;reference&quot; href=&quot;http://0x539.de/members.html&quot;&gt;0x539.dev group&lt;/a&gt;. I downloaded and compiled the application, played
a bit with it, read the (still quite short) mailing list archive, and chatted a
lot on the &lt;a class=&quot;reference&quot; href=&quot;irc://irc.blitzed.org:6667/0x539&quot;&gt;#0x539 IRC channel&lt;/a&gt;. And I have to say I was quite positively
impressed!&lt;/p&gt;
&lt;p&gt;In short, Gobby is a multi-platform (Linux, Mac, Windows) collaborative text
editor written in &lt;a class=&quot;reference&quot; href=&quot;http://en.wikipedia.org/wiki/C_Plus_Plus&quot;&gt;C++&lt;/a&gt; and using the &lt;a class=&quot;reference&quot; href=&quot;http://www.gtk.org/&quot;&gt;GTK&lt;/a&gt; toolkit. Despite the low version
number (0.2.0 was recently released) it&apos;s already quite usable though it still
has a few annoying limitations:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;When a user loads a document, the whole document appears with the background
colour of that user, making it impossible to see the text that user has typed
during the session.&lt;/li&gt;
&lt;li&gt;The Undo mechanism does not distinguish between local and remote edits. There
is no way (yet) to undo your actions without first undoing more recent
actions from other users.&lt;/li&gt;
&lt;li&gt;The networking implementation is still less than ideal, in particular, the
application freezes while trying to establish a connection.&lt;/li&gt;
&lt;li&gt;The carets and selections of other users are not visible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the upside, most of these limitations are likely to be fixed in the near
future, except multiple-caret and multiple-selection display that would require
a non-trivial amount of GTK programming.&lt;/p&gt;
&lt;p&gt;Most of the features you would expect are already there:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;Lock-less collaborative text editing that actually works, providing all three
of convergence, causality preservation and intention preservation.&lt;/li&gt;
&lt;li&gt;Each user is associated to a background colour that marks the text the user
has typed during the session.&lt;/li&gt;
&lt;li&gt;A built-in chat service.&lt;/li&gt;
&lt;li&gt;Syntax highlighting provided by the &lt;a class=&quot;reference&quot; href=&quot;http://gtksourceview.sourceforge.net/&quot;&gt;GtkSourceView&lt;/a&gt; widget.&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;reference&quot; href=&quot;http://www.zeroconf.org/&quot;&gt;Zeroconf&lt;/a&gt; networking using &lt;a class=&quot;reference&quot; href=&quot;http://www.porchdogsoft.com/products/howl/&quot;&gt;Howl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A sane build system, based on the &lt;a class=&quot;reference&quot; href=&quot;http://vipe.technion.ac.il/~shlomif/lecture/Autotools/&quot;&gt;GNU Autotools&lt;/a&gt; suite.&lt;/li&gt;
&lt;li&gt;Localisation support using &lt;a class=&quot;reference&quot; href=&quot;http://www.gnu.org/software/gettext/&quot;&gt;gettext&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My main issues with this project is that it is written in C++, which is not a
language I would be programming in for fun, and that it enforces a centralised
model. However, centralisation appears like a reasonable choice when you
consider the additional complexity involved by useful decentralisation.&lt;/p&gt;
&lt;/div&gt;</description>
  </item>
   </channel>
</rss>
