<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8898675299294472058</id><updated>2012-02-17T07:47:47.106+11:00</updated><category term='buzz'/><category term='maven'/><category term='jni'/><category term='osgi'/><category term='tweenbots'/><title type='text'>OSGi Robots</title><subtitle type='html'>An investigation into the use of OSGi technologies in distributed robotics.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.osgibots.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default'/><link rel='alternate' type='text/html' href='http://www.osgibots.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ben Coughlan</name><uri>http://www.blogger.com/profile/11130365871101539115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_F7qkyXN5AQ8/SdRq8B_QmxI/AAAAAAAAAAM/4c9vP1la_-U/S220/portrait.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8898675299294472058.post-5517129424067288741</id><published>2009-04-25T00:42:00.011+10:00</published><updated>2009-04-26T15:44:39.280+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jni'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>JNI, Maven and OSGi</title><content type='html'>I've done my best to avoid JNI like the plague until now.  Usually I would pick one side of the fence and code in either pure C or pure Java.  This is my first attempt to do both, and after quite a steep learning curve it doesn't seem any more attractive.  However it could certainly be worse.  Thanks to a fantastic and seemingly magical build tool, &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;, and a couple of well configured plugins,  I was able to create an OSGi compliant bundle including a native library wrapper for the &lt;a href="http://www.linux-robots.com/"&gt;Linux Robotics Framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The goal of this whole excercise is to produce a single jar file which contains a native library, can be deployed in an OSGi framework, and ofcourse work when other bundles try to access methods with native hooks.&lt;br /&gt;&lt;br /&gt;Those of you that have dabbled with JNI, and everyone else who writes any native code will know that to load a native library requires the binaries to be visible to the OS and not hidden away inside a jar.  I was very happy to discover that an OSGi framework is nice enough to unpack native libraries to the file system for you, and then point the JVM to them when your bundle tries to load them.&lt;br /&gt;&lt;br /&gt;OSGi bundles are usually expected to be portable and able to be deployed within any framework instance.  Adding native libraries to a bundle does tie them to a particular OS and processor architecture.  The OSGi specification does however, include a &lt;span style="font-weight: bold;"&gt;Bundle-NativeCode &lt;/span&gt;header which allows developers to notify the OSGi framework of native libraries included in the bundle, as well as the environments they require to run.  Multiple native binaries can be included in a bundle, each with their own dependencies and the framework will pick and unpack to correct one.  So we can recover some of our bundle's portability by including native libraries for different environments.  If there is no binary provided for the environment in question, the bundle will gracefully refuse to load with the message:&lt;br /&gt;&lt;blockquote&gt;org.osgi.framework.BundleException: Unable to select a native library clause.&lt;/blockquote&gt;This about as close as you can get to complete JVM portability when using any JNI.&lt;br /&gt;&lt;br /&gt;To achieve this feat I'm using &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; with two explicit plugins.  The &lt;a href="http://java.freehep.org/freehep-nar-plugin/intro.html"&gt;freehep-nar-plugin&lt;/a&gt; will process your java source code with javah to produce some header files.  Then it will compile you implementation of these headers and package them into a shared library.  It will also create a pile of meta-data which comes in handy when you want to distribute things. Unfortunately, this plugin packages your java interface (jar) separately from the native libraries (nar).  While this is a good thing and allows much more flexibility when managing these artifacts, it's not what we want when deploying to an OSGi framework.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html"&gt;maven-bundle-plugin&lt;/a&gt; is very helpful when creating OSGi bundles.  Although inserting manifest headers is not that difficult, it can be quite tedious and incredibly difficult to debug if you get it wrong.  This plugin will process your compiled classes and calculate all the required import package headers, based on their dependencies.  It will also verify your bundles manifest to ensure all is well.&lt;br /&gt;&lt;br /&gt;Both of these plugins expect to create an artifact of their own type.  To get the result needed, we need to get a bit creative.  The final packaging we want is a bundle, so this is what we specify in our projects pom.xml.  This means that the nar-plugin goals need to be mentioned explicitly.  Add this between your nar-plugin tags.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;executions&amp;gt;&lt;br /&gt;&amp;lt;execution&amp;gt;&lt;br /&gt;  &amp;lt;goals&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;nar-javah&amp;lt;/goal&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;nar-compile&amp;lt;/goal&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;nar-system-generate&amp;lt;/goal&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;nar-integration-test&amp;lt;/goal&amp;gt;&lt;br /&gt;  &amp;lt;/goals&amp;gt;&lt;br /&gt;&amp;lt;/execution&amp;gt;&lt;br /&gt;&amp;lt;/executions&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That will generate the headers, compile the source code, create a convenient little class to load the library and run the integration test.  It will not however, create the nar artifact, which is fine by me.&lt;br /&gt;&lt;br /&gt;This will now give us a shared library built in our target directory, so now we need to include it in our bundle.  Insert this between your build tags.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;&amp;lt;resource&amp;gt;&lt;br /&gt;  &amp;lt;directory&amp;gt;target/nar&amp;lt;/directory&amp;gt;&lt;br /&gt;  &amp;lt;includes&amp;gt;&amp;lt;include&amp;gt;lib/**&amp;lt;/include&amp;gt;&amp;lt;/includes&amp;gt;&lt;br /&gt;  &amp;lt;excludes&amp;gt;&amp;lt;exclude&amp;gt;*.flag&amp;lt;/exclude&amp;gt;&amp;lt;/excludes&amp;gt;&lt;br /&gt;&amp;lt;/resource&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will include all native libraries as resources in the final jar.&lt;br /&gt;&lt;br /&gt;Finally we need to add meta-data to the jar so an OSGi framework knows what to do with it.  Add this between your plugins tags.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-bundle-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;instructions&amp;gt;&lt;br /&gt;    &amp;lt;Export-Package&amp;gt;com.osgibots.lrf4j&amp;lt;/Export-Package&amp;gt;&lt;br /&gt;    &amp;lt;Private-Package&amp;gt;&amp;lt;/Private-Package&amp;gt;&lt;br /&gt;    &amp;lt;Bundle-Activator&amp;gt;com.osgibots.lrf4j.Activator&amp;lt;/Bundle-Activator&amp;gt;&lt;br /&gt;    &amp;lt;Bundle-NativeCode&amp;gt;&lt;br /&gt;      lib/i386-Linux-g++/jni/liblrf4j-0.1-SNAPSHOT.so;&lt;br /&gt;        osname=Linux;processor=x86&lt;br /&gt;    &amp;lt;/Bundle-NativeCode&amp;gt;&lt;br /&gt;  &amp;lt;/instructions&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Take note of the Bundle-NativeCode header.  This specifies the native libraries available inside the bundle and which environment they are intended to run on.  A list of canonical names is available within the OSGi specification.&lt;br /&gt;&lt;br /&gt;The OSGi specification mentions the fact that "...only one class loader can load a native library as specified by an absolute path.  Loading of a native library file by multiple class loaders (from multiple bundles, for example) will result in a linkage error."   This is important to note as most implementations of an JNI involve static initializers to call System.loadLibrary().  If you've read my last post on static variables in OSGi, you'll know this will cause issues.&lt;br /&gt;&lt;br /&gt;The easiest thing to do is to load the native library from your bundles activator.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Activator implements BundleActivator {&lt;br /&gt;&lt;br /&gt;  public void start(BundleContext arg0) throws Exception {&lt;br /&gt;      NarSystem.loadLibrary();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void stop(BundleContext arg0) throws Exception {&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note the usage of NarSytem.loadLibrary().  This helps us avoid changing constants within the source code with every new minor release.&lt;br /&gt;&lt;br /&gt;I've skipped an awful lot of detail on the usage of these two plugins.  You can get you hands on my example via my &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; repository:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;hg clone &lt;a href="http://hg.osgibots.com/lrf4j"&gt;http://hg.osgibots.com/lrf4j&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is an JNI wrapper for the &lt;a href="http://www.linux-robots.com/"&gt;Linux Robotics Framework&lt;/a&gt; which you will need available on your LD_LIBRARY_PATH if you hope to build the example.  Of course you can just browse the code online.&lt;br /&gt;&lt;br /&gt;There are other approaches to combining these two plugins.  The ideas above work best when you are only planning to deploy to one environment, and therefore, only need to compile the native library once.  If you want to include binaries for other environments, you will be better off creating two projects.  One project to create the nar artifacts for various environments and deploy them to a repository.  The second is to fetch all those artifacts and compile them into a single bundle.  Unless you can cross compile all your target binaries on one machine, you'll have a great time keeping your code base in sync...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898675299294472058-5517129424067288741?l=www.osgibots.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.osgibots.com/feeds/5517129424067288741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.osgibots.com/2009/04/jni-maven-and-osgi.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/5517129424067288741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/5517129424067288741'/><link rel='alternate' type='text/html' href='http://www.osgibots.com/2009/04/jni-maven-and-osgi.html' title='JNI, Maven and OSGi'/><author><name>Ben Coughlan</name><uri>http://www.blogger.com/profile/11130365871101539115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_F7qkyXN5AQ8/SdRq8B_QmxI/AAAAAAAAAAM/4c9vP1la_-U/S220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898675299294472058.post-814123892578117080</id><published>2009-04-24T22:53:00.000+10:00</published><updated>2009-04-24T23:53:54.727+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><title type='text'>Static Variables and OSGi</title><content type='html'>I've often run across discussion involving&lt;span style="font-style: italic;"&gt; &lt;/span&gt;best-practice-zealots and their opinions on the use of static variables, often quite strongly against.  I personally believe they have their place in the world and have used them often to great affect.  However, when developing an application within an OSGi framework the game changes quite significantly.&lt;br /&gt;&lt;br /&gt;Most developers take it for granted that a static variable will only have one instance within their application (per JVM).  The fact is that a static variable will only have one instance &lt;span style="font-style: italic;"&gt;per class-loader.&lt;/span&gt;  After dealing with the millions of cryptic stack traces I found when first learning about OSGi, I expect everyone on the same path will soon realise that &lt;span style="font-weight: bold;"&gt;each bundle has its own class-loader&lt;/span&gt;.  After all, it is written in the spec which I'm sure you've all read.&lt;br /&gt;&lt;br /&gt;What this means is that some classes can be loaded by two distinct class loader instances within the same JVM.  I've been unable to find a definitive answer regarding this behavior in various framework implementations and my knowledge of class loading is quite shallow.  If anyone can shed some light, I would appreciate it.  Having said that, if you've ever come a across an exception like&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;java.lang.ClassCastException: org.example.Foo cannot be cast to org.example.Foo&lt;/pre&gt; then you've witnessed the symptoms of uncoordinated class-loaders first hand.  The number of times I saw this early on provides evidence to my claim.&lt;br /&gt;&lt;br /&gt;This of course leads to some interesting errors, mostly from Singletons that have not been created completely.  One major factor in an APIs OSGi compatibility (after a lack a manifest headers) is the use of static instances and how they behave in a multi-bundle, dynamic environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898675299294472058-814123892578117080?l=www.osgibots.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.osgibots.com/feeds/814123892578117080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.osgibots.com/2009/04/static-variables-and-osgi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/814123892578117080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/814123892578117080'/><link rel='alternate' type='text/html' href='http://www.osgibots.com/2009/04/static-variables-and-osgi.html' title='Static Variables and OSGi'/><author><name>Ben Coughlan</name><uri>http://www.blogger.com/profile/11130365871101539115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_F7qkyXN5AQ8/SdRq8B_QmxI/AAAAAAAAAAM/4c9vP1la_-U/S220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898675299294472058.post-890663473276144086</id><published>2009-04-12T12:58:00.000+10:00</published><updated>2009-04-26T15:45:34.289+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tweenbots'/><title type='text'>tweenbots</title><content type='html'>Building a robot capable of traversing the streets of New York is no small task.  The environment is unpredictable, the terrain is in no way smooth not to mention all the rules and etiquette of navigating a street without being hit by a car or arrested.&lt;br /&gt;&lt;br /&gt;There is however, a technology that makes this task trivial and all it takes is a &lt;a href="http://www.tweenbots.com/"&gt;friendly face&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898675299294472058-890663473276144086?l=www.osgibots.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.osgibots.com/feeds/890663473276144086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.osgibots.com/2009/04/tweenbots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/890663473276144086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/890663473276144086'/><link rel='alternate' type='text/html' href='http://www.osgibots.com/2009/04/tweenbots.html' title='tweenbots'/><author><name>Ben Coughlan</name><uri>http://www.blogger.com/profile/11130365871101539115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_F7qkyXN5AQ8/SdRq8B_QmxI/AAAAAAAAAAM/4c9vP1la_-U/S220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898675299294472058.post-177963634436862252</id><published>2009-04-06T16:23:00.000+10:00</published><updated>2009-04-07T11:56:03.702+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><title type='text'>OSGi Bots</title><content type='html'>I am in my final year of my Software Engineering degree at the &lt;a href="http://www.anu.edu.au/"&gt;Australian National University&lt;/a&gt;.  As part of this final year I am spending one semester researching the use of &lt;a href="http://www.osgi.org/"&gt;OSGi&lt;/a&gt; technologies in &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.linux-robots.com/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 263px; height: 246px;" src="http://4.bp.blogspot.com/_F7qkyXN5AQ8/Sdmqaaq3kgI/AAAAAAAAAA4/kpny__j8Axk/s320/IMGP1609.png" alt="" id="BLOGGER_PHOTO_ID_5321471805527396866" border="0" /&gt;&lt;/a&gt;distributed robotic systems.  Having worked previously on the &lt;a href="http://www.linux-robots.com/"&gt;Linux Robotic Framework&lt;/a&gt; where I built 'Buzz' pictured to the left, I was fascinated by the use of software in real world machines, much more so than server and desktop applications.&lt;br /&gt;&lt;br /&gt;I first came across OSGi when searching for a plugin/update management mechanism for an in-house software product I was developing at my day job.  It appeared quite daunting at first, as it required a complete overhaul of the software architecture and introduced many new capabilities I had not considered.  Thanks to some brilliant work by the developers at &lt;a href="http://www.dynamicjava.org/"&gt;Dynamic Java&lt;/a&gt; I was able to create a modular, remotely updatable, and very maintainable desktop application without much fuss.&lt;br /&gt;&lt;br /&gt;I immediately recognized the potential for OSGi and came up with a lot of scenarios where I'd like to see it used.  One of these being a control system/platform for a distributed network of robotic agents.  Others have incorporated OSGi into IDEs and application servers and several groups have dedicated themselves to supporting the OSGi movement.&lt;br /&gt;&lt;br /&gt;It is difficult to explain the value of OSGi in a single paragraph so I strongly suggest you following the links and try to familiarize yourself with it, rather than taking my shallow &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.osgi.org/Specifications/HomePage"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 305px; height: 196px;" src="http://1.bp.blogspot.com/_F7qkyXN5AQ8/SdmlZaFIHYI/AAAAAAAAAAw/yZhUmZWPXjA/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5321466290631089538" border="0" /&gt;&lt;/a&gt;explanation.  An OSGi framework provides a dynamic and modular support system for Java.  It addresses some of the shortcomings of bundle management within a JVM and greatly increases deployment capabilities.  The image to the right has been taken form the &lt;a href="http://www.osgi.org/Release4/Download"&gt;OSGi specification version 4.1&lt;/a&gt; and shows the basic architecture of an OSGi runtime.  The execution environment will be a JavaSE virtual machine in most cases, but it can also be run on various realtime VMs, JavaME and even &lt;a href="http://developer.android.com/guide/basics/what-is-android.html"&gt;Dalvik&lt;/a&gt;.  The bundles are the actual application packages.&lt;br /&gt;&lt;br /&gt;My objective this semester is to demonstrate the use of OSGi in a robotic system.  I hope to show that the dynamic capabilities of an OSGi based software system will allow for more powerful and creative configurations of individual robotic agents as well as complex systems of cooperating agents.  Combing OSGi with other projects such as &lt;a href="https://jxta.dev.java.net/"&gt;JXTA&lt;/a&gt; and &lt;a href="http://r-osgi.sourceforge.net/"&gt;R-OSGi&lt;/a&gt; will hopefully demonstrate a very powerful system of collaboration in dynamic systems.&lt;br /&gt;&lt;br /&gt;I have started this blog to summarize my research and results in order to receive feedback from people much smarter than myself.  I will be the first to admit I am in-experienced in robotics and quite naive with my expectations.  Hopefully constructive criticism and feedback will help me reach a more realistic and practical outcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898675299294472058-177963634436862252?l=www.osgibots.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.osgibots.com/feeds/177963634436862252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.osgibots.com/2009/04/osgi-bots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/177963634436862252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898675299294472058/posts/default/177963634436862252'/><link rel='alternate' type='text/html' href='http://www.osgibots.com/2009/04/osgi-bots.html' title='OSGi Bots'/><author><name>Ben Coughlan</name><uri>http://www.blogger.com/profile/11130365871101539115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_F7qkyXN5AQ8/SdRq8B_QmxI/AAAAAAAAAAM/4c9vP1la_-U/S220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_F7qkyXN5AQ8/Sdmqaaq3kgI/AAAAAAAAAA4/kpny__j8Axk/s72-c/IMGP1609.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
