<?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>Asynchronous Flickr Library, version 0.3</title><guid isPermaLink="false">computers/postr/flickrpc-2008-11-11-21-50</guid><link>http://www.burtonini.com/blog/computers/postr/flickrpc-2008-11-11-21-50</link><description>Finally , Flickrpc 0.3 is released. Some nice features that we all know and love from Postr here: Proxy support ...</description><content:encoded><![CDATA[<p>
  <em>Finally</em>, Flickrpc 0.3 is released.  Some nice features that we all
  know and love from Postr here:
</p>
<ul>
  <li>Proxy support</li>
  <li>Add more upload arguments: safety, privacy, public/friends/private,
  search_hidden</li>
  <li>Cache the users full name, username and NSID (jcrosby)</li>
  <li>Fix UTF-8 encoding problems</li>
  <li>Verify our cached token before using it</li>
</ul>
<p>
  Grab a <a href="http://burtonini.com/computing/flickrpc-0.3.tgz">tarball
  here</a> or the <a href="http://burtonini.com/bzr/flickrpc">Bazaar tree
  here</a>.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/postr</category><dc:date>2008-11-11T21:50:00Z</dc:date></item><item><title>Sound Juicer &quot;Old Man Take A Look At My Life&quot; 2.25.1</title><guid isPermaLink="false">computers/sound-juicer/sj-2.25.1</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.25.1</link><description>Sound Juicer &quot;Old Man Take A Look At My Life&quot; 2.25.1 has been released. Tarballs are available on burtonini.com , ...</description><content:encoded><![CDATA[<p>
  Sound Juicer "Old Man Take A Look At My Life" 2.25.1 has been
  released.  Tarballs are
  available <a href="http://www.burtonini.com/computing/sound-juicer-2.25.1.tar.bz2">on
    <tt>burtonini.com</tt></a>, or from
  the <a href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.25/">GNOME
  FTP servers</a>.  Everyone's favourite Frockney did a huge amount of work on
  this, and I'm still talking to him after he admitted that the master plan is
  to replace Sound Juicer with Rhythmbox in Fedora!
</p>
<ul>
  <li>Chain the metadata lookups (Bastien Nocera)</li>
  <li>Finish the libmusicbrainz3 metadata fetcher (BN)</li>
  <li>Add a GVFS metadata fetcher as fallback (BN)</li>
  <li>Make libcdio option, as it breaks the GPL+Exception license (BN)</li>
  <li>Export ASIN, Discogs, Wikipedia in the internal metadata (BN)</li>
  <li>Lots of other cleanups to the metadata code (BN)</li>
  <li>Remove copy of the id3mux plugin, assume it exists now (BN)</li>
  <li>Remove Encoding field from desktop file (Pacho Ramos)</li>
  <li>Add Audio to desktop categories (Patryk Zawadzki)</li>
  <li>Correctly parse CDDA URLs (Matthew Martin)</li>
  <li>Don't free the option context</li>
</ul>

]]></content:encoded><category domain="http://www.burtonini.com">/sound-juicer</category><dc:date>2008-11-04T21:33:00Z</dc:date></item><item><title>OfflineIMAP, ConsoleKit, GNOME Keyring</title><guid isPermaLink="false">computers/offlineimap-2008-11-04-20-00</guid><link>http://www.burtonini.com/blog/computers/offlineimap-2008-11-04-20-00</link><description>Over the weekend I finally got fed up with Evolution struggling to connect to work's &quot;IMAP&quot; server (Exchange 2007), and ...</description><content:encoded><![CDATA[<p>
  Over the weekend I finally got fed up with Evolution struggling to connect to
  work's "IMAP" server (Exchange 2007), and switched to using OfflineIMAP to
  sync the mail to a local Maildir.  This as expected worked pretty well, and
  I'm now hidden from the nasty lag on the server.  However, I've had to write
  my top secret Intel password into <tt>.offlineimaprc</tt>, which sucks.  Then
  I had a cunning plan...
</p>
<p>
  GNOME Keyring will store passwords in a pretty secure manner, so somehow I
  need to fetch the password from there.  A quick look at the OfflineIMAP manual
  revealed that I can write Python functions which return the password, so I
  should be abe to hook into the keyring from OfflineIMAP.  This should be
  fairly simple:
</p>
<pre>import gobject, gnomekeyring

# The keyring needs to know the application name
if gobject.get_application_name() is None:
  gobject.set_application_name("offlineimap")

def keyring(user, host):
  keys = gnomekeyring.find_network_password_sync(user=user, server=host, protocol="imap")
  # First one will do nicely thanks
  return keys[0]["password"]
...
remotepasseval = keyring("rburton", "imapmail.intel.com")
</pre>
<p>
  After writing
  a <a href="http://burtonini.com/bzr/keyring-utils/set-password.py">small
  tool</a> to add the key to the keyring, to my surprise this worked first time.
  I bounced with glee, but ten minutes later I had error messages from
  OfflineIMAP running from cron in my inbox...
</p>
<p>
  GNOME Keyring uses an environment variable to find the daemon, which isn't set
  in a cron environment. GNOME Keyring will fall back to using DBus to find the
  daemon, but the DBus session bus environment variable isn't set.  DBus will
  fall back to reading the session bus address from the X root window, but
  DISPLAY isn't set so that doesn't work either...  EPIC FAIL.
</p>
<p>
  But, I thought, I upgraded to Network Manager 0.7 last week which bought in
  ConsoleKit.  If I ask ConsoleKit for my sessions I should be able to find a
  session with has an X connection, then I can set DISPLAY appropriately and
  then the chain described above will work, and I'll have my password.
  Shockingly, this worked first time too:
</p>
<pre>import dbus, os
if not os.getenv("DISPLAY"):
  # Get the ConsoleKit manager
  bus = dbus.SystemBus()
  manager_obj = bus.get_object('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager')
  manager = dbus.Interface(manager_obj, 'org.freedesktop.ConsoleKit.Manager')
  
  # For each of my sessions..
  for ssid in manager.GetSessionsForUnixUser(os.getuid()):
    obj = bus.get_object('org.freedesktop.ConsoleKit', ssid)
    session = dbus.Interface(obj, 'org.freedesktop.ConsoleKit.Session')
    # Get the X11 display name
    dpy = session.GetX11Display()
    if dpy:
      # If we have a display, set the environment variable
      os.putenv("DISPLAY", dpy);
      break</pre>
<p>
  (man, I really with python-dbus had a better syntax for getting objects with a specific interface)
</p>
<p>
  So there you go, integrating OfflineIMAP with the GNOME Keyring via ConsoleKit
  and DBus. Surprisingly this was pretty easy to do, thanks to DBus and the
  magic provided by ConsoleKit it is 100% hack free.
</p>
]]></content:encoded><dc:date>2008-11-04T20:00:00Z</dc:date></item><item><title>Tasks In GNOME SVN</title><guid isPermaLink="false">computers/tasks-2008-10-17-20-15</guid><link>http://www.burtonini.com/blog/computers/tasks-2008-10-17-20-15</link><description>Thanks to the heroic work of Olav and Thomas, Tasks (along with Contacts and Dates) is now in GNOME SVN. ...</description><content:encoded><![CDATA[<p>
  Thanks to the heroic work of Olav and Thomas, Tasks (along with Contacts and
  Dates) is now in GNOME SVN.  Translators, feel free to do your thing.  Oh, and
  would it be possible to get Tasks added to Damned Lies?
</p>
]]></content:encoded><dc:date>2008-10-17T19:15:00Z</dc:date></item><item><title>Translation Nightmare</title><guid isPermaLink="false">computers/tasks-2008-10-01-21-17</guid><link>http://www.burtonini.com/blog/computers/tasks-2008-10-01-21-17</link><description>I just got a new bug titled Very weird translation template, need comments in .pot file to clarify , and ...</description><content:encoded><![CDATA[<p>
  I just got a new bug titled <cite>Very weird translation template, need
  comments in .pot file to clarify</cite>, and giggled to myself.  I was
  wondering how long it would be for this bug to be filed.  The problem is that
  whilst most of the translatable strings in Tasks are pretty boring: "Tasks",
  "today", "Priority" and so on, all of a sudden the template goes a bit mental:
</p>
<pre>"^(?&lt;task&gt;.+) (?:by|due|on)? (?&lt;month&gt;\\w+) (?&lt;day&gt;\\d{1,2})(?:st|nd|rd|th)?$"</pre>
<p>
  Apparently the average translator doesn't think that learning PCRE-style
  regular expressions, and reading the source that uses this string to understand
  how it is to be used, is appropriate. [note: this is sarcasm]
</p>
<p>
  Maybe I should have added some translator comments to clarify exactly what I
  meant by this.  These monster strings (all in <tt>koto-date-parser.c</tt>)
  are <tt>GRegex</tt> regular expressions which are used to parse the user's
  input to try and extract meaningful date information.  To translate these
  strings you'll need to have a basic understanding of regular expressions: if
  you don't then skip them and hopefully someone who does will finish the
  translation.  If you know regular expressions then translating these strings
  is easy, honest.
</p>
<p>
  The golden rule is to never translate the words which look like
  this: <tt>(?&lt;foo&gt;</tt>.  These are markers which identify portions of
  the input (such as task or month) and need to remain in English, although they
  can be moved around if required.  The rest of the strings are translatable.
  I'll give an example using the French translation by St&eacute;phane
  Raimbault.  First, the string in English and a worked example:
</p>
<pre>"^(?&lt;task&gt;.+) (?:by|due|on)? (?&lt;day&gt;\\d{1,2})(?:st|nd|rd|th)? (?&lt;month&gt;\\w+)$"</pre>
<p>
  First, we have a sequence of any characters identified
  as <tt>task</tt>, which magically expands to be as many as possible.  This is
  optionally followed by one of the words "by", "due" or "on".  This is followed
  by one or two digits identified as <tt>day</tt> followed by "st", "nd", "rd"
  or "th".  Finally a sequence of characters which is identified
  as <tt>month</tt>.  If the user had entered "pay
  bills on 2nd june" then <tt>task</tt> would be "pay bills", <tt>day</tt> would
  be "2", and <tt>month</tt> would be "june".  Tasks can then turn "june" into a
  month number through other translations, and it now knows what date the user
  entered.   In French, this translates as follows:
</p>
<pre>"^(?&lt;task&gt;.+) (?:pour|prévu|pour le)? (?&lt;day&gt;\\d{1,2})(?:er|e)? (?&lt;month&gt;\\w+)$"</pre>
<p>
  See, I said it was easy!  All I need now is a legion of translators who
  understand regular expressions enough to correctly translate the new Tasks... [this, again, is sarcasm]
  Luckily, plans are afoot to move the Tasks source to the GNOME Subversion
  server, so the full fury of the GNOME translation team can attack this.
</p>

<p>
  <small>NP: <cite>Trailer Park</cite>, Beth Orton</small>
</p>
]]></content:encoded><dc:date>2008-10-01T20:17:00Z</dc:date></item><item><title>Tasks 0.14</title><guid isPermaLink="false">computers/tasks-2008-09-29-08-45</guid><link>http://www.burtonini.com/blog/computers/tasks-2008-09-29-08-45</link><description>It's been nearly 10 months after the previous Tasks release, for which I profusely apologise. I wanted to fix one ...</description><content:encoded><![CDATA[<p>
  It's been nearly 10 months after the previous Tasks release, for which I
  profusely apologise.  I wanted to fix one final bug before releasing, which
  sadly took five months to get around too...  I eventually fixed it last night,
  so here is <a href="http://pimlico-project.org/tasks.html">Tasks 0.14</a>.
</p>
<ul>
  <li>Magic date parser when adding tasks</li>
  <li>Support libunique in the GTK+ port (Jonny Lamb)</li>
  <li>Support OWL window menus in the GTK+ port</li>
  <li>Save and restore the edit window size</li>
  <li>Add a clickable note icon (#548)</li>
  <li>Ellipsize the undo/redo menu items (#741)</li>
  <li>Make sure the date popup doesn't go off the screen (#752)</li>
</ul>
<p>
  The most interesting change in this release is the magic date parser, which
  first landed back in March.  This lets you use <cite>Google Calendar</cite>
  style descriptive tasks such as "release tasks today", "do shopping next
  tuesday" or "pay bills on 2nd". There are many patterns that are matched but
  I need two things from any users of Tasks.
</p>
<ol>
  <li>
    Translations.  At the moment there are only English and French translations
    for the strings, which are critical for the parser to work.  Translators,
    please update the translations!
  </li>
  <li>
    Feedback. The parser handles all of the natural language expressions that I
    thought would be useful.  There are probably plenty more which are not
    handled, so if you find one which isn't handled (or is handled incorrectly)
    then please <a href="http://bugzilla.openedhand.com">file a bug</a>.
  </li>
</ol>
<p>
  Oh, and one last thing.  The OpenMoko and Maemo ports have likely bitrotted.
  New functionality has been added to the platform abstraction and I don't think
  those ports were updated.  If someone actively uses Tasks on either Maemo or
  OpenMoko and is willing to test builds before release,
  please <a href="mailto:ross@burtonini.com">contact me</a>.
</p>
]]></content:encoded><dc:date>2008-09-29T07:45:00Z</dc:date></item><item><title>Sound Juicer &quot;Why Should You Know Better By Now&quot; 2.24.0</title><guid isPermaLink="false">computers/sound-juicer/sj-2.24.0</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.24.0</link><description>Sound Juicer &quot;Why Should You Know Better By Now&quot; 2.24.0 has been released. Tarballs are available on burtonini.com , or ...</description><content:encoded><![CDATA[<p>
  Sound Juicer "Why Should You Know Better By Now" 2.24.0 has been
  released.  Tarballs are
  available <a href="http://www.burtonini.com/computing/sound-juicer-2.24.0.tar.bz2">on
    <tt>burtonini.com</tt></a>, or from
  the <a href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.24/">GNOME
  FTP servers</a>.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/sound-juicer</category><dc:date>2008-09-21T12:41:41Z</dc:date></item><item><title>Sound Juicer &quot;Stab Stab Stab! This Is More Than A Message&quot; 2.23.3</title><guid isPermaLink="false">computers/sound-juicer/sj-2.23.3</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.23.3</link><description>Sound Juicer &quot;Stab Stab Stab! This Is More Than A Message&quot; 2.23.3 has been released. Tarballs are available on burtonini.com ...</description><content:encoded><![CDATA[<p>
  Sound Juicer "Stab Stab Stab! This Is More Than A Message" 2.23.3 has been
  released.  Tarballs are
  available <a href="http://www.burtonini.com/computing/sound-juicer-2.23.3.tar.bz2">on
    <tt>burtonini.com</tt></a>, or from
  the <a href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.23/">GNOME
  FTP servers</a>.
</p>
<ul>
  <li>Don't crash when exiting</li>
  <li>Don't distribute full GFDL with docs</li>
  <li>Correctly parse CDDA URLs (#550131, thanks Matthew Martin)</li>
</ul>
]]></content:encoded><category domain="http://www.burtonini.com">/sound-juicer</category><dc:date>2008-09-08T10:01:01Z</dc:date></item><item><title>Sound Juicer &quot;I Don't Know What You Heard But It's Mandatory&quot; 2.23.2</title><guid isPermaLink="false">computers/sound-juicer/sj-2.23.2</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.23.2</link><description>Sound Juicer &quot;I Don't Know What You Heard But It's Mandatory&quot; 2.23.2 has been released. Tarballs are available on burtonini.com ...</description><content:encoded><![CDATA[<p>
  Sound Juicer "I Don't Know What You Heard But It's Mandatory" 2.23.2 has been
  released.  Tarballs are
  available <a href="http://www.burtonini.com/computing/sound-juicer-2.23.2.tar.bz2">on
    <tt>burtonini.com</tt></a>, or from
  the <a href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.23/">GNOME
  FTP servers</a>.  Lots of fixes from the Amazing Matthew Martin:
</p>
<ul>
  <li>Stop playback when the disc is re-read (Matthew Martin)</li>
  <li>Only eject the disc if tracks were ripped (MM)</li>
  <li>Don't try and move the non-existant temp file when skipping (MM)</li>
  <li>Free the option context (Pierre Benz)</li>
  <li>Don't block until n-c-b quits when copying discs</li>
  <li>Fix playback track switching (MM)</li>
</ul>

]]></content:encoded><category domain="http://www.burtonini.com">/sound-juicer</category><dc:date>2008-08-18T13:59:53Z</dc:date></item><item><title>Sound Juicer &quot;We're Singing In Tune But Now It's Over&quot; 2.23.1</title><guid isPermaLink="false">computers/sound-juicer/sj-2.23.1</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.23.1</link><description>Sound Juicer &quot;We're Singing In Tune But Now It's Over&quot; 2.23.1 has been released. Tarballs are available on burtonini.com , ...</description><content:encoded><![CDATA[<p>
  Sound Juicer "We're Singing In Tune But Now It's Over" 2.23.1 has been released.  Tarballs
  are available <a href="http://www.burtonini.com/computing/sound-juicer-2.23.1.tar.bz2">on
    <tt>burtonini.com</tt></a>, or from
  the <a href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.23/">GNOME
  FTP servers</a>.  Nothing that amazing here, sorry:
</p>
<ul>
  <li>Fix play+pause+play (#523182, thanks Matthew Martin)</li>
  <li>Add %ay, album year (#522909, Juan F. Giménez Silva)</li>
</ul>
]]></content:encoded><category domain="http://www.burtonini.com">/sound-juicer</category><dc:date>2008-08-04T19:33:17Z</dc:date></item><item><title>GUADEC</title><guid isPermaLink="false">computers/guadec-2008-07-29-21-40</guid><link>http://www.burtonini.com/blog/computers/guadec-2008-07-29-21-40</link><description>Hmm, so I never did blog a GUADEC roundup. In two words: it rocked. Congratulations to Baris and everyone else ...</description><content:encoded><![CDATA[<p>
  Hmm, so I never did blog a GUADEC roundup.  In two words: it rocked.
  Congratulations to Baris and everyone else who organised it!
</p>
<p>
  In other late GUADEC news I finally reviewed the rest of my GUADEC photos and
  <a href="http://www.flickr.com/photos/rossburton/sets/72157606166808992/">uploaded
  them to Flickr</a>.  I'll try and not take a month to upload next time,
  honest!
</p>
]]></content:encoded><dc:date>2008-07-29T20:40:00Z</dc:date></item><item><title>OH Wares</title><guid isPermaLink="false">computers/oh-wares-2008-07-11-14-14</guid><link>http://www.burtonini.com/blog/computers/oh-wares-2008-07-11-14-14</link><description>I've just been informed that Rob Bradford has one large &quot;I3&lt;OH&quot; left. If you want one, then find him fast! ...</description><content:encoded><![CDATA[<p>
  I've just been informed that Rob Bradford has <em>one</em> large "I3&lt;OH"
  left.  If you want one, then find him fast!  The grapevine also says that
  there is a crack team of
  rouge <a href="http://o-hand.com/2008/05/09/ohmen-arrived/">OH Men</a> on the
  loose, so watch out!
</p>
]]></content:encoded><dc:date>2008-07-11T13:14:00Z</dc:date></item><item><title>GUPnP Action</title><guid isPermaLink="false">computers/gupnp-2008-06-30-14-00</guid><link>http://www.burtonini.com/blog/computers/gupnp-2008-06-30-14-00</link><description>Action around GUPnP has been really hotting up recently. Jorn is back from the dead studying and demonstrating that he ...</description><content:encoded><![CDATA[<p>
  Action around GUPnP has been really hotting up recently.  Jorn is back
  from <strike>the dead</strike> studying and demonstrating that he hasn't lost
  his touch by refactoring the various audio/visual widgets spread around our
  toy projects
  into <a href="http://svn.o-hand.com/repos/misc/trunk/libowl-av/">libowl-av</a>,
  adding Vala bindings, and then writing
  a <a href="http://svn.o-hand.com/repos/gupnp/trunk/gupnp-media-renderer/">MediaRenderer</a>
  implementation on top of that.  This means we now have reference
  implementations of the full media specification in the form of
  gupnp-media-server (server), gupnp-av-cp (control), and gupnp-media-renderer
  (playback).
</p>
<p>
  Also Johan Kristell posted to the list for the first time with an
  implementation of
  the <a href="http://www.upnp.org/standardizeddcps/digitalsecuritycamera.asp">Digital
  Security Camera specifications</a>, both server and
  client.  <a href="http://www.kristell.se/network-camera/">GUPnP Network
  Camera</a> currently only supports still images, but as it is based on
  GStreamer video can't be far away.
</p>
]]></content:encoded><dc:date>2008-06-30T13:00:00Z</dc:date></item><item><title>Erm...</title><guid isPermaLink="false">computers/fail-2008-06-23-18-00</guid><link>http://www.burtonini.com/blog/computers/fail-2008-06-23-18-00</link><description>case &quot;$1&quot; in *.sh) # Source shell script for speed. ( trap - INT QUIT TSTP scriptname=$1 shift . $scriptname ...</description><content:encoded><![CDATA[<pre>case "$1" in
        *.sh)
                # Source shell script for speed.
                (
                        trap - INT QUIT TSTP
                        scriptname=$1
                        shift
                        . $scriptname
                )
                ;;
        *)
                "$@"
                ;;
  esac</pre>
<p>
  OPTIMISATION FAIL.
</p>
<p>
  <small>NP: <cite>Roseland NYC Live</cite>, Portishead</small>
</p>
]]></content:encoded><dc:date>2008-06-23T17:00:00Z</dc:date></item><item><title>Zebu 0.1</title><guid isPermaLink="false">computers/zebu-2008-06-22-14-20</guid><link>http://www.burtonini.com/blog/computers/zebu-2008-06-22-14-20</link><description>As one of the maintainers of debian.o-hand.com I use the always wonderful pbuilder and cowbuilder to rebuild packages originally build ...</description><content:encoded><![CDATA[<p>
  As one of the maintainers
  of <a href="http://debian.o-hand.com/">debian.o-hand.com</a> I use the always
  wonderful <tt>pbuilder</tt> and <tt>cowbuilder</tt> to rebuild packages
  originally build for Debian Sid for Debian Etch, Ubuntu Gutsy, Hardy, and so
  on.  Continually typing the commands to update the cowbuilders can get
  tiresome fast so last week I scratched the itch and
  produced <cite>Zebu</cite>.
</p>
<p>
  <img src="http://burtonini.com/computing/screenshots/zebu-0.1.png" alt="Zebu"/>
</p>
<p>
  As of version 0.1 it is barely functional but it does let you update or login
  to a cowbuilder.  It requires that the cowbuilders are
  named <tt>/var/cache/pbuilder/*.cow</tt> and doesn't support "traditional"
  pbuilder rootstraps yet, but that is planned.  Anyway, cowbuilders are the
  future.
</p>
<p>
  If anyone else thinks this could be useful there is
  a <a href="http://burtonini.com/computing/zebu-0.1.tar.gz">tarball</a> and
  a <a href="http://burtonini.com/bzr/zebu">Bazaar repository</a>.  I must also
  thank the wonderful Ulisse Perusin for the rocking icon he created.
</p>
<p>
  <small>NP: <cite>Cosmos</cite>, Murcof</small>
</p>
]]></content:encoded><dc:date>2008-06-22T13:20:00Z</dc:date></item><item><title>Wanted: Icon</title><guid isPermaLink="false">computers/wanted-icon-2008-06-18-09-40</guid><link>http://www.burtonini.com/blog/computers/wanted-icon-2008-06-18-09-40</link><description>I'm hacking on a small tool at the moment and need an icon for the launcher. A simple icon of ...</description><content:encoded><![CDATA[<p>
  I'm hacking on a small tool at the moment and need an icon for the launcher.
  A simple icon of a cow's head would be perfect: anyone know of something like
  this, or willing to quickly draw one for me?
</p>
]]></content:encoded><dc:date>2008-06-18T08:40:00Z</dc:date></item><item><title>Postr 0.12.2</title><guid isPermaLink="false">computers/postr/postr-2008-06-15-15-10</guid><link>http://www.burtonini.com/blog/computers/postr/postr-2008-06-15-15-10</link><description>Another point release of Postr which should fix Flickr authentication for good this time. Also the file size limit has ...</description><content:encoded><![CDATA[<p>
  Another point release
  of <a href="http://burtonini.com/blog/computers/postr">Postr</a> which should
  fix Flickr authentication for good this time.  Also the file size limit has
  been increased to 20Mb to match the new Flickr limits.
</p>
<p>
  The <a href="http://burtonini.com/computing/postr-0.12.2.tar.gz">tarball is
    here</a>, and packages for Debian are being worked on next.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/postr</category><dc:date>2008-06-15T14:10:00Z</dc:date></item><item><title>UPnP in Epiphany</title><guid isPermaLink="false">computers/gupnp-ephy-2008-06-12-22-10</guid><link>http://www.burtonini.com/blog/computers/gupnp-ephy-2008-06-12-22-10</link><description>One of the more useful features of the UPnP specification is that devices have a standard way of specifying a ...</description><content:encoded><![CDATA[<p>
  One of the more useful features of the UPnP specification is that devices have
  a standard way of specifying a "presentation URL", a human-readable web page
  representing the device.  For example, my SoundBridge has a web page which
  shows the currently playing music and lets me switch radio station, whilst my
  router's presentation URL is the administration page.
</p>
<p>
  Useful, but not exposed anywhere.  Until now...
</p>
<p>
  <img src="http://burtonini.com/computing/screenshots/ephy-upnp.png" alt="GUPnP in Epiphany" width="609" height="400"/>
</p>
<p>
  This is a small Epiphany extension which adds all presentation URLs it finds
  to the <cite>Nearby Sites</cite> menu, just like the URLs discovered using
  Avahi.  It needs a bit more work as it doesn't yet handle being unloaded or
  devices disappearing, but it is certainly usable now.
</p>
<p>
  If anyone else wants to have a go with it, the source can be fetched using
  Bazaar from <a href="http://burtonini.com/bzr/ephy-gupnp/">here</a>.  Watch
  out for the currently hard-coded paths...
</p>
]]></content:encoded><dc:date>2008-06-12T21:10:00Z</dc:date></item><item><title>GUPnP Documentation</title><guid isPermaLink="false">computers/gupnp-2008-06-10-17-15</guid><link>http://www.burtonini.com/blog/computers/gupnp-2008-06-10-17-15</link><description>What started off as a quick tutorial to writing a service using GUPnP turned into a week of reviewing and ...</description><content:encoded><![CDATA[<p>
  What started off as a quick tutorial to writing a service using GUPnP turned
  into a week of reviewing and writing more GUPnP documentation.  It's all
  landed in our Subversion repository now but if anyone wants to see how to
  write
  a <a href="http://burtonini.com/computing/gupnp-docs/client-tutorial.html">UPnP
  client</a>, <a href="http://burtonini.com/computing/gupnp-docs/server-tutorial.html">implement
  the UPnP networked light bulb service</a>, or just browse the beginnings
  of the <a href="http://burtonini.com/computing/gupnp-docs/glossary.html">glossary</a>, then I have a local copy of
  the <a href="http://burtonini.com/computing/gupnp-docs/">latest documentation
  online</a>.
</p>

<p>
  <small>NP: <cite>Aerial</cite>, 2562</small>
</p>
]]></content:encoded><dc:date>2008-06-10T16:15:00Z</dc:date></item><item><title>Sound Juicer &quot;Harder Now With Higher Speed&quot; 2.23.0</title><guid isPermaLink="false">computers/sound-juicer/sj-2.23.0</guid><link>http://www.burtonini.com/blog/computers/sound-juicer/sj-2.23.0</link><description>Sound Juicer &quot;Harder Now With Higher Speed&quot; 2.23.0 has finally been released.. Tarballs are available on burtonini.com , or from ...</description><content:encoded><![CDATA[<p>
  Sound Juicer "Harder Now With Higher Speed" 2.23.0 has finally been released..  Tarballs
  are available <a href="http://www.burtonini.com/computing/sound-juicer-2.23.0.tar.bz2">on
    <tt>burtonini.com</tt></a>, or from
  the <a href="ftp://ftp.gnome.org/pub/gnome/sources/sound-juicer/2.23/">GNOME
  FTP servers</a>.  Hot new features!
</p>
<ul>
  <li>Port to GIO (Michael Terry)</li>
  <li>Update URL handling for New GIO World Order (Bastien Nocera)</li>
  <li>Fix display problems with the cluebar (Pekka Vuorela)</li>
  <li>Add audio preview when overwriting (Luca Cavalli)</li>
  <li>Use GtkVolmeButton instead of BaconVolume (MT)</li>
  <li>Fix crash when no profile is selected (Matthew Martin)</li>
  <li>Add []&lt;&gt; to the special character list (MM)</li>
  <li>Make the year and disc entries a11y (Patrick Wade)</li>
  <li>Fix error handling in CD playback (Tim-Philipp Müller)</li>
  <li>Require intltool 0.40</li>
</ul>
<p>
  I really need some heavy testing on the GIO rewrite, so please try and extract
  tracks to as many different targets as possible.  Although I expect
  confirmation that using an unmounted remote location currently fails, it
  should be possible to use this to write to Samba, OBEX-FTP, and so on.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/sound-juicer</category><dc:date>2008-06-05T12:34:03Z</dc:date></item><item><title>Postr 0.12.1</title><guid isPermaLink="false">computers/postr/postr-2008-05-27-10-00</guid><link>http://www.burtonini.com/blog/computers/postr/postr-2008-05-27-10-00</link><description>I just made a quick Postr 0.12.1 release to fix authentication with non-trivial HTTP handler strings. If you can't login ...</description><content:encoded><![CDATA[<p>
  I just made a quick Postr 0.12.1 release to fix authentication with
  non-trivial HTTP handler strings.  If you can't login to Flickr with Postr,
  then this release <em>should</em> fix it for you.
</p>
<p>
  The <a href="http://burtonini.com/computing/postr-0.12.1.tar.gz">tarball is
    here</a>, and packages for Debian are being built now.
</p>
<p>
  In other news postr.dev has seen a lot of development and is looking pretty
  damn neat at the moment.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/postr</category><dc:date>2008-05-27T09:00:00Z</dc:date></item><item><title>GUPnP Bindings Generation</title><guid isPermaLink="false">computers/gupnp-binding-2008-05-23-16-40</guid><link>http://www.burtonini.com/blog/computers/gupnp-binding-2008-05-23-16-40</link><description>I've now finished the first draft of the bindings generation tool for GUPnP, which is now part of libgupnp itself. ...</description><content:encoded><![CDATA[<p>
  I've now finished the first draft of the bindings generation tool for GUPnP,
  which is now part of <tt>libgupnp</tt> itself.  I've added both blocking and
  non-blocking wrappers, so if you wanted to get the external IP there is the
  choice of this for blocking calls:
</p>
<pre>char *ip;
GetExternalIPAddress (proxy, &amp;ip, &amp;error);</pre>
<p>
  Or this for non-blocking calls:
</p>
<pre>static void
external_ip_cb (GUPnPServiceProxy *proxy, char * ip,
                GError *error, gpointer userdata)
{
  // ...
}
...
  GetExternalIPAddress_async (proxy, external_ip_cb, NULL);</pre>
<p>
  I've ported my test applications to use the bindings, which are available in
  <a href="http://burtonini.com/bzr/gupnp-demos">this Bazaar repository</a>.  It
  appears to work quite well, I just need to test it against all of the official
  service descriptions and add a few small features.
</p>
]]></content:encoded><dc:date>2008-05-23T15:40:00Z</dc:date></item><item><title>GUPnP Autogeneration</title><guid isPermaLink="false">computers/upnp-gen-2008-05-22-16-25</guid><link>http://www.burtonini.com/blog/computers/upnp-gen-2008-05-22-16-25</link><description>The problem with GUPnP is that (like DBus) when programming from C you need to specify the types of each ...</description><content:encoded><![CDATA[<p>
  The problem with GUPnP is that (like DBus) when programming from C you need to
  specify the types of each argument when making a method call:
</p>
<pre>gupnp_service_proxy_send_action (proxy,
                                   "AddPortMapping", &amp;error,
                                   /* In arguments */
                                   "NewRemoteHost", G_TYPE_STRING, "",
                                   "NewExternalPort", G_TYPE_UINT, external_port,
                                   "NewProtocol", G_TYPE_STRING, "TCP",
                                   "NewInternalPort", G_TYPE_UINT, internal_port,
                                   "NewInternalClient", G_TYPE_STRING, internal_host,
                                   "NewEnabled", G_TYPE_BOOLEAN, TRUE,
                                   "NewPortMappingDescription", G_TYPE_STRING, desc,
                                   "NewLeaseDuration", G_TYPE_UINT, 0,
                                   NULL,
                                   /* Out arguments */
                                   NULL);</pre>
<p>
  Now, that really is quite tiresome.  It basically means that you need to have
  the service reference to hand when coding, because you need to know the name
  and type of each argument. Luckily for DBus part of <tt>dbus-glib</tt> is a
  binding tool which can create type-safe wrappers so that making method calls
  is much easier.  Wouldn't it be nice if there was something similar for GUPnP,
  which generated inline functions with prototypes like this:
</p>
<pre>static inline gboolean
AddPortMapping (GUPnPServiceProxy *proxy,
                char * in_NewRemoteHost,
                unsigned int in_NewExternalPort,
                char * in_NewProtocol,
                unsigned int in_NewInternalPort,
                char * in_NewInternalClient,
                gboolean in_NewEnabled,
                char * in_NewPortMappingDescription,
                unsigned int in_NewLeaseDuration,
                GError **error);</pre>
<p>
  Well, now there is.  I've put
  the <a href="http://burtonini.com/computing/gupnp-bind.py">initial code
  here</a> but will be moving this into GUPnP itself shortly.  The next task is
  to add asynchronous wrappers just as in dbus-glib, but that shouldn't be too
  hard.
</p>
]]></content:encoded><dc:date>2008-05-22T15:25:00Z</dc:date></item><item><title>Anjuta+Poky Integration</title><guid isPermaLink="false">computers/anjuta-2008-05-20-17-40</guid><link>http://www.burtonini.com/blog/computers/anjuta-2008-05-20-17-40</link><description>Yesterday I tested and rolled a new release of the Poky integration plugin for Anjuta , created by our fearless ...</description><content:encoded><![CDATA[<p>
  Yesterday I tested and rolled a new release of
  the <a href="http://labs.o-hand.com/anjuta-poky-sdk-plugin/">Poky
    integration plugin for Anjuta</a>, created by our
  fearless <a href="http://www.robster.org.uk/">Sir Bradford</a>.  This is a
  very special piece of magic which lets you use a Poky SDK in Anjuta to
  cross-compile binaries without any pain, and will even deploy, execute and
  debug the binaries in a QEMU for testing. As part of the release process I
  had to test it, so I'll step through what I did as a brief tutorial on how
  to use Anjuta with Poky.
</p>
<p>
  The prerequisites are Anjuta, the Anjuta Poky SDK plugin, and QEMU.  These are
  all available for installation from
  our <a href="http://debian.o-hand.com">Debian repository</a> for Debian/Ubuntu
  users, everyone else will have to build from source, sorry!  You'll also need
  a Poky ARM SDK and QEMU ARM images from
  the <a href="http://pokylinux.org">Poky</a> web site.  The SDK is a tarball
  which contains a cross compiler with base libraries (glibc, GTK+, and so on)
  and should be extracted onto your machine (it extracts the SDK
  into <tt>/usr/local/poky</tt>).  The QEMU image consists of a kernel and
  a <tt>ext3</tt> file system which will boot Poky inside QEMU.
</p>
<p>
  To start I fetched a checkout
  of <a href="http://pimlico-project.org/tasks.html">Tasks</a> and loaded up
  Anjuta.  I don't have an existing Anjuta project for Tasks, so I used
  <cite>File &rarr; New &rarr; Project From Existing Sources</cite> to create a project using
  the checkout.  At this point I could do native development using
  <cite>Build &rarr; Run Configure</cite> and <cite>Build &rarr; Build
    Project</cite> to configure and compile the source, but we want to
  cross-compile.
</p>
<p>
  To activate cross compiling go to <cite>Edit &rarr; Preferences &rarr; General
    &rarr; Installed Plugins</cite> and enable the <cite>Poky SDK</cite> plugin.
  This will add a new page <cite>Poky SDK</cite> to the preferences dialog.
  We're using an external toolchain so set the SDK root
  to <tt>/usr/local/poky/eabi-glibc/arm</tt> and the toolchain triplet
  to <tt>arm-poky-linux-gnueabi</tt>.  We're also using QEMU instead of a real
  device so set the paths to the kernel and root filesystem (remembering to
  uncompress the filesystem).  We're now done configuring, so the preferences
  dialog can be closed.  However notice that if you switch from using a SDK to
  building with a full Poky tree you can use the cross-compiler it produces
  directly, and you can also use an external device instead of QEMU: the only
  requirement is that you can SSH into it.
</p>
<p>
  Now to do the build.  Use <cite>Build &rarr; Run Configure</cite> to configure
  Tasks, passing any extra options you want.  Note that if you want to debug
  your build in the future you'll need to enter <tt>CFLAGS=-g</tt> here to
  disable optimisation (autoconf sets <tt>-O2 -g</tt> by default, which isn't
  useful for debugging).  The configure script is then ran with the right
  environment and options for cross compiling, and with any luck will
  successfully configure.  Then hit <cite>Build &rarr; Build Project</cite> and
  watch the cross-compiler do its thing.  When that has worked, you can prove to
  yourself that the right thing has happened.
</p>
<pre>$ file tasks
  tasks: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, dynamically linked (uses shared libs), not stripped</pre>
<p>
  We have an ARM binary, ready for deployment.  Start the virtual machine
  with <cite>Tools &rarr; Start QEMU</cite> (this may ask for your root password
  to configure networking) and once it has booted you can install the project
  into the VM with <cite>Tools &rarr; Deploy</cite>.  This will run <tt>make
  install</tt> to a temporary directory and then rsync it to the VM.  Now you
  can either interact with the VM directly (if the application installed a new
  desktop file, then it should appear on the desktop), or use <cite>Tools &rarr;
  Run Remote</cite> to execute a binary directly: entering <tt>tasks</tt> will
  execute the freshly installed Tasks.  Neat, huh?
</p>
<p>
  For the final trick there is even GDB integration.  <cite>Tools &rarr; Debug
  Remote</cite> will let you specify a local binary (to extract debug symbols
  from, say <tt>src/gtk/tasks</tt>) and a remote binary to run, and then start a
  GDB on the VM and connect to it.  The binary will be initially running but
  paused at the entrypoint, so you can add breakpoints and
  then <tt>continue</tt> execution.
</p>
<p>
  Hopefully this post has been a good overview of the integration available
  between Poky and Anjuta.  In the future I hope to see Nemiver integrated into
  Anjuta, and gdbserver support in Nemiver, which would be a killer combination
  for Poky integration.
</p>
<p>
  <small>NP: <cite>One On Twoism</cite>, Various</small>
</p>
]]></content:encoded><dc:date>2008-05-20T16:40:00Z</dc:date></item><item><title>Gypsy and Geoclue in Fedora</title><guid isPermaLink="false">computers/geo-2008-05-19-10-50</guid><link>http://www.burtonini.com/blog/computers/geo-2008-05-19-10-50</link><description>Thanks to Peter Robinson, both Gypsy and Geoclue are scheduled for addition to Fedora 9 Updates. Thanks Peter!</description><content:encoded><![CDATA[    <p>
      Thanks to Peter Robinson, both Gypsy and Geoclue are scheduled for
      addition to Fedora 9 Updates.  Thanks Peter!
    </p>
]]></content:encoded><dc:date>2008-05-19T09:50:00Z</dc:date></item><item><title>Today's Second Geohack</title><guid isPermaLink="false">computers/geo-2008-05-13-15-15</guid><link>http://www.burtonini.com/blog/computers/geo-2008-05-13-15-15</link><description>I managed to wangle a Fire Eagle invitation this morning, so over lunch I grabbed the Python API Kit and ...</description><content:encoded><![CDATA[    <p>
      I managed to wangle a Fire Eagle invitation this morning, so over lunch I
      grabbed the Python API Kit and threw it at the sample Gypsy client.
    </p>
    <pre>$ ./gypsy-fireeagle.py 00:0B:0D:88:A4:A3
got 51.861145 0.156275
Updated FireEagle</pre>
    <p>
      The first line is me running my script (this one is 64 lines, but it is
      half whitespace), telling it where my GPS is.  The second line is the
      current position that my rather cheap and nasty GPS determined.  The third
      line tells me that Fire Eagle has been updated with those coordinates.
    </p>
    <p>
      Suffice to say I'm very impressed with Yahoo's geocoding software.  My GPS
      never settles to an accurate reading and will happily jitter around a 20
      metre wide circle for hours, but the location Fire Eagle is reporting me
      at is <em>two doors away</em>.  I'm not exaggerating: it says number 9 on
      my street when it should be number 5.  That is some incredibly accurate
      mapping they have.
    </p>
]]></content:encoded><dc:date>2008-05-13T14:15:00Z</dc:date></item><item><title>Today's Geohack</title><guid isPermaLink="false">computers/geo-2008-05-13-10-50</guid><link>http://www.burtonini.com/blog/computers/geo-2008-05-13-10-50</link><description>Following hot on the heels of Yahoo's announcement of their Internet Location Platform , I wrote a quick 20-line Python ...</description><content:encoded><![CDATA[    <p>
      Following hot on the heels of Yahoo's announcement of
      their <a href="http://developer.yahoo.com/geo/">Internet Location
      Platform</a>, I wrote a quick 20-line Python hack to convert from latitude and
      longitude to a place name.  Because the ILP doesn't yet expose the ability
      to go from a position to a <acronym title="Where On Earth
      ID">WOEID</acronym> we have to ask the Flickr web services to do this
      first (as Flickr is owned by Yahoo this is using the same backend).  Once
      we have the WOEID, it can be then be looked up on the ILP and useful
      information obtained.  Example speak more than words:
    </p>
    <pre>$ python geohack.py 
Using position 51.872330 0.161950
Got WOEID 12775
Got town Bishop's Stortford</pre>
    <p>
      Now to write a <a href="http://geoclue.freedesktop.org">GeoClue</a>
      provider which will fill in the locality information from the position.
      Long-term grand plans involve integrating all of this geo magic into
      Postr, somehow.
    </p>
    <p>
      <small>NP: <cite>Third</cite>, Portishead</small>
    </p>
]]></content:encoded><dc:date>2008-05-13T09:50:00Z</dc:date></item><item><title>Fire Eagle Invitation?</title><guid isPermaLink="false">computers/fireeagle-2008-05-12-21-50</guid><link>http://www.burtonini.com/blog/computers/fireeagle-2008-05-12-21-50</link><description>Does anyone out there on the Intarwebs work for Yahoo, or have a friend who works at Yahoo? I'd really ...</description><content:encoded><![CDATA[    <p>
      Does anyone out there on the Intarwebs work for Yahoo, or have a friend
      who works at Yahoo?  I'd really like to give
      this <a href="http://fireeagle.yahoo.net/">Fire Eagle</a> thing a go,
      specifically integrating <a href="http://gypsy.freedesktop.org/">Gypsy</a>
      and <a href="http://geoclue.freedesktop.org/">GeoClue</a> with Fire Eagle,
      but it's invitation only at the moment...
    </p>
    <p>
      <strong>Update: </strong> I now have an account!
    </p>
]]></content:encoded><dc:date>2008-05-12T20:50:00Z</dc:date></item><item><title>GUPnP Basics, Part 1</title><guid isPermaLink="false">computers/gupnp-basics-2008-05-12-12-50</guid><link>http://www.burtonini.com/blog/computers/gupnp-basics-2008-05-12-12-50</link><description>For the last few days I've been learning more about UPnP and testing it with the few devices I have ...</description><content:encoded><![CDATA[    <!-- -*- Mode: html -*- -->
    <p>
      For the last few days I've been learning more about UPnP and testing it
      with the few devices I have around the house.  One of these is a cheap
      ADSL router, which apparently has the lamest UPnP stack on in existence.
      It does however support the <cite>WAN IP Connection</cite> interface, so
      you can use UPnP to get the external IP address and manipulate the port
      mapping.  I'll skip over the horrific security violations this involves,
      because it's a useful demonstration that the majority of people will be
      able to test.
    </p>
    <p>
      Today we'll start simple and get our external IP address using GUPnP.  The
      first thing to be done is to create a <cite>Control Point</cite>, which in
      the UPnP model handles discovery of resources, be them devices or services
      (a device can have multiple services).  When creating a control point you
      can specify the URN of the resource you want to target.  In this case we
      want all services providing <cite>WANIPConnection</cite> so we'd
      use <tt>urn:schemas-upnp-org:service:WANIPConnection:1</tt>.  If you want
      to browse for all services then use <tt>ssdp:all</tt> (SSDP being the
      <cite>Simple Service Discovery Protocol</cite>).
    </p>
    <pre>static GMainLoop *main_loop;

int
main (int argc, char **argv)
{
  GError *error = NULL;
  GUPnPContext *context;
  GUPnPControlPoint *cp;
  
  /* libsoup requires threading, so we have to initialise it */
  g_thread_init (NULL);
  g_type_init ();

  /* Default GLib context, default host IP, default port */
  context = gupnp_context_new (NULL, NULL, 0, &amp;error);
  if (error) g_error (error->message);

  /* Create a control point targeting WAN IP Connection services */
  cp = gupnp_control_point_new
    (context, "urn:schemas-upnp-org:service:WANIPConnection:1");
  /* The service-proxy-available signal is emitted when any services which match
     our target are found */
  g_signal_connect (cp,
		    "service-proxy-available",
		    G_CALLBACK (service_proxy_available_cb),
		    NULL);
  
  /* Tell the control point to start searching */
  gssdp_resource_browser_set_active (GSSDP_RESOURCE_BROWSER (cp), TRUE);

  /* Enter the main loop */
  main_loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (main_loop);

  /* Clean up */
  g_main_loop_unref (main_loop);
  g_object_unref (cp);
  g_object_unref (context);
  
  return 0;
}

static void
service_proxy_available_cb (GUPnPControlPoint *cp,
                            GUPnPServiceProxy *proxy)
{
  /* ... */
}</pre>
    <p>
      Now we have an application which searches for the service we specified and
      calls <tt>service_proxy_available_cb</tt> for each one it found.  Now, to
      get the external IP address we need to invoke
      the <tt>GetExternalIPAddress</tt> action.  This action takes no in
      arguments, and has a single out argument called "NewExternalIPAddress".
      Yes, the naming scheme is <em>stupid</em>.  GUPnP has a set of methods to
      invoke actions -- which will be very familiar to anyone who has
      used <tt>dbus-glib</tt> -- where you pass a <tt>NULL</tt>-terminated varargs list
      of (name, type, value) tuples for the in arguments, then
      a <tt>NULL</tt>-terminated varargs list of (name, value, return location) tuples
      for the out arguments.  A simple implementation would be as follows.
    </p>
    <pre>static void
service_proxy_available_cb (GUPnPControlPoint *cp,
                            GUPnPServiceProxy *proxy)
{
  GError *error = NULL;
  char *ip = NULL;
  
  gupnp_service_proxy_send_action (proxy,
				   /* Action name and error location */
				   "GetExternalIPAddress", &amp;error,
				   /* IN args */
				   NULL,
				   /* OUT args */
				   "NewExternalIPAddress",
				   G_TYPE_STRING, &amp;ip,
				   NULL);
  
  if (error == NULL) {
    g_print ("External IP address is %s\n", ip);
    g_free (ip);
  } else {
    g_printerr ("Error: %s\n", error-&gt;message);
    g_error_free (error);
  }
  g_main_loop_quit (main_loop);
}</pre>
    <p>
      Note that <tt>_send_action</tt> blocks until the service has replied.  If you
      need to make non-blocking calls then
      use <tt>gupnp_service_proxy_begin_action</tt> which takes a callback.
    </p>
    <p>
      So, that is searching for services and invoking actions in GUPnP.  Next
      time I'll cover subscribing to state variables, and routers which can't
      count.
    </p>
    <p>
      <small>NP: <cite>Folk But Not Folk</cite>, Various</small>
    </p>
]]></content:encoded><dc:date>2008-05-12T11:50:00Z</dc:date></item><item><title>EphyDeli 0.3</title><guid isPermaLink="false">computers/ephydeli-2008-04-29-20-12</guid><link>http://www.burtonini.com/blog/computers/ephydeli-2008-04-29-20-12</link><description>EphyDeli is a Python extension for Epiphany that adds Post To Delicious menu and toolbar items for posting the current ...</description><content:encoded><![CDATA[    <p>
      EphyDeli is a Python extension for Epiphany that adds <cite>Post To
      Delicious</cite> menu and toolbar items for posting the current page to
      Del.icio.us.  I know of several people who use it frequently and the last
      release was in 2006, so I've obviously mastered the Unix philosophy well
      here!  This release was caused by those mean old Epiphany developers
      changing the API, many thanks to Thibauld Nion for noticing this and
      sending a patch.
    </p>
    <p>
      To download it you can either
      grab <a href="http://burtonini.com/computing/ephydeli-0.3.tar.gz">the
      tarball</a> or fetch the <a href="http://burtonini.com/bzr/ephydeli/">bzr
      tree</a>.
    </p>
]]></content:encoded><dc:date>2008-04-29T19:12:00Z</dc:date></item><item><title>It's Bubbling Hot</title><guid isPermaLink="false">computers/hot-2008-04-24-17-47</guid><link>http://www.burtonini.com/blog/computers/hot-2008-04-24-17-47</link><description>$ cat /proc/acpi/thermal_zone/*/temperature temperature: 84 C temperature: 90 C Maybe it's time to get a dedicated build machine, my poor ...</description><content:encoded><![CDATA[    <pre>$ cat /proc/acpi/thermal_zone/*/temperature
temperature:             84 C
temperature:             90 C</pre>
    <p>
      Maybe it's time to get a dedicated build machine, my poor laptop gets
      quite toasty when building Poky.  Then again it seems happy enough, so
      maybe I should just use an external keyboard to avoid boiling my hands.
    </p>

    <p>
      <small>NP: <cite>Oneric</cite>, Boxcutter</small>
    </p>
]]></content:encoded><dc:date>2008-04-24T16:47:00Z</dc:date></item><item><title>Postr 0.12</title><guid isPermaLink="false">computers/postr/postr-2008-04-23-10-30</guid><link>http://www.burtonini.com/blog/computers/postr/postr-2008-04-23-10-30</link><description>A quick Postr 0.12 release, mainly to fix an annoying bug but there are some neat new features here too. ...</description><content:encoded><![CDATA[<p>
  A quick Postr 0.12 release, mainly to fix an annoying bug but there are some
  neat new features here too.
</p>
<ul>
  <li>Update the status bar after uploading</li>
  <li>Add a Switch User menu item</li>
  <li>Add Add/Remove buttons to the image pane</li>
  <li>Install the Nautilus extension to the new extension path</li>
  <li>Don't select groups when the name is clicked</li>
  <li>Don't display errors when posting to moderated groups</li>
  <li>Show a warning on exit if there are images to upload (thanks Germán Póo-Caamaño)</li>
</ul>
<p>
  The <a href="http://burtonini.com/computing/postr-0.12.tar.gz">tarball is
    here</a>, and packages for Debian have been uploaded.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/postr</category><dc:date>2008-04-23T09:30:00Z</dc:date></item><item><title>Postr 0.11</title><guid isPermaLink="false">computers/postr/postr-2008-04-20-16-50</guid><link>http://www.burtonini.com/blog/computers/postr/postr-2008-04-20-16-50</link><description>I finally got around to fixing the very annoying text wrapping problem in postr.dev, I thought I best release Postr ...</description><content:encoded><![CDATA[<p>
  I finally got around to fixing the very annoying text wrapping problem in
  postr.dev, I thought I best release Postr 0.11:
</p>
<ul>
  <li>Add Send To Group options</li>
  <li>Add Privacy and Safety options</li>
  <li>Use a multi-line entry for the Description field</li>
  <li>Show the user's name in the status bar</li>
  <li>Fix the resizing of the preview</li>
</ul>
<p>
  The <a href="http://burtonini.com/computing/postr-0.11.tar.gz">tarball is
    here</a>, and packages for Debian have been uploaded.
</p>
]]></content:encoded><category domain="http://www.burtonini.com">/postr</category><dc:date>2008-04-20T15:50:00Z</dc:date></item><item><title>No Iain, I Am Luis Villa</title><guid isPermaLink="false">computers/i-am-luis-2008-04-17-14-40</guid><link>http://www.burtonini.com/blog/computers/i-am-luis-2008-04-17-14-40</link><description>Iain, you are clearly an imposter . And this perfect-sighted intruder , whoever he is, should be hunted down, because ...</description><content:encoded><![CDATA[    <p>
      Iain, you
      are <a href="http://blogs.gnome.org/iain/2008/04/17/i-am-luis-villa/">clearly
      an imposter</a>.  And
      this <a href="http://tieguy.org/blog/2008/04/16/new-headshot/">perfect-sighted
      intruder</a>, whoever he is, should be hunted down, because I am Luis
      Villa!
    </p>
    <p>
      <img src="http://burtonini.com/images/i-am-luis.jpg" alt="I Am Luis!"/>
    </p>
]]></content:encoded><dc:date>2008-04-17T13:40:00Z</dc:date></item><item><title>We're Hiring!</title><guid isPermaLink="false">computers/oh-jobs-2008-04-16-14-45</guid><link>http://www.burtonini.com/blog/computers/oh-jobs-2008-04-16-14-45</link><description>Here at OpenedHand Towers we've just announced some more job openings , so if you have skills in any of ...</description><content:encoded><![CDATA[    <p>
      Here at OpenedHand Towers we've just announced some
      more <a href="http://o-hand.com/jobs/">job openings</a>, so if you have
      skills in any of the kernel, X.org, GTK+, Clutter or OpenEmbedded then
      please have a look.  We're also after user interface/interaction
      designers, junior designers (print/web/UI), and have an student internship
      for a programmer.  Pretty much something for everyone!
    </p>
]]></content:encoded><dc:date>2008-04-16T13:45:00Z</dc:date></item><item><title>GNOME Mobile Moduleset</title><guid isPermaLink="false">computers/mobile-jhbuild-2008-04-15-16-10</guid><link>http://www.burtonini.com/blog/computers/mobile-jhbuild-2008-04-15-16-10</link><description>I just committed to JHBuild three new modulesets, mobile-2.24 , pimlico and matchbox , so that GNOME people wanting to ...</description><content:encoded><![CDATA[    <p>
      I just committed to JHBuild three new
      modulesets, <tt>mobile-2.24</tt>, <tt>pimlico</tt> and <tt>matchbox</tt>,
      so that GNOME people wanting to develop against
      the <a href="http://gnome.org/mobile/">GNOME Mobile</a> platform can use
      tools they know to build everything they need.
    </p>
    <dl>
      <dt><tt>mobile-2.24</tt></dt>
      <dd><p>This changes GConf and EDS to use the DBus ports, and
	  provides <tt>meta-mobile-platform</tt> which builds the complete
	  platform.</p></dd>

      <dt><tt>pimlico</tt></dt>
      <dd><p>This builds Contacts, Dates and Tasks, providing <tt>meta-pimlico</tt>.</p></dd>

      <dt><tt>matchbox</tt></dt>
      <dd><p>This builds Matchbox Panel, Matchbox Desktop, Matchbox Keyboard and
      Matchbox Window Manager, providing <tt>meta-matchbox</tt>.</p></dd>
    </dl>
    <p>
      Also, <a href="http://pokylinux.org/">Poky</a> is building images nightly
      with the complete platform in, which will let you build and test software
      in a PDA-style environment with QEMU, running on x86 or a number of
      ARM-based devices (such as Nokia N800, Sharp Zaurus or OpenMoko).
    </p>
    <p>
      Last week at the Collaboration Summit in Austin (which I couldn't attend
      for <a href="http://www.burtonini.com/blog/life/baby-2008-04-07-09-50">personal
      reasons</a>) there was a day-long GNOME Mobile meeting, as a result of
      which there is now a long list of packages which need to be considered for
      addition to the Platform (such as HAL, Gypsy and Geoclue), and a few
      changes (such as replacing gnome-vfs with gvfs).  I hope to review the
      proposals fairly shortly, so that we can hopefully make an initial GNOME
      Mobile 2.24 platform release alongside the Desktop release in September.
    </p>
    <p>
      In other
      news, <a href="http://laughingsquid.com/a-cat-playing-the-theremin/">this
	is exactly what the Internet is for</a>.
    </p>
    <p>
      <small>NP: <cite>Blue Moon Station</cite>, Solar Fields</small>
    </p>
]]></content:encoded><dc:date>2008-04-15T15:10:00Z</dc:date></item><item><title>Dear Interwebs: Secure SMTP Relay Wanted</title><guid isPermaLink="false">computers/mail-2008-03-30-14-22</guid><link>http://www.burtonini.com/blog/computers/mail-2008-03-30-14-22</link><description>I'm looking for a basic SMTP relay which supports SMTP AUTH, TLS, supports the sendmail interface, and has a local ...</description><content:encoded><![CDATA[<p>
  I'm looking for a basic SMTP relay which supports SMTP AUTH, TLS, supports the
  sendmail interface, and has a local mail queue, so that I can send mail from
  my laptop in Evolution (to localhost, or calls sendmail) and the shell
  (calling sendmail) when online or offline.
</p>
<p>
  I need SMTP AUTH and TLS, which means nbsmtp, masqmail, and nullmailer are
  out.  I want a local queue for when I'm not online which means esmtp, ssmtp,
  msmtp, and nullmailer are out (I'm not convinced that msmtp's queue scripts
  are reliable enough).  Surely there must be a simple SMTP relay which will
  reliably manage a queue if the mail cannot be sent!  If not, does anyone know
  of a good guide to configuring Postfix or Exim to do this?
</p>

]]></content:encoded><dc:date>2008-03-30T13:22:00Z</dc:date></item><item><title>New Gypsy Release</title><guid isPermaLink="false">computers/gypsy-2008-03-27-16-00</guid><link>http://www.burtonini.com/blog/computers/gypsy-2008-03-27-16-00</link><description>Coding Legend Iain has just released Gypsy 0.6 , the all-new GPS multiplexing daemon which focuses on being lean and ...</description><content:encoded><![CDATA[    <p>
      <abbr title="Gypsy!  Blingtacity! gnome-cd!!">Coding
      Legend</abbr> <a href="http://blogs.gnome.org/iain/">Iain</a> has just
      released <a href="http://gypsy.freedesktop.org">Gypsy 0.6</a>, the all-new
      GPS multiplexing daemon which focuses on being lean and easy to use, and
      not on, erm, putting your GPS on the Internet or something weird.
    </p>
    <p>
      Because I'm fairly lame there are not matching Debian packages yet, but
      I'll get around to that tomorrow.  In other news, a very nice man called
      Ian Lawrence
      wrote <a href="http://www.ianlawrence.info/random-stuff/django-bluetooth-and-gps-on-ubuntu-mobile">a
      buzzword-compliant tutorial</a> where he uses Gypsy to talk to a Bluetooth
      GPS, tests it with
      my <a href="http://www.burtonini.com/blog/computers/gypsy-2007-12-17-10-30">Gypsy
      Status 10-minute hack</a>, and then uses Django to redirect the user to
      the relevant geohash.org page.
    </p>
    <p>
      <small>NP: <cite>Remembranza</cite>, Murcof</small>
    </p>
]]></content:encoded><dc:date>2008-03-27T16:00:00Z</dc:date></item></channel></rss>