<?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; work</title>
	<atom:link href="http://blog.adamspiers.org/category/work/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>Rediscovering music</title>
		<link>http://blog.adamspiers.org/2011/08/12/rediscovering-music/</link>
		<comments>http://blog.adamspiers.org/2011/08/12/rediscovering-music/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 03:18:08 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[front page]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[travel]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[cello]]></category>
		<category><![CDATA[risk-taking]]></category>

		<guid isPermaLink="false">http://blog.adamspiers.org/?p=272</guid>
		<description><![CDATA[I&#8217;m sitting on a plane from LA to Chicago. This is my fifth flight in the last two months, having already been to New York, Ohio, Florida, and California, and it&#8217;s probably about time I explain what the hell I&#8217;m doing, as I have friends and family who have seen various confusing status updates I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sitting on a plane from LA to Chicago.  This is my fifth flight in the last two months, having already been to New York, Ohio, Florida, and California, and it&#8217;s probably about time I explain what the hell I&#8217;m doing, as I have friends and family who have seen various confusing status updates I&#8217;ve posted on <a href="http://facebook.com/adam.spiers">Facebook</a> and <a href="http://twitter.com/adamspiers">Twitter</a> whom I owe the full story.</p>
<p>Just over two years ago, I <a href="http://blog.adamspiers.org/going-back-to-my-roots">blogged about taking a leap of faith and turning down two great jobs because they didn&#8217;t involve doing something I was truly passionate about</a>. It was a gamble, but <a href="http://blog.adamspiers.org/almost-two-months-in">even after two months I could tell it was going to pay off</a>.  Sure enough, two years later, I found myself with a wealth of new experience and knowledge which I&#8217;d had a ton of fun acquiring, plus a healthy boost to <a href="http://adamspiers.org/CV/IT.html">my CV</a> and set of friends and connections within the industry.</p>
<p>Then the stars aligned again, and I found myself with another life-changing dilemma: take an even more awesome job than the one I was in, or quit IT altogether and face an indefinite period of zero income. Pretty obvious what to do, right?  I quit.</p>
<p>If that sounds crazy, it&#8217;s because it probably was &#8211; definitely another leap into the unknown.  But I&#8217;ll try to explain my decision.<span id="more-272"></span>  I&#8217;ve had a number of life-changing decisions to make over the years, and I&#8217;m gradually learning to trust my gut instincts in those moments, because they&#8217;re generally right.  I think they work out well because they&#8217;re usually based on my need to keep doing things I love doing (or to put it another way, my pathetic lack of tolerance for things I don&#8217;t enjoy), rather than concerns about money and other tedious &#8220;real world&#8221; distractions.</p>
<p>But wait, I hear you ask &#8211; didn&#8217;t I just say I decided not to pursue an even more awesome job than the one I loved doing for the last two years?  How could my instincts guide me away from that?  There are two parts to the answer.</p>
<p>Firstly, I had a bit of luck recently which combined with existing savings and investments meant that I could afford not to work for a while.  Secondly, I&#8217;ve had an itch for a long time to play more music, and it just wouldn&#8217;t go away.  In fact it kept growing and growing, until (20 years later than would have been ideal) I identified it as a basic need that I&#8217;m stuck with for good.  When I say &#8220;play more music&#8221;, I don&#8217;t mean the kind where you go off and play along with CDs in your bedroom every now and again, or join an amateur orchestra.  That&#8217;s enough for some people, and I totally respect that &#8211; but for some reason (false pride, perhaps) I could never bear to think of myself as a hobbyist musician.  For better or worse, I only ever enjoy playing music when I&#8217;m playing to the best of my ability, and experiencing real progress. </p>
<p>Unfortunately, in music as with many things in life, progress requires hard grind &#8211; the standard blood, sweat and tears formula.  Jazz musicians call it &#8220;shedding&#8221; which is short for &#8220;woodshedding&#8221;, because the idea is you lock yourself in a woodshed for 6 months and practice non-stop.  If a 15 year career in IT has taught me anything, it&#8217;s that you can&#8217;t develop your musicianship quickly alongside a full-time job outside music.  So I quit.  Or at least, I&#8217;m taking sabbatical.  To be honest I have no idea what will happen.  Maybe I&#8217;ll go back to IT full-time, maybe part-time, maybe never.  Right now I&#8217;m just focusing on studying, practising, playing with other people &#8230; whatever I can do to improve.</p>
<p>I decided that I&#8217;m most interested in developing my non-classical skills, especially jazz but also various types of folk, pop, Indian, and whatever else takes my fancy.  I&#8217;ve played (Western) classical music my whole life and had some of the most incredible experiences from it, but now I want to explore what can be done on the cello outside that &#8211; cello is such a versatile instrument and there&#8217;s a whole new sound world which is a mostly untrodden path at this point.</p>
<p>That&#8217;s all I have time for now, but I&#8217;ll blog again soon about the amazing experiences I&#8217;ve already had around the USA in the last two months &#8211; I have a whole ton of photos, audio and video, so watch this space!</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%2F08%2F12%2Frediscovering-music%2F&amp;title=Rediscovering%20music" 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/08/12/rediscovering-music/feed/</wfw:commentRss>
		<slash:comments>3</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_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/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_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/2010/05/20/announcing-rypper-again/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_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/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_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/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_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/2009/07/09/going-back-to-my-roots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>press interviews</title>
		<link>http://blog.adamspiers.org/2009/03/27/press-interviews/</link>
		<comments>http://blog.adamspiers.org/2009/03/27/press-interviews/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 21:27:00 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[front page]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://wp.adamspiers.org/?p=5</guid>
		<description><![CDATA[End of a stressful week &#8211; preparing for my first ever press interviews yesterday (which went fine, shouldn&#8217;t have let myself get so wound up about them) whilst mixing with a bunch of executives at a seminar in the Forest of Arden and trying to keep various other balls in the air.]]></description>
			<content:encoded><![CDATA[<p>End of a stressful week &#8211; preparing for my first ever press interviews yesterday (which went fine, shouldn&#8217;t have let myself get so wound up about them) whilst mixing with a bunch of executives at a seminar in the <a href="http://www.marriott.co.uk/hotels/travel/cvtgs-forest-of-arden-a-marriott-hotel-and-country-club/">Forest of Arden</a> and trying to keep various other balls in the air.</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%2F03%2F27%2Fpress-interviews%2F&amp;title=press%20interviews" 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/2009/03/27/press-interviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

