<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Structured Procrastination &#187; geek</title>
	<atom:link href="http://blog.adamspiers.org/category/geek/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.adamspiers.org</link>
	<description>because there's always something more interesting than what you should be doing</description>
	<lastBuildDate>Mon, 23 Jan 2012 12:16:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>port redirection from kvm host to guest</title>
		<link>http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/</link>
		<comments>http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 01:58:03 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[DNAT]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[libvirt]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NAT]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[port redirection]]></category>
		<category><![CDATA[QEMU]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[virsh]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=636</guid>
		<description><![CDATA[I&#8217;ve just started using kvm in earnest, and immediately ran into the challenge of how to access my guest via ssh. My first instinct was to configure the guest in bridged mode, but this doesn&#8217;t work well (or at all) with wireless interfaces. So plan B was to set up port redirection from the host [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just started using <a href="http://www.linux-kvm.org/">kvm</a> in earnest, and immediately ran into the challenge of how to access my guest via ssh.  My first instinct was to configure the guest in bridged mode, but this <a href="http://www.linux-kvm.org/page/Networking#public_bridge">doesn&#8217;t work well (or at all) with wireless interfaces</a>.</p>
<p>So plan B was to set up port redirection from the host to the guest, e.g. so that ssh&#8217;ing to localhost port 2222 would redirect to the guest&#8217;s port 22.</p>
<p>After a quick google, <a href="http://serverfault.com/questions/170079/forwarding-ports-to-guests-in-libvirt-kvm">some fiddling with iptables</a>, and a glance at <a href="http://wiki.libvirt.org/page/Networking">the libvirt Networking wiki page</a>, I was still having no luck.  Then it hit me &#8211; my guest was using <a href="http://doc.opensuse.org/products/draft/openSUSE_Factory/opensuse-kvm_sd_draft/cha.qemu.running.html#cha.qemu.running.networking.usermode">user-mode networking</a>, and rather than getting its DHCP-allocated IP from the libvirtd-launched <code>dnsmasq</code> instance on the host, was receiving a <a href="http://doc.opensuse.org/products/draft/openSUSE_Factory/opensuse-kvm_sd_draft/cha.qemu.running.html#cha.qemu.running.networking.usermode">hardcoded allocation of <code>10.0.2.15</code> from the host which is on <code>10.0.2.2</code></a>.  This can be extremely puzzling at first, because no network commands run on the host (such as <code>ifconfig</code>, <code>iptables</code>, <code>brctl</code>, <code>route</code>) will reveal this magic address, yet the host is still accessible from the guest via it. </p>
<p>After a lot more googling, I stumbled across a technique for <a href="http://www.linux-kvm.com/content/host-guest-port-redirection-fly">configuring host to guest port redirection on a running VM</a>.  This sounded very promising, but <code>virt-manager</code> refused to accept the magic <code>Control-Alt-2</code> key combination to switch to QEMU monitor mode.  It turns out that <a href="http://wiki.libvirt.org/page/FAQ#Can_I_connect_to_the_QEMU_monitor_with_libvirt.3F">this is no accident</a>.  However, since <code>libvirt 0.8.8</code>, <a href="http://blog.vmsplice.net/2011/03/how-to-access-qemu-monitor-through.html">the QEMU monitor can be accessed via <code>virsh</code></a>.<br />
Note that the <code>--hmp</code> option is required, otherwise <a href="http://blog.devnu11.net/2011/05/libvirt-qemu-monitor-protocol-qmp-2/">the monitor expects the command in JSON format</a>, so omitting it leads to errors like <code>error: internal error cannot parse json ... lexical error: invalid char in json text</code>.</p>
<p>The final hurdle was figuring out the correct monitor command.  The <code>host_net_redir</code> command as mentioned in the above article is no longer recognized.  Luckily the QEMU monitor interface helped me out here &#8211; I spotted an encouraging sounding command <code>hostfwd_add</code>:</p>
<pre class="brush: bash; title: ; notranslate">
# virsh qemu-monitor-command --hmp sles11 'help hostfwd_add'
hostfwd_add [vlan_id name] [tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport -- redirect TCP or UDP connections from host to guest (requires -net user)
</pre>
<p>and <a href="http://www.google.co.uk/search?q=hostfwd_add+host_net_redir">google confirmed that the latter had superceded the former</a>.</p>
<p>So finally we have the complete solution:</p>
<pre class="brush: bash; title: ; notranslate">
# virsh qemu-monitor-command --hmp sles11 'hostfwd_add ::2222-:22'
# ssh -p 2222 localhost
Password:
Last login: Mon Jan 23 00:37:44 2012
linux-mnsh:~ #
</pre>
<p>Hooray!</p>
<p><span style="color: red">UPDATE:</span> just found another very simple solution &#8211; add a new NIC to the VM which doesn&#8217;t use user-mode networking. Then it will get a IP (on 192.168.100.0/24 by default) which is still NAT&#8217;d but also routable via <code>virbr0</code> on the host, meaning no redirection is necessary; just ssh directly to the guest&#8217;s IP from the host.  A minor disadvantage of this is that the guest won&#8217;t be directly reachable from outside the host, but that&#8217;s unlikely to be an issue in most scenarios.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2012%2F01%2F23%2Fport-redirection-from-kvm-host-to-guest%2F&amp;title=port%20redirection%20from%20kvm%20host%20to%20guest" id="wpa2a_2"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux desktop community &#8220;outraged&#8221; by latest Torvalds comments</title>
		<link>http://blog.adamspiers.org/2011/11/29/linux-desktop-community-outraged-by-latest-torvalds-comments/</link>
		<comments>http://blog.adamspiers.org/2011/11/29/linux-desktop-community-outraged-by-latest-torvalds-comments/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 15:40:38 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[fun]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Canonical]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[Ebay]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[joke]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOS X]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[Sony]]></category>
		<category><![CDATA[Torvalds]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=609</guid>
		<description><![CDATA[Once again, users and developers all around the Linux desktop community have been provoked by controversial comments from Linus Torvalds, creator and long-time maintainer of the Linux kernel. Back in October, Linus dubbed GNOME 3 an &#8220;unholy mess&#8221;, referring to one of the changes as &#8220;crazy crap&#8221; and demanding &#8220;I want my sane interfaces back&#8221;. Since [...]]]></description>
			<content:encoded><![CDATA[<p>Once again, users and developers all around the Linux desktop community have been provoked by controversial comments from Linus Torvalds, creator and long-time maintainer of the Linux kernel.  Back in October, <a href="http://www.theregister.co.uk/2011/08/05/linus_slams_gnome_three/">Linus dubbed GNOME 3 an &#8220;unholy mess&#8221;</a>, referring to one of the changes as &#8220;crazy crap&#8221; and demanding &#8220;I want my sane interfaces back&#8221;.  Since then he has gone even further, contending that &#8220;for some people, a stable, flexible functional desktop environment is far more important than the latest eye candy or trendy minimalist UI design.&#8221;</p>
<p>Reaction from the desktop development community has been swift and mostly unapologetic.  <a href="http://en.wikipedia.org/wiki/Mark_Shuttleworth">Mark Shuttleworth</a>, the founder of <a href="http://en.wikipedia.org/wiki/Canonical_Ltd">Canonical</a>, responded &#8220;Once again, Linus is underestimating the importance of aesthetics in computing. You only have to look at Apple to see that people place more importance on visual beauty than the kind of efficient work processes that a flexible and reliable desktop environment enable.  This is why we&#8217;re pushing our new Unity launcher as a mandatory part of Ubuntu.  We&#8217;re confident that people will quickly overcome the initial shock of <a href="http://www.linuxjournal.com/video/unity-3-rants-and-tip">everything taking longer to find and access</a> because they&#8217;ll be too busy admiring how beautiful it looks.&#8221;  He then cited the latest 11.10 release as an example of this.  &#8220;If you look in the <a href="https://wiki.ubuntu.com/OneiricOcelot/ReleaseNotes">release notes for [Oneiric Ocelot]</a>, you&#8217;ll see a new Alt+Tab switcher at the top of the list of highlights, and below it other radical changes such as renaming &#8216;Places&#8217; to &#8216;Lenses&#8217;.  Frankly, most people lap up this whizzbang shit, and as long as it looks cooler than their friend&#8217;s Windows 7 netbook they&#8217;ll be willing to tolerate <a href="http://goo.gl/caerL">some minor annoyances</a> which are unavoidable when making <a href="http://www.pcpro.co.uk/blogs/2011/05/03/ubuntu-unity-the-great-divider/">immature software</a> a critical component of the desktop.  Sure, we could prioritise boring bug-fixing over innovation, but that just doesn&#8217;t excite the teenagers on the web forums, and we have to think about the next generation of users.  Besides, if you want a dumbed down system that mostly works, there&#8217;s always Mac OS X.&#8221;</p>
<p><a href="http://en.wikipedia.org/wiki/Havoc_Pennington">Havoc Pennington</a>, a GNOME developer well-known for initiating the war on Linux desktop flexibility by <a href="http://ometer.com/free-software-ui.html">drastically reducing the number of preferences</a> and replacing GNOME&#8217;s default window manager, the high-performance scriptable <a href="http://en.wikipedia.org/wiki/Sawfish_(window_manager)">Sawfish</a>, with <a href="http://en.wikipedia.org/wiki/Twm">Metacity</a>, commented: &#8220;It&#8217;s about achieving the right work/play balance. If your desktop allowed you to get stuff done too quickly, it would just increase your stress levels.  <a href="http://mail.gnome.org/archives/usability/2005-December/msg00021.html">Some &#8216;power&#8217; users think they want to be able to stream-line their workflows</a>, but we know better, so <a href="http://www.christoph-wickert.de/blog/2011/06/25/gnome-developer-quote-of-the-day/">we are doing them a favour by making this customizability harder</a>.  After all, everyone needs basically the same things.  Rather than trying to be different, <a href="http://goo.gl/pTCZy">these people</a> should instead learn to enjoy the cute visuals and focus more on having fun.  Life&#8217;s more than just work, work, work, you know.&#8221;</p>
<p>The KDE camp has been slightly less vociferous, perhaps because it&#8217;s old hat for them &#8211; back in 2008 they pioneered the concept of intrusive redesigns and ended up <a href="http://linuxhelp.blogspot.com/2009/01/linus-torvalds-ditches-kde-4-for-gnome.html">the wrong end of one of Linus&#8217; rants</a> as a result.  &#8220;With KDE 4.0, we did our best to prevent people achieving real work, and I think we largely succeeded&#8221;, one of the KDE team leaders recalls.  &#8220;I mean, there was a significant period of time where neither the KDE3 version of knetworkmanager nor its KDE4 rewrite worked properly, so for many wireless networks, the only way you could connect was to disable NetworkManager and write a shell-script to interface directly with wpa-supplicant and ifup.  And that&#8217;s just one small example.&#8221;</p>
<p>Despite Torvalds&#8217; comments, the move towards form over function has been witnessed elsewhere outside the desktop software space.  For example, Apple have introduced <a href="http://www.theonion.com/video/apple-introduces-revolutionary-new-laptop-with-no,14299/">the MacWheel</a>, a move so bold that it makes innovations such as Unity and the GNOME Shell look positively conservative.  However there is no clear industry-wide consensus; in fact companies such as <a href="http://goo.gl/wydGJ">Ebay</a> and <a href="http://goo.gl/CQhe">Sony</a> are beginning to experiment with rejecting both form <em>and</em> function, turning conventional wisdom on its head.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2011%2F11%2F29%2Flinux-desktop-community-outraged-by-latest-torvalds-comments%2F&amp;title=Linux%20desktop%20community%20%26%238220%3Boutraged%26%238221%3B%20by%20latest%20Torvalds%20comments" id="wpa2a_4"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2011/11/29/linux-desktop-community-outraged-by-latest-torvalds-comments/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Running Amazon MP3 downloader on 64-bit Ubuntu 11.04 (Natty Narwhal)</title>
		<link>http://blog.adamspiers.org/2011/09/25/running-amazon-mp3-downloader-on-64-bit-ubuntu-11-04-natty-narwhal/</link>
		<comments>http://blog.adamspiers.org/2011/09/25/running-amazon-mp3-downloader-on-64-bit-ubuntu-11-04-natty-narwhal/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 14:00:18 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MP3]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=594</guid>
		<description><![CDATA[Amazon MP3 store &#8211; a phenomenonly popular online music store. Ubuntu &#8211; a phenomenonly popular version of Linux. 64-bit x86_64 CPUs &#8211; been around for years. You&#8217;d think this was a good combination, wouldn&#8217;t you? Wrong Amazon, along with Spotify and countless others, is dismally failing to support its rapidly growing set of customers who [...]]]></description>
			<content:encoded><![CDATA[<p>Amazon MP3 store &#8211; a phenomenonly popular online music store.  Ubuntu &#8211; a phenomenonly popular version of Linux. 64-bit x86_64 CPUs &#8211; been around for years.  You&#8217;d think this was a good combination, wouldn&#8217;t you?  Wrong <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />   Amazon, along with <a href="http://getsatisfaction.com/spotify/topics/will_there_be_rpm_or_spotify_repository_for_other_distros#reply_6670641">Spotify</a> and countless others, is dismally failing to support its rapidly growing set of customers who run Linux.  As I&#8217;ve said elsewhere, even if 2% of your customers use Linux, that can still be a huge number.  Hopefully some day these big companies will acquire some common sense.</p>
<p>Anyway, in the mean time a quick google brought up the following solution:</p>
<ul>
<li><a href="http://www.dgf64art.com/2011/07/05/installing-amazon-mp3-downloader-on-ubuntu-11-04/">http://www.dgf64art.com/2011/07/05/installing-amazon-mp3-downloader-on-ubuntu-11-04/</a>
</ul>
<p>Unfortunately it doesn&#8217;t work &#8211; the step which installs the manually downloaded .deb files fails due to broken dependencies.  However further googling found a <a href="http://jonathonhill.net/2008-12-26/installing-32-bit-programs-on-64-bit-ubuntu-linux/">post from 2008</a> which revealed a technique based on the very useful <code>getlibs</code> utility.</p>
<p>So here&#8217;s my solution:</p>
<ol>
<li>Download the 32-bit Amazon downloader app for Ubuntu 9.10.
<li>Run <code>sudo dpkg -i --force-all AmazonMP3DownloaderInstall.deb</code>
<li>Run <code>sudo apt-get install getlibs</code> if you don&#8217;t already have <code>getlibs</code> installed.
<li>Run <code>sudo getlibs /usr/bin/amazonmp3</code> and answer yes to the confirmation.
</ol>
<p>At this point if you try to run <code>/usr/bin/amazonmp3</code> you&#8217;ll probably hit <a href="https://bugs.launchpad.net/ubuntu/+source/ia32-libs/+bug/781870">Ubuntu bug 781870</a>.  The workaround is as follows:</p>
<pre class="brush: bash; title: ; notranslate">
export GDK_PIXBUF_MODULE_FILE=/usr/lib32/gdk-pixbuf-2.0/2.10.0/loaders.cache
/usr/bin/amazonmp3
</pre>
<p>You&#8217;ll still get an error that it&#8217;s trying to load the 64-bit version of <code>libgvfsdbus.so</code> thanks to <a href="https://bugs.launchpad.net/ubuntu/+source/ia32-libs/+bug/369498">Ubuntu bug 369498</a>.  I had hopes that <a href="https://answers.launchpad.net/ubuntu/+source/ia32-libs/+question/98762"><code>export GIO_EXTRA_MODULES=/usr/lib32/gio/modules</code> would fix this</a>, but it seems that this variable only gets honoured too late. However, apparently this issue doesn&#8217;t stop the program working so can be ignored.</p>
<p>Another option is to use Banshee&#8217;s built-in Amazon downloader, but even without all the <a href="http://www.networkworld.com/community/banshee-amazon-store-disabled-by-canonical-in-ubuntu">politics surrounding Ubuntu&#8217;s version of Banshee</a> this didn&#8217;t suit my tastes.</p>
<p><span style="color: red">UPDATE:</span> Wow.  Just found out <a href="http://www.amazon.com/Can-I-re-download/forum/Fx3P42S75I9N8FX/Tx1JQUC3VCLTLS0/1?_encoding=UTF8&#038;asin=B0035DH9GC">Amazon doesn&#8217;t support re-downloading stuff you&#8217;ve already bought</a>.  This is truly pathetic, especially considering their Android app kind of implements a locker service.  From now on I&#8217;ll be using <a href="http://7digital.com">7digital</a> whenever I can &#8211; unfortunately their selection isn&#8217;t as big though.  The quest for the perfect music services continues &#8230; :-/</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2011%2F09%2F25%2Frunning-amazon-mp3-downloader-on-64-bit-ubuntu-11-04-natty-narwhal%2F&amp;title=Running%20Amazon%20MP3%20downloader%20on%2064-bit%20Ubuntu%2011.04%20%28Natty%20Narwhal%29" id="wpa2a_6"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2011/09/25/running-amazon-mp3-downloader-on-64-bit-ubuntu-11-04-natty-narwhal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>freedb is dead, long live freedb</title>
		<link>http://blog.adamspiers.org/2011/09/13/freedb-is-dead-long-live-freedb/</link>
		<comments>http://blog.adamspiers.org/2011/09/13/freedb-is-dead-long-live-freedb/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 14:13:20 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[lazyweb]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=573</guid>
		<description><![CDATA[I&#8217;ve been a fan of freeDB for years. It&#8217;s a great way of crowd-sourcing CD title/artist/track information and is a huge help when converting CDs into part of your digital music collection (&#8220;ripping&#8221;). However, more recently I have noticed that the majority of times I submit a new CD to freeDB, it gets rejected due [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been a fan of <a href="http://en.wikipedia.org/wiki/Freedb">freeDB</a> for years.  It&#8217;s a great way of <a href="http://en.wikipedia.org/wiki/Crowdsourcing">crowd-sourcing</a> CD title/artist/track information and is a huge help when converting CDs into part of your digital music collection (&#8220;ripping&#8221;).</p>
<p>However, more recently I have noticed that the majority of times I submit a new CD to freeDB, it gets rejected due to a <a href="http://www.freedb.org/en/faq.3.html#27">discid collision</a>.  This is due to a fundamental limitation in the <a href="http://en.wikipedia.org/wiki/CDDB#How_CDDB_works">discid hashing algorithm</a> which freeDB inherited from CDDB &#8211; it&#8217;s only a 32-bit number, of which a mere 8 bits are used as a checksum for the individual track starting times.  So it&#8217;s no surprise that we&#8217;re getting collisions galore, at an increasing frequency as the database continually grows.  Even worse, CDDB attempts to deal with collisions by making CD entries in the database uniquely retrievable by <code>(discid, category)</code> pairs, where category is one of only <a href="http://www.freedb.org/en/faq.3.html#25">11 musical genres</a>.  Of course this is woefully inadequate, because there are countless genres and most music defies classification anyway.  They attempted to deal with this by calling the 11th category &#8220;misc&#8221;, but that still has the problem of restricting entries to one unique discid per genre. Unsurprisingly this has caused a huge number of collisions, especially in the &#8220;misc&#8221; category. As a result, people have been re-submitting collided entries into the wrong genre, simply because having an entry with the wrong genre in the database is still better than not having it at all.</p>
<p><a href="http://www.gracenote.com/">Gracenote</a>, the <a href="http://en.wikipedia.org/wiki/CDDB#History">eventual owner of CDDB</a> have developed a new generation database imaginatively called <a href="https://doors.gracenote.com/developer/cddb2new.html">CDDB2</a> which adds a much richer meta-data structure.  Gracenote has taken advantage of this to <a href="http://www.cbsnews.com/stories/2007/01/09/ces/main2339906.shtml">clean up the mess caused by attempting to shoe-horn classical CDs into an inadequate schema, and license the results to Apple for iTunes</a>.  Unfortunately that&#8217;s no use to those of us who recognise the value of <a href="http://fsf.org/">freedom</a> over vendor lock-in.</p>
<p>It seems that <a href="http://ftp.freedb.org/pub/freedb/latest/CHANGELOG">the freeDB server software hasn&#8217;t been updated since 2006</a>, so presumably there&#8217;s not much of an active community left.  So there&#8217;s a ripe opportunity for a smart philanthropist hacker to breathe new life into this valuable project.  Sounds ideal for <a href="http://code.google.com/soc/">Google Summer of Code</a> task, for instance. As this is largely a <em>lazyweb</em> blog post, here are my thoughts on what needs to be done; it&#8217;s unlikely I&#8217;ll ever manage to prioritise it above other things already on my plate:</p>
<ul>
<li>Design a new collision-proof hashing algorithm. It should produce at least 128-bit hashes, and include as much information about the contents of the physical CD as possible, namely:
<ol>
<li>number of tracks
<li>starting times of all tracks
<li>total playing time
</ol>
<p>This algorithm could be as simple as calculating the MD5 digest of a delimiter-separated concatenation of the above items represented as integers.</p>
<p>Notice that this should be limited to information which can be retrieved very quickly; for instance producing MD5 digests of the <em>contents</em> of each track takes too long to be useful in practice.</p>
<li>Design the next level of the <a href="http://ftp.freedb.org/pub/freedb/latest/CDDBPROTO">CDDB protocol</a> (which at the time of writing would be <a href="http://ftp.freedb.org/pub/freedb/latest/CDDBPROTO">level 7</a>), which allows additional querying by this new 128-bit (or larger) digest.
<li>Extend <a href="http://www.freedb.org/en/download__server_software.4.html">the existing freeDB server software</a> to support this new level whilst remaining backwards-compatible with existing clients.  In other words, database entries should be retrievable both by the old (32-bit discid, category) pair and the new digest. This would require iterating once through all existing entries to recalculate the new digest for each.
<li>(Optional) Extend one or more F/OSS clients to use the new protocol level, and advocate other clients to do the same &#8230;
</ul>
<p>For bonus points, you could extend the database schema in a similar way to CDDB2, and then start a crowd-sourcing project for cleaning up the database with respect to all those pesky classical tracks which have distinct composer / performer metadata.</p>
<p>So, any takers?  You&#8217;d win the admiration and gratitude of a few, the satisfaction of knowing you helped slightly improve the lives of millions, and a place in heaven <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2011%2F09%2F13%2Ffreedb-is-dead-long-live-freedb%2F&amp;title=freedb%20is%20dead%2C%20long%20live%20freedb" id="wpa2a_8"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2011/09/13/freedb-is-dead-long-live-freedb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to never EVER lose your phone contacts again</title>
		<link>http://blog.adamspiers.org/2011/07/30/never-ever-lose-your-phone-contacts-again/</link>
		<comments>http://blog.adamspiers.org/2011/07/30/never-ever-lose-your-phone-contacts-again/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 19:31:13 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[front page]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[contacts]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[phone]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[syncML]]></category>
		<category><![CDATA[Windows phones]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=514</guid>
		<description><![CDATA[It continually astonishes me how often I see facebook status updates / group invites / tweets / emails from friends and acquaintances saying something to the effect of &#8220;ARGH my iPhone / Blackberry / Nokia phone has been stolen / lost / eaten by my pet donkey and I lost everyone&#8217;s numbers, please can you [...]]]></description>
			<content:encoded><![CDATA[<p>It continually astonishes me how often I see facebook status updates / group invites / tweets / emails from friends and acquaintances saying something to the effect of &#8220;ARGH my iPhone / Blackberry / Nokia phone has been stolen / lost / eaten by my pet donkey and I lost everyone&#8217;s numbers, please can you all send me your numbers!!&#8221;</p>
<p>People, it&#8217;s 2011 already! Whilst technology is still far from perfect, it landed a man on the moon 42 years ago way before mobile phones existed, and certainly solved this particular problem of disappearing phones several years ago.  So for those of you who still haven&#8217;t figured this out, without further ado I will outline a solution which should only cost 10 minutes of your life and ensure you never have to broadcast a panicked message cursing your pet donkey and asking everyone to send you their numbers.</p>
<p><span id="more-514"></span></p>
<h3>Android phones</h3>
<p>Firstly, if you already have a phone belonging to the <a href="http://www.mediapost.com/publications/?fa=Articles.showArticle&amp;art_aid=154896">rapidly growing</a> family of <a href="http://www.google.com/mobile/android/">Android phones</a> (such as any recent Samsung, HTC, Sony Ericsson or Motorola phone), then congratulations!  You&#8217;re immediately at an advantage.  If you have a <a href="http://www.google.com/intl/en/landing/accounts/">Google account</a>, you probably already linked your phone to it when you first went through the phone&#8217;s setup procedure, in which case your contacts / calendar / e-mail etc. are most likely already being automatically synchronised with your account, and are safely backed up within Google&#8217;s cloud.  To make sure, visit <a href="http://google.com/contacts">http://google.com/contacts</a> and you should see all your contacts listed in a very nice interface which lets you do other handy things like automatically merge duplicate contacts.</p>
<p>If you don&#8217;t see your contacts there, or you don&#8217;t have a Google account and/or never linked your phone with a Google account, take the following simple steps:</p>
<ol>
<li><a href="http://www.google.com/intl/en/landing/accounts/">Create a Google account</a> if you don&#8217;t have one already (it&#8217;s free)</li>
<li>On your phone, go to the Settings menu, select &#8220;Accounts &amp; sync settings&#8221;, and then ensure that your Google account is listed and that sync is enabled.</li>
</ol>
<h3>iPhones, Blackberries, Nokia / Windows / other vaguely modern phones</h3>
<p>Again the solution I would recommend is to set up automatic synchronization to a Google Account, because it&#8217;s free, proven to work, and means your data is backed up in the Google cloud, which statistically speaking is a far safer place to store your contacts than one of your own hard drives.  Instructions for these phones are listed here: <a href="http://www.google.com/mobile/sync/">http://www.google.com/mobile/sync/</a></p>
<p><iframe width="425" height="349" src="http://www.youtube.com/embed/Kt_-qHczCMg" frameborder="0" allowfullscreen></iframe></p>
<p>Even if you have a &#8220;dumb&#8221; (non-smart) phone, unless it is really ancient, the chances are that it supports SyncML which means that the above will work.  If however your phone is so old that it doesn&#8217;t even support SyncML then I would simply recommend that you upgrade.  Modern mobile handsets are so sophisticated that even the cheapest, most basic models (given away for free with low-cost contracts) will support SyncML.</p>
<h3>It&#8217;s more than just contacts</h3>
<p>If you follow the above suggestions, you&#8217;ll find that your phone&#8217;s calendar will automatically get synchronized too.</p>
<h3>Non-Google solutions</h3>
<p>If for some strange reason you are highly anti-Google, there are of course plenty of other options.  I&#8217;m not going to go into detail here, but here&#8217;s some food for thought:</p>
<ul>
<li><a href="http://www.macworld.com/article/154847/2010/10/mobileme_or_google.html">Choosing between MobileMe and Google</a></li>
<li><a href="http://www.tipb.com/2009/02/11/great-iphone-sync-debate-desktop-laptop-cloud/">The Great iPhone Sync Debate: Desktop, Laptop, or Cloud?</a></li>
</ul>
<h3>Wrapping up</h3>
<p>That&#8217;s all for now.  Hope it was useful &#8211; feel free to leave comments.  Oh, and here are two final suggestions for what to do if you see one of your poor friends send out a facebook message like the one at the top of this article:</p>
<ul>
<li>DON&#8217;T respond by posting your mobile phone number on their wall (do you <em>really</em> want the whole world to have your number?)</li>
<li>Send them the link to this article.</li>
</ul>
<p>&nbsp;</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2011%2F07%2F30%2Fnever-ever-lose-your-phone-contacts-again%2F&amp;title=How%20to%20never%20EVER%20lose%20your%20phone%20contacts%20again" id="wpa2a_10"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2011/07/30/never-ever-lose-your-phone-contacts-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>email nirvana</title>
		<link>http://blog.adamspiers.org/2011/05/15/email-nirvana/</link>
		<comments>http://blog.adamspiers.org/2011/05/15/email-nirvana/#comments</comments>
		<pubDate>Sun, 15 May 2011 15:33:00 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gtd]]></category>
		<category><![CDATA[inbox]]></category>
		<category><![CDATA[lifehacks]]></category>
		<category><![CDATA[mail]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=473</guid>
		<description><![CDATA[Back in November 2010 I blogged about how I was chasing my dream of catching up on all personal mail, by automatically measuring my progress. Well, it worked &#8211; I finally made it!  For the first time in years, I finally have an empty inbox.  It turns out Google even hid a little Easter egg in gmail [...]]]></description>
			<content:encoded><![CDATA[<p>Back in November 2010 I <a href="http://blog.adamspiers.org/2010/11/28/measuring-inbox-sizes/">blogged about how I was chasing my dream of catching up on all personal mail, by automatically measuring my progress</a>. Well, it worked &#8211; I finally made it!  For the first time in <em>years</em>, I finally have an empty inbox.  It turns out Google even hid a little <a href="http://en.wikipedia.org/wiki/Easter_egg_(media)">Easter egg</a> in gmail to reward people who reach this state of bliss:</p>
<p style="text-align: center;"><a href="http://blog.adamspiers.org/wp-content/uploads/2011/05/no-gmail.png"><img class="aligncenter size-full wp-image-474" title="look ma, an empty inbox!" src="http://blog.adamspiers.org/wp-content/uploads/2011/05/no-gmail.png" alt="" width="664" height="263" /></a></p>
<p>This feels <em>good</em>.  Next up is to purge my massive TODO list of out of date entries and then re-evaluate what&#8217;s left &#8230;</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2011%2F05%2F15%2Femail-nirvana%2F&amp;title=email%20nirvana" id="wpa2a_12"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2011/05/15/email-nirvana/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>measuring email inbox sizes</title>
		<link>http://blog.adamspiers.org/2010/11/28/measuring-inbox-sizes/</link>
		<comments>http://blog.adamspiers.org/2010/11/28/measuring-inbox-sizes/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 17:35:08 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gtd]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[lifehacks]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=349</guid>
		<description><![CDATA[Like many people, for a long time I have been drowning in email. I am perhaps bit unusual in that whilst my personal google inboxes are permanently overflowing, my work inboxes are generally very close to empty. This is because as a (bad) practitioner of GTD and sometime reader of Inbox Zero and similar sites, [...]]]></description>
			<content:encoded><![CDATA[<p>Like many people, for a long time I have been drowning in email.  I am perhaps bit unusual in that whilst my personal google inboxes are permanently overflowing, my work inboxes are generally very close to empty.  This is because as a (bad) practitioner of <a href="http://en.wikipedia.org/wiki/Getting_Things_Done">GTD</a> and sometime reader of <a href="http://inboxzero.com/">Inbox Zero</a> and similar sites, I <em>do</em> actually know <em>how</em> to get grips with email, and through professional pride apply the techniques fairly religiously when I&#8217;m working.  In contrast, when it comes to dealing with personal mail, I&#8217;ll always favour procrastinating on some other interesting project instead.  God forbid I should ever get my personal life in gear!</p>
<p>Well, this bad habit has been stressing me out for a LONG time now.  I&#8217;m a long-term fan of Gretchen Rubin&#8217;s <a href="http://www.happiness-project.com/">Happiness Project</a>, and the other day stumbled across one of her older posts entitled <a href="http://www.happiness-project.com/happiness_project/2009/03/measure-what-you-want-to-manage.html">Measure what you want to manage</a>.  I&#8217;d been wanting to graph the size of my inboxes over time, to get some grip on how bad my backlog actually is, and her post gave me the nudge to actually sort it out.</p>
<p>As usual, <a href="http://www.ruby-lang.org/en/">Ruby</a> makes it almost ridiculously easy.  There&#8217;s a beautiful written <a>gem</a> called <a href="http://rubydoc.info/gems/gmail/0.3.4/frames">gmail</a> which uses IMAP to talk to your gmail account.  So then it&#8217;s just a matter of writing a little program to append a line of gmail folder sizes to a CSV file every time it gets run:</p>
<pre class="brush: ruby; title: ; notranslate">
#!/usr/bin/env ruby

require 'pathname'
require 'rubygems'

# sudo gem install gmail
# Note: this is an improved version of Daniel Parker's ruby-gmail
# http://rubydoc.info/gems/gmail/0.3.4/frames
require 'gmail'

# sudo gem install fastercsv
require 'faster_csv'

USERNAME = 'your.account.name.goes.here@gmail.com'
PASSWORD = 'your.password.goes.here'

CSV_FILE = Pathname(ENV['HOME']).join(
  &quot;choose&quot;, &quot;a&quot;, &quot;path&quot;, &quot;to&quot;, &quot;gmail-counts.csv&quot;
)

labels = FasterCSV.open(CSV_FILE, 'r').shift[2..-1]

FasterCSV.open(CSV_FILE, 'a') do |csv|
  Gmail.connect(USERNAME, PASSWORD) do |gmail|
    now = Time.now
    counts = [ now.to_i.to_s, now.strftime(&quot;%Y/%m/%d.%H:%M:%S&quot;) ]
    labels.each do |label|
      unread = label.gsub!(/ unread$/, '')
      folder = gmail.mailbox(label)
      count = unread ? folder.count(:unread) : folder.count
      puts &quot;%s: %d (%d unread, %d read)&quot; % \
        [ label, count, folder.count(:unread), folder.count(:read) ]
      counts &lt;&lt; count
    end
    csv &lt;&lt; counts
  end
end
</pre>
<p>Then create <code>gmail-counts.csv</code> in the folder referenced in the script, whose header line contains a list of the labels you want counted (append <code>unread</code> if you want the unread count rather than the total, and prefix &#8220;special&#8221; gmail folders with <code>[Google Mail]/</code>.  Here&#8217;s an example of the header followed by a single line of folder counts:</p>
<pre class="brush: plain; title: ; notranslate">
epoch,datetime,INBOX,INBOX unread,[Google Mail]/Drafts,music
1290873125,11/27/2010.15:52:05,555,20,12,1596
</pre>
<p>Then make sure the program is automatically run on a regular basis somehow.  On Linux this is as simple as adding a new line into your <code><a href="http://en.wikipedia.org/wiki/Cron">crontab</a></code>.  My <a href="http://adamspiers.org/computing/quietrun">quietrun</a> utility comes in handy for this:</p>
<pre class="brush: plain; title: ; notranslate">
0 6,12,18 * * * quietrun /path/to/script/count-gmail
</pre>
<p>Then you can use Google Docs or your favourite spreadsheet / charting application to plot some nice graphs.  I used <a href="http://adamspiers.org/mail/gmail-counts.ploticus">this script</a> which is written in the <a href="http://ploticus.sourceforge.net/">Ploticus</a> graphing language; here is the result:</p>
<p><span title="Click to view image"><a href="http://adamspiers.org/mail/gmail-counts.png"><img src="http://adamspiers.org/mail/gmail-counts.png" alt="sample graph of gmail inbox size over time" width="700" /></a></span></p>
<p>Easy!</p>
<p><strong>UPDATE 5 months later! (15th May 2011): <a title="email nirvana" href="http://blog.adamspiers.org/2011/05/15/email-nirvana/">I finally made it!</a></strong></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F11%2F28%2Fmeasuring-inbox-sizes%2F&amp;title=measuring%20email%20inbox%20sizes" id="wpa2a_14"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/11/28/measuring-inbox-sizes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven fail</title>
		<link>http://blog.adamspiers.org/2010/10/07/maven-fail/</link>
		<comments>http://blog.adamspiers.org/2010/10/07/maven-fail/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 19:18:37 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[dependencies]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=277</guid>
		<description><![CDATA[In my recent work I have encountered Apache Maven, and I think the following snippet of real-world Maven code nicely sums up why Maven is not the idea replacement for the horror that is ant: Dear god. 34 lines and a plug-in, just to change the permissions on a file in a platform-specific way?? I [...]]]></description>
			<content:encoded><![CDATA[<p>In my recent work I have encountered <a href="http://maven.apache.org/">Apache Maven</a>, and I think the following snippet of real-world Maven code nicely sums up why Maven is <strong>not</strong> the idea replacement for <a href="http://blog.adamspiers.org/ant-dependency-fail/">the horror that is ant</a>:</p>
<pre class="brush: xml; title: ; notranslate">
  &lt;profiles&gt;
    &lt;profile&gt;
      &lt;id&gt;unix&lt;/id&gt;
      &lt;activation&gt;
        &lt;os&gt;
          &lt;family&gt;unix&lt;/family&gt;
        &lt;/os&gt;
      &lt;/activation&gt;
      &lt;build&gt;
        &lt;plugins&gt;
          &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;exec-maven-plugin&lt;/artifactId&gt;
            &lt;executions&gt;
              &lt;execution&gt;
                &lt;id&gt;set-run-file-perms&lt;/id&gt;
                &lt;phase&gt;generate-resources&lt;/phase&gt;
                &lt;goals&gt;
                  &lt;goal&gt;exec&lt;/goal&gt;
                &lt;/goals&gt;
                &lt;configuration&gt;
                  &lt;executable&gt;chmod&lt;/executable&gt;
                  &lt;arguments&gt;
                    &lt;argument&gt;0755&lt;/argument&gt;
                    &lt;argument&gt;${project.build.directory}/foo.sh&lt;/argument&gt;
                  &lt;/arguments&gt;
                &lt;/configuration&gt;
              &lt;/execution&gt;
            &lt;/executions&gt;
          &lt;/plugin&gt;
        &lt;/plugins&gt;
      &lt;/build&gt;
    &lt;/profile&gt;
  &lt;/profiles&gt;
</pre>
<p>Dear god.  34 lines and a plug-in, just to change the permissions on a file in a platform-specific way??</p>
<p>I should add that the above was written by an extremely smart guy who is a top-notch programmer; no, I don&#8217;t think the author is at fault here.  Even if there&#8217;s a more concise/portable way of achieving the same result in Maven (and there might well be &#8211; I admit I&#8217;m still a Maven newbie), there&#8217;s still the undeniable fact that XML is horrendously verbose, and any code written in it is by nature unnecessarily difficult to maintain.  To this end I applaud the <a href="http://github.com/mrdon/maven-yamlpom-plugin/wiki">ongoing efforts supporting the use of YAML to implement the Maven POM</a>.</p>
<p>It&#8217;s worth seeing what the above would look like if we wrote it in <a href="http://rake.rubyforge.org/">rake</a>:</p>
<pre class="brush: ruby; title: ; notranslate">
require 'pathname'

desc &quot;Make binary executable&quot;
task :chmod do
  File.new(Pathname.new(build_dir) + &quot;foo.sh&quot;).chmod(0755)
end
</pre>
<p>I don&#8217;t think I need to make a case for which is more legible or maintainable.  Oh, <em>and</em> the Ruby version is cross-platform.</p>
<p>To continue an anti-XML rant which has been made <a href="http://www.google.co.uk/search?q=xml+sucks">countless times already</a>: what the ant and Maven people don&#8217;t seem to realise is that XML is not a real programming language and is therefore not expressive enough to deal with many cases that a build system needs.  The clue&#8217;s <a href="http://en.wikipedia.org/wiki/Xml">in the name</a>, guys!  &#8220;M&#8221; is for &#8220;markup&#8221; not &#8220;<a href="http://en.wikipedia.org/wiki/Turing_completeness">Turing-complete</a>&#8220;.  That&#8217;s why every time you need to do something vaguely unusual for which there isn&#8217;t an ant <code>taskdef</code> or Maven plugin, you have to write hundreds of lines more Java/XML just to cope with that case.  That&#8217;s why Maven needs so many damn plugins.</p>
<p>The accidental silver lining to this is that because it takes so much effort to accomplish simple tasks, Maven developers find themselves compelled to reuse and share plugins, and to be fair, Maven has some good ideas on how to do this, even if the implementation isn&#8217;t always the best.  For example, the built-in <a href="http://maven.apache.org/repository-management.html">plug-in repository management</a> and <a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">plug-in dependency management</a> seem to work nicely, but unfortunately for some reason it has a propensity to download plug-ins on most runs, far more frequently than any sensible caching layer should.</p>
<p><a href="http://en.wikipedia.org/wiki/Domain-specific_language">DSL</a> issues aside, I&#8217;m not convinced by <a href="http://en.wikipedia.org/wiki/Apache_Maven#Build_Lifecycles">the fixed lifecycle philosophy behind Maven</a> either.  I wonder if it was borne out of frustration with <a href="http://blog.adamspiers.org/ant-dependency-fail/">the lack of proper dependency checking in ant</a>.</p>
<p>That said, I do like how Maven encourages standardization of the build lifecycle and phase namespace thereof, since newcomers to a project immediately know some familiar entry points.  But the same could be said of 99% of projects which use Make and use standard rule target names such as <code>install</code> and <code>clean</code>.  And I suspect that many developers suffer when they try to shoe-horn their own project&#8217;s build requirements into Maven&#8217;s standard lifecycle.</p>
<p>My concern with this phased approach is that it is too linear.  The expectation is that a build process is a one-dimensional sequence of steps, and you get to choose your starting point but not much else.  This seems fundamentally wrong to me.  A build dependency tree is well understood to be a <a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph">DAG</a>, and any build system which doesn&#8217;t model this properly seems to me to be burying its head in the sand.  On the other hand, if it does model it properly, which includes implementing proper dependency resolution, the required build lifecycle should emerge naturally without having to dictate that <code>generate-sources</code> comes before <code>compile</code> which comes before <code>test</code> and so on.</p>
<p>I&#8217;ve had some ideas of what the ideal build system looks like, and how to get there from the conventional Java world.  More on that soon.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F10%2F07%2Fmaven-fail%2F&amp;title=Maven%20fail" id="wpa2a_16"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/10/07/maven-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>announcing rypper (again)</title>
		<link>http://blog.adamspiers.org/2010/05/20/announcing-rypper-again/</link>
		<comments>http://blog.adamspiers.org/2010/05/20/announcing-rypper-again/#comments</comments>
		<pubDate>Thu, 20 May 2010 21:54:21 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[build service]]></category>
		<category><![CDATA[obs]]></category>
		<category><![CDATA[openSUSE]]></category>
		<category><![CDATA[packaging]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[rypper]]></category>
		<category><![CDATA[suse]]></category>
		<category><![CDATA[zypper]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=260</guid>
		<description><![CDATA[Back in August 2009, I announced the release of a simple script called rypper which I wrote to wrap around zypper and provide the ability to make batch operations on repositories. Here are some example usages: I only got one response so I assumed it wasn&#8217;t that useful to other people. However here I am [...]]]></description>
			<content:encoded><![CDATA[<p>Back in August 2009, I <a href="http://lists.opensuse.org/opensuse-softwaremgmt/2009-08/msg00002.html">announced the release</a> of a simple script called <code>rypper</code> which I wrote to wrap around <code><a title="zypper" href="http://en.opensuse.org/Zypper">zypper</a></code> and provide the ability to make batch operations on repositories.  Here are some example usages:</p>
<pre class="brush: bash; title: ; notranslate">
# list all disabled repos
rypper -d

# list all enabled repos with autorefresh off
rypper -e -R

# list all repos which have anything to do with KDE
rypper -x kde

# list priority and URIs for all repos whose alias contains 'home:'
rypper -a home: l -pu

# enable autorefresh on all OpenSUSE Build Service repos
rypper -u download.opensuse.org -R mr -r

# remove all repos on external USB HDD mounted on /media/disk
rypper -u /media/disk rr
</pre>
<p>I only got one response so I assumed it wasn&#8217;t that useful to other people.</p>
<p>However here I am at <a href="http://www.novell.com/brainshare/amsterdam/">BrainShare EMEA in Amsterdam</a> surrounded by like-minded geeks, and in a fit of enthusiasm / procrastination, I have finally got round to learning how to build <a href="http://wiki.opensuse.org/openSUSE:Build_Service">openSUSE Build Service</a> packages, and so proudly (?) present my first OBS package release: <a href="http://software.opensuse.org/search?baseproject=ALL&amp;p=1&amp;q=rypper">the 1-click install version of rypper</a>.  Enjoy!</p>
<p><strong>UPDATE 21 March 2011:</strong> based on feedback from <a href="http://www.novell.com/linux/">SLE</a> Product Management, I have submitted a <a href="https://fate.novell.com/312051">formal request</a> to have zypper extended to include this kind of functionality.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F05%2F20%2Fannouncing-rypper-again%2F&amp;title=announcing%20rypper%20%28again%29" id="wpa2a_18"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/05/20/announcing-rypper-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>don&#8217;t use Orange abroad</title>
		<link>http://blog.adamspiers.org/2010/04/03/dont-use-orange-abroad/</link>
		<comments>http://blog.adamspiers.org/2010/04/03/dont-use-orange-abroad/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 16:10:42 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[front page]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[abroad]]></category>
		<category><![CDATA[broadband]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[orange]]></category>
		<category><![CDATA[roaming]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=252</guid>
		<description><![CDATA[Ouch.  Arrived back home to a nice letter from Orange: Great news. Every year we invite an exclusive group of customers to join our Premier Service for 12 months &#8211; and this year you&#8217;re one of them. It went on to offer me a dedicated customer services and a USB dongle providing 3 months&#8217; free [...]]]></description>
			<content:encoded><![CDATA[<p>Ouch.  Arrived back home to a nice letter from Orange:</p>
<blockquote><p>Great news. Every year we invite an exclusive group of customers to join our Premier Service for 12 months &#8211; and this year you&#8217;re one of them.</p></blockquote>
<p>It went on to offer me a dedicated customer services and a USB dongle providing 3 months&#8217; free mobile broadband, then 2p per MB after that.  Amazingly generous, no?  Then I realised why they&#8217;re being so nice to me:</p>
<p><a href="http://blog.adamspiers.org/wp-content/uploads/2010/04/Orange-roaming-data.png"><img class="aligncenter size-full wp-image-253" title="excerpt from my last Orange bill" src="http://blog.adamspiers.org/wp-content/uploads/2010/04/Orange-roaming-data.png" alt="" width="636" height="253" /></a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F04%2F03%2Fdont-use-orange-abroad%2F&amp;title=don%26%238217%3Bt%20use%20Orange%20abroad" id="wpa2a_20"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/04/03/dont-use-orange-abroad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>get (no) satisfaction FAIL</title>
		<link>http://blog.adamspiers.org/2010/03/02/get-no-satisfaction-fail/</link>
		<comments>http://blog.adamspiers.org/2010/03/02/get-no-satisfaction-fail/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 10:17:44 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[getsatisfaction]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=243</guid>
		<description><![CDATA[I only just realised how lame getsatisfaction.com is: You can&#8217;t sort search results by popularity You can&#8217;t restrict search results to answered or unanswered questions Well, that pretty much renders it totally useless right there, for both customers and companies, unless the community you&#8217;re searching is tiny, in which case why would you need the [...]]]></description>
			<content:encoded><![CDATA[<p>I only just realised how lame <a href="http://getsatisfaction.com/">getsatisfaction.com</a> is:</p>
<ul>
<li>You can&#8217;t sort search results by popularity</li>
<li>You can&#8217;t restrict search results to answered or unanswered questions</li>
</ul>
<p>Well, that pretty much renders it totally useless right there, for both customers and companies, unless the community you&#8217;re searching is tiny, in which case why would you need the site anyway?</p>
<p>Oh yeah, and the <a href="http://getsatisfaction.com/getsatisfaction/topics/is_there_any_way_to_search_for_all_words_not_just_any">undocumented boolean AND searches don&#8217;t work</a>.</p>
<p>Staggering.  (I&#8217;m praying someone will tell me I&#8217;m wrong about at least one of these.)</p>
<p><strong>Update 2010/03/07:</strong> got a <a href="http://getsatisfaction.com/getsatisfaction/topics/sort_ideas_by_number_of_followers">reply from getsatisfaction</a> on search results sorting &#8211; I was right but there is a kind of lame alternative.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F03%2F02%2Fget-no-satisfaction-fail%2F&amp;title=get%20%28no%29%20satisfaction%20FAIL" id="wpa2a_22"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/03/02/get-no-satisfaction-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Motorola doesn&#8217;t get it</title>
		<link>http://blog.adamspiers.org/2010/03/01/motorola-doesnt-get-it/</link>
		<comments>http://blog.adamspiers.org/2010/03/01/motorola-doesnt-get-it/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 21:24:10 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[closed]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[milestone]]></category>
		<category><![CDATA[motorola]]></category>
		<category><![CDATA[open]]></category>
		<category><![CDATA[phone]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=236</guid>
		<description><![CDATA[I just posted this on Motorola Europe&#8217;s facebook page: Just got a Milestone and am impressed with the hardware but disappointed with Motorola&#8217;s attitude towards European customers regarding the closed bootloader. [An official statement from the manager of the technical team behind the MOTODEV program at Motorola] says &#8220;This practice is driven by a number [...]]]></description>
			<content:encoded><![CDATA[<p>I just posted this on <a href="http://www.facebook.com/motorolaeurope">Motorola Europe&#8217;s facebook page</a>:</p>
<blockquote><p>Just got a Milestone and am impressed with the hardware but disappointed with Motorola&#8217;s attitude towards European customers regarding the closed bootloader.  [<a href="http://community.developer.motorola.com/t5/MOTODEV-Blog/Custom-ROMs-and-Motorola-s-Android-Handsets/ba-p/4224">An official statement from the manager of the technical team behind the MOTODEV program  at Motorola</a>] says &#8220;This practice is driven by a number of different business factors&#8221; but does not explain further &#8211; what are you hiding, Motorola? You seem to be underestimating</p>
<ul>
<li> (a) the potential of a technology community which promotes collaboration rather than hindering it (why do you think Android grew so quickly in the first place?), and</li>
</ul>
<ul>
<li>(b) the importance of regular, open communication with your customers.</li>
</ul>
<p>Sadly if this continues, I expect HTC and your other competitors will leave you far behind.
</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F03%2F01%2Fmotorola-doesnt-get-it%2F&amp;title=Motorola%20doesn%26%238217%3Bt%20get%20it" id="wpa2a_24"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/03/01/motorola-doesnt-get-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Golden Cheetah</title>
		<link>http://blog.adamspiers.org/2010/02/15/golden-cheetah/</link>
		<comments>http://blog.adamspiers.org/2010/02/15/golden-cheetah/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 18:53:27 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[cinqo]]></category>
		<category><![CDATA[CompuTrainer]]></category>
		<category><![CDATA[cycling]]></category>
		<category><![CDATA[golden cheetah]]></category>
		<category><![CDATA[qollector]]></category>
		<category><![CDATA[quarq]]></category>
		<category><![CDATA[wko]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=218</guid>
		<description><![CDATA[A few days ago whilst browsing the latest news on Quarq power-meters, I discovered that some very smart guys have answered my prayers and written a fabulous new piece of software called Golden Cheetah!  Not only is it fully cross-platform and incredibly feature-rich, but it works natively with ANT+ devices via quarqd, and with the [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago whilst browsing the latest news on <a href="http://www.quarq.com/">Quarq power-meters</a>, I discovered that some very smart guys have answered my prayers and written a <a href="http://goldencheetah.org/">fabulous new piece of software called Golden Cheetah</a>!  Not only is it fully cross-platform and <a href="http://markliversedge.blogspot.com/2009/12/3d-plotting-of-power-data.html">incredibly</a> <a href="http://goldencheetah.org/screenshots.html">feature-rich</a>, but it <a href="http://www.youtube.com/watch?v=6rsvw-xPLT8">works natively with ANT+ devices via quarqd</a>, and with the Computrainer not just in standard <a href="http://www.youtube.com/watch?v=3BmEI0unSEA">erg mode</a> but also in <a href="http://www.youtube.com/watch?v=Mu80qwHFDGc">online streaming mode</a> allowing you train with someone on the other side of the Atlantic <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   It&#8217;s becoming harder and harder to resist buying a <a href="http://www.heartratemonitor.co.uk/garmin_forerunner_310xt.html">Garmin Forerunner 310XT</a> and a <a href="http://www.quarq.com/cinqo">Quarq Cinqo Saturn</a> &#8230;  But perhaps most importantly of all, it&#8217;s <a href="http://adamspiers.org/computing/free-software.html">free software</a> released under the <a href="http://www.gnu.org/licenses/licenses.html#GPL">GPL</a>.  The authors really do &#8220;get it&#8221;:</p>
<blockquote><p>We believe that cyclists should be able to download their power data to the computer of their choice, analyze it in whatever way they see fit, and share their methods of analysis with others.</p></blockquote>
<p>If only companies like Suunto &#8220;got it&#8221; rather than shipping miserable excuses for software such as Suunto Training Manager&#8230; *sigh*.  Anyway, looking forward to getting my media PC fixed and trying this out soon&#8230; maybe I&#8217;ll even find some time to help improve it <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F02%2F15%2Fgolden-cheetah%2F&amp;title=Golden%20Cheetah" id="wpa2a_26"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/02/15/golden-cheetah/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ant dependency FAIL</title>
		<link>http://blog.adamspiers.org/2010/01/05/ant-dependency-fail/</link>
		<comments>http://blog.adamspiers.org/2010/01/05/ant-dependency-fail/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 01:28:03 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[dependencies]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=196</guid>
		<description><![CDATA[Oh wow, that&#8217;s four hours of my life I won&#8217;t get back. Four hours trying to figure out why the hell my changes to .java source files weren&#8217;t showing up in the compiled binaries, debugging an unholy mess of ant XML files, before I finally realised how badly ant&#8217;s dependency checking sucks &#8230; Then 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Oh wow, that&#8217;s four hours of my life I won&#8217;t get back.</p>
<p>Four hours trying to figure out why the hell my changes to .java source files weren&#8217;t showing up in the compiled binaries, debugging an unholy mess of ant XML files, before I finally realised how badly ant&#8217;s dependency checking sucks &#8230; Then 5 minutes of googling for &#8216;ant sucks&#8217; and I find two <a href="http://andreas-krey.blogspot.com/2009/01/ant-bad.html">excellently written</a> <a href="http://olsner.se/2008/03/29/ant-sucks/">rants</a> which confirm my discovery (you might need to consult google&#8217;s cache for the latter).</p>
<p>I shouldn&#8217;t have been surprised.  Anything which uses XML as a domain-specific language should have already set the alarm bells ringing, but my excitement at learning something new initially blotted out the dull headache caused by hacking in XML.  Bah!</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2010%2F01%2F05%2Fant-dependency-fail%2F&amp;title=ant%20dependency%20FAIL" id="wpa2a_28"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2010/01/05/ant-dependency-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Almost two months in&#8230;</title>
		<link>http://blog.adamspiers.org/2009/09/10/almost-two-months-in/</link>
		<comments>http://blog.adamspiers.org/2009/09/10/almost-two-months-in/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 10:42:37 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[front page]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[career]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=167</guid>
		<description><![CDATA[Almost two months into my new job and I&#8217;m absolutely loving it &#8211; if I was meant to be in IT (which sometimes I do wonder), then this is where I belong. My main observations are: My team is amazing. Really &#8211; full of uber-smart, motivated, helpful guys supported by great management, great interface to the [...]]]></description>
			<content:encoded><![CDATA[<p>Almost two months into my <a href="http://blog.adamspiers.org/going-back-to-my-roots">new job</a> and I&#8217;m absolutely loving it &#8211; if I was meant to be in IT (which sometimes I do <a href="http://blog.adamspiers.org/category/music">wonder</a>), then this is where I belong.  My main observations are:</p>
<ul>
<li>My team is amazing.  Really &#8211; full of uber-smart, motivated, helpful guys supported by great management, great interface to the business, and very slick, well-oiled processes.</li>
<li>This was a <em>huge</em> sideways move, so the learning curve has been a similar experience to last year when I started <a href="http://blog.adamspiers.org/tag/triathlon">triathlons</a> and had to learn to freestyle without drowning.  I love learning new things, definitely feel like I am over the hardest part now, and am trying to contribute to the team effort with as close as I can get to the breakneck speed the other guys do.</li>
<li>When you really love something, it sucks you in &#8211; sometimes too much.  Last night I was up until 3am <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_confused.gif' alt=':-?' class='wp-smiley' />    I need to follow the advice <a href="http://en.wikipedia.org/wiki/Michael_Meeks_%28software%29">Michael Meeks</a> gave me when I asked him for tips on how to deal with being a full-time home-working geek:<br />
<blockquote><p>Sure &#8211; get up at the same time every day; and quit work roughly 9 hours later without fail.</p>
<p>Then you stay sane <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p></blockquote>
</li>
<li>It&#8217;s a more solitary lifestyle than my previous role, so I need to make more effort to get out and socialize in the evenings. Actually this could be a good thing because I used to occasionally use &#8220;work is quite social&#8221; as an excuse for not going out if I was tired.</li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2009%2F09%2F10%2Falmost-two-months-in%2F&amp;title=Almost%20two%20months%20in%26%238230%3B" id="wpa2a_30"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2009/09/10/almost-two-months-in/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>going back to my roots</title>
		<link>http://blog.adamspiers.org/2009/07/09/going-back-to-my-roots/</link>
		<comments>http://blog.adamspiers.org/2009/07/09/going-back-to-my-roots/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 22:58:01 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[front page]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[Novell]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=154</guid>
		<description><![CDATA[A month or so ago I did something a bit crazy&#8230; twice. But let&#8217;s back up a bit first. For the last 3.5 years I&#8217;ve been working as a Solutions Architect for Novell, a job which has: trusted me with working from home, even before I&#8217;d proved myself, introduced me to some great colleagues and [...]]]></description>
			<content:encoded><![CDATA[<p>A month or so ago I did something a bit crazy&#8230; twice.  But let&#8217;s back up a bit first.</p>
<p>For the last 3.5 years I&#8217;ve been working as a <a href="http://adamspiers.org/CV/architect.html">Solutions Architect</a> for <a href="http://novell.com/">Novell</a>, a job which has:</p>
<ul>
<li>trusted me with working from home, even before I&#8217;d proved myself,</li>
<li>introduced me to some great colleagues and new friends (Novell is full of highly motivated and talented people),</li>
<li>pushed me outside my comfort zone many times (and in case it&#8217;s not obvious, that is a <em>very</em> good thing), including forcing me to confront and completely overcome my phobia of public speaking, </li>
<li>taught me a whole range of technical and &#8220;soft&#8221; skills,</li>
<li>given me the opportunity to work on projects with some of the finest minds in the industry and stay at the cutting edge of technology,</li>
<li>given me the opportunity to meet, learn from, and help countless client customers and partners, both existing and prospective,</li>
<li>rewarded me for innovation (I co-filed two patents),</li>
<li>taught me how to understand, and where possible sidestep people politics (although politics are inevitable in any large corporation, Novell is relatively free of it and even the CxOs at the top are very down-to-earth, approachable people)</li>
<li>and probably many other things I missed.</li>
</ul>
<p>Despite all that, a while ago I started feeling that I needed a fresh challenge.  And the feeling wouldn&#8217;t go away &#8211; in fact it kept growing.  I started thinking about what to do, and as often happens when you open your mind to possibilities, a very promising new opportunity presented itself to me out of the blue, in the form of a job at another company.</p>
<p>So we come back to the crazy thing.  I interviewed for this job, found out that it was certainly challenging role, and had phenomenal opportunities for career growth and networking, got an offer, and after much stress and agonizing, turned it down.</p>
<p>Two weeks later, almost exactly the same thing happened with another company.</p>
<p>Especially in today&#8217;s economy, what the hell was I doing turning down two great job offers?  Well, I was taking a gamble based on the possibility of being offered something new at Novell which sounded more exciting than either of those.</p>
<p>Let&#8217;s back up again, this time much further.  When I was about 8, I first discovered computers and quickly realised that they presented a whole new world where you could invent all kinds of wonderful new creations and you were pretty much limited only by your imagination.  Well, this was quite a long time ago, so admittedly having only 1 kilobyte of memory and a cassette tape recorder which only worked once every 10 times for storing your programs on was a bit of a limit too, but hopefully you get the point.  I realised that I liked <em>making stuff</em>.</p>
<p>This passion has stayed with me my whole life &#8211; it sort of went into hibernation for two amazing years at music college, although even then you could argue I was making stuff (i.e. music).  And it&#8217;s why I turned down both those two jobs &#8211; even though they were great, they didn&#8217;t present immediate chances to <em>create</em>, and my instinct was telling me that&#8217;s what I needed.</p>
<p>So the great news I received earlier today is that the gamble paid off, and I have been formally offered a job as a Software Engineer Consultant, joining an extremely talented team based mainly in Santa Cruz in California.  This is getting scarily close to being a dream job!  I remember years ago voluntarily pulling 100 hour weeks at <a href="http://guideguide.com/">guideguide</a> despite terrible pay, simply because I loved it so much &#8211; and I think this will give me the same kind of rush <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>For those wondering whether I&#8217;ll be relocating to California: for now, I&#8217;ll still be officially working from home here in London, but I&#8217;m crossing fingers for a business trip across the pond to meet the new team soon <img src='http://blog.adamspiers.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />   I hear it&#8217;s a beautiful stretch of coastline, and would be <a href="http://blog.adamspiers.org/category/training/">triathlon training</a> heaven &#8230;</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2009%2F07%2F09%2Fgoing-back-to-my-roots%2F&amp;title=going%20back%20to%20my%20roots" id="wpa2a_32"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2009/07/09/going-back-to-my-roots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CompuTrainer on Linux</title>
		<link>http://blog.adamspiers.org/2009/06/20/computrainer-on-linux/</link>
		<comments>http://blog.adamspiers.org/2009/06/20/computrainer-on-linux/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 18:13:45 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[CompuTrainer]]></category>
		<category><![CDATA[cycling]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[turbo]]></category>
		<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://wordpress.adamspiers.org/?p=104</guid>
		<description><![CDATA[Finally started using my CompuTrainer a bit more. Just rode 20km in the lounge with the computer pacing me at 200 Watts. After so much riding with guys way stronger than me, the temptation to draft the computer is difficult to resist. However in the last 500 metres it spontaneously decided to make a sprint [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.racermateinc.com/computrainer.asp"><img class="alignright size-medium wp-image-128" src="http://blog.adamspiers.org/wp-content/uploads/2009/06/img_compu_trainer-300x214.gif" alt="" width="300" height="214" /></a></p>
<p>Finally started using my <a href="http://www.racermateinc.com/computrainer.asp">CompuTrainer</a> a bit more.  Just rode 20km in the lounge with the computer pacing me at 200 Watts.  After so much riding with guys way stronger than me, the temptation to draft the computer is difficult to resist.  However in the last 500 metres it spontaneously decided to make a sprint for the finish line &#8211; the bloody cheek!  Obviously I couldn&#8217;t allow a bunch of transistors to beat me so I sprinted after it and hit the finish line 0.05 seconds ahead, narrowly avoiding embarassment.  Next step is to start doing <a href="http://www.triathlontrainingguide.com/brick-workouts-for-triathlon-prep/">brick sessions</a> &#8230;<br />
<span id="more-104"></span><br />
By the way, in case anyone googles for <a href="http://www.google.com/search?q=computrainer linux">computrainer linux</a>, I am actually running it under <a href="http://www.vmware.com/products/ws/">VMware Workstation</a> on <a href="http://linuxmce.org/">LinuxMCE</a> <a href="http://wiki.linuxmce.org/index.php/Version_0710">0710</a> which is based on <a href="http://www.ubuntu.com/">Ubuntu</a> <a href="https://wiki.ubuntu.com/GutsyGibbon">Gutsy</a>.  It works great with the unfortunate exception of the <a href="http://www.computrainer.com/rm_inc/IRCVideos.htm">Interactive Real Course Videos (IRCV)</a>, which seems to be due to missing support in <a href="http://www.vmware.com/products/ws/">VMware Workstation</a> for VMR9.  I&#8217;ve posted about this in both <a href="http://communities.vmware.com/message/1178743#1178743">VMware Communities</a> and the <a href="http://www.racermate.net/forum/viewtopic.php?f=29&amp;t=2159">RacerMate Forum</a> but noone has been able to suggest a solution so far.</p>
<p>UPDATE 15th February 2010 &#8211; great news! Check out this <a href="golden-cheetah/">fantastic new piece of software called Golden Cheetah</a>!</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2009%2F06%2F20%2Fcomputrainer-on-linux%2F&amp;title=CompuTrainer%20on%20Linux" id="wpa2a_34"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2009/06/20/computrainer-on-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>farewell KDE, hello GNOME</title>
		<link>http://blog.adamspiers.org/2009/05/11/farewell-kde-hello-gnome/</link>
		<comments>http://blog.adamspiers.org/2009/05/11/farewell-kde-hello-gnome/#comments</comments>
		<pubDate>Mon, 11 May 2009 13:13:40 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://wordpress.adamspiers.org/?p=55</guid>
		<description><![CDATA[Sad to say, I&#8217;ve jumped on the Torvalds bandwagon and switched from KDE 4 to GNOME. Sorry to all the hard-working KDE developers, but I just don&#8217;t have time to put up with a desktop plagued by numerous regressions, and worse, a crippled front-end to NetworkManager. There appear to be two versions of knetworkmanager &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Sad to say, I&#8217;ve jumped on the <a href="http://itmanagement.earthweb.com/osrc/article.php/3798396/Torvalds-KDE-4-and-the-Media-Circus.htm">Torvalds bandwagon</a> and switched from <a href="http://kde.org/">KDE</a> 4 to <a href="http://www.gnome.org/">GNOME</a>.  Sorry to all the hard-working KDE developers, but I just don&#8217;t have time to put up with a desktop <a href="https://bugs.kde.org/show_bug.cgi?id=158556">plagued</a> by <a href="https://bugs.kde.org/show_bug.cgi?id=164386">numerous</a> <a href="https://bugs.kde.org/show_bug.cgi?id=168914">regressions</a>, and worse, <a href="http://bugzilla.novell.com/show_bug.cgi?id=458933">a crippled front-end to NetworkManager</a>.  There appear to be two versions of knetworkmanager &#8211; the 3.5.x branch which for some reason went under a significant UI redesign and is now harder to use and more buggy, and the 4.x branch which AFAIK is still unfinished and unreleased.  That was the last straw for me &#8211; the NM front-end is arguably the most important component of any modern Linux desktop (from the point of view of laptop users anyway), so I find it fairly staggering that KDE still doesn&#8217;t have one which is stable, polished, and well-designed with respect to usability.</p>
<p>There were other things, like korganizer getting slower and more buggy, phonon not working right, plasma&#8217;s bizarre customisation UI and tendency to leak memory like a sieve, a device notifier pop-up which often makes new devices invisible and unclickable &#8230; but enough is enough, life is too short.  GNOME does what I need (which isn&#8217;t much, thanks to the flexibility of <a href="http://icculus.org/openbox/">openbox</a>).</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2009%2F05%2F11%2Ffarewell-kde-hello-gnome%2F&amp;title=farewell%20KDE%2C%20hello%20GNOME" id="wpa2a_36"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2009/05/11/farewell-kde-hello-gnome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Goodbye Blogger, hello WordPress</title>
		<link>http://blog.adamspiers.org/2009/05/03/goodbye-blogger-hello-wordpress/</link>
		<comments>http://blog.adamspiers.org/2009/05/03/goodbye-blogger-hello-wordpress/#comments</comments>
		<pubDate>Sun, 03 May 2009 15:15:23 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://wordpress.adamspiers.org/?p=53</guid>
		<description><![CDATA[I wish I&#8217;d known how much better WordPress is than Google Blogger before spending all that effort on the latter. Some quick highlights: A real programming language (PHP) rather than some lame imitation which doesn&#8217;t even have proper flow control structures. Of course this also means it&#8217;s very easy to set cookies, use CGI parameters [...]]]></description>
			<content:encoded><![CDATA[<p>I wish I&#8217;d known how much better <a href="http://wordpress.org">WordPress</a> is than Google Blogger before spending <a href="http://blog.adamspiers.org/2009/04/19/hacking-blogger-templates/">all that effort</a> on the latter.  Some quick highlights:</p>
<ul>
<li>A real programming language (PHP) rather than some lame imitation which doesn&#8217;t even have proper flow control structures.  Of course this also means it&#8217;s very easy to set cookies, use CGI parameters etc.</li>
<li>More more out-of-the-box flexibility and functionality on the backend</li>
<li>Unbelievably easy to set up on my own webserver</li>
<li><a href="http://wordpress.org/extend/plugins/">Over 4000 plugins!</a> including ones for SyntaxHighlighter and Google Analytics</li>
<li>Countless themes, many of which support fluid width content columns.
</ul>
<p>So I&#8217;m totally sold; now I just have to make different RSS feeds available for my different audiences (none of which exist yet&#8230;) </p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2009%2F05%2F03%2Fgoodbye-blogger-hello-wordpress%2F&amp;title=Goodbye%20Blogger%2C%20hello%20WordPress" id="wpa2a_38"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2009/05/03/goodbye-blogger-hello-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publishing long rides from MyTracks in Google Maps</title>
		<link>http://blog.adamspiers.org/2009/05/03/publishing-long-rides-from-mytracks-in-google-maps/</link>
		<comments>http://blog.adamspiers.org/2009/05/03/publishing-long-rides-from-mytracks-in-google-maps/#comments</comments>
		<pubDate>Sun, 03 May 2009 14:22:40 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[hidden]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[kml]]></category>
		<category><![CDATA[mymaps]]></category>
		<category><![CDATA[mytracks]]></category>

		<guid isPermaLink="false">http://wordpress.adamspiers.org/?p=41</guid>
		<description><![CDATA[Just in case it&#8217;s useful to anyone, here&#8217;s how I publish my cycling routes in my blog. I record the routes on my great G1 Google phone which runs Android, using the great MyTracks application from Android Market. Once the route is recorded and I get back home, I do the following: In MyTracks, copy [...]]]></description>
			<content:encoded><![CDATA[<p>Just in case it&#8217;s useful to anyone, here&#8217;s how I publish my <a href="http://blog.adamspiers.org/tag/routes">cycling routes</a> in my blog.  I record the routes on my great G1 Google phone which runs Android, using the great <a href="http://mytracks.appspot.com/">MyTracks</a> application from <a href="http://www.android.com/market/">Android Market</a>.  Once the route is recorded and I get back home, I do the following:</p>
<ol>
<li> In MyTracks, copy the track to SD card as a KML file</li>
<li> Plug the phone in via USB and mount the SD card&#8217;s filesystem</li>
<li> Copy the KML file from the <code>kml</code> directory to a local directory.</li>
<li> Open the KML file in an editor, search for <code>7f0000ff</code> (light orange) and change it to <code>ffcc66cc</code> (purple) or something more visible</li>
<li> Ensure the track name is correct</li>
<li> Go to <a href="http://maps.google.co.uk/">http://maps.google.co.uk/</a> (ensuring I&#8217;m signed into my google account)</li>
<li> Click &#8220;My Maps&#8221;</li>
<li> Click &#8220;Create new map&#8221;</li>
<li> Click &#8220;Import&#8221; and upload the KML file</li>
<li> Edit the route if necessary and save changes.</li>
<li> Sometimes it&#8217;s necessary to click on another route and back to this new one, in order to make the &#8220;View in Google Earth&#8221; link appear.</li>
<li> Copy the URL of the &#8220;View in Google Earth&#8221; KML link and paste it into the Google Maps *search* bar (yes that&#8217;s right, *not* your browser address bar)</li>
<li> Click &#8220;Link&#8221; near the top right</li>
<li> Share the link with friends and/or paste the embeddable HTML into a new blog post.</li>
</ol>
<p>The copy of the &#8220;View in Google Earth&#8221; KML link back into the search bar in step 12 is necessary to <a href="http://groups.google.com/group/Google-Maps-How-Do-I/msg/b6e8e2bf1fd8a704">stop Google Maps from splitting the route up into multiple pages</a>, which would only show shorter segments (&#8220;lines&#8221;) of the overall route at one time.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adamspiers.org%2F2009%2F05%2F03%2Fpublishing-long-rides-from-mytracks-in-google-maps%2F&amp;title=Publishing%20long%20rides%20from%20MyTracks%20in%20Google%20Maps" id="wpa2a_40"><img src="http://blog.adamspiers.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adamspiers.org/2009/05/03/publishing-long-rides-from-mytracks-in-google-maps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

