<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>drboblog</title>
	
	<link>http://tecnocode.co.uk</link>
	<description>Ramblings on computers…</description>
	<lastBuildDate>Thu, 19 Jan 2012 22:32:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license>		<feedburner:info uri="drboblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://creativecommons.org/licenses/by-sa/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://tecnocode.co.uk/feed/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ftecnocode.co.uk%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ftecnocode.co.uk%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://tecnocode.co.uk/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ftecnocode.co.uk%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ftecnocode.co.uk%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item>
		<title>All aboard the Bendy Bus</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/OOhI24cKVBQ/</link>
		<comments>http://tecnocode.co.uk/2012/01/19/all-aboard-the-bendy-bus/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 22:30:26 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Bendy Bus]]></category>
		<category><![CDATA[D-Bus]]></category>
		<category><![CDATA[Telepathy]]></category>
		<category><![CDATA[university]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=460</guid>
		<description><![CDATA[Have you ever written a client for a D-Bus service, then had difficulty in testing it because you need to find a way to set up the state of the D-Bus service, run your test, then set up the service in a completely different manner, rinse and repeat…all while running a modified version of the [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever written a client for a D-Bus service, then had difficulty in testing it because you need to find a way to set up the state of the D-Bus service, run your test, then set up the service in a completely different manner, rinse and repeat…all while running a modified version of the service’s binary in parallel with your system installation of it, and without doing anything which might cause your personal data to be accidentally eaten?</p>
<p>Having done some hacking on Telepathy and EDS clients I can, unfortunately, say “yes” to all of the above. Since problems are problematic, I’ve been hacking on a tool called <a title="git repository of Bendy Bus on gitorious." href="https://www.gitorious.org/bendy-bus/bendy-bus">Bendy Bus</a>, which will hopefully alleviate some of this pain.</p>
<p>Bendy Bus is a project I’ve been working on as my final year university project, but I intend for it to be most useful outside of (hopefully) getting me marks for my degree. The basic idea of Bendy Bus is that you fuel it up with a description of a nondeterministic finite state automaton which represents the D-Bus service you’re using, plus a D-Bus introspection XML file describing all the relevant D-Bus interfaces. Bendy Bus will use the FSM description to simulate the D-Bus service, and run as a wrapper around the client program you’re trying to test. It’ll set up a private <tt>dbus-daemon</tt> instance for your client program, and expose all the simulated D-Bus objects on this bus.</p>
<p>Bendy Bus will listen for D-Bus method calls and property changes made by your client program, and execute transitions within the FSM as coded in your FSM description file. These transitions may, for example, change the FSM’s state, change data stored in the FSM (technically making it a nondeterministic DFSM, but that’s immaterial), emit D-Bus signals, throw D-Bus errors, etc. Why do I say it’s a <em>nondeterministic</em> FSM? Because you may specify several transitions between the same pair of states which are triggered by the same (for example) D-Bus method call. Bendy Bus will randomly choose one of the transitions to take. For example, if your client program calls a <tt>frobnicate : string &#8594; string</tt> D-Bus method, you could code one transition which successfully replies to the method call with a string return value, and another transition which simulates a failure in the D-Bus service by throwing a D-Bus error instead.</p>
<p>It’s in this fashion that Bendy Bus is actually designed as a fuzzing tool. You can code up a full description of every possible state and transition in your D-Bus service, then set your client program running in the Bendy Bus wrapper, and it’ll randomly explore the service’s state space until a termination condition is met. For example, the client program could crash (in which case a bug’s been found!), a D-Bus activity timeout could be reached (if your client program hasn’t made any D-Bus calls for a few seconds, for example), or a global timeout could be reached. At this point, the test harness can restart your client program and start the whole thing all over again with a different random seed value, causing different execution paths to be explored, and more of your client’s code to be covered.</p>
<p>Of course, Bendy Bus is still young, so features are missing, there are plenty of bugs, and documentation is basically non-existent. A couple of the big features on the list are to implement support for unit testing (which would tone down the fuzz testing aspect of Bendy Bus, and allow deterministic unit tests to be written for D-Bus client programs), implement better error reporting in the machine description parser and better logging during simulation, write a language specification and GtkSourceView highlighter, and write documentation. Help on any of these (except the unit testing stuff, which I have to keep for myself for my university project) would be greatly appreciated.</p>
<p>More than anything, it would be great if people could play with Bendy Bus and see if it’s useful for them (and if not, what could be done to improve it). In the repository at the moment are a couple of example machine description files for Telepathy. They can be used to get a randomly-generated contact list to appear in Empathy, using the following command:</p>
<p><code>bendy-bus machines/telepathy-cm.machine machines/telepathy-cm.xml \<br />
--test-program-log-file=test-program.log \<br />
--dbus-daemon-log-file=dbus-daemon.log \<br />
--simulator-log-file=simulator.log \<br />
-E FOLKS_DEBUG=telepathy -E EMPATHY_DEBUG=all -E G_MESSAGES_DEBUG=all \<br />
-- empathy</code></p>
<p>That’s all from me at the moment. The <a title="git repository of Bendy Bus on gitorious." href="https://www.gitorious.org/bendy-bus/bendy-bus">Bendy Bus git repository is on gitorious</a>, and all bug reports should be e-mailed to me: <a title="E-mail me with Bendy Bus bug reports." href="mailto:%70%68%69%6C%69%70%40%74%65%63%6E%6F%63%6F%64%65%2E%63%6F%2E%75%6B"><span id="emob-cuvyvc@grpabpbqr.pb.hx-78">philip {at} tecnocode.co(.)uk</span><script type="text/javascript">
    var mailNode = document.getElementById('emob-cuvyvc@grpabpbqr.pb.hx-78');
    var linkNode = document.createElement('a');
    linkNode.setAttribute('href', "mailto:%70%68%69%6C%69%70%40%74%65%63%6E%6F%63%6F%64%65%2E%63%6F%2E%75%6B");
    tNode = document.createTextNode("philip {at} tecnocode.co(.)uk");
    linkNode.appendChild(tNode);
    linkNode.setAttribute('id', "emob-cuvyvc@grpabpbqr.pb.hx-78");
    mailNode.parentNode.replaceChild(linkNode, mailNode);
</script></a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=OOhI24cKVBQ:w7Zik_0KOho:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=OOhI24cKVBQ:w7Zik_0KOho:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=OOhI24cKVBQ:w7Zik_0KOho:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=OOhI24cKVBQ:w7Zik_0KOho:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=OOhI24cKVBQ:w7Zik_0KOho:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=OOhI24cKVBQ:w7Zik_0KOho:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=OOhI24cKVBQ:w7Zik_0KOho:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/OOhI24cKVBQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2012/01/19/all-aboard-the-bendy-bus/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2012/01/19/all-aboard-the-bendy-bus/</feedburner:origLink></item>
		<item>
		<title>Character encoding and locales</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/fsIsOkZKE1I/</link>
		<comments>http://tecnocode.co.uk/2011/08/27/character-encoding-and-locales/#comments</comments>
		<pubDate>Sat, 27 Aug 2011 00:03:45 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[character encoding]]></category>
		<category><![CDATA[character set]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[iconv]]></category>
		<category><![CDATA[setlocale]]></category>
		<category><![CDATA[Unicode]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=446</guid>
		<description><![CDATA[Recently, I've been looking into how character encoding and locales work on Linux, and I thought it might be worthwhile to write down my findings; partly so that I can look them up again later, and partly so that people can correct all the things I've got wrong. To begin with, let's define some terminology: [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I've been looking into how character encoding and locales work on Linux, and I thought it might be worthwhile to write down my findings; partly so that I can look them up again later, and partly so that people can correct all the things I've got wrong.</p>
<p>To begin with, let's define some terminology:</p>
<ul>
<li>Character set: a set of symbols which can be used together. This defines the symbols and their semantics, but not how they're encoded in memory. For example: Unicode. (Update: As noted in the comments, the character set doesn't define the appearance of symbols; this is left up to the fonts.)</li>
<li>Character encoding: a mapping from a character set to an representation of the characters in memory. For example: UTF-8 is one encoding of the Unicode character set.</li>
<li>Nul byte: a single byte which has a value of zero. Typically represented as the C escape sequence ‘<code>\0</code>’.</li>
<li>NULL character: the Unicode NULL character (U+0000) in the relevant encoding. In UTF-8, this is just a single nul byte. In UTF-16, however, it's a sequence of two nul bytes.</li>
</ul>
<p>Now, the problem: if I'm writing a (command line) C program, how do strings get from the command line to the program, and how do strings get from the program to the terminal? More concretely, what actually happens with <code>argv[]</code> and <code>printf()</code>?</p>
<p>Let's consider the input direction first. When the <code>main()</code> function of a C program is called, it's passed an array of pointers to <code>char</code> arrays, i.e. strings. These strings can be arbitrary byte sequences (for example, file names), but are generally intended/assumed to be encoded in the user's environment's character encoding. This is set using the <code>LC_ALL</code>, <code>LC_CTYPE</code> or <code>LANG</code> environment variables. These variables specify the user's locale which (among other things) specifies the character encoding they use.</p>
<p>So the program receives as input a series of strings which are in an arbitrary encoding. This means that all programs have to be able to handle all possible character encodings, right? Wrong. A standard solution to this already exists in the form of libiconv. <code>iconv()</code> will convert between any two character encodings known to the system, so we can use it to convert from the user's environment encoding to, for example, UTF-8. How do we find out the user's environment encoding without parsing environment variables ourselves? We use <code>setlocale()</code> and <code>nl_langinfo()</code>.</p>
<p><code>setlocale()</code> parses the <tt>LC_ALL</tt>, <tt>LC_CTYPE</tt> and <tt>LANG</tt> environment variables (in that order of precedence) to determine the user's locale, and hence their character encoding. It then stores this locale, which will affect the behaviour of various C runtime functions. For example, it will change the formatting of numbers outputted by <code>printf()</code> to use the locale's decimal separator. Just calling <code>setlocale()</code> doesn't have any effect on character encodings, though. It won't, for example, cause <code>printf()</code> to magically convert strings to the user's environment encoding. More on this later.</p>
<p><code>nl_langinfo()</code> is one function affected by <code>setlocale()</code>. When called with the <code>CODESET</code> type, it will return a string identifying the character encoding set in the user's environment. This can then be passed to <code>iconv_open()</code>, and we can use <code>iconv()</code> to convert strings from <code>argv[]</code> to our internal character encoding (which will typically be UTF-8).</p>
<p>At this point, it's worth noting that most people don't need to care about any of this. If using a library such as GLib – and more specifically, using its <code>GOption</code> command line parsing functionality – all this character encoding conversion is done automatically, and the strings it returns to you are guaranteed to be UTF-8 unless otherwise specified.</p>
<p>So we now have our input converted to UTF-8, our program can go ahead and do whatever processing it likes on it, safe in the knowledge that the character encoding is well defined and, for example, there aren't any unexpected embedded nul bytes in the strings. (This could happen if, for example, the user's environment character encoding was UTF-16; although this is really unlikely and might not even be possible on Linux — but that's a musing for another blog post).</p>
<p>Having processed the input and produced some output (which we'll assume is in UTF-8, for simplicity), many programs would just <code>printf()</code> the output and be done with it. <code>printf()</code> knows about character encodings, right? Wrong. <code>printf()</code> outputs exactly the bytes which are passed to its format parameter (ignoring all the fancy conversion specifier expansion), so this will only work if the program's internal character encoding is equal to the user's environment character encoding, for the characters being outputted. In many cases, the output of programs is just ASCII, so programs get away with just using <code>printf()</code> because most character encodings are supersets of ASCII. In general, however, more work is required to do things properly.</p>
<p>We need to convert from UTF-8 to the user's environment encoding so that what appears in their terminal is correct. We could just use <code>iconv()</code> again, but that would be boring. Instead, we should be able to use <code>gettext()</code>. This means we get translation support as well, which is always good.</p>
<p><code>gettext()</code> takes in a <code>msgid</code> string and returns a translated version in the user's locale, if possible. Since these translations are done using message catalogues which may be in a completely different character encoding to the user's environment <em>or</em> the program's internal character encoding (UTF-8), <code>gettext()</code> helpfully converts from the message catalogue encoding to the user's environment encoding (the one returned by <code>nl_langinfo()</code>, discussed above). Great!</p>
<p>But what if no translation exists for a given string? <code>gettext()</code> returns the <code>msgid</code> string, unmodified <strong>and unconverted</strong>. This means that translatable string literals in our program need to magically be written in the user's environment encoding…and we're back to where we were before we introduced <code>gettext()</code>. Bother.</p>
<p>I see three solutions to this:</p>
<ul>
<li>The <code>gettext()</code> solution: declare that all <code>msgid</code> strings should be in US-ASCII, and thus not use any Unicode characters. This works, provided we make the (reasonable) assumption that the user's environment encoding is a superset of ASCII. This requires that if a program wants to use Unicode characters in its translatable strings, it has to provide an en-US message catalogue to translate the American English <code>msgid</code> strings to American English (with Unicode). Not ideal.</li>
<li>The <code>gettext()</code>++ solution: declare that all <code>msgid</code> strings should be in UTF-8, and assume that anybody who's running without message catalogues is using UTF-8 as their environment encoding (this is a big assumption). Also not ideal, but a lot less work.</li>
<li>The <code>iconv()</code> solution: instruct <code>gettext()</code> to not return any strings in the user's environment encoding, but to return them all in UTF-8 instead (using <code>bind_textdomain_codeset()</code>), and use UTF-8 for the <code>msgid</code> strings. The program can then pass these translated (and untranslated) strings through <code>iconv()</code> as it did with the input, converting from UTF-8 to the user's environment encoding. More effort, but this should work properly.</li>
</ul>
<p>An additional complication is that of combining translatable <code>printf()</code> format strings with UTF-8 string output from the program. Since <code>printf()</code> isn't encoding-aware, this requires that both the format string and the parameters are in the same encoding (or we get into a horrible mess with output strings which have substrings encoded in different ways). In this case, since our program output is in UTF-8, we definitely want to go with option 3 from above, and have <code>gettext()</code> return all translated messages in UTF-8. This also means we get to use UTF-8 in <code>msgid</code> strings. Unfortunately, it means that we now can't use <code>printf()</code> directly, and instead have to <code>sprintf()</code> to a string, use <code>iconv()</code> to convert that string from UTF-8 to the user's environment encoding, and <em>then</em> <code>printf()</code> it. Whew.</p>
<p>Here's a diagram which hopefully makes some of the journey clearer (click for a bigger version):</p>
<div style="text-align: center;"><a href="http://tecnocode.co.uk/wp-content/uploads/2011/08/Linux-character-encoding.png"><img class="aligncenter size-full wp-image-448" title="Linux character encoding" src="http://tecnocode.co.uk/wp-content/uploads/2011/08/Linux-character-encoding.png" alt="Diagram of the processing of strings from input to output in a C program." width="496" height="120" /></a></div>
<p>So what does this mean for you? As noted above, in most cases it will mean nothing. Libraries such as GLib should take care of all of this for you, and the world will be a lovely place with ponies (U+1F3A0) and cats (U+1F431) everywhere. Still, I wanted to get this clear in my head, and hopefully it's useful to people who can't make use of libraries like GLib (for whatever reason).</p>
<p>Exploring exactly what GLib does is a matter for another time. Similarly, exploring how Windows does things is also best left to a later post (hint: Windows does things completely differently to Linux and other Unices, and I'm not sure it's for the better).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=fsIsOkZKE1I:_T6S9FIXjS4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=fsIsOkZKE1I:_T6S9FIXjS4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=fsIsOkZKE1I:_T6S9FIXjS4:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=fsIsOkZKE1I:_T6S9FIXjS4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=fsIsOkZKE1I:_T6S9FIXjS4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=fsIsOkZKE1I:_T6S9FIXjS4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=fsIsOkZKE1I:_T6S9FIXjS4:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/fsIsOkZKE1I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/08/27/character-encoding-and-locales/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/08/27/character-encoding-and-locales/</feedburner:origLink></item>
		<item>
		<title>Back from the Desktop Summit</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/-ssf-C5dC08/</link>
		<comments>http://tecnocode.co.uk/2011/08/15/back-from-the-desktop-summit/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 22:50:34 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Desktop Summit]]></category>
		<category><![CDATA[GXml]]></category>
		<category><![CDATA[libfolks]]></category>
		<category><![CDATA[libgdata]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=442</guid>
		<description><![CDATA[The Desktop Summit's over for another year. Berlin was great, the parties were good (thanks to Intel and Collabora!), and it was good to see everyone again — and also meet some new people. My thanks, as always, go to the GNOME Foundation for arranging and sponsoring my accommodation. Unfortunately, the Summit wasn't all parties [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="The bi-annual GNOME and KDE Desktop Summit." href="http://www.desktopsummit.org/">Desktop Summit</a>'s over for another year. Berlin was great, the parties were good (thanks to Intel and Collabora!), and it was good to see everyone again — and also meet some new people. My thanks, as always, go to the <a title="The GNOME Foundation's website." href="http://foundation.gnome.org/">GNOME Foundation</a> for arranging and sponsoring my accommodation.</p>
<p>Unfortunately, the Summit wasn't all parties and sightseeing. We managed to belatedly push out <a title="libfolks, a meta-contact aggregation library." href="http://telepathy.freedesktop.org/wiki/Folks">folks</a> 0.6, with <a title="Travis Reitter's blog." href="http://treitter.livejournal.com/">Travis</a> putting in far too much of his holiday time to tar it all up. <a title="Raúl Segales' blog." href="http://www.itevenworks.net/">Raúl</a> somehow got away with sneaking off and doing <a title="Raúl's blog port on porting Sugar to GTK+ 3." href="http://www.itevenworks.net/2011/08/catching-up-with-sugar-running-gtk3-activities/">interesting things with the Sugar people</a> instead.</p>
<p>My <a title="BoF sessions at the Desktop Summit." href="http://tecnocode.co.uk/2011/08/07/bof-sessions-at-the-desktop-summit/">libgdata BoF</a> went down well, with a reasonable amount of interest in pushing libgdata's support for Google Documents forward, for use by both GNOME Documents and Zeitgeist. I'll get round to tidying up and pushing forward with the libgdata 0.12 roadmap in the near future.</p>
<p>I'm looking forward to being the lucky recipient of a load of GSoC patches to review for using <a title="A GObject API for manipulating XML." href="http://live.gnome.org/XML">GXml</a> in libgdata. I love reviewing patches.</p>
<p>A Coruña next year!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=-ssf-C5dC08:NfeLul9dhnk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=-ssf-C5dC08:NfeLul9dhnk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=-ssf-C5dC08:NfeLul9dhnk:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=-ssf-C5dC08:NfeLul9dhnk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=-ssf-C5dC08:NfeLul9dhnk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=-ssf-C5dC08:NfeLul9dhnk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=-ssf-C5dC08:NfeLul9dhnk:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/-ssf-C5dC08" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/08/15/back-from-the-desktop-summit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/08/15/back-from-the-desktop-summit/</feedburner:origLink></item>
		<item>
		<title>BoF sessions at the Desktop Summit</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/agfdE6FDQJE/</link>
		<comments>http://tecnocode.co.uk/2011/08/07/bof-sessions-at-the-desktop-summit/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 16:17:48 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Desktop Summit]]></category>
		<category><![CDATA[libfolks]]></category>
		<category><![CDATA[libgdata]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=439</guid>
		<description><![CDATA[Just a quick bit of promotion: anyone who's interested in libfolks or libgdata, both as users or developers, should come along to the BoF sessions for them on Tuesday and Wednesday, respectively. libfolks hacking BoF: meeting at 10:00 on Tuesday (2011-08-09) in the lobby in front of Kinosaal. We'll then relocate to a yet-to-be-revealed room [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick bit of promotion: anyone who's interested in libfolks or libgdata, both as users or developers, should come along to the BoF sessions for them on Tuesday and Wednesday, respectively.</p>
<ul>
<li>libfolks hacking BoF: meeting at 10:00 on Tuesday (2011-08-09) in the lobby in front of Kinosaal. We'll then relocate to a yet-to-be-revealed room with tables and things.</li>
<li>libgdata roadmap BoF: 13:00–14:00 on Wednesday (2011-08-10) in room 1.405/1.</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=agfdE6FDQJE:kGkA3UscWd0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=agfdE6FDQJE:kGkA3UscWd0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=agfdE6FDQJE:kGkA3UscWd0:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=agfdE6FDQJE:kGkA3UscWd0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=agfdE6FDQJE:kGkA3UscWd0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=agfdE6FDQJE:kGkA3UscWd0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=agfdE6FDQJE:kGkA3UscWd0:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/agfdE6FDQJE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/08/07/bof-sessions-at-the-desktop-summit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/08/07/bof-sessions-at-the-desktop-summit/</feedburner:origLink></item>
		<item>
		<title>Avatars for Google Contacts in Evolution</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/2r6E1tfsagY/</link>
		<comments>http://tecnocode.co.uk/2011/08/01/avatars-for-google-contacts-in-evolution/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 22:55:03 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Desktop Summit]]></category>
		<category><![CDATA[evolution-data-server]]></category>
		<category><![CDATA[Google Contacts]]></category>
		<category><![CDATA[libfolks]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=433</guid>
		<description><![CDATA[Following on from group/category support, I've just merged support for setting and retrieving avatars/photos on Google Contacts from Evolution. There are still a few rough edges, but hopefully I'll get time to tidy those up before GNOME 3.2. I'll be arriving on the 5th, spending a day hurriedly seeing absolutely everything there is to see [...]]]></description>
			<content:encoded><![CDATA[<p>Following on from <a title="My blog post on adding group/category support to the Google Contacts backend in Evolution." href="http://tecnocode.co.uk/2011/01/15/groupcategory-support-for-google-contacts-in-evolution/">group/category support</a>, I've just merged support for setting and retrieving avatars/photos on Google Contacts from Evolution. There are still <a title="Bugzilla comment about the remaining work to be done on avatar/photo support." href="https://bugzilla.gnome.org/show_bug.cgi?id=619135#c3">a few rough edges</a>, but hopefully I'll get time to tidy those up before GNOME 3.2.</p>
<p><a href="http://tecnocode.co.uk/wp-content/uploads/2011/08/DS2011banner.png"><img class="aligncenter size-full wp-image-434" title="Desktop Summit 2011 banner" src="http://tecnocode.co.uk/wp-content/uploads/2011/08/DS2011banner.png" alt="“I'm going to Desktop Summit 2011 in Berlin” banner" width="333" height="110" /></a>I'll be arriving on the 5th, spending a day hurriedly seeing absolutely everything there is to see in Berlin, then diving into the conference on Saturday. I'm leaving on the 12th.</p>
<p>For anybody interested in contacts, meta-contacts, individuals, personas and inventing words to make your software sound more impressive, there's a folks BoF happening at some point on Wednesday (not Thursday as <a title="Workshop and BoF schedule for the Desktop Summit 2011." href="https://desktopsummit.org/program/workshops-bofs">the schedule</a> says, since Travis has to leave beforehand). More details will follow, hopefully, in the <a title="Details of the libfolks talk at the Desktop Summit 2011." href="https://desktopsummit.org/program/sessions/folks-contact-aggregation-free-software">libfolks talk</a> on Saturday, 11:20–11:50 in Room 2002.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=2r6E1tfsagY:hSLU9MoKhvc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=2r6E1tfsagY:hSLU9MoKhvc:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=2r6E1tfsagY:hSLU9MoKhvc:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=2r6E1tfsagY:hSLU9MoKhvc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=2r6E1tfsagY:hSLU9MoKhvc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=2r6E1tfsagY:hSLU9MoKhvc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=2r6E1tfsagY:hSLU9MoKhvc:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/2r6E1tfsagY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/08/01/avatars-for-google-contacts-in-evolution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/08/01/avatars-for-google-contacts-in-evolution/</feedburner:origLink></item>
		<item>
		<title>End of the hackfest</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/_nhu2luQDeI/</link>
		<comments>http://tecnocode.co.uk/2011/06/18/end-of-the-hackfest/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 10:18:42 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Collabora]]></category>
		<category><![CDATA[libfolks]]></category>
		<category><![CDATA[nyan]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=430</guid>
		<description><![CDATA[The IM, Contacts &#38; Social hackfest is over and people are variously heading back to their respective corners of the world. A lot of good discussion was had, and I think everyone's got a clearer vision of where we need to be with IMs and contacts and what needs to be done to get there. [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="IM, Contacts &amp; Social hackfest" href="http://tecnocode.co.uk/2011/06/12/im-contacts-social-hackfest/">IM, Contacts &amp; Social hackfest</a> is over and people are variously heading back to their respective corners of the world. A lot of good discussion was had, and I think everyone's got a clearer vision of where we need to be with IMs and contacts and what needs to be done to get there.</p>
<p><a title="Travis Reitter's blog." href="http://treitter.livejournal.com/">Travis</a>, Raúl and I clarified a lot of the changes needed to <a title="Wiki page about libfolks." href="http://telepathy.freedesktop.org/wiki/Folks">libfolks</a> for this shiny new future, and while I didn't get as much hacking done as I would've liked, there's plenty of time for that later.</p>
<p>Thanks to <a title="Open source consultants." href="http://www.collabora.com/">Collabora</a> for providing space for the hackfest and sponsoring plenty of food, the GNOME Foundation for enabling the hackfest to happen, and <a title="Non-stop Nyan cat." href="http://nyan.cat/">Nyan cat</a> for <a title="Bastien Nocera's blog post on the hackfest." href="http://www.hadess.net/2011/06/im-contacts-and-social-hackfest-final.html">entertaining Bastien</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=_nhu2luQDeI:3khQX9lAx9s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=_nhu2luQDeI:3khQX9lAx9s:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=_nhu2luQDeI:3khQX9lAx9s:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=_nhu2luQDeI:3khQX9lAx9s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=_nhu2luQDeI:3khQX9lAx9s:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=_nhu2luQDeI:3khQX9lAx9s:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=_nhu2luQDeI:3khQX9lAx9s:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/_nhu2luQDeI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/06/18/end-of-the-hackfest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/06/18/end-of-the-hackfest/</feedburner:origLink></item>
		<item>
		<title>IM, Contacts &amp; Social hackfest</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/b58GxrVXSR4/</link>
		<comments>http://tecnocode.co.uk/2011/06/12/im-contacts-social-hackfest/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 12:00:58 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Collabora]]></category>
		<category><![CDATA[Evolution]]></category>
		<category><![CDATA[evolution-data-server]]></category>
		<category><![CDATA[GOA]]></category>
		<category><![CDATA[libfolks]]></category>
		<category><![CDATA[libgdata]]></category>
		<category><![CDATA[OAuth]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=427</guid>
		<description><![CDATA[I'll be heading along to the IM, Contacts &#38; Social hackfest next week at Collabora's offices. There, a plan for world domination by libfolks will be forged, along with plotting around GNOME's new SSO overlord system and work on the much-awaited GNOME Contacts. Should be fun! Relatedly, I've just released libgdata 0.9.0, which has sprouted [...]]]></description>
			<content:encoded><![CDATA[<p>I'll be heading along to the <a href="https://live.gnome.org/Hackfests/IMContactsSocial2011">IM, Contacts &amp; Social hackfest</a> next week at Collabora's offices. There, a plan for world domination by <a title="Wiki page about libfolks." href="http://telepathy.freedesktop.org/wiki/Folks">libfolks</a> will be forged, along with plotting around GNOME's new <a title="The initial announcement for GNOME Online Accounts." href="http://davidz25.blogspot.com/2011/04/gnome-online-accounts.html">SSO overlord system</a> and work on the much-awaited GNOME Contacts.</p>
<p>Should be fun!</p>
<p>Relatedly, I've just released <a title="libgdata: A GData library for GNOME." href="https://live.gnome.org/libgdata">libgdata</a> 0.9.0, which has sprouted support for <a title="Google's documentation on OAuth 1.0 in GData APIs." href="http://code.google.com/apis/accounts/docs/OAuthForInstalledApps.html">OAuth 1.0</a> — so hopefully some GNOME Online Accounts goodness will soon make it into Evolution's Google Contacts and Calendar backends.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=b58GxrVXSR4:l9A3TkPTI4s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=b58GxrVXSR4:l9A3TkPTI4s:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=b58GxrVXSR4:l9A3TkPTI4s:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=b58GxrVXSR4:l9A3TkPTI4s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=b58GxrVXSR4:l9A3TkPTI4s:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=b58GxrVXSR4:l9A3TkPTI4s:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=b58GxrVXSR4:l9A3TkPTI4s:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/b58GxrVXSR4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/06/12/im-contacts-social-hackfest/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/06/12/im-contacts-social-hackfest/</feedburner:origLink></item>
		<item>
		<title>Group/Category support for Google Contacts in Evolution</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/YyoeHAJ9ZS4/</link>
		<comments>http://tecnocode.co.uk/2011/01/15/groupcategory-support-for-google-contacts-in-evolution/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 15:35:36 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[evolution-data-server]]></category>
		<category><![CDATA[Google Contacts]]></category>
		<category><![CDATA[libgdata]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=420</guid>
		<description><![CDATA[My work to add support for groups/categories to Evolution's Google Contacts address book backend has just landed, thanks to Milan Crha for reviewing it all. It should be available in GNOME 3.0, so people can categorise their contacts to their hearts' content! I'm now working on making the backend properly asynchronous and cancellable, and also [...]]]></description>
			<content:encoded><![CDATA[<p>My <a title="Bug 566441 — The Google backend doesn't use the tags/categories/groups" href="https://bugzilla.gnome.org/show_bug.cgi?id=566441">work to add support for groups/categories to Evolution's Google Contacts address book backend</a> has just landed, thanks to Milan Crha for reviewing it all. It should be available in GNOME 3.0, so people can categorise their contacts to their hearts' content!</p>
<p>I'm now working on making the backend properly asynchronous and cancellable, and also looking into <a title="Bug 619135 — Add photo support to Google Contacts backend" href="https://bugzilla.gnome.org/show_bug.cgi?id=619135">adding support for contact photos</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=YyoeHAJ9ZS4:4Ei6svDJobk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=YyoeHAJ9ZS4:4Ei6svDJobk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=YyoeHAJ9ZS4:4Ei6svDJobk:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=YyoeHAJ9ZS4:4Ei6svDJobk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=YyoeHAJ9ZS4:4Ei6svDJobk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=YyoeHAJ9ZS4:4Ei6svDJobk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=YyoeHAJ9ZS4:4Ei6svDJobk:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/YyoeHAJ9ZS4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/01/15/groupcategory-support-for-google-contacts-in-evolution/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/01/15/groupcategory-support-for-google-contacts-in-evolution/</feedburner:origLink></item>
		<item>
		<title>More progress on folks' EDS backend</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/DadofIQutE0/</link>
		<comments>http://tecnocode.co.uk/2011/01/12/more-progress-on-folks-eds-backend/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 17:25:33 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[evolution-data-server]]></category>
		<category><![CDATA[libfolks]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=416</guid>
		<description><![CDATA[Raúl (who is unfortunately not on Planet GNOME) continues to plough ahead on the evolution-data-server backend for libfolks. Great work!]]></description>
			<content:encoded><![CDATA[<p>Raúl (who is unfortunately not on Planet GNOME) <a title="Raúl's work on an EDS backend for libfolks." href="http://www.itevenworks.net/2011/01/an-eds-backend-for-folks-part-ii/">continues to plough ahead on the evolution-data-server backend for libfolks</a>. Great work!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=DadofIQutE0:20TERvd_T0g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=DadofIQutE0:20TERvd_T0g:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=DadofIQutE0:20TERvd_T0g:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=DadofIQutE0:20TERvd_T0g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=DadofIQutE0:20TERvd_T0g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=DadofIQutE0:20TERvd_T0g:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=DadofIQutE0:20TERvd_T0g:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/DadofIQutE0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2011/01/12/more-progress-on-folks-eds-backend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2011/01/12/more-progress-on-folks-eds-backend/</feedburner:origLink></item>
		<item>
		<title>More festive drinks</title>
		<link>http://feedproxy.google.com/~r/drboblog/~3/h7cH5eRSvf8/</link>
		<comments>http://tecnocode.co.uk/2010/12/30/more-festive-drinks/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 17:36:14 +0000</pubDate>
		<dc:creator>Philip Withnall</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[libgdata]]></category>
		<category><![CDATA[recipe]]></category>

		<guid isPermaLink="false">http://tecnocode.co.uk/?p=410</guid>
		<description><![CDATA[It turns out that stuffing my failure of an apricot liqueur full of spices has worked, and I now have a bottle of tasty festive spicy apricot vodka. Here's the recipe in full: Ingredients 300g dried apricots 700ml vodka 1 large cinnamon stick Rind of 1 orange 2 blades mace 4 cloves 8 juniper berries [...]]]></description>
			<content:encoded><![CDATA[<p>It turns out that stuffing <a title="My raspberry vodka recipe, and information on my failure of an apricot liqueur." href="http://tecnocode.co.uk/2010/12/14/festive-drinks/">my failure of an apricot liqueur</a> full of spices has worked, and I now have a bottle of tasty festive spicy apricot vodka. Here's the recipe in full:</p>
<h2>Ingredients</h2>
<ul>
<li>300g dried apricots</li>
<li>700ml vodka</li>
<li>1 large cinnamon stick</li>
<li>Rind of 1 orange</li>
<li>2 blades mace</li>
<li>4 cloves</li>
<li>8 juniper berries</li>
<li>~200g granulated sugar</li>
</ul>
<h2>Method</h2>
<ol>
<li>Submerge the dried apricots in boiling water and leave them overnight to re-inflate. I had to do this because I could only buy dried apricots, but I guess an equivalent mass of fresh apricots would work.</li>
<li>Split the apricots into halves and put them into a 1.5l plastic bottle (an empty water bottle is perfect) with a cinnamon stick and the vodka. It's better to put the apricots in first so that they don't splash.</li>
<li>Seal the bottle well and shake it.</li>
<li>Leave the bottle in a cool, dark place for around four weeks,  shaking it every day. The precise amount of time you leave the mixture  to infuse doesn’t really matter, as long as it’s more than about three  weeks. Try to avoid opening the bottle during this time, as that’ll  introduce contaminants.</li>
<li>After the mixture has infused for a suitable amount of time, filter  it out into another bottle. This might take a day or longer, depending  on your filter paper. Use fine filter paper (coffee filter papers worked  well for me), and be prepared to use several filter papers, as they  will get clogged up. Keep the apricots!</li>
<li>Once filtering is complete, add sugar to the filtered liquid to taste. 200g should be about right (I used 225g this time, and it was a little too sweet). Add the cinnamon stick again (or use a fresh one), and the orange rind, mace blades, cloves and juniper berries. Seal the bottle up again and leave it for at least another two weeks, shaking it daily.</li>
<li>After at least two weeks, filter it again. This should take a lot less time, as most of the fine sediment will have been removed during the first filtration.</li>
<li>Drink and enjoy! The recipe produces about 700ml of spiced apricot  vodka. The apricots left over from filtration are nice in a pie, though they will have lost a lot of their flavour (more so than the raspberries).</li>
</ol>
<p>I'm sure it would be quite possible to infuse the vodka with the apricots <em>and</em> spices at the same time, but I didn't try this, so I can't be sure. Another thing I probably should've done is added the sugar <em>after</em> infusing the vodka with the spices, as that would've allowed it to be added to taste. As it was, I added what I guessed was the right amount and fortunately it turned out well.</p>
<p>While not busy playing around with drinks, I've got around to finishing off and releasing <a title="libgdata's home page, including download links." href="http://live.gnome.org/libgdata">libgdata 0.8.0</a>. This vastly improves upload and downloads via streaming I/O, as well as fixing a lot of race conditions, leaks and cancellation problems. This release doesn't introduce much new functionality, but breaks a lot of API, hopefully for the better.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/drboblog?a=h7cH5eRSvf8:NLpLJXusjTQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/drboblog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=h7cH5eRSvf8:NLpLJXusjTQ:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/drboblog?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=h7cH5eRSvf8:NLpLJXusjTQ:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/drboblog?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=h7cH5eRSvf8:NLpLJXusjTQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/drboblog?i=h7cH5eRSvf8:NLpLJXusjTQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/drboblog?a=h7cH5eRSvf8:NLpLJXusjTQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/drboblog?i=h7cH5eRSvf8:NLpLJXusjTQ:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/drboblog/~4/h7cH5eRSvf8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tecnocode.co.uk/2010/12/30/more-festive-drinks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tecnocode.co.uk/2010/12/30/more-festive-drinks/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.494 seconds -->

