<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:html="http://www.w3.org/1999/html" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Ross Burton</title><link>http://www.burtonini.com/blog</link><description>A potted account of Ross' life</description><language>en</language><ttl>60</ttl><dc:creator>Ross Burton</dc:creator><admin:generatorAgent rdf:resource="http://pyblosxom.sourceforge.net/"/><admin:errorReportsTo rdf:resource="mailto:ross@burtonini.com"/><item><title>Tasks 0.9</title><guid isPermaLink="false">computers/tasks-2007-06-26-21-15</guid><link>http://www.burtonini.com/blog/computers/tasks-2007-06-26-21-15</link><description>After fixing a few bugs, cleaning up the source code, and even adding a few new features, Tasks 0.9 is ...</description><content:encoded><![CDATA[    <p>
      After fixing a few bugs, cleaning up the source code, and even adding a
      few new features, <a href="http://pimlico-project.org/tasks.html">Tasks
      0.9 is ready</a>.
    </p>
    <p>
      Most of the changes were internal, but there are a few user-visible
      changes.
    </p>
    <ul>
      <li>Show icon in the main task view when a task has a URL</li>
      <li>When clicking on the URL icons, start a web browser</li>
      <li>Revert the group when cancelling New Group</li>
      <li>Make the editor dialog two pane, with Notes on a seperate pane</li>
    </ul>
]]></content:encoded><category domain="http://www.burtonini.com">/computers</category><dc:date>2007-06-26T20:15:00Z</dc:date></item><item><title>GTK+ Is My Bitch</title><guid isPermaLink="false">computers/gtk-2007-06-26-13-40</guid><link>http://www.burtonini.com/blog/computers/gtk-2007-06-26-13-40</link><description>Thanks to some pointers from Kris, I've got some subtle new bling in Tasks. The core of the code is ...</description><content:encoded><![CDATA[    <p>
      Thanks to some pointers from Kris, I've got some subtle new bling in
      Tasks.  The core of the code is <a
      href="http://svn.o-hand.com/view/tasks/trunk/libkoto/koto-cell-renderer-pixbuf.c?view=markup">KotoCellRendererPixbuf</a>,
      a <tt>GtkCellRendererPixbuf</tt> subclass which implements the <tt>activate</tt>
      virtual method, so that it is clickable.  However because the other renderer in
      the column is not activatable (a text renderer), clicking on the row
      activates the pixbuf renderer.  A quick bit of logic in the activate
      virtual function to look at where was clicked solves this, and now Tasks
      shows clickable icons when a task has a URL set.
    </p>
    <p>
      <img src="http://burtonini.com/computing/screenshots/tasks-url.png"
        width="240" height="402" alt="Tasks"/>
    </p>
    <p>
      I particularly like how space for the icon isn't allocated in every row,
      so if there is no icon the text extends all the way across the view.
    </p>

    <p>
      <small>NP: <cite>The Herd</cite>, The Herd</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers</category><dc:date>2007-06-26T12:40:00Z</dc:date></item><item><title>For Sale: Babylon 5 DVDs</title><guid isPermaLink="false">life/b5-sale-2007-06-20-19-40</guid><link>http://www.burtonini.com/blog/life/b5-sale-2007-06-20-19-40</link><description>In the continuing effort to clear some space and pay some bills, I'm selling my collection of Babylon 5 DVDs. ...</description><content:encoded><![CDATA[    <p>
      In the continuing effort to clear some space and pay some bills, I'm
      selling my collection of Babylon 5 DVDs. I have the boxed sets of series 1
      through to 5, in great condition: they've been watched once and then put
      on the shelf, where they've stayed.
    </p>
    <p>
      Each series retails at &pound;57, I'm asking for &pound;90 for the
      complete set (plus shipping, or we meet in Cambridge or London for the
      cost of a beer).  If anyone is interested, <a
      href="mailto:ross@burtonini.com">please mail me</a>.
    </p>
    <p>
    <strong>Update:</strong> I've got a buyer!
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/life</category><dc:date>2007-06-20T18:40:00Z</dc:date></item><item><title>Sound Juicer Love Hour</title><guid isPermaLink="false">computers/sound-juicer/sj-love-2007-06-20-14-30</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-love-2007-06-20-14-30</link><description>Does anyone fancy hacking for an hour on a neat little feature for Sound Juicer, as a way of learning ...</description><content:encoded><![CDATA[    <p>
      Does anyone fancy hacking for an hour on a neat little feature for Sound
      Juicer, as a way of learning the code base a little?  This shouldn't take
      more than an hour or so, and would be good for the world.
    </p>
    <p>
      When Musicbrainz can't find the track listing for a CD, it automatically
      queries FreeDB and will attempt to return something from the garbled
      nonsense that FreeDB generally contains.  The user cannot tell the
      difference, unless they notice that the track listings are badly
      formatted, the album artist is incorrect, or the encoding is wrong.  The
      user will not notice any trivial issues, fix any obvious problems and then
      rip the CD, or just give up now if the encoding is wrong.
    </p>
    <p>
      This is bad.
    </p>
    <p>
      What should happen is that Sound Juicer should subtly point out to the
      user if the data is proxied from FreeDB, so that they can import it into
      MusicBrainz where more data can be added and verified.  What I'd like to
      see is a little pane appear if a CD is from FreeDB (SJ knows this already)
      with a link to the relevant import URL, so the user can quickly import it
      once for the benefit of everyone else who rips the album in the future.
    </p>
    <p>
      Does anyone fancy hacking this?  As I said, it sounds like an hour of
      coding for someone who can code GTK+ but hasn't touched SJ before.
    </p>

    <p>
      <small>NP: <cite>This Book Is About Words</cite>, Ahmad Szabo</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers/sound-juicer</category><dc:date>2007-06-20T13:30:00Z</dc:date></item><item><title>Hito Lives!</title><guid isPermaLink="false">computers/hito-2007-06-18-19-50</guid><link>http://www.burtonini.com/blog/computers/hito-2007-06-18-19-50</link><description>Hito is alive! I admit that the contact preview needs some work, there is some tasty code in Contacts I ...</description><content:encoded><![CDATA[    <p>
      Hito is alive!
    </p>
    <p>
      <img src="http://burtonini.com/computing/screenshots/hito-2.png" alt="Hito"/>
    </p>
    <p>
      I admit that the contact preview needs some work, there is some tasty code
      in Contacts I need to refactor.
    </p>
    <p>
      So, what is happening here?  The tree view is a <tt>HitoContactView</tt>,
      which subclasses <tt>GtkTreeView</tt>.  This displays the contents of a
      <tt>HitoContactStore</tt>, a subclass of <tt>GtkListStore</tt> which holds
      the <tt>EContacts</tt> from an <tt>EBookView</tt>.  In between the store
      and the view is a <tt>HitoContactFilterModel</tt>, which can filter both
      on groups (currently the most useful implementation is
      <tt>HitoCategoryGroup</tt>, which groups on the <tt>CATEGORY</tt> vCard
      field) and text, which does decomposed matches against the contact's name.
    </p>
    <p>
      The combo box is a <tt>HitoGroupCombo</tt>, which controls the group being
      filtered.  The entry is the only widget which isn't a subclass (yet), and
      controls the text being filtered.  The final bit of magic is
      <tt>HitoGroupStore</tt>, which collects categories from contacts and
      creates <tt>HitoCategoryGroups</tt> as required (this is used as the model
      for the combo).
    </p>
    <p>
      Now for the hard work of writing a usable preview widget, and the
      nightmare of a decent contact editor...
    </p>
    <p>
      <small>NP: <cite>Live At the Union Chapel</cite>, Damien Rice</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers</category><dc:date>2007-06-18T18:50:00Z</dc:date></item><item><title>Sound Juicer &quot;Little Bit Of Your Song In My Ear&quot; 2.19.2</title><guid isPermaLink="false">computers/sound-juicer/sj-2.19.2</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.19.2</link><description>Sound Juicer &quot;Little Bit Of Your Song In My Ear&quot; 2.19.2is out. Tarballs are available on burtonini.com , or from ...</description><content:encoded><![CDATA[    <p>
      Sound Juicer "Little Bit Of Your Song In My Ear" 2.19.2is out.
      Tarballs are available <a
      href="http://www.burtonini.com/computing/sound-juicer-2.19.2.tar.gz">on
      <tt>burtonini.com</tt></a>, or from the <a
        href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.19/">GNOME
        FTP servers</a>.
    </p>
    <ul>
      <li>Correctly read the album artist (#393707)</li>
      <li>Don't set empty track titles (#435964)</li>
      <li>Fix a11y on the play/pause button (#364371, Patrick Wade)</li>
    </ul>
]]></content:encoded><category domain="http://www.burtonini.com">/computers/sound-juicer</category><dc:date>2007-06-18T09:50:32Z</dc:date></item><item><title>Tasks 0.8</title><guid isPermaLink="false">computers/tasks-2007-06-14-14-20</guid><link>http://www.burtonini.com/blog/computers/tasks-2007-06-14-14-20</link><description>After all of the mad Tasks hacking that I did over the last few weeks, I thought it really was ...</description><content:encoded><![CDATA[    <p>
      After all of the mad Tasks hacking that I did over the last few weeks, I
      thought it really was time to make a release. So without much ado, here is
      <a href="http://pimlico-project.org/tasks.html">Tasks 0.8</a>.
    </p>
    <ul>
      <li>Allow filtering on uncategorised tasks (#370, thanks Andrey Tatarinov)</li>
      <li>Fix off-by-one in the window title when deleting tasks (#353)</li>
      <li>Display day names if the task is due in the next week</li>
      <li>Don't use properties that only exist in GTK+ 2.10</li>
      <li>Fix builds against Glib &lt; 2.10</li>
      <li>Add a label to the Category combo (#320)</li>
      <li>When editing a task, raise any existing windows (#350)</li>
      <li>Display a confirmation when deleting tasks from the editor (#351)</li>
      <li>Set the task editor title to the task summary (#349)</li>
    </ul>
    <p>
      Tarballs and packages for Etch, Edgy and Feisty are on <a
      href="http://debian.o-hand.com/">debian.o-hand.com</a>.  Packages for Sid
      are uploaded already.
    </p>
    <p>
      As a teaser, using the experience from working on both the Nokia
      addressbook and Tasks I've started working on a framework for the next
      generation of <a
      href="http://pimlico-project.org/contacts.html">Contacts</a>.  Large
      amounts of the code are from Tasks but with <tt>s/task/contact/g</tt>
      applied, and it works quite well already.
    </p>
    <p>
      <img src="http://burtonini.com/computing/screenshots/hito.png" alt="Hito screenshot" width="183" height="303"/>
    </p>
    <p>
      That is a view of my entire addressbook, filtered on the OpenedHand group.
      There is no widget to select groups yet, so you'll have to trust me that
      it's live!
    </p>
    <p>
      To anyone who noticed that not all of OpenedHand are in the list, and are
      wondering if I'm subtly dissing people: No I'm not. We have an internal
      LDAP server, so I stopped keeping my local addressbook up to date some
      time ago.
    </p>
    <p>
      <small>NP: <cite>What's Come Inside Of You?</cite>, Freescha</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers</category><dc:date>2007-06-14T13:20:00Z</dc:date></item><item><title>Postr 0.7</title><guid isPermaLink="false">computers/postr/postr-2007-06-13-11-30</guid><link>http://www.burtonini.com/blog/computers/postr/postr-2007-06-13-11-30</link><description>Postr 0.7 is out, fixing a couple of very nasty bugs. Don't silently stop uploading if no set was selected ...</description><content:encoded><![CDATA[    <p>
      Postr 0.7 is out, fixing a couple of very nasty bugs.
    </p>
    <ul>
      <li>Don't silently stop uploading if no set was selected</li>
      <li>Unquote URIs when accepting drags</li>
    </ul>
    <p>
      Tarballs at <a href="http://burtonini.com/computing/postr-0.7.tar.gz">the
      usual place</a>, packages heading towards Debian shortly.
    </p>
    <p>
      <small>NP: <cite>Flight 602</cite>, Aim</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers/postr</category><dc:date>2007-06-13T10:30:00Z</dc:date></item><item><title>Shock and Awe</title><guid isPermaLink="false">computers/shock-2007-06-12-21-58</guid><link>http://www.burtonini.com/blog/computers/shock-2007-06-12-21-58</link><description>From The Hacker's Guide To GPSD : The best way to avoid having dynamic-memory allocation problems is not to use ...</description><content:encoded><![CDATA[    <p>
      From <a href="http://gpsd.berlios.de/hacking.html">The Hacker's Guide To
      GPSD</a>:
    </p>
    <blockquote>
      <q>
        The best way to avoid having dynamic-memory allocation problems is not
        to use malloc/free at all.
      </q>
    </blockquote>
    <p>
      An interesting approach to avoiding dynamic memory problems which in
      general are not that hard to debug with good tools (such as Valgrind), especially in relatively simple pieces of code like gpsd.  However, in the next section:
    </p>
    <blockquote>
      <q>
        The parsing of GPGSV sentences in the NMEA driver has been a persistent
        and nasty trouble spot, causing more buffer overruns and weird secondary
        damage than all the rest of the code put together.
      </q>
    </blockquote>
    <p>
      Personally, I often find that not allocating buffers on the stack and
      using dynamically allocated memory with length-bounded functions helps fix
      buffer overruns.
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers</category><dc:date>2007-06-12T20:58:00Z</dc:date></item><item><title>Generating Random vCards</title><guid isPermaLink="false">computers/random-vcards-2007-06-06-15-00</guid><link>http://www.burtonini.com/blog/computers/random-vcards-2007-06-06-15-00</link><description>Again I found myself wanting a pile of realistic vCards to test with, and decided to write a decent and ...</description><content:encoded><![CDATA[    <p>
      Again I found myself wanting a pile of realistic vCards to test with, and
      decided to write a decent and extendable solution for once (instead of the
      hilarity of <a
      href="http://burtonini.com/bzr/eds-tests/dummy-ebook/e-book-backend-dummy.c">this</a>).
      A while ago I discovered <a
      href="http://code.google.com/p/barnum/">Barnum</a>, which can generate
      pseudo-realistic data by containing large data sets of names, street
      addresses, zip codes and credit card numbers.  I extended it a little,
      adding support for creating an email address from a given name (it looks
      weird when the contact's name is John Smith but the email is
      john.doe@bar.com) and generating birth dates, then wrote a tiny script to
      write valid vCards.  Et voil&agrave;:
    </p>
    <pre>$ ./gen_vcard.py 
BEGIN:VCARD
VERSION:3.0
UID:barnum-1107705517
FN:Caleb Barone
N:Barone;Caleb;;;
BDAY:1955-05-06
EMAIL;TYPE=WORK:cbarone@blanditvelit.eu
X-JABBER;TYPE=HOME:cbarone@eratdolore.eu
ADR;TYPE=HOME:;;8270 Kahlden Lane;Thompson;CT;06277;USA
END:VCARD</pre>
    <p>
      If this is useful to anyone else, you'll want <a
      href="http://code.google.com/p/barnum/">Barnum</a>, my patched <a
      href="http://burtonini.com/computing/gen_data.py">gen_data.py</a>, and <a
      href="http://burtonini.com/computing/gen_vcard.py">gen_vcard.py</a>.
    </p>
    <p>
      <small>NP: <cite>More Than Music</cite>, Murphin</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers</category><dc:date>2007-06-06T14:00:00Z</dc:date></item><item><title>Postr 0.6</title><guid isPermaLink="false">computers/postr/postr-2007-06-05-19-45</guid><link>http://www.burtonini.com/blog/computers/postr/postr-2007-06-05-19-45</link><description>Postr 0.6 is here! What is new I hear you ask. Well: Really parse embedded IPTC data Sweet new look ...</description><content:encoded><![CDATA[    <p>
      Postr 0.6 is here!  What is new I hear you ask.  Well:
    </p>
    <ul>
      <li>Really parse embedded IPTC data</li>
      <li>Sweet new look for the side bar (thanks Lucas Rocha)</li>
      <li>Ability to select a set to upload the pictures too</li>
      <li>New icon (thanks Andreas Nilsson)</li>
    </ul>
    <p>
      The tarball is <a
      href="http://burtonini.com/computing/postr-0.6.tar.gz">in the usual
      place</a>, and I'll make Debian packages shortly.
    </p>
    <p>
      <small>NP: <cite>Konfusion</cite>, Skalpel</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers/postr</category><dc:date>2007-06-05T18:45:00Z</dc:date></item><item><title>Sound Juicer Refactor: Testers Wanted</title><guid isPermaLink="false">computers/sound-juicer/sj-rewrite-2007-06-04-18-00</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-rewrite-2007-06-04-18-00</link><description>I've been slowly refactoring bits of Sound Juicer to make it more manageable and in the end usable with plugins, ...</description><content:encoded><![CDATA[    <p>
      I've been slowly refactoring bits of Sound Juicer to make it more
      manageable and in the end usable with plugins, and I'm ready to commit a
      chunk of refactoring back into Subversion.  However before I do so I'd
      appreciate it if some others would test the changes.  The changes are in
      <a href="http://burtonini.com/bzr/sj">this Bazaar repository</a>, branch,
      build and use it like you would any other Sound Juicer release.
    </p>
    <p>
      I've refactored the track store and view into separate objects, which
      meant that the spagehtti code that held the UI together had to be
      rewritten.  I think I tested all of the cases, but if someone could give
      it a go, and check that the buttons are correctly enabled and disabled as
      you select tracks, that the sorting is correct and so on, I'd be very
      happy.  Thanks!
    </p>

    <p>
      <small>NP: <cite>Live EP</cite>, Bonobo</small>
    </p>
]]></content:encoded><category domain="http://www.burtonini.com">/computers/sound-juicer</category><dc:date>2007-06-04T17:00:00Z</dc:date></item></channel></rss>