<?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-1865737548201411060</id><updated>2012-02-17T04:14:21.090+08:00</updated><category term='distributed'/><category term='P2'/><category term='OSGi'/><category term='Maven'/><category term='peaberry'/><category term='Jigsaw'/><category term='Newton'/><category term='services'/><category term='Spring'/><category term='health'/><category term='book'/><category term='bundleplugin'/><category term='Guice'/><category term='EclipseCon'/><category term='OBR'/><title type='text'>Pisang Quiet</title><subtitle type='html'>A subtle blend of english and malay puns, with a dash of software news, and a hearty dose of reality</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3976684246383197713</id><published>2011-04-06T00:55:00.002+08:00</published><updated>2011-04-06T01:05:50.353+08:00</updated><title type='text'>OSGi in Action in print</title><content type='html'>Just heard from Manning (publishers of &lt;a href="http://manning.com/hall/"&gt;OSGi in Action&lt;/a&gt;) that our book will be in print tomorrow!! This is great news - thanks again to my co-authors Richard, Karl, and David; as well as all the managers, editors, and graphics people at Manning who put up with us for so long!&lt;br /&gt;&lt;br /&gt;Free chapter samples are available from &lt;a href="http://manning.com/hall/"&gt;http://manning.com/hall/&lt;/a&gt;, but there's nothing quite like having a physical copy lying around on your coffee table ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3976684246383197713?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3976684246383197713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3976684246383197713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3976684246383197713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3976684246383197713'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2011/04/osgi-in-action-in-print.html' title='OSGi in Action in print'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4977682870655611370</id><published>2009-06-28T15:33:00.014+08:00</published><updated>2009-06-28T20:31:53.166+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OBR'/><category scheme='http://www.blogger.com/atom/ns#' term='P2'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Jigsaw'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>OSGi vs Jigsaw, JSR 330 vs 299, OBR vs P2, Maven vs ...?</title><content type='html'>&lt;div style="text-align: justify;"&gt;While I enjoy a good technical discussion I try to avoid conflict where I can. So it's somewhat worrying to wake up and realize that all the projects I work on are involved in heated debates!&lt;br /&gt;&lt;br /&gt;The most obvious one is between &lt;a href="http://www.osgi.org/"&gt;OSGi&lt;/a&gt; and &lt;a href="http://openjdk.java.net/projects/jigsaw/"&gt;Jigsaw&lt;/a&gt; - now personally I have no issue with a modularity system that's optimized for the JVM. Having done time as a JVM developer I realize that often what's best for the JVM is not what's best for applications, and vice versa. Sometimes you just need shortcuts that you can trust to 'internal' users but would be dangerous if exposed to everyone, for example the Unsafe class. That said, I would be cautious in using Jigsaw for modularity outside of the JVM - this is not based on any technical point at the moment, it's purely inertia on my side while Jigsaw is being fleshed out. I don't have much spare time and I'm currently in my comfort zone with OSGi.&lt;br /&gt;&lt;br /&gt;My hope is that JSR &lt;a href="http://jcp.org/en/jsr/detail?id=294"&gt;294&lt;/a&gt; can act as a bridge between OSGi and Jigsaw by standardizing some of the details needed to declare and define modules - like naming, version ranges, imports, exports, etc. We could then use JSR 294 metadata to configure OSGi bundles in place of the dependable (but non-type-safe) manifest, removing a major bugbear of new developers. Unfortunately it looks like JSR 294 might fudge this issue and go with opaque strings that only the target module system understands :(&lt;br /&gt;&lt;br /&gt;In my ideal world JSR 294 would define a small common module API without trying to standardize a complete module system. Trying to capture too much detail can lead to long, contentious discussions and puts a straightjacket on future solutions. Specifying not enough (opaqueness) makes portability a joke.&lt;br /&gt;&lt;br /&gt;Does this sound familiar? This is essentially what's happening with JSRs &lt;a href="http://jcp.org/en/jsr/detail?id=299"&gt;299&lt;/a&gt; (Contexts and Dependency Injection) and &lt;a href="http://jcp.org/en/jsr/detail?id=330"&gt;330&lt;/a&gt; (Dependency Injection for Java). JSR 299 defines the API and semantics for a complete dependency injection system for Java EE, whereas 330 is defining a much smaller API that just covers injection points and configuration in Java SE. Ideally people could code to the smaller 330 API to gain some portability between DI frameworks without having to rewrite or use a completely different API for the more complete JSR 299 specification. Developers can choose the level of portability they want.&lt;br /&gt;&lt;br /&gt;While there has been some recent friction on the JSR 330 list, it does look like people are making significant concessions to standardize this reduced API. This is great news for people like me who provide DI extensions (in my case &lt;a href="http://code.google.com/p/peaberry/"&gt;peaberry&lt;/a&gt;) because by adopting this API my extension could conceivably be used with Guice, Spring, or any other framework that supports JSR 330 - even fully-fledged JSR 299 systems.&lt;br /&gt;&lt;br /&gt;Now if the same thing happened with JSR 294 I could package peaberry so it could be used as an OSGi bundle, or a Jigsaw module, or even as an element in some future modularity framework I've not yet heard of.&lt;br /&gt;&lt;br /&gt;Unfortunately finding the sweet spot between defining too much and too little is a hard process, and isn't helped by personality clashes. Another example of this is the recent flare up between &lt;a href="http://wiki.eclipse.org/Equinox_p2_Getting_Started"&gt;P2&lt;/a&gt; and &lt;a href="http://www.osgi.org/Repository/HomePage"&gt;OBR&lt;/a&gt;... both provide a form of requirement/capability model to help decide what bundles should be deployed to satisfy a given need, but P2 goes further and defines additional details necessary for Eclipse installations. That doesn't mean they can't co-exist or there isn't a common subset of metadata they could share, which is what RFP &lt;a href="http://www.tensegrity.hellblazer.com/2009/03/osgi-rfp-122---the-osgi-bundle-repository.html"&gt;122&lt;/a&gt; is hoping to achieve.&lt;br /&gt;&lt;br /&gt;Indeed the &lt;a href="http://www.sonatype.com/products/nexus"&gt;Nexus&lt;/a&gt; Maven repository manager (Professional Version) already supports P2 and will support OBR in 1.3.5 - and when the updated OBR spec is finalized I'm sure it will be just as straightforward to handle that as well.&lt;br /&gt;&lt;br /&gt;The last project from my title is &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; - a name associated with peace, harmony, and logical discussions that has never been involved in this kind of dispute ;) Seriously though, it is interesting that the next version of Maven may be based on both Guice (hopefully using the JSR 330 API) and OSGi (abstracted via the JSR 330 API using peaberry). Its artifact resolver will probably be pluggable, allowing it to take advantage of both P2 and OBR metadata.&lt;br /&gt;&lt;br /&gt;So in the end these spec discussions are not the end of the world: even without agreement it is often possible to map between different forms of API and metadata. Of course it is much easier if things like version formats are standardized (any chance of this 294 gurus?) but even with opaque strings I bet someone will end up writing a Jigsaw-OSGi adapter...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4977682870655611370?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4977682870655611370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4977682870655611370' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4977682870655611370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4977682870655611370'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/06/osgi-vs-jigsaw-jsr-330-vs-299-obr-vs-p2.html' title='OSGi vs Jigsaw, JSR 330 vs 299, OBR vs P2, Maven vs ...?'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7381907404125490767</id><published>2009-05-05T01:51:00.005+08:00</published><updated>2009-05-05T03:08:13.512+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><category scheme='http://www.blogger.com/atom/ns#' term='Newton'/><category scheme='http://www.blogger.com/atom/ns#' term='peaberry'/><title type='text'>Distributed OSGi with Newton + peaberry</title><content type='html'>&lt;div style="text-align: justify;"&gt;Last week I finally got around to testing peaberry with the &lt;a href="http://newton.codecauldron.org/site/index.html"&gt;Newton&lt;/a&gt; distributed OSGi framework from &lt;a href="http://www.paremus.com/"&gt;Paremus&lt;/a&gt;. It was surprisingly easy to use peaberry with Newton, I only had to make a couple of changes to support native LDAP filter strings when querying the OSGi service registry:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://code.google.com/p/peaberry/issues/detail?id=34"&gt;http://code.google.com/p/peaberry/issues/detail?id=34&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These changes are now available in the &lt;a href="http://peaberry.googlecode.com/files/peaberry-1.1.1.zip"&gt;1.1.1&lt;/a&gt; release of peaberry. I've also written up a distributed OSGi example based on the existing &lt;a href="http://newton.codecauldron.org/site/example/Spring-OSGi-Chainlink.html"&gt;Spring&lt;/a&gt; example.&lt;br /&gt;&lt;br /&gt;The new &lt;a href="http://code.google.com/p/peaberry/wiki/NewtonExample"&gt;example&lt;/a&gt; unpacks on top of a binary installation of &lt;a href="http://newton.codecauldron.org/site/download/release-1.3.2.html"&gt;Newton 1.3.2&lt;/a&gt; and shows how you can use property files to switch between local and remote services without changing your compiled Guice bindings.&lt;br /&gt;&lt;br /&gt;While writing the example I realized that there are a lot of cool abstractions we can build on top of the basic peaberry API. I'm trying to follow the model used in both Guice and OSGi and keep the core API as simple, lean, and mean as possible while providing ways for others to build even more user-friendly layers, such as &lt;a href="http://code.google.com/p/bindforge/"&gt;BindForge&lt;/a&gt;, on top.&lt;br /&gt;&lt;br /&gt;There are two essential layers I would like to add in the next peaberry release:&lt;ul&gt;&lt;li&gt;Configuration - but not tied directly to the OSGi CM service&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lifecycle - but again, not tied directly to Bundles and Activators&lt;/li&gt;&lt;/ul&gt;which will hopefully make it really easy to configure and tie services together.&lt;br /&gt;&lt;br /&gt;I'm also considering adding extender bundles to scan for service annotations or scrape 'blueprint' XML and dynamically configure the relevant bindings at runtime, but that would be more of a 1.3 feature. If you're interested in building on top of peaberry, or you have an interesting idea for a new feature, please let me &lt;a href="mailto:guice-osgi@googlegroups.com"&gt;know&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Until then take a look at Newton+peaberry and see distributed OSGi in action!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7381907404125490767?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7381907404125490767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7381907404125490767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7381907404125490767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7381907404125490767'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/05/distributed-osgi-with-newton-peaberry.html' title='Distributed OSGi with Newton + peaberry'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7981487584833874341</id><published>2009-03-28T01:25:00.005+08:00</published><updated>2009-03-28T02:29:51.168+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='EclipseCon'/><category scheme='http://www.blogger.com/atom/ns#' term='peaberry'/><title type='text'>peaberry - EclipseCon slides now available</title><content type='html'>My EclipseCon talk on peaberry seems to have been well received, although I think it would have been even better if I'd reduced the technical content to allow time for more questions. I always find short talks harder to plan than long talks, and this was a good learning experience.&lt;br /&gt;&lt;br /&gt;If you missed the talk you can either view it on &lt;a href="https://www.gpublication.com/eclipse/#requestedContent=contentID://EclipseConferences/EC2009/315"&gt;gPublication&lt;/a&gt; or download the original &lt;a href="http://peaberry.googlecode.com/files/peaberry%20-%20blending%20services%20and%20extensions.odp"&gt;presentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course hearing from my boss that he was closing our company the night before didn't really help. But I'm glad I got the chance to visit EclipseCon one more time and expand my network, which will come in useful for my upcoming job search.&lt;br /&gt;&lt;br /&gt;So if you know of any companies interested in hiring someone with good Java, OSGi, and Maven skills... let me know :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7981487584833874341?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7981487584833874341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7981487584833874341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7981487584833874341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7981487584833874341'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/03/peaberry-eclipsecon-slides-now.html' title='peaberry - EclipseCon slides now available'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-5706543485159925454</id><published>2009-03-05T09:43:00.005+08:00</published><updated>2009-03-05T10:20:56.650+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='bundleplugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>maven-bundle-plugin 2.0.0 released!</title><content type='html'>&lt;div style="text-align: justify;"&gt;The Apache Felix team is pleased to announce the release of maven-bundle-plugin 2.0.0&lt;br /&gt;&lt;br /&gt;This release uses the latest bndlib (0.0.311) which requires you to build with a Java5 JDK. You can continue to target earlier JVMs while building with a Java5 or later JDK by setting the source and target levels in the maven-compiler-plugin configuration.&lt;br /&gt;&lt;br /&gt;Here is the list of issues fixed in this release:&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&gt;Bug&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-545" target="_blank"&gt;FELIX-545&lt;/a&gt;] - Export-Package version inconsistencies.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-546" target="_blank"&gt;FELIX-546&lt;/a&gt;] - Import-Package version inconsistencies.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-549" target="_blank"&gt;FELIX-549&lt;/a&gt;] - Import-Package should not include "snapshot" from snapshot dependencies &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-660" target="_blank"&gt;FELIX-660&lt;/a&gt;] - "Class in different directory than declared" error when bundle classes in a directory other than bundle root&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-677" target="_blank"&gt;FELIX-677&lt;/a&gt;] - Parser throws error when DynamicImport-Package contains attributes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-699" target="_blank"&gt;FELIX-699&lt;/a&gt;] - manifest goal does not interprete _include instruction correctly&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-782" target="_blank"&gt;FELIX-782&lt;/a&gt;] - Manifest goal ignores version attribute specified in _exportcontents&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-807" target="_blank"&gt;FELIX-807&lt;/a&gt;] - conversion of JAR into bundle fails if there are classes is the default name space&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-831" target="_blank"&gt;FELIX-831&lt;/a&gt;] - bndlib unnecessary modifies valid OSGi Bundle-Version numbers (update to bndlib 0.0.293)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-843" target="_blank"&gt;FELIX-843&lt;/a&gt;] - Regression: BND 0.0.295 does not augment Ignore-Package with excluded import packages&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-850" target="_blank"&gt;FELIX-850&lt;/a&gt;] - Wrong symbolic name computed when groupId is a single segment string.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-864" target="_blank"&gt;FELIX-864&lt;/a&gt;] - A wrong symbolic name is calculated if artifactId starts with lastGroupIdSegment-.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-899" target="_blank"&gt;FELIX-899&lt;/a&gt;] - Version attribute missing from Import-Package on provided dependencies&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-907" target="_blank"&gt;FELIX-907&lt;/a&gt;] - Regression in latest BND code: negated exports are applied to private packages&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&gt;Improvement&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-684" target="_blank"&gt;FELIX-684&lt;/a&gt;] - Enable excludeDependencies to check groupId, version, etc. rather than only artifactId&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-806" target="_blank"&gt;FELIX-806&lt;/a&gt;] - changing the internal configuration of the archive plugin doesn't seem to be possible&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-941" target="_blank"&gt;FELIX-941&lt;/a&gt;] - Support singleton &amp;amp; fragment-attachment directive generation&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&gt;New Feature&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;[&lt;a href="https://issues.apache.org/jira/browse/FELIX-912" target="_blank"&gt;FELIX-912&lt;/a&gt;] - Improve default Export-Package / Private-Package settings by scanning the project source&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;A quick bundle example using the classic Maven quickstart project:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;# edit the pom.xml, change packaging from jar to bundle and add:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;build&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;plugins&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;maven-bundle-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/build&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;mvn clean install     &lt;/span&gt;# you should now have a valid OSGi bundle&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;plugin docs:   &lt;a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html" target="_blank"&gt;http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html&lt;/a&gt;&lt;br /&gt;plugin FAQ:   &lt;a href="http://felix.apache.org/site/apache-felix-bundle-plugin-faq.html" target="_blank"&gt;http://felix.apache.org/site/apache-felix-bundle-plugin-faq.html&lt;/a&gt;&lt;br /&gt;bnd docs:       &lt;a href="http://www.aqute.biz/Code/Bnd" target="_blank"&gt;http://www.aqute.biz/Code/Bnd&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Regards, the Apache Felix team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-5706543485159925454?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/5706543485159925454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=5706543485159925454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/5706543485159925454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/5706543485159925454'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/03/maven-bundle-plugin-200-released.html' title='maven-bundle-plugin 2.0.0 released!'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3624209390775423081</id><published>2009-02-27T19:36:00.003+08:00</published><updated>2009-02-27T19:43:14.715+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='bundleplugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>maven-bundle-plugin 2.0.0 coming soon</title><content type='html'>Just started a &lt;a href="http://mail-archives.apache.org/mod_mbox/felix-dev/200902.mbox/%3C81f0d9c0902270201k701069f7y756b1a7e461369f7@mail.gmail.com%3E"&gt;vote&lt;/a&gt; for the next major release of the maven-bundle-plugin, if all goes well it will be published to Maven central next Wednesday (4th March).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3624209390775423081?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3624209390775423081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3624209390775423081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3624209390775423081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3624209390775423081'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/02/maven-bundle-plugin-200-coming-soon.html' title='maven-bundle-plugin 2.0.0 coming soon'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6467265545983044323</id><published>2009-02-22T12:27:00.005+08:00</published><updated>2009-02-22T12:38:39.232+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><title type='text'>Guice feature comparison</title><content type='html'>Yesterday Jesse added this table to the &lt;a href="http://code.google.com/p/google-guice/wiki/OptionalAOP"&gt;Optional AOP&lt;/a&gt; page of the Guice wiki:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;   &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; &lt;strong&gt;Guice 1.0&lt;/strong&gt; &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; &lt;strong&gt;Guice 2.0&lt;/strong&gt; &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; &lt;strong&gt;Guice+AOP 2.0&lt;/strong&gt; &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; &lt;strong&gt;&lt;a href="http://code.google.com/p/google-gin/" rel="nofollow"&gt;GIN&lt;/a&gt;&lt;/strong&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Library size &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; 544Kb &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; 420Kb &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; 640Kb &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; 0Kb (code gen) &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; High performance &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Binding EDSL &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Scopes &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Typesafe &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Fast reflection &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ (&lt;a href="http://cglib.sourceforge.net/" rel="nofollow"&gt;cglib&lt;/a&gt;) &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ (&lt;a href="http://cglib.sourceforge.net/" rel="nofollow"&gt;cglib&lt;/a&gt;) &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ (code gen) &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Line numbers in error messages  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Method interceptors  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Provider Methods &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Binding overrides &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Tool-friendly SPI &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Child Injectors &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Servlet Support &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Scopes Only &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; ✔ &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt;  &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Error Reporting &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Good &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Better &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Best &lt;/td&gt;&lt;td style="border: 1px solid #aaa; padding: 5px;"&gt; Best &lt;/td&gt;&lt;/tr&gt; &lt;/table&gt;&lt;br /&gt;I think it's a great summary and shows how flexible the new release will be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6467265545983044323?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6467265545983044323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6467265545983044323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6467265545983044323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6467265545983044323'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/02/guice-feature-comparison.html' title='Guice feature comparison'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7284257820125701864</id><published>2009-01-13T01:42:00.003+08:00</published><updated>2009-01-13T01:54:02.702+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='peaberry'/><title type='text'>Guice-Peaberry vs Spring-DM</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://code.google.com/p/peaberry/wiki/Benchmarks"&gt;six times as fast, half the size!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course it's never &lt;i&gt;that&lt;/i&gt; simple, these are just some fun measurements I took today using a trivial testcase that injects an OSGi service. They completely ignore functionality, flexibility, usability, and many other *bilities... flame-on!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7284257820125701864?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7284257820125701864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7284257820125701864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7284257820125701864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7284257820125701864'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/01/guice-peaberry-vs-spring-dm.html' title='Guice-Peaberry vs Spring-DM'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3693827151956813293</id><published>2009-01-07T02:23:00.003+08:00</published><updated>2009-01-07T02:29:24.558+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='peaberry'/><title type='text'>Happy new year!</title><content type='html'>Just completed one of my new year resolutions and uploaded a release candidate of &lt;a href="http://code.google.com/p/peaberry/"&gt;peaberry&lt;/a&gt;. See my &lt;a href="http://groups.google.com/group/guice-osgi/browse_thread/thread/ca483ba864155b78"&gt;message&lt;/a&gt; on the Guice-OSGi group for a few more details.&lt;br /&gt;&lt;br /&gt;OK onto my next resolution, back to writing more chapters for OSGi in Action...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3693827151956813293?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3693827151956813293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3693827151956813293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3693827151956813293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3693827151956813293'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2009/01/happy-new-year.html' title='Happy new year!'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-8148789407339215667</id><published>2008-12-18T18:53:00.009+08:00</published><updated>2008-12-19T11:35:37.600+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='EclipseCon'/><title type='text'>Want to hear the latest on Guice and OSGi?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Then you'll want to attend EclipseCon 2009, where you can hear me talk about using &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt; and the &lt;a href="http://code.google.com/p/peaberry/"&gt;peaberry&lt;/a&gt; extension to blend OSGi services with Eclipse extensions:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipsecon.org/2009/sessions?id=315"&gt;http://www.eclipsecon.org/2009/sessions?id=315&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll also be running through some of the design decisions behind peaberry which I think are pretty neat - like the recent work on "outjection" that lets you share services between registries and watch for service updates. If I have time I'll also discuss some thoughts about lifecycle support (for some background see Todor's recent &lt;a href="http://code.google.com/p/peaberry/issues/detail?id=10"&gt;request&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I'm going to be around for the whole conference, so you'll have plenty of opportunities to ask me questions about peaberry, Pax-Construct, the maven-bundle-plugin, or the "OSGi in Action" book :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-8148789407339215667?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/8148789407339215667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=8148789407339215667' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/8148789407339215667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/8148789407339215667'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/12/want-to-hear-latest-on-guice-and-osgi.html' title='Want to hear the latest on Guice and OSGi?'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2822157976667195170</id><published>2008-12-09T16:20:00.005+08:00</published><updated>2008-12-09T17:04:30.771+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>How much OSGi should I use?</title><content type='html'>&lt;div style="text-align: justify;"&gt;This began as a quick reply to a question on the Felix &lt;a href="http://www.mail-archive.com/users@felix.apache.org/"&gt;users&lt;/a&gt; list about bundling third-party libraries, but these days once I start writing I find it hard to stop! Hope you find it useful...&lt;blockquote&gt;It's actually up to you - OSGi doesn't force you to make everything a bundle, it merely helps you when you decide to modularize.&lt;br /&gt;&lt;br /&gt;So if you want to put third-party libraries on your application classpath and use the "org.osgi.framework.bootdelegation" property to make them visible to all bundles then you can. You could then concentrate on modularizing your application without worrying about legacy classloading issues - however it would also mean you couldn't replace these libraries at runtime, or have multiple versions of them loaded at the same time. Additionally, if you use tools to generate OSGi manifests you'd need to tell them that these packages should not be marked as imported, as they're available instead using bootdelegation - otherwise your bundles would have trouble resolving, because no other bundle would be exporting these packages.&lt;br /&gt;&lt;br /&gt;Or you could keep the libraries on your application classpath and use "org.osgi.framework.system.packages.extra" to augment the exports from the main system bundle. Unlike bootdelegation, your bundles would need to import any of these packages they want to use - and these imports would then get wired to the system bundle. However, because you're now using OSGi resolution to find these packages you could replace them at runtime and have other bundles provide alternative versions. The downside is that you may find issues with a few legacy libraries that expect the "classic" model (ie. everything on the application classpath)&lt;br /&gt;&lt;br /&gt;Later on you might decide to move libraries from the application classpath into one or more OSGi bundles - you could either crack open the library and add OSGi metadata to the manifest to export everything, or use a tool like BND to create a new jar based on the original. This is great if you want to share libraries between bundles - but if the library is only used by one bundle then it might make more sense to embed the library inside that bundle, especially if it's an implementation detail and you never expect to export any packages. Again you have a choice: you can unpack the library inside your bundle, or embed the jar as-is and add it to your Bundle-ClassPath (OSGi supports "jars within jars").&lt;br /&gt;&lt;br /&gt;Once you have the third-party library as (or inside) an OSGi bundle then you can start thinking about making certain packages private, and add a Bundle-Activator to initialize and clean up resources and/or threads. Using an activator is optional and while it will introduce a compile time dependency to OSGi, it doesn't force the library to use OSGi at runtime. You can still use the library in classic Java applications, because they won't attempt to load the activator class. This is cool, because it means you can fully participate in the OSGi lifecycle without affecting anyone not interested in OSGi.&lt;br /&gt;&lt;br /&gt;The best part is that you can mix any of these approaches in your application and you can decide when move between them. You're not forced to make everything a bundle, and you may even decide to move bundles back to the application classpath. Feel free to use as much or as little of OSGi as you like :)&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2822157976667195170?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2822157976667195170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2822157976667195170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2822157976667195170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2822157976667195170'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/12/how-much-osgi-should-i-use.html' title='How much OSGi should I use?'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-5925407104767994810</id><published>2008-12-04T18:20:00.003+08:00</published><updated>2008-12-04T23:55:36.627+08:00</updated><title type='text'>Cat massage, courtesy of Friesia</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZOwzJlPwCt4&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ZOwzJlPwCt4&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-5925407104767994810?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/5925407104767994810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=5925407104767994810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/5925407104767994810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/5925407104767994810'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/12/cat-massage-courtesy-of-friesa.html' title='Cat massage, courtesy of Friesia'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7008714864075006571</id><published>2008-11-26T02:31:00.003+08:00</published><updated>2008-11-26T02:41:11.452+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='services'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>OSGi (Services) in Action</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just noticed that my chapter on OSGi services has reached the &lt;a href="http://manning.com/hall/"&gt;Manning Early Access Program&lt;/a&gt;. Hope you enjoy reading it, and remember to post any comments or questions on our &lt;a href="http://www.manning-sandbox.com/forum.jspa?forumID=507"&gt;author forum&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;Here's some of the topics covered in &lt;b&gt;Studying Services&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The what, why and when of services&lt;/li&gt;&lt;br /&gt;&lt;li&gt;OSGi services in action!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dealing with dynamics&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Using services in the paint example&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How services relate to modularity and lifecycle&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Framework services&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7008714864075006571?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7008714864075006571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7008714864075006571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7008714864075006571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7008714864075006571'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/11/osgi-services-in-action.html' title='OSGi (Services) in Action'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3336368653800994712</id><published>2008-11-17T02:20:00.004+08:00</published><updated>2008-11-17T02:52:59.374+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Do you remember to unget OSGi services?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just posted the first set of code examples for &lt;a href="http://manning.com/hall/"&gt;OSGi in Action&lt;/a&gt;, chapters 1 to 4:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://code.google.com/p/osgi-in-action/"&gt;http://code.google.com/p/osgi-in-action/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The answer to when you should "unget" an OSGi service (and why you should bother) will be explained in chapter 4 of the book, which will hopefully reach Manning's Early Access Program very soon.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Spoiler alert&lt;/i&gt;: take a peek at &lt;code&gt;chapter04/dynamics&lt;/code&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3336368653800994712?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3336368653800994712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3336368653800994712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3336368653800994712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3336368653800994712'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/11/do-you-remember-to-unget-osgi-services.html' title='Do you remember to unget OSGi services?'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-1176915919260202772</id><published>2008-10-24T00:32:00.004+08:00</published><updated>2008-10-24T01:02:11.450+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>OSGi in Action!</title><content type='html'>&lt;div style="text-align: justify;"&gt;The kind folks at Manning have just made the first chapter of "OSGi in Action" available through their early access program: &lt;a href="http://manning.com/hall/"&gt;http://manning.com/hall/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately the figures seem to be chopped off in the PDF, so apologies for that in advance... we're using OpenOffice to write the book and this is apparently new for Manning, so there's still a couple of bugs to squash in the publishing process. Never mind, the next update will be much better!&lt;br /&gt;&lt;br /&gt;Richard, Karl and I are eagerly working on getting the next few chapters ready for MEAP. This is where we delve into the different layers of OSGi (modularity, lifecycle and services) with plenty of examples to explain the differences and best practices.&lt;br /&gt;&lt;br /&gt;Those of you signed up to MEAP can send comments and corrections via the &lt;a href="http://www.manning-sandbox.com/forum.jspa?forumID=507"&gt;author forum&lt;/a&gt;. You can also reach us via the usual lists (Felix, OPS4J, etc.)&lt;br /&gt;&lt;br /&gt;That's all for now - got to get back to writing!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-1176915919260202772?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/1176915919260202772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=1176915919260202772' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/1176915919260202772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/1176915919260202772'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/10/osgi-in-action.html' title='OSGi in Action!'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-8310726295468742311</id><published>2008-10-14T15:30:00.003+08:00</published><updated>2008-10-14T15:39:26.708+08:00</updated><title type='text'>Karangan - Kampung halaman saya</title><content type='html'>&lt;div style="text-align: justify;"&gt;Nama kampung saya Guarlford. Guarlford terletak dua batu dari sebuah kaki bukit besar yang bernama Malvern Hills. Di sekeliling Guarlford ada banyak ladang, lembu tenusu dan anak biri-biri.&lt;br /&gt;&lt;br /&gt;Pada musim bunga pemandangan sangat cantik sebab semua tumbuh-tumbuhan hijau dan segar. Pemandangan musim gugur juga sangat cantik sebab daun-daun pohon menjadi warna-warni.&lt;br /&gt;&lt;br /&gt;Walaupun jumlah penduduk di sekitar Malvern adalah tiga puluh ribu orang, jumlah penduduk Guarlford hanya dua ratus lima puluh orang sahaja.&lt;br /&gt;&lt;br /&gt;Kampung saya sangat tua, ia wujud sejak tahun 1275. Ibubapa saya dan rakan-rakan mereka telah menulis dua buah buku tentang sejarah Guarlford yang anda dapat beli dari &lt;a href="http://www.amazon.co.uk/Guarlford-Scene-Don-Hill/dp/0955049814"&gt;Amazon&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-8310726295468742311?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/8310726295468742311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=8310726295468742311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/8310726295468742311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/8310726295468742311'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/10/karangan-kampung-halaman-saya.html' title='Karangan - Kampung halaman saya'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6223819306144378332</id><published>2008-07-30T04:15:00.005+08:00</published><updated>2008-07-30T04:36:47.647+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><title type='text'>OSGi Text Scrambling Service</title><content type='html'>Here's most of the code from the peaberry example I mentioned in my previous post - as you can see, peaberry lets you import and export OSGi services from your Guice enabled application, without introducing a dependency on the OSGi API. In fact you can even plug your own service frameworks into peaberry.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EXPORTING BUNDLE&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;hr&gt;&lt;pre&gt;package examples.scrambler.impl;&lt;br /&gt;&lt;br /&gt;import static org.ops4j.peaberry.Peaberry.registration;&lt;br /&gt;import static org.ops4j.peaberry.util.TypeLiterals.export;&lt;br /&gt;&lt;br /&gt;import com.google.inject.AbstractModule;&lt;br /&gt;import com.google.inject.Key;&lt;br /&gt;&lt;br /&gt;import examples.scrambler.Scramble;&lt;br /&gt;&lt;br /&gt;// here's where we bind the exported service...&lt;br /&gt;public class ExportModule extends AbstractModule {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  protected void configure() {&lt;br /&gt;    // note: the service is exported at injection time&lt;br /&gt;    bind(export(Scramble.class)).toProvider(&lt;br /&gt;        registration(Key.get(ScrambleImpl.class)).export());&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;hr&gt;&lt;pre&gt;package examples.scrambler.impl;&lt;br /&gt;&lt;br /&gt;import static com.google.inject.Guice.createInjector;&lt;br /&gt;import static org.ops4j.peaberry.Peaberry.osgiModule;&lt;br /&gt;&lt;br /&gt;import org.ops4j.peaberry.Export;&lt;br /&gt;import org.osgi.framework.BundleActivator;&lt;br /&gt;import org.osgi.framework.BundleContext;&lt;br /&gt;&lt;br /&gt;import com.google.inject.Inject;&lt;br /&gt;&lt;br /&gt;import examples.scrambler.Scramble;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unused")&lt;br /&gt;public class Activator implements BundleActivator {&lt;br /&gt;&lt;br /&gt;  @Inject&lt;br /&gt;  final Export&amp;lt;Scramble&amp;gt; handle = null;&lt;br /&gt;&lt;br /&gt;  public void start(final BundleContext ctx) throws Exception {&lt;br /&gt;&lt;br /&gt;    // apply the exported service binding&lt;br /&gt;    createInjector(osgiModule(ctx), new ExportModule()).injectMembers(this);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void stop(final BundleContext ctx) throws Exception {&lt;br /&gt;&lt;br /&gt;    if (null != handle) {&lt;br /&gt;      handle.remove();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;hr&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;IMPORTING BUNDLE&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;hr&gt;&lt;pre&gt;package examples.scrambler.test;&lt;br /&gt;&lt;br /&gt;import static org.ops4j.peaberry.Peaberry.service;&lt;br /&gt;&lt;br /&gt;import com.google.inject.AbstractModule;&lt;br /&gt;&lt;br /&gt;import examples.scrambler.Scramble;&lt;br /&gt;&lt;br /&gt;// here's where we bind the imported service...&lt;br /&gt;public class ImportModule extends AbstractModule {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  protected void configure() {&lt;br /&gt;    bind(Scramble.class).toProvider(service(Scramble.class).single());&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;hr&gt;&lt;pre&gt;package examples.scrambler.test;&lt;br /&gt;&lt;br /&gt;import static com.google.inject.Guice.createInjector;&lt;br /&gt;import static org.ops4j.peaberry.Peaberry.osgiModule;&lt;br /&gt;&lt;br /&gt;import org.ops4j.peaberry.ServiceUnavailableException;&lt;br /&gt;import org.osgi.framework.BundleActivator;&lt;br /&gt;import org.osgi.framework.BundleContext;&lt;br /&gt;&lt;br /&gt;import com.google.inject.Inject;&lt;br /&gt;&lt;br /&gt;import examples.scrambler.Scramble;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unused")&lt;br /&gt;public class Activator implements BundleActivator {&lt;br /&gt;&lt;br /&gt;  // plain text to be scrambled...&lt;br /&gt;  final static String TEXT = "This is a simple test of peaberry.";&lt;br /&gt;&lt;br /&gt;  @Inject&lt;br /&gt;  final Scramble service = null; // Guice can actually inject final fields!&lt;br /&gt;&lt;br /&gt;  Thread tester;&lt;br /&gt;&lt;br /&gt;  public void start(final BundleContext ctx) throws Exception {&lt;br /&gt;&lt;br /&gt;    // apply the imported service binding&lt;br /&gt;    createInjector(osgiModule(ctx), new ImportModule()).injectMembers(this);&lt;br /&gt;&lt;br /&gt;    // quick'n'dirty test thread&lt;br /&gt;    tester = new Thread(new Runnable() {&lt;br /&gt;      public void run() {&lt;br /&gt;        // support cooperative cancellation&lt;br /&gt;        while (Thread.currentThread() == tester) {&lt;br /&gt;          try {&lt;br /&gt;            System.out.println('[' + service.process(TEXT) + ']');&lt;br /&gt;          } catch (final ServiceUnavailableException e) {&lt;br /&gt;            System.err.println("No scrambler service!");&lt;br /&gt;          }&lt;br /&gt;          try {&lt;br /&gt;            Thread.sleep(2000);&lt;br /&gt;          } catch (final InterruptedException e) {&lt;br /&gt;            // wake-up&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;    tester.start();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void stop(final BundleContext ctx) throws Exception {&lt;br /&gt;&lt;br /&gt;    // cooperatively stop the thread&lt;br /&gt;    final Thread zombie = tester;&lt;br /&gt;    tester = null;&lt;br /&gt;    zombie.join();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;hr&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6223819306144378332?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6223819306144378332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6223819306144378332' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6223819306144378332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6223819306144378332'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/07/text-scrambling-service.html' title='OSGi Text Scrambling Service'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2753644156530050291</id><published>2008-07-30T04:10:00.003+08:00</published><updated>2008-07-30T04:15:08.237+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><title type='text'>peaberry 1.0 alpha</title><content type='html'>You may have noticed I recently uploaded an alpha build of peaberry 1.0&lt;br /&gt;&lt;br /&gt;     &lt;a href="http://peaberry.googlecode.com/files/peaberry-1.0-alpha.zip"&gt;http://peaberry.googlecode.com/files/peaberry-1.0-alpha.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;today I've also been working on updating the design and user guide pages:&lt;br /&gt;&lt;br /&gt;     &lt;a href="http://code.google.com/p/peaberry/wiki/UserGuide"&gt;http://code.google.com/p/peaberry/wiki/UserGuide&lt;/a&gt;&lt;br /&gt;     &lt;a href="http://code.google.com/p/peaberry/wiki/DetailedDesign"&gt;http://code.google.com/p/peaberry/wiki/DetailedDesign&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;including a small Eclipse/PDE example I put together in a matter of minutes.&lt;br /&gt;(and which hopefully also works ok on other people's installations of Eclipse!)&lt;br /&gt;&lt;br /&gt;     &lt;a href="http://peaberry.googlecode.com/files/PeaberryExample.zip"&gt;http://peaberry.googlecode.com/files/PeaberryExample.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At this point I'm feeling good about the API and (unless I hear otherwise) will&lt;br /&gt;concentrate on more "behind-the-scenes" work, and perhaps add a few more&lt;br /&gt;utilities to help developers.&lt;br /&gt;&lt;br /&gt;So... if you find any bugs please let me know via the issues tab :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2753644156530050291?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2753644156530050291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2753644156530050291' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2753644156530050291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2753644156530050291'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/07/peaberry-10-alpha.html' title='peaberry 1.0 alpha'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-669049150880159319</id><published>2008-07-29T15:31:00.003+08:00</published><updated>2008-07-29T16:07:49.819+08:00</updated><title type='text'>IdentityHashMap is broken in IBM JDK 5!</title><content type='html'>&lt;div style="text-align: justify;"&gt;So there I was, happily running some tests with the latest copy of Guice when &lt;b&gt;blam&lt;/b&gt; - I got a NullPointerException from inside the injector. Hmmm, I thought, perhaps the latest trunk code is unstable. So I pulled down a stable snapshot... and got the same exception.&lt;br /&gt;&lt;br /&gt;Looked at location of the NPE and got even more confused:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CreationTimeMemberInjector.java:87&lt;br /&gt;&lt;br /&gt;where it iterates over the cached entry set of an identity hash-map. Added some debug code, and yes - the entry set is valid to begin with, but after stashing it in a list, the list elements are all null. Weird!&lt;br /&gt;&lt;br /&gt;Why hadn't I seen this before, I've run the same test many times - then it struck me, today I happened to have JAVA_HOME set to the IBM JDK, while previously I've used the default Sun JDK.&lt;br /&gt;&lt;br /&gt;Time to crack open the src.jar from the IBM JDK - lo and behold in IdentityHashMap.java:1142&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;      public &lt;t&gt; T[] toArray(T[] a) {&lt;br /&gt;          return (T[])toArray(); // !!!!&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;that is plain wrong - the specification for &lt;code&gt;toArray(T[] a)&lt;/code&gt; clearly states that the provided array must be used if it's large enough:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array. If the collection fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this collection.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;this behaviour is relied on in other classes from &lt;code&gt;java.util&lt;/code&gt;, where they create a large enough array and use &lt;code&gt;c.toArray(elements);&lt;/code&gt; to initialize the array contents. Hence the null array when creating a list based on the entry set.&lt;br /&gt;&lt;br /&gt;I was going to report this on the "IBM Java Runtimes and SDKs" forum as the problem still exists in the latest service release, but it appears to be offline today! For those interested, here is a simple testcase to recreate the bug:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;public class IdentityHashMapTest {&lt;br /&gt;  @SuppressWarnings("unchecked")&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    Map map1 = new HashMap();&lt;br /&gt;    Map map2 = new IdentityHashMap();&lt;br /&gt;    map1.put("Hello", "World");&lt;br /&gt;    map2.put("Hello", "World");&lt;br /&gt;    System.out.println("MAP  1 : " + map1.entrySet());&lt;br /&gt;    System.out.println("MAP  2 : " + map2.entrySet());&lt;br /&gt;    System.out.println("LIST 1 : " + new ArrayList(map1.entrySet()));&lt;br /&gt;    System.out.println("LIST 2 : " + new ArrayList(map2.entrySet()));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;BTW, that comment &lt;code&gt;// !!!!&lt;/code&gt; is actually in the original source code, which suggests someone out there knows this is wrong but couldn't be bothered to fix it...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-669049150880159319?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/669049150880159319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=669049150880159319' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/669049150880159319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/669049150880159319'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/07/identityhashmap-is-broken-in-ibm-jdk-5.html' title='IdentityHashMap is broken in IBM JDK 5!'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-192072595012272493</id><published>2008-06-27T17:41:00.002+08:00</published><updated>2008-06-27T17:52:00.692+08:00</updated><title type='text'>Guice 2.0 and OSGi</title><content type='html'>&lt;div style="text-align: justify;"&gt;Some cool news: the  &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt; trunk (which will eventually become 2.0) now includes my patches to support OSGi-style classloading, and also adds OSGi metadata to its jars.&lt;br /&gt;&lt;br /&gt;This means that you will be able to take the Guice 2.0 jar and drop it onto any OSGi framework, without having to worry about classloading issues wrt. the internal proxy code. The new code also allows generated proxy classes to be unloaded when they're no longer needed.&lt;br /&gt;&lt;br /&gt;So when Guice 2.0 hits the internet, the &lt;a href="http://code.google.com/p/peaberry/"&gt;peaberry&lt;/a&gt; project will become a neat little extension library that you can drop alongside the Guice jar to inject OSGi services.&lt;br /&gt;&lt;br /&gt;Good stuff!   ( no more patches :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-192072595012272493?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/192072595012272493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=192072595012272493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/192072595012272493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/192072595012272493'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/06/guice-20-and-osgi.html' title='Guice 2.0 and OSGi'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6168345086680749439</id><published>2008-05-16T10:51:00.006+08:00</published><updated>2008-05-16T11:35:00.436+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='health'/><title type='text'>Bio-reboot</title><content type='html'>&lt;div style="text-align: justify;"&gt;You may (or may not) have noticed that I haven't been as active as usual on various projects. I've been having stomach issues for the last few months, and after numerous tests the doc decided to "reboot" my stomach by clearing out all the bacteria with antibiotics. He's now started me on probiotics to replace the good bacteria/enzymes (like the ones that help digest milk) that got zapped.&lt;br /&gt;&lt;br /&gt;It's going to take a while before things are fully back to normal, and I need to regain about 5kg, but I'm feeling more positive (which is a good sign). The doc did tell me to keep my stress levels down, but that may be difficult when there's so many cool ideas that need implementing ;)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6168345086680749439?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6168345086680749439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6168345086680749439' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6168345086680749439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6168345086680749439'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/05/bio-reboot.html' title='Bio-reboot'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7801166253341605439</id><published>2008-04-07T23:42:00.002+08:00</published><updated>2008-04-08T00:04:55.180+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><title type='text'>peaberry 0.3 available for testing / review</title><content type='html'>I've uploaded a new peaberry bundle along with early design docs:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://peaberry.googlecode.com/files/peaberry-0.3.jar" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://peaberry.googlecode.com&lt;wbr&gt;/files/peaberry-0.3.jar&lt;/a&gt;&lt;br /&gt;  (this also contains the source code under OSGI-OPT)&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://code.google.com/p/peaberry/wiki/DetailedDesign" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://code.google.com/p&lt;wbr&gt;/peaberry/wiki/DetailedDesign&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the new design is much less invasive: you can decide to explicitly&lt;br /&gt;add bindings to services without using the @Service annotation if&lt;br /&gt;you want, and you can even use peaberry to inject services from&lt;br /&gt;other registry based systems (by implementing ServiceRegistry).&lt;br /&gt;&lt;br /&gt;There's also a small demo to show it working in practice&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://peaberry.googlecode.com/files/peaberry-0.3-logdemo.zip" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://peaberry.googlecode.com&lt;wbr&gt;/files/peaberry-0.3-logdemo.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;although this demo doesn't actually do anything useful ;)&lt;br /&gt;&lt;br /&gt;I'll upload the user guide tomorrow and then start working on a&lt;br /&gt;production quality implementation of the OSGiServiceRegistry&lt;br /&gt;(the current one is basic proof-of-concept and non-optimal).&lt;br /&gt;&lt;br /&gt;Other TODOs:&lt;br /&gt;&lt;br /&gt;  mandatory services (ie. bundle won't start without them)&lt;br /&gt;&lt;br /&gt;  service registration (need to find an intuitive approach)&lt;br /&gt;&lt;br /&gt;Anyway, please take a look and let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7801166253341605439?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7801166253341605439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7801166253341605439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7801166253341605439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7801166253341605439'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/04/peaberry-03-available-for-testing.html' title='peaberry 0.3 available for testing / review'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7233591384253355178</id><published>2008-03-07T15:16:00.003+08:00</published><updated>2008-03-07T15:28:39.945+08:00</updated><title type='text'>A jolt of Guice</title><content type='html'>&lt;div style="text-align: justify;"&gt;Fantastic news from this year's &lt;a href="http://www.joltawards.com/press/030608.htm"&gt;Jolt Awards&lt;/a&gt;: Guice won the award for "Libraries/Frameworks" beating several other worthy finalists, including the Spring Framework! Hopefully this news will provoke a fresh injection of interest in Guice :)&lt;br /&gt;&lt;br /&gt;Certainly I'm feeling more of a buzz about the next release, and can't wait to find time to continue my work on extending Guice to support dynamic injection of services from registries, such as the one in OSGi (&lt;a href="http://code.google.com/p/peaberry"&gt;http://code.google.com/p/peaberry&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So congratulations to Bob, Kevin and everyone else involved with Guice!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7233591384253355178?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7233591384253355178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7233591384253355178' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7233591384253355178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7233591384253355178'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/03/jolt-of-guice.html' title='A jolt of Guice'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-244763168931125415</id><published>2008-03-07T15:06:00.003+08:00</published><updated>2008-03-07T15:15:22.406+08:00</updated><title type='text'>Pax Construct 1.0 released</title><content type='html'>I've released version 1.0 of Pax Construct, just in time for EclipseCon! (phew) And now you can find the scripts and plugin on the central Maven repository, so it's even easier to use:&lt;br /&gt;&lt;br /&gt;   &lt;a href="http://repo1.maven.org/maven2/org/ops4j/pax/construct/scripts/1.0/scripts-1.0.zip"&gt;http://repo1.maven.org/maven2/org/ops4j/pax/construct/scripts/1.0/scripts-1.0.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Improvement&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-66"&gt;PAXCONSTRUCT-66&lt;/a&gt;]&lt;br /&gt; - Add all Maven compilation dependencies to the Eclipse classpath&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-67"&gt;PAXCONSTRUCT-67&lt;/a&gt;]&lt;br /&gt; - Add pax:provision option to select Pax-Runner profiles (-Ddeploy=...)&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-68"&gt;PAXCONSTRUCT-68&lt;/a&gt;]&lt;br /&gt; - Support use of Pax-Runner argument files (-Dargs=&lt;url-or-filename&gt;)&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-69"&gt;PAXCONSTRUCT-69&lt;/a&gt;]&lt;br /&gt; - Support pax:run as alias for pax:provision&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-70"&gt;PAXCONSTRUCT-70&lt;/a&gt;]&lt;br /&gt; - Provide a pax-provision script that works outside of a Maven project&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-71"&gt;PAXCONSTRUCT-71&lt;/a&gt;]&lt;br /&gt; - Support provisioning of bundles not marked as provided dependencies&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New Feature&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-72"&gt;PAXCONSTRUCT-72&lt;/a&gt;]&lt;br /&gt; - Add new command "pax-create-module" to simplify creation of subdirectories&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Task&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-59"&gt;PAXCONSTRUCT-59&lt;/a&gt;]&lt;br /&gt; - Look into using velocity instead of groovy to generate the various scripts&lt;br /&gt;&lt;br /&gt;Plus several changes to the underlying internals to improve performance and usability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-244763168931125415?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/244763168931125415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=244763168931125415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/244763168931125415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/244763168931125415'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/03/pax-construct-10-released.html' title='Pax Construct 1.0 released'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6517053697882275235</id><published>2008-01-22T12:28:00.000+08:00</published><updated>2008-01-22T12:30:06.554+08:00</updated><title type='text'>maven-bundle-plugin 1.2.0 released</title><content type='html'>It's finally here, a new stable release of the bundleplugin:&lt;br /&gt;&lt;pre&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;version&amp;gt;1.2.0&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;hopefully the next development cycle won't take so long :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6517053697882275235?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6517053697882275235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6517053697882275235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6517053697882275235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6517053697882275235'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2008/01/maven-bundle-plugin-120-released.html' title='maven-bundle-plugin 1.2.0 released'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-341592938939862108</id><published>2007-12-19T19:54:00.000+08:00</published><updated>2007-12-19T20:01:43.888+08:00</updated><title type='text'>Using OSGi? Need logging?</title><content type='html'>&lt;div style="text-align: justify;"&gt;We're very close to the first major release of &lt;a href="http://wiki.ops4j.org/confluence/x/F"&gt;Pax-Logging&lt;/a&gt; - if you're using OSGi and are still looking for a good logging provider, why not try the release candidate:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://repository.ops4j.org/maven2/org/ops4j/pax/logging/pax-logging-api/1.0-RC2/pax-logging-api-1.0-RC2.jar"&gt;pax-logging-api-1.0-RC2.jar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://repository.ops4j.org/maven2/org/ops4j/pax/logging/pax-logging-service/1.0-RC2/pax-logging-service-1.0-RC2.jar"&gt;pax-logging-service-1.0-RC2.jar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;several major open-source projects are already using it to simplify their logging story.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-341592938939862108?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/341592938939862108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=341592938939862108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/341592938939862108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/341592938939862108'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/12/using-osgi-need-logging.html' title='Using OSGi? Need logging?'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3303188413143129279</id><published>2007-12-18T23:52:00.000+08:00</published><updated>2007-12-19T00:14:12.185+08:00</updated><title type='text'>An introduction to Pax tools for OSGi</title><content type='html'>&lt;div style="text-align: justify;"&gt;I received an early Christmas present this year: my proposed &lt;a href="http://www.eclipsecon.org/2008/index.php?page=sub/&amp;amp;id=59"&gt;tutorial&lt;/a&gt; for EclipseCon 2008 was accepted! Come along if you want to hear how Pax-Runner, Pax-Construct, Pax-Logging, and the rest of the Pax family can make life with OSGi much more bearable :)&lt;br /&gt;&lt;br /&gt;Both Alin and I will be there to go through the tools, run demos, suggest OSGi best-practises, and answer questions. BTW, if you have any specific topics you'd like covered, let me know and I'll see if I can work them into the tutorial.&lt;br /&gt;&lt;br /&gt;Hope to see you at EclipseCon 2008.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3303188413143129279?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3303188413143129279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3303188413143129279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3303188413143129279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3303188413143129279'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/12/introduction-to-pax-tools-for-osgi.html' title='An introduction to Pax tools for OSGi'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6510416594017623395</id><published>2007-12-04T16:46:00.000+08:00</published><updated>2007-12-04T16:57:36.804+08:00</updated><title type='text'>Pax Construct 0.6.2 Released</title><content type='html'>&lt;h2&gt;Moving to 0.6.2&lt;/h2&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;You can update existing scripts and projects with the &lt;a href="http://www.ops4j.org/projects/pax/construct/help/update.html"&gt;pax-update&lt;/a&gt; command. Or you can download the new scripts and manually change the maven-pax-plugin version in your project's &lt;code&gt;pom.xml&lt;/code&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Change Log&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;Bug&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-52"&gt;PAXCONSTRUCT-52&lt;/a&gt;] - pax-clone has issues with java files containing #. and #stop&lt;/li&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-53"&gt;PAXCONSTRUCT-53&lt;/a&gt;] - pax-clone corrupts binaries&lt;/li&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-54"&gt;PAXCONSTRUCT-54&lt;/a&gt;] - pax-validate.bat fails when invoked from cygwin&lt;/li&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-55"&gt;PAXCONSTRUCT-55&lt;/a&gt;] - pax-import-bundle throws NPE when run outside of a maven project - it should report an error instead&lt;/li&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-56"&gt;PAXCONSTRUCT-56&lt;/a&gt;] - pax:eclipse error using latest 0.6.2-SNAPSHOT&lt;/li&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-57"&gt;PAXCONSTRUCT-57&lt;/a&gt;] - Support using Pax-Construct scripts in a directory with spaces under Cygwin&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Improvement&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-50"&gt;PAXCONSTRUCT-50&lt;/a&gt;] - maven-pax-plugin can cause long compilation times when unpacking bundles with embedded dependencies&lt;/li&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-58"&gt;PAXCONSTRUCT-58&lt;/a&gt;] - Add provided dependencies as required libraries in the Eclipse classpath to better support testing&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Task&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-51"&gt;PAXCONSTRUCT-51&lt;/a&gt;] - Separate archetypes from the main pax plugin and scripts so they can be released separately&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6510416594017623395?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6510416594017623395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6510416594017623395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6510416594017623395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6510416594017623395'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/12/pax-construct-062-released.html' title='Pax Construct 0.6.2 Released'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2137990845283981020</id><published>2007-11-29T11:56:00.000+08:00</published><updated>2007-11-29T12:05:08.754+08:00</updated><title type='text'>oatmeal</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just thought I'd share a picture of our new cat Oatmeal (or Oatey for short) who we got several weeks ago from a rescue organization. He's settled in very quickly and enjoys distracting me when I use my macbook at home - I'm beginning to suspect my wife is encouraging this behaviour ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/mcculls/Oatey/photo?authkey=2_bsq4MeCkc#5136712198802223186"&gt;&lt;img src="http://lh6.google.com/mcculls/R0lEh4MFsFI/AAAAAAAAA7w/7uM5AIg7i08/s400/PB170153.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;this is Oatey in "cute" mode (warning: he also has a "biting+scratching" mode!)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2137990845283981020?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2137990845283981020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2137990845283981020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2137990845283981020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2137990845283981020'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/oatmeal.html' title='oatmeal'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3254957499296722386</id><published>2007-11-28T16:19:00.000+08:00</published><updated>2007-11-28T16:41:52.403+08:00</updated><title type='text'>EclipseCon 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;Well, the submissions are in and it looks like there are some really great talks and tutorials out there - it's a shame there's only so much time available. There was a flood of OSGi related submissions just before the deadline, so Peter can rest easy ;)&lt;br /&gt;&lt;br /&gt;If you want to see what's available, take a gander at:&lt;br /&gt;&lt;br /&gt;   &lt;a href="https://eclipsecon.greenmeetingsystems.com/submissions"&gt;https://eclipsecon.greenmeetingsystems.com/submissions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the submissions process is open and transparent, so feel free to review them and comment on those you'd like to see, or ask for more details on any talks/tutorials.&lt;br /&gt;&lt;br /&gt;Hope to see you at EclipseCon next year!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3254957499296722386?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3254957499296722386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3254957499296722386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3254957499296722386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3254957499296722386'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/eclipsecon-2008.html' title='EclipseCon 2008'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-9019597787654358769</id><published>2007-11-28T14:50:00.000+08:00</published><updated>2007-11-28T15:27:17.792+08:00</updated><title type='text'>mmm... durian</title><content type='html'>&lt;div style="text-align: justify;"&gt;One of the benefits of living in Malaysia is the wide range of food available*. It took me a while to get used to eating &lt;a href="http://en.wikipedia.org/wiki/Durian"&gt;durian&lt;/a&gt; fruit, as the smell reminded me too much of ripe cheese - but now my wife and I can happily eat several in a single sitting.&lt;br /&gt;&lt;br /&gt;I don't know exactly when it happened, but one day I was drawn to the smell rather than it putting me off - since then I look forward to durian season and enjoy savouring the different flavours and textures you can find here and in Indonesia. Every fruit is different - and now and again you find a really great durian that you just wish you could eat again :)&lt;br /&gt;&lt;br /&gt;These days you can find durian in ice-cream, candy, mooncakes - even doughnuts!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/mcculls/DurianDoughnut/photo#5136713783645155538"&gt;&lt;img src="http://lh3.google.com/mcculls/R0lF-IMFsNI/AAAAAAAAA9M/FwOke6ysFwE/s400/PB030125.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;perhaps this could even make Homer Simpson try durian?&lt;br /&gt;&lt;br /&gt;(* I also like Indonesian &lt;a href="http://en.wikipedia.org/wiki/Salak"&gt;salak&lt;/a&gt; but it's hard to find good supplies of this locally)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-9019597787654358769?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/9019597787654358769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=9019597787654358769' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/9019597787654358769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/9019597787654358769'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/mmm-durian.html' title='mmm... durian'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6510254975533710912</id><published>2007-11-21T14:49:00.000+08:00</published><updated>2007-11-21T15:04:49.728+08:00</updated><title type='text'>Pax Construct 0.6.1 Released</title><content type='html'>&lt;span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;a href="http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.6.1/scripts-0.6.1.zip" rel="nofollow" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://repository.ops4j.org&lt;wbr&gt;/maven2/org/ops4j/pax/construct&lt;wbr&gt;/scripts/0.6.1/scripts-0.6.1&lt;wbr&gt;.zip&lt;sup&gt;&lt;img src="http://wiki.ops4j.org/confluence/images/icons/linkext7.gif" alt="" align="absmiddle" border="0" height="7" width="7" /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;div&gt;  &lt;p&gt;if you have 0.6.0 installed, you can use &lt;b&gt;pax-update&lt;/b&gt; to upgrade your existing scripts (must be run from inside the scripts bin directory).&lt;/p&gt;  &lt;p&gt;&lt;ins&gt;Release Notes - Pax Construct - Version 0.6.1&lt;/ins&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Bug&lt;/b&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-47"&gt;PAXCONSTRUCT-47&lt;/a&gt; - Default classpath entry for an imported bundle is missing when source is unavailable&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;&lt;b&gt;Improvement&lt;/b&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-46"&gt;PAXCONSTRUCT-46&lt;/a&gt; - Use latest release of Pax-Runner by default, instead of always defaulting to a known static version&lt;/li&gt;&lt;li&gt;&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-49"&gt;PAXCONSTRUCT-49&lt;/a&gt; - resources out of basic resource path included in details.bnd not copied when cloning, or fix for bundle build&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;&lt;b&gt;New Feature&lt;/b&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://issues.ops4j.org/jira/browse/PAXCONSTRUCT-48"&gt;PAXCONSTRUCT-48&lt;/a&gt; - Allow users to specify a different bundle groupId, rather than limiting them to the generated groupId&lt;/li&gt;&lt;/ul&gt; &lt;/div&gt;                   &lt;img src="http://wiki.ops4j.org/confluence/images/border/spacer.gif" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6510254975533710912?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6510254975533710912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6510254975533710912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6510254975533710912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6510254975533710912'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/pax-construct-061-released.html' title='Pax Construct 0.6.1 Released'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4832547860391589194</id><published>2007-11-09T10:22:00.000+08:00</published><updated>2007-11-09T10:34:23.542+08:00</updated><title type='text'>JayView Issue 14: OSGi - not just a four letter word</title><content type='html'>&lt;div style="text-align: justify;"&gt;The latest issue of the Jayway magazine, &lt;a href="http://www.jayway.se/jayview"&gt;JayView&lt;/a&gt;, is now out:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.jayway.se/download/18.22f90280115a3439d1a80001597/jayview14.pdf"&gt;JayView issue 14&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;it includes an article I wrote recently about OSGi - let me know what you think... (FYI, the cover shows the Petronas Towers, which are visible from the office where I work in Kuala Lumpur)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4832547860391589194?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4832547860391589194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4832547860391589194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4832547860391589194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4832547860391589194'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/jayview-issue-14-osgi-not-just-four.html' title='JayView Issue 14: OSGi - not just a four letter word'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7967459618612193922</id><published>2007-11-07T23:44:00.000+08:00</published><updated>2007-11-08T00:28:20.106+08:00</updated><title type='text'>Peaberry: injecting OSGi services using Guice</title><content type='html'>&lt;div style="text-align: justify;"&gt;Several months ago I blogged about Guice-OSGi, my OPS4J research project looking at using Guice to do dependency injection of OSGi services. Since then I've been distracted with other projects, moving house and our new cat (who almost managed to rewrite my DevCon submission when he took an keen interest in my MacBook, and then managed to disconnect the ADSL line - what a critic!)&lt;br /&gt;&lt;br /&gt;Anyway, it seems that to officially use OSGi in a project name it must be an adjective, which is why Spring-OSGi has transformed into: "Spring Dynamic Modules for OSGi(tm) Service Platforms". Rather than try to compete with an equally long title, I decided to resurrect a name I'd previously used for a demo project: "peaberry", which is a special type of coffee bean. (as my wife will tell you, I really like coffee...)&lt;br /&gt;&lt;br /&gt;So peaberry is the new Guice-OSGi, and is now hosted over at Google Code:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://code.google.com/p/peaberry"&gt;http://code.google.com/p/peaberry&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I decided to host the project there rather than at OPS4J because it makes it easier for people who know the Guice site to find their way to peaberry. BTW, if you're interested in helping out, let me know and I'll add you to the project team.&lt;br /&gt;&lt;br /&gt;I've just made the first download available:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://peaberry.googlecode.com/files/peaberry-0.1.jar"&gt;peaberry-0.1.jar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;which is an OSGi bundle of the latest trunk version of Guice with patches for issue 49 (binding factories) and issue 94 (classloader interception of generated classes) which are needed to use Guice in a reloadable container, such as OSGi. Hopefully these patches will eventually be folded back into the main Guice tree.&lt;br /&gt;&lt;br /&gt;The next step is to install a 'bridge' classloader (based on issue 94) to allow generated classes to see both the internal Guice code and external user classes without needing DynamicImport-Package:* in the peaberry bundle. After that I plan to migrate the Guice-OSGi annotation work over to peaberry (based on issue 49) and remove the need to extend a specific base class to bootstrap the service injection process.&lt;br /&gt;&lt;br /&gt;As mentioned in my last post, I've submitted a talk about my work on peaberry to the DevCon site, so if enough people are interested I may get the chance to explain all the cool features in person.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7967459618612193922?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7967459618612193922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7967459618612193922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7967459618612193922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7967459618612193922'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/peaberry-injecting-osgi-services-using.html' title='Peaberry: injecting OSGi services using Guice'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3039535757961350001</id><published>2007-11-06T23:41:00.000+08:00</published><updated>2007-11-06T23:52:35.755+08:00</updated><title type='text'>OSGi DevCon/EclipseCon 2008</title><content type='html'>Only a couple more weeks left to submit talks or tutorials for the next OSGi DevCon. I've submitted one tutorial and a talk so far:&lt;br /&gt;&lt;br /&gt;   &lt;a href="https://eclipsecon.greenmeetingsystems.com/submissions/view/59"&gt;An introduction to Pax tools for OSGi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;   &lt;a href="https://eclipsecon.greenmeetingsystems.com/submissions/view/60"&gt;OSGi service injection using Guice&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have you got an interesting story or project involving OSGi? If so then submit it soon - I don't want to be the only speaker :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3039535757961350001?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3039535757961350001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3039535757961350001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3039535757961350001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3039535757961350001'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/11/osgi-devconeclipsecon-2008.html' title='OSGi DevCon/EclipseCon 2008'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4434880775720529110</id><published>2007-10-19T03:07:00.000+08:00</published><updated>2007-10-19T03:29:37.728+08:00</updated><title type='text'>Migrate existing OSGi projects to the latest Pax-Construct</title><content type='html'>&lt;div style="text-align: justify;"&gt;I'm currently tinkering with a Maven mojo to help people migrate old Pax-Construct (0.1.x) and other OSGi projects to the new Pax-Construct layout. At the moment this mojo only captures the project layout and types of bundles (wrapper, compiled, imported, etc.) but will eventually include the actual bundle source, BND instructions, and other POM customization - like extra repositories.&lt;br /&gt;&lt;br /&gt;To try out the new mojo, either download the latest 0.2.1-SNAPSHOT &lt;a href="http://repository.ops4j.org/mvn-snapshots/org/ops4j/pax/construct/scripts/0.2.1-SNAPSHOT/scripts-0.2.1-20071018.173151-2.zip"&gt;scripts&lt;/a&gt; and use the &lt;i&gt;pax-validate&lt;/i&gt; command to pull down the latest maven-pax-plugin, or build from the latest sources.&lt;br /&gt;&lt;br /&gt;Then go to your OSGi project and call:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mvn org.ops4j:maven-pax-plugin:0.2.1-SNAPSHOT:clone&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;which should generate both UNIX and Windows build scripts under the target folder.&lt;br /&gt;&lt;br /&gt;Make sure the 0.2.1-SNAPSHOT Pax-Construct scripts are on your path, and cd to a temporary directory - you should then be able to call the generated build script, which will recreate the project structure using the latest Pax-Construct commands.&lt;br /&gt;&lt;br /&gt;For example:&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;cd ~/Code/ops4j/pax/radman ; mvn org.ops4j:maven-pax-plugin:0.2.1-SNAPSHOT:clone&lt;br /&gt;&lt;br /&gt;cd /tmp ; ~/Code/ops4j/pax/radman/target/pax-clone-radman&lt;/pre&gt;&lt;br /&gt;If you want to make sure there's only one main project, use the &lt;i&gt;-DunifyRoot&lt;/i&gt; Maven property to bring any disconnected (ie. parent-less) modules under the same root project.&lt;br /&gt;&lt;br /&gt;Feel free to try it out and feedback any issues / requests via the OPS4J JIRA site as usual - enjoy!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4434880775720529110?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4434880775720529110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4434880775720529110' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4434880775720529110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4434880775720529110'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/10/migrate-existing-osgi-projects-to.html' title='Migrate existing OSGi projects to the latest Pax-Construct'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-858331199826815992</id><published>2007-10-12T21:45:00.000+08:00</published><updated>2007-10-12T22:00:04.812+08:00</updated><title type='text'>Rapid OSGi development : Pax-Construct 2 goes GA</title><content type='html'>I've just made the new version of Pax-Construct generally available on the OPS4J repository:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.2.0-ga/scripts-0.2.0-ga.zip"&gt;http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.2.0-ga/scripts-0.2.0-ga.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;detailed documentation for the scripts and Maven2 plugins can be found on the following site:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ops4j.org/projects/pax/construct/index.html"&gt;http://www.ops4j.org/projects/pax/construct/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;including an example of using Pax-Construct to assemble and deploy Spring Dynamic Modules!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ops4j.org/projects/pax/construct/examples/spring-osgi.html"&gt;http://www.ops4j.org/projects/pax/construct/examples/spring-osgi.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Other noteworthy features:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;much simpler project layout - you can even create standalone bundle POMs&lt;/li&gt;&lt;li&gt;transitive wrapping of third-party jars and their dependencies&lt;/li&gt;&lt;li&gt;transitive importing of OSGi bundles and their bundle dependencies&lt;br /&gt;&lt;/li&gt;&lt;li&gt;new scripts to help move bundles around the project&lt;/li&gt;&lt;li&gt;supports the latest release of Pax-Runner!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I'm away in Penang for the next few days, but will be back soon to answer questions and provide many more examples. In the meantime, feel free to comment on the wiki, or raise issues on JIRA :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-858331199826815992?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/858331199826815992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=858331199826815992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/858331199826815992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/858331199826815992'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/10/rapid-osgi-development-pax-construct-2.html' title='Rapid OSGi development : Pax-Construct 2 goes GA'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2667037790590594302</id><published>2007-10-12T09:36:00.000+08:00</published><updated>2007-10-12T09:49:35.900+08:00</updated><title type='text'>Launching Spring Dynamic Modules using Pax-Runner</title><content type='html'>&lt;div style="text-align: justify;"&gt;My fellow OPS4J'r Alin Dreghiciu has produced a really cool screencast showing how you can quickly deploy Spring-OSGi M3 using his recently released version of Pax-Runner:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://wiki.ops4j.org/confluence/x/SwBN"&gt;http://wiki.ops4j.org/confluence/x/SwBN&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also read more about the ongoing Pax-Runner story at:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://wiki.ops4j.org/confluence/x/A4A6"&gt;http://wiki.ops4j.org/confluence/x/A4A6&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Support for the major OSGi frameworks, flexible configuration, directory and maven scanners - what more could you want? (if yes, please mention it on JIRA!)&lt;br /&gt;&lt;br /&gt;Alin's screencast is now linked from the Spring Dynamic Modules site:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.springframework.org/osgi"&gt;http://www.springframework.org/osgi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;well done Alin!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2667037790590594302?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2667037790590594302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2667037790590594302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2667037790590594302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2667037790590594302'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/10/launching-spring-dynamic-modules-using.html' title='Launching Spring Dynamic Modules using Pax-Runner'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2377326741120365278</id><published>2007-09-24T17:38:00.000+08:00</published><updated>2007-09-24T17:43:03.008+08:00</updated><title type='text'>documentation for the maven-inherit-plugin</title><content type='html'>I've uploaded some documentation for the maven-inherit-plugin in the usual format:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://www.ops4j.org/projects/pax/construct/maven-inherit-plugin"&gt;http://www.ops4j.org/projects/pax/construct/maven-inherit-plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and improved the code to use custom Javadoc tags to get the extended plugin details.&lt;br /&gt;&lt;br /&gt;For example:&lt;pre&gt;&lt;code&gt;&lt;br /&gt;  /**&lt;br /&gt;  * @extendsPlugin archetype&lt;br /&gt;  * @extendsGoal create&lt;br /&gt;  * @goal create-project&lt;br /&gt;  * @requiresProject false&lt;br /&gt;  */&lt;br /&gt;  public class OSGiProjectArchetypeMojo extends MavenArchetypeMojo&lt;br /&gt;  {&lt;br /&gt;    // if you override member fields, remember to propagate the values using reflection&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2377326741120365278?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2377326741120365278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2377326741120365278' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2377326741120365278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2377326741120365278'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/09/documentation-for-maven-inherit-plugin.html' title='documentation for the maven-inherit-plugin'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6168720763689878347</id><published>2007-09-18T06:26:00.000+08:00</published><updated>2007-09-26T15:58:23.456+08:00</updated><title type='text'>Simple Maven Plugin Inheritance</title><content type='html'>&lt;div style="text-align: justify;"&gt;Pax Construct extends a number of other maven mojos from the archetype, compiler and eclipse plugins. Extending maven mojos is a bit of a pain at the moment, because plexus (the component manager used by maven) relies on javadoc comments to generate the plugin XML. Unfortunately when the parent mojo is provided by an external project, the javadoc isn't available to plexus.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;At first I relied on duplicating parameters in the sub-mojo to trick plexus into creating the right plugin XML, then used reflection to forcibly update any private fields in the parent mojo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Maintaining these parameters was a bit of a nightmare, so I developed a new plugin called the maven-inherit-plugin to help with the plugin XML. It attempts to merge the various plugin XML fragments and warns about any potential field clashes that would require reflection.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To use it in your plugin pom, add the following XML:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;plugin&amp;gt;&lt;br /&gt;      &amp;lt;groupid&amp;gt;org.ops4j.pax.construct.ng&amp;lt;/groupid&amp;gt;&lt;br /&gt;      &amp;lt;artifactid&amp;gt;maven-inherit-plugin&amp;lt;/artifactid&amp;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;inherit&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;    &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;  &amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;    &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;ops4j-repository&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;http://repository.ops4j.org/maven2&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt;  &amp;lt;/pluginRepositories&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;It looks for dependencies of type "maven-plugin" and will merge the XML fragments describing their goals with any matching local goals that have the following syntax:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;    @extendsPlugin {plugin}&lt;br /&gt;    @goal {local-goal}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you want to rename a inherited goal, use this syntax:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    @extendsPlugin {plugin}&lt;br /&gt;    @extendsGoal {inherited-goal}&lt;br /&gt;    @goal {local-goal}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;For example, in Pax-Construct I extend the archetype goal into a number of sub-goals, such as:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;  /**&lt;br /&gt;  * @extendsPlugin archetype&lt;br /&gt;  * @extendsGoal create&lt;br /&gt;  * @goal create-project&lt;br /&gt;  * @requiresProject false&lt;br /&gt;  */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Overridden fields generate a warning at compile time and must be updated using reflection. See the main pax plugin for examples of using this technique to add behaviour to existing plugins.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Source code is available from:&lt;pre&gt;&lt;br /&gt;    &lt;a href="https://scm.ops4j.org/repos/ops4j/projects/pax/construct/maven-inherit-plugin"&gt;https://scm.ops4j.org/repos/ops4j/projects/pax/construct/maven-inherit-plugin&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(updated to show new javadoc tags)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6168720763689878347?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6168720763689878347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6168720763689878347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6168720763689878347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6168720763689878347'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/09/simple-maven-plugin-inheritance.html' title='Simple Maven Plugin Inheritance'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-1848484294475255182</id><published>2007-09-18T01:08:00.000+08:00</published><updated>2007-09-18T06:01:44.975+08:00</updated><title type='text'>Calling all testers! Pax Construct v2 beta1</title><content type='html'>&lt;div style="text-align: justify;"&gt;Well, we've finally completed the move to our new home and are slowly unpacking boxes "on-demand" :)&lt;br /&gt;&lt;br /&gt;Meanwhile, back at OPS4J I've finished a major refactoring of the Pax Construct plugin and slimmed down the archetypes to produce a much leaner project layout. The more adventurous of you might like to try out the beta version:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.2.0-beta1/scripts-0.2.0-beta1.zip"&gt;http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.2.0-beta1/scripts-0.2.0-beta1.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Be warned - the usual beta disclaimers apply! Especially since the only machine I have with Windows is still packed away, and so all testing so far has been on my macbook using Ubuntu (my main development environment). Also, the docs are woefully out of date - at this moment the code is the best documentation, but you can use -h with any of the scripts to get basic usage.&lt;br /&gt;&lt;br /&gt;Second warning: Pax Construct v2 is not compatible with projects created using older versions, but a script is being developed to migrate projects to the new layout. However you can use v2 to create and manage new projects.&lt;br /&gt;&lt;br /&gt;Some highlights of v2:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Transitive wrapping - you can choose to embed dependencies, or create further wrappers&lt;/li&gt;&lt;li&gt;Transitive import - provided dependencies of imported bundles are automatically added&lt;/li&gt;&lt;li&gt;Simple import management - the import list is maintained inside a single provision pom&lt;/li&gt;&lt;li&gt;Optional generation of Eclipse project files - use "mvn clean install -Peclipse"&lt;/li&gt;&lt;li&gt;Enhanced compilation - supports compiling against bundles with embedded jars&lt;/li&gt;&lt;li&gt;Refactoring support - bundles can be moved around, poms will be created as necessary&lt;/li&gt;&lt;li&gt;Improved maven mojos - can be used inside other poms to create projects for testing&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Here's a couple of wrapping examples, which should be done inside a project created with pax-create-project - the first creates a bundle with embedded dependencies (use "mvn clean install" to build it) the second replaces it with a series of bundles, one per dependency:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;blockquote&gt;pax-wrap-jar -g commons-logging -a commons-logging -v 1.1 -- -DembedTransitive&lt;br /&gt;&lt;br /&gt;pax-wrap-jar -g commons-logging -a commons-logging -v 1.1 -- -DwrapTransitive -Doverwrite&lt;br /&gt;&lt;/blockquote&gt;&lt;/div&gt;A more complex example involving Spring-OSGi can be downloaded here:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://wiki.ops4j.org/confluence/download/attachments/223/SPRING_OSGI_EXAMPLE"&gt;Spring-OSGi deployment script (unix)&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://wiki.ops4j.org/confluence/download/attachments/223/SPRING_OSGI_EXAMPLE.bat"&gt;Spring-OSGi deployment script (windows)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download the script for your OS, make sure the v2 scripts are in your path and run it - it should build and deploy a basic Spring-OSGi setup based on milestone 3, along with some wrappers and the weather sample. (note: it can take a few seconds to startup on Felix, the default framework)&lt;br /&gt;&lt;br /&gt;There's a lot of cool stuff behind the scenes, and I'm starting on proper documentation for it  this week. BTW, if you find any bugs with beta1 please raise them at &lt;a href="http://issues.ops4j.org/"&gt;http://issues.ops4j.org&lt;/a&gt; while I work on the docs :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-1848484294475255182?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/1848484294475255182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=1848484294475255182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/1848484294475255182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/1848484294475255182'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/09/calling-all-testers-pax-construct-v2.html' title='Calling all testers! Pax Construct v2 beta1'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6602311040591454151</id><published>2007-07-22T21:50:00.000+08:00</published><updated>2007-07-22T22:09:27.771+08:00</updated><title type='text'>Our new home</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Hayfa and I are now home-owners! Picked up the keys to our new condo apartment yesterday, and spent most of this weekend discussing paints, what should go where, etc. (we're both fairly easy-going so it takes us ages to decide anything!)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/mcculls/OurHome/photo?authkey=3EAHqdU0Bww#5089677794504650258"&gt;&lt;img src="http://lh3.google.com/mcculls/RqIq_OKkrhI/AAAAAAAAA24/aQA3LqGg0f8/s400/P7210029.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/mcculls/OurHome/photo?authkey=3EAHqdU0Bww#5089678352850399106"&gt;&lt;img src="http://lh5.google.com/mcculls/RqIrfuKkr4I/AAAAAAAAA5w/_0Yb31cfuy0/s400/P7210090.JPG" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6602311040591454151?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6602311040591454151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6602311040591454151' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6602311040591454151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6602311040591454151'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/07/our-new-home.html' title='Our new home'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4411713352236048979</id><published>2007-07-06T00:24:00.000+08:00</published><updated>2007-07-06T00:37:45.450+08:00</updated><title type='text'>Better dependency management with Pax Construct</title><content type='html'>Had some really useful discussions during the OSGi Community Event in Munich about wrapping complex artifacts such as Hibernate3. The next drop of Pax Construct will try to handle dependencies for you as much as possible (automatically embedding / wrapping / importing them as required) so with one command you can drag an artifact into your OSGi project without having to repeatedly deploy or compile to track down those annoying missing dependencies.&lt;br /&gt;&lt;br /&gt;Also planned: OBR support to search for artifacts based on your bundle's imports :)&lt;br /&gt;&lt;br /&gt;As ever, let me know via JIRA or email if there's anything that would make OSGi development that little bit easier!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4411713352236048979?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4411713352236048979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4411713352236048979' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4411713352236048979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4411713352236048979'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/07/better-dependency-management-with-pax.html' title='Better dependency management with Pax Construct'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4343116974081912145</id><published>2007-07-03T04:28:00.000+08:00</published><updated>2007-07-03T04:35:04.745+08:00</updated><title type='text'>OSGi Alliance Community Event talks now online</title><content type='html'>My talk from the 2007 OSGi Alliance Community Event is now online:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.osgi.org/wiki/uploads/Conference/OSGiCommunity-McCulloch.pdf"&gt;http://www2.osgi.org/wiki/uploads/Conference/OSGiCommunity-McCulloch.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;along with slides from all the other talks - well worth perusing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.osgi.org/Conference/2007CommunityEvent"&gt;http://www2.osgi.org/Conference/2007CommunityEvent&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4343116974081912145?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4343116974081912145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4343116974081912145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4343116974081912145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4343116974081912145'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/07/osgi-alliance-community-event-talks-now.html' title='OSGi Alliance Community Event talks now online'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4492580546255253077</id><published>2007-06-23T16:09:00.000+08:00</published><updated>2007-06-23T16:19:25.637+08:00</updated><title type='text'>Guice-OSGi 0.1.0 released</title><content type='html'>FYI, I've just made an initial drop of my Guice-OSGi laboratory project:&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://wiki.ops4j.org/confluence/display/ops4j/Guice-OSGi"&gt;http://wiki.ops4j.org/confluence/display/ops4j/Guice-OSGi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://repository.ops4j.org/maven2-laboratory/org/ops4j/guice-osgi/org.ops4j.guice-osgi.core/0.1.0/org.ops4j.guice-osgi.core-0.1.0.jar"&gt;org.ops4j.guice-osgi.core-0.1.0.jar&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://repository.ops4j.org/maven2-laboratory/org/ops4j/guice-osgi/org.ops4j.guice-osgi.core/0.1.0/org.ops4j.guice-osgi.core-0.1.0-javadoc.jar"&gt;org.ops4j.guice-osgi.core-0.1.0-javadoc.jar&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://repository.ops4j.org/maven2-laboratory/org/ops4j/guice-osgi/org.ops4j.guice-osgi.core/0.1.0/org.ops4j.guice-osgi.core-0.1.0-sources.jar"&gt;org.ops4j.guice-osgi.core-0.1.0-sources.jar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;which lets you use Guice to access / register OSGi services - for example:&lt;br /&gt;&lt;br /&gt;    @Inject&lt;br /&gt;    @OSGiServiceRegistration&lt;br /&gt;    ExampleService exported;&lt;br /&gt;&lt;br /&gt;would register the object injected into 'exported' as an OSGi service, and:&lt;br /&gt;&lt;br /&gt;    @Inject&lt;br /&gt;    @OSGiService&lt;br /&gt;    ExampleService imported;&lt;br /&gt;&lt;br /&gt;would inject a proxy into 'imported' which delegates to the OSGi service.&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://wiki.ops4j.org/confluence/download/attachments/2981915/guice-osgi-example.zip?version=1"&gt;example&lt;/a&gt; (use 'mvn clean install pax:provision' to try it out)&lt;br /&gt;&lt;br /&gt;It's capable of lots more (custom LDAP filters, injected listeners, etc.) but I have a flight to catch in a few hours and need to finish my packing :) The integration tests checked into subversion contain more examples.&lt;br /&gt;&lt;br /&gt;It doesn't do everything Spring-OSGi does, but then again it is only one bundle of ~500k ;)&lt;br /&gt;&lt;br /&gt;(PS. I've also released 0.1.6 of the Pax Construct tools - busy week!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4492580546255253077?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4492580546255253077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4492580546255253077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4492580546255253077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4492580546255253077'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/06/guice-osgi-010-released.html' title='Guice-OSGi 0.1.0 released'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6458716881058077739</id><published>2007-06-12T20:57:00.000+08:00</published><updated>2007-06-12T21:33:39.332+08:00</updated><title type='text'>The dreaded disk0s2: 0xe0030005 (UNDEFINED)</title><content type='html'>I've had my macbook for nearly five months and use it as my primary dev box. Last month I took it with me to Sweden to run some OSGi tutorials - before the very first session I calmly closed the lid, wandered over to the conference room and opened it up to see... nothing!&lt;br /&gt;&lt;br /&gt;People were already wandering in so decided to do a quick reboot - but instead of the reassuring apple logo I now saw a flashing question mark folder (gulp). Luckily the tutorial was available on the intranet (FYI, it's based on Pax Construct) so I was able to grab a spare laptop and continue.&lt;br /&gt;&lt;br /&gt;Anyway after the tutorial session I absentmindedly turned on my macbook, which now started ok!&lt;br /&gt;&lt;br /&gt;So is this a new mac feature, auto-repair? Sadly not... since then its behaviour has been erratic - occasional beach-balls, looking like the system had frozen only to return after a few minutes. Tried turning off spotlight indexing (nice performance boost) which helped for a bit but the problem returned. Tried a full archive, erase and re-install with minimum setup which I thought had nailed it, but this weekend my macbook went totally rosak :(&lt;br /&gt;&lt;br /&gt;No hard disk, nothing... nowhere to reinstall MacOSX, no chance of recovering data - thankfully I still had the full image backup from a few days ago (plus most of my work is online these days).&lt;br /&gt;&lt;br /&gt;So my macbook is now at the local Apple support centre and I'm back to using my trusty Linux box that I built from scratch (and ironically contains a still-working HDD I rescued from an ancient Dell laptop and now use for temporary storage).&lt;br /&gt;&lt;br /&gt;So here's the MOTD... if you see any errors like the following in your system log:&lt;br /&gt;&lt;br /&gt;    disk0s2: 0xe0030005 (UNDEFINED)&lt;br /&gt;&lt;br /&gt;make sure you have any critical data backed up and get your macbook checked out asap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6458716881058077739?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6458716881058077739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6458716881058077739' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6458716881058077739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6458716881058077739'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/06/dreaded-disk0s2-0xe0030005-undefined.html' title='The dreaded disk0s2: 0xe0030005 (UNDEFINED)'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3770368343726865193</id><published>2007-05-23T16:24:00.000+08:00</published><updated>2007-05-23T16:26:36.393+08:00</updated><title type='text'>Pax Construct 0.1.5</title><content type='html'>Hi folks,&lt;br /&gt;&lt;br /&gt;By popular demand I've released &lt;a href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+Construct"&gt;Pax Construct 0.1.5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.1.5/scripts-0.1.5.zip"&gt;http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.1.5/scripts-0.1.5.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This release has the following improvements:&lt;br /&gt;&lt;br /&gt;  * simpler project layout&lt;br /&gt;  * support for adding repositories, removing bundles, embedding jars&lt;br /&gt;     inside bundles, and using bundles (ie. inter-bundle dependencies)&lt;br /&gt;  * better error checking and recovery&lt;br /&gt;&lt;br /&gt;that makes it a lot easier to construct more complex OSGi projects.&lt;br /&gt;&lt;br /&gt;Remaining issues have been pushed to 0.1.6, which is targeted for&lt;br /&gt;mid-to-late June, and will include the project snapshot feature along&lt;br /&gt;with (hopefully!) more documentation and samples.&lt;br /&gt;&lt;br /&gt;Please let me know if you have any problems using this new release.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Cheers, Stuart&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3770368343726865193?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3770368343726865193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3770368343726865193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3770368343726865193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3770368343726865193'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/05/pax-construct-015.html' title='Pax Construct 0.1.5'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7714883556750542937</id><published>2007-05-23T11:29:00.000+08:00</published><updated>2007-05-23T11:36:48.684+08:00</updated><title type='text'>Giving a talk at the OSGi Alliance Community Event</title><content type='html'>Just found out that my talk on using Maven to build OSGi projects has been accepted for the "short talks" section of the &lt;a href="http://osgi.org/news_events/2007_06_communities/agenda.asp"&gt;OSGi Alliance Community Event&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;So, now there's even more reason to attend the event - if only to ask difficult questions / heckle ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.osgi.org/news_events/2007_06_communities/overview.asp"&gt;&lt;img src="http://www.osgi.org/images/event_images/osgi_communities2.gif" alt="OSGi Alliance Community Event, June 26th-27th Munich, Germany"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7714883556750542937?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7714883556750542937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7714883556750542937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7714883556750542937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7714883556750542937'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/05/giving-talk-at-osgi-alliance-community.html' title='Giving a talk at the OSGi Alliance Community Event'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-5969619453447807665</id><published>2007-05-09T17:13:00.001+08:00</published><updated>2007-05-09T18:22:30.780+08:00</updated><title type='text'>Convert local Maven repository into remote mirror</title><content type='html'>Almost finished my round of OSGi tutorials in Malmo, Sweden. It's been a busy time, last weekend I had two sessions back to back from 0830 to 1900! Things are a bit quieter now, so I'm going to spend time on the 0.1.5 release of Pax Construct, improving it based on feedback from the tutorials. I'm also going to add a command to create a template of a bundle that embeds a jarfile, which should make various people happy.&lt;br /&gt;&lt;br /&gt;Anyway, on to the real topic of this post - in creating the tutorial I wrote a couple of useful scripts which let you convert your local Maven repository into a remote repository, by fixing up the necessary maven metadata and adding SHA-1 digests. You can grab the scripts from my OPS4J page at &lt;a href="http://wiki.ops4j.org/confluence/display/~mcculls/%21sh"&gt;http://wiki.ops4j.org/confluence/display/~mcculls/%21sh&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I used these scripts to create an offline repository for the tutorial - by just cleaning out my local repo, running through all the exercises, copying the local repo to another location and running the scripts to add the missing metadata (see example on the !sh page). I also provided a modified settings.xml file which added mirror repos relative to the maven installation (such as file:${M2_HOME}/../../artifacts) for all the main repo ids.&lt;br /&gt;&lt;br /&gt;This mean people could work the tutorial offline, and also meant that even when online the network wasn't hammered by everyone downloading exactly the same set of artifacts... the only downside is the extra work keeping the mirror up-to-date.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-5969619453447807665?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/5969619453447807665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=5969619453447807665' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/5969619453447807665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/5969619453447807665'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/05/convert-local-maven-repository-into.html' title='Convert local Maven repository into remote mirror'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-4679887227854776602</id><published>2007-04-26T13:00:00.000+08:00</published><updated>2007-04-26T13:16:05.580+08:00</updated><title type='text'>Guice and OSGi</title><content type='html'>I recently wrote a patch for &lt;a href="http://code.google.com/p/google-guice"&gt;Guice&lt;/a&gt;, which adds OSGi metadata to the jarfile and fixes some classloader issues when running on OSGi. Just apply this &lt;a href="http://code.google.com/p/google-guice/issues/detail?id=94#c2"&gt;patch&lt;/a&gt; to the current Guice &lt;a href="http://google-guice.googlecode.com/svn/trunk"&gt;trunk&lt;/a&gt; (and copy the attached bnd-0.0.130.jar to the lib/build folder) and do "ant clean dist".&lt;br /&gt;&lt;br /&gt;You can now take the Guice jar from build/dist and use it in any OSGi framework - there's an example over at OPS4J:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://scm.ops4j.org/repos/ops4j/laboratory/users/stuart/peaberry"&gt;https://scm.ops4j.org/repos/ops4j/laboratory/users/stuart/peaberry&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;( btw, peaberry is a simple entity framework to test Guice and AOP on OSGi ... it only provides partial entity bean support, hence the name: &lt;a href="http://en.wikipedia.org/wiki/Peaberry"&gt;Peaberry&lt;/a&gt; ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-4679887227854776602?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/4679887227854776602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=4679887227854776602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4679887227854776602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/4679887227854776602'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/04/guice-and-osgi.html' title='Guice and OSGi'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-715346590462595101</id><published>2007-04-24T22:09:00.000+08:00</published><updated>2007-04-24T22:17:30.019+08:00</updated><title type='text'>OSGi Alliance Community Event</title><content type='html'>&lt;a href="http://www.osgi.org/news_events/2007_06_communities/overview.asp"&gt;&lt;img src="http://www.osgi.org/images/event_images/osgi_communities2.gif" alt="OSGi Alliance Community Event, June 26th-27th Munich, Germany"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Should be interesting - I'm thinking of going, as I'll be in Europe for June/July.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-715346590462595101?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/715346590462595101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=715346590462595101' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/715346590462595101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/715346590462595101'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/04/osgi-alliance-community-event.html' title='OSGi Alliance Community Event'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2571033590507177941</id><published>2007-04-23T02:45:00.000+08:00</published><updated>2007-04-23T03:01:21.789+08:00</updated><title type='text'>Quick OSGi projects using Maven archetypes</title><content type='html'>Have you ever wanted to try OSGi, but found setting up the build and working out the manifest too much of a chore?&lt;br /&gt;&lt;br /&gt;If so then help is at hand - over the last few months, I have been developing a set of Maven archetypes and plugins to automate much of the manual work required in creating an OSGi project. Recently I also provided Windows batch files and Linux shell &lt;A href="http://repository.ops4j.org/maven2/org/ops4j/pax/construct/scripts/0.1.4/scripts-0.1.4.zip"&gt;scripts&lt;/A&gt; to make it even easier:&lt;br /&gt;&lt;br /&gt;    &lt;A href="http://wiki.ops4j.org/confluence/display/ops4j/Pax+Construct"&gt;http://wiki.ops4j.org/confluence/display/ops4j/Pax+Construct&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;All you need is Maven2 and a Java5 runtime - the best part is the OSGi manifest attributes are automatically calculated for you by Peter Krien's wonderful &lt;A href="http://www.aqute.biz/Code/Bnd"&gt;bnd&lt;/A&gt; tool, connected to Maven by the &lt;A href="http://cwiki.apache.org/FELIX/bundle-plugin-for-maven-bnd.html"&gt;maven-bundle-plugin&lt;/A&gt; from the Apache Felix project.&lt;br /&gt;&lt;br /&gt;For example, the following commands would create a simple skeleton OSGi web application ... and deploy it to Equinox:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    pax-create-project -g simple.project -a osgi-web-app&lt;br /&gt;&lt;br /&gt;    cd osgi-web-app&lt;br /&gt;&lt;br /&gt;    mvn install&lt;br /&gt;&lt;br /&gt;    pax-wrap-jar -g javax.servlet -a servlet-api -v 2.5&lt;br /&gt;    pax-import-bundle -g org.ops4j.pax.logging -a api -v 0.9.4&lt;br /&gt;    pax-import-bundle -g org.ops4j.pax.logging -a jcl -v 0.9.4&lt;br /&gt;    pax-import-bundle -g org.ops4j.pax.logging -a slf4j -v 0.9.4&lt;br /&gt;    pax-import-bundle -g org.ungoverned.osgi.bundle -a http -v 1.1.2&lt;br /&gt;    pax-create-bundle -p my.osgi.code.myBundle -n myBundle&lt;br /&gt;&lt;br /&gt;    mvn install pax:provision&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;all you need to add is the internal application code ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2571033590507177941?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2571033590507177941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2571033590507177941' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2571033590507177941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2571033590507177941'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/04/quick-osgi-projects-using-maven.html' title='Quick OSGi projects using Maven archetypes'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-1530999967539325842</id><published>2007-02-27T18:19:00.000+08:00</published><updated>2007-02-27T18:28:35.482+08:00</updated><title type='text'>Bali 2007</title><content type='html'>&lt;div style="text-align:center;width:194px;font-family:arial,sans-serif;font-size:83%"&gt;&lt;div style="height:194px;background:url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left"&gt;&lt;a href="http://picasaweb.google.com/mcculls/Bali2007?authkey=bZcdp7W1UB0"&gt;&lt;img src="http://lh5.google.com/image/mcculls/ReBXXt_bA-E/AAAAAAAAA1g/_rg7wR8111g/s160-c/Bali2007.jpg" width="160" height="160" style="border:none;padding:0px;margin-top:16px;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Photos of our recent trip to Bali - we set off on Valentine's day (along with Hayfa's parents) to Jimbaran in the south of Bali, and spent most of our trip enjoying the culture and scenery around Ubud. Had a really good time - many thanks to Pak Gusti for showing us round!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-1530999967539325842?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/1530999967539325842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=1530999967539325842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/1530999967539325842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/1530999967539325842'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/02/bali-2007.html' title='Bali 2007'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7493605412764715391</id><published>2007-02-10T18:31:00.000+08:00</published><updated>2007-02-10T19:05:18.662+08:00</updated><title type='text'>My new macbook</title><content type='html'>I've always wanted to try out a mac, and the recent batch of Intel Core 2 Duo macbooks really caught my eye. However, I managed to resist the temptation last year ... as my wife Hayfa kept reminding me, we didn't need more computers cluttering up the house (we already have a dell laptop and an AMD64 desktop that I built in the UK).&lt;br /&gt;&lt;br /&gt;Anyway, recently I moved to a new job (working on OSGi stuff) and this triggered a new bout of window ...err... mac-browsing. I'd been looking at the 2GHz mid-range model, but it wasn't in stock in KL. Then one weekend when Hayfa was in Penang (funny how I buy these things when my sayang isn't around) I saw an advert for MacCity in Cineleisure - RM3999 for the basic model for the first 10 customers between 3 and 5pm, a saving of RM400!&lt;br /&gt;&lt;br /&gt;So I drove to Cineleisure, parked, wandered over to the store just before 3pm, mulled things over a bit, decided to queue and got the next-to-last one!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;width:194px;font-family:arial,sans-serif;font-size:83%"&gt;&lt;div style="height:194px;background:url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left"&gt;&lt;a href="http://picasaweb.google.com/mcculls/MyNewMacbook"&gt;&lt;img src="http://lh5.google.com/image/mcculls/Rc2dhx_5Z1E/AAAAAAAAAqI/g4DaVjxc51I/s160-c/MyNewMacbook.jpg" width="160" height="160" style="border:none;padding:0px;margin-top:16px;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I'm very happy with my macbook - didn't take long to get used to the single mouse button (even starts to make sense!) and the mac command key. Even happier once I got fink and iTerm installed - in fact, it's now replaced my development machine at work!&lt;br /&gt;&lt;br /&gt;Hayfa was pleased with my purchase in the end, because we don't have to fight over using the dell while we sit on the coach ... and it didn't take long (I think under an hour) for her to 'persuade' me to add a login for her on the macbook :)&lt;br /&gt;&lt;br /&gt;So... if anyone wants a dell, let me know ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7493605412764715391?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7493605412764715391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7493605412764715391' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7493605412764715391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7493605412764715391'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/02/my-new-macbook.html' title='My new macbook'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7255463448573222255</id><published>2007-02-10T17:44:00.000+08:00</published><updated>2007-02-09T17:15:46.358+08:00</updated><title type='text'>Spring Flowers</title><content type='html'>&lt;div style="text-align:center;width:194px;font-family:arial,sans-serif;font-size:83%"&gt;&lt;div style="height:194px;background:url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left"&gt;&lt;a href="http://picasaweb.google.com/mcculls/SpringFlowers"&gt;&lt;img src="http://lh3.google.com/image/mcculls/Rc2TpR_5ZxE/AAAAAAAAAn4/T_pnIt5vl9U/s160-c/SpringFlowers.jpg" width="160" height="160" style="border:none;padding:0px;margin-top:16px;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;A bargain at only RM16 from IKEA :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7255463448573222255?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7255463448573222255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7255463448573222255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7255463448573222255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7255463448573222255'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/02/spring-flowers.html' title='Spring Flowers'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-2546033374287241145</id><published>2007-02-09T17:07:00.000+08:00</published><updated>2007-02-09T17:15:08.958+08:00</updated><title type='text'>I miss snow</title><content type='html'>My parents just sent me this photo of the view from their house, brrrr...&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_t4x9nreNn1c/Rcw6eB_5ZwI/AAAAAAAAAnU/C5f-yXjGGIM/s1600-h/Snow_070208.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_t4x9nreNn1c/Rcw6eB_5ZwI/AAAAAAAAAnU/C5f-yXjGGIM/s320/Snow_070208.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5029459171472926466" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-2546033374287241145?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/2546033374287241145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=2546033374287241145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2546033374287241145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/2546033374287241145'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2007/02/i-miss-snow.html' title='I miss snow'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_t4x9nreNn1c/Rcw6eB_5ZwI/AAAAAAAAAnU/C5f-yXjGGIM/s72-c/Snow_070208.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-9222249163733605704</id><published>2006-11-27T10:56:00.000+08:00</published><updated>2006-12-08T23:00:14.950+08:00</updated><title type='text'>Finally ... photos from our trip to Indonesia!</title><content type='html'>&lt;div style="text-align: justify;"&gt;After promising and promising to upload the photos from our recent trip to Indonesia, my wife and I sat down this weekend and went through labelling and selecting images - here is the result of our efforts, enjoy!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align:center;width:194px;font-family:arial,sans-serif;font-size:83%"&gt;&lt;div style="height:194px;background:url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left"&gt;&lt;a href="http://picasaweb.google.com/mcculls/Indonesia2006?authkey=pJt1Rh5F1Z0"&gt;&lt;img src="http://lh4.google.com/image/mcculls/RVVOufsuABE/AAAAAAAAAmY/VehsFKNbvjs/s160-c/Indonesia2006.jpg" width="160" height="160" style="border:none;padding:0px;margin-top:16px;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://picasaweb.google.com/mcculls/Indonesia2006?authkey=pJt1Rh5F1Z0"&gt;&lt;div style="color:#4D4D4D;font-weight:bold;text-decoration:none;"&gt;Indonesia 2006&lt;/div&gt;&lt;/a&gt;&lt;div style="color:#808080"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-9222249163733605704?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/9222249163733605704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=9222249163733605704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/9222249163733605704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/9222249163733605704'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/11/finally-photos-from-our-trip-to.html' title='Finally ... photos from our trip to Indonesia!'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-7730043090578954192</id><published>2006-11-13T14:09:00.000+08:00</published><updated>2006-11-13T14:18:30.065+08:00</updated><title type='text'>Sun open sources Java under GPLv2</title><content type='html'>&lt;div style="text-align: justify;"&gt;Amazing news ... Sun is going to release Java under the GPL! InfoQ has the full scoop at &lt;a href="http://www.infoq.com/news/2006/11/open-source-java"&gt;http://www.infoq.com/news/2006/11/open-source-java&lt;/a&gt; along with some interesting observations on whether classes extending a GPL'd java.lang.Object are a derivative work (thankfully they aren't - phew).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-7730043090578954192?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/7730043090578954192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=7730043090578954192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7730043090578954192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/7730043090578954192'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/11/sun-open-sources-java-under-gplv2.html' title='Sun open sources Java under GPLv2'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-8739795609024913045</id><published>2006-11-06T11:12:00.000+08:00</published><updated>2006-11-06T11:40:55.785+08:00</updated><title type='text'>Selamat Hari Raya Idul Fitri 1427 H, Mohon Maaf Lahir Batin</title><content type='html'>&lt;div style="text-align: justify;"&gt;Back from visiting Indonesia for Raya - we went to Padang and Bukittinggi in West Sumatra, where my mother-in-law's family live. My wife's lineage is &lt;a href="http://en.wikipedia.org/wiki/Minangkabau"&gt;Minangkabau&lt;/a&gt;, which is matrilineal, so when we have kids they'll also be Minang - how cool is that! Everyone was very friendly and interested to meet the new 'Inggeris' addition to the family. I learnt so many words in two weeks - much more than in Malaysia, mainly because not many people spoke english over there (older people can understand some dutch/german, as it used to be a dutch colony).&lt;br /&gt;&lt;br /&gt;Food was fantastic, but oh-so-more spicy than I'm used to in KL. We had rice at every meal, even breakfast, along with various dishes like Rendang, Dendeng (like beef jerky with hot chili) and Cincang. We even managed to bring back some smoked eels, which smell horrible but taste great.&lt;br /&gt;&lt;br /&gt;More to come later... hopefully with some photos!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-8739795609024913045?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/8739795609024913045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=8739795609024913045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/8739795609024913045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/8739795609024913045'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/11/selamat-hari-raya-idul-fitri-1427-h.html' title='Selamat Hari Raya Idul Fitri 1427 H, Mohon Maaf Lahir Batin'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-3337454608836875133</id><published>2006-10-18T10:57:00.000+08:00</published><updated>2006-11-15T16:06:17.981+08:00</updated><title type='text'>Google Sitemap for Blogger Beta (was solved, now broken)</title><content type='html'>&lt;div style="text-align: justify;"&gt;I've been trying to submit my Blogger site to Google for a few days now, and was stuck at the 'Add Sitemap' stage. I couldn't publish my own sitemap directly to the root folder because it's hosted on blogspot, so I was hoping to use the feed URL:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://mcculls.blogspot.com/atom.xml&lt;br /&gt;&lt;br /&gt;Unfortunately, the beta version of Blogger uses a newer version of the Atom format which Google Sitemap doesn't like. Thankfully there is a simple &lt;a href="http://www.bloggertalk.net/ftopict-154.html"&gt;solution&lt;/a&gt; which I found while searching Google groups ... just use the RSS feed instead:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight: bold;"&gt;http://mcculls.blogspot.com/rss.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;it's as simple as that :)&lt;br /&gt;&lt;br /&gt;... at least it was until Blogger Beta changed over to the REST style feeds at /feeds/blogid/posts/default. The RSS version is available by using the ?alt=rss parameter (/feeds/blogid/posts/default?alt=rss) but for some reason the top-level rss.xml file redirects to the atom format!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-3337454608836875133?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/3337454608836875133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=3337454608836875133' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3337454608836875133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/3337454608836875133'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/10/google-sitemap-for-beta-blogger-sites.html' title='Google Sitemap for Blogger Beta (was solved, now broken)'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-479451253163603803</id><published>2006-10-15T00:24:00.000+08:00</published><updated>2006-10-15T00:45:45.551+08:00</updated><title type='text'>Footy Futsal</title><content type='html'>&lt;div style="text-align: justify;"&gt;Just got back from Footy Futsal in Taman Megah - lots of fun and exercise as usual, but have to play in the evenings at the moment as it's fasting month. My wife and I had gone to Mid Valley earlier on in the day to recycle the mountain of paper and plastic that we'd accumulated over the last few months (including far too many Dunkin' Donut boxes!).&lt;br /&gt;&lt;br /&gt;After breaking fast with kurma (dates) we prayed Maghrib while the Surau was relatively quiet. Most people were waiting to break fast in the various restaurants - it was weird seeing row on row of tables with steaming hot food, with everyone checking the time on their mobiles.&lt;br /&gt;&lt;br /&gt;We had hoped to eat in Chili's, but by the time we got there the waiting time was 1.5 hours! Our original plan was scuppered by their no reservation policy :(  Oh well, we managed to get seats at a nice italian instead, and had plenty of time to let the food settle before the futsal.&lt;br /&gt;&lt;br /&gt;Time to finish this post, so we can read a bit of the Qu'ran before going to bed ... have a religious class tomorrow at Al-Khadeem led by Ustaz Hussein Yee, who gives very thoughtful sermons.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-479451253163603803?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/479451253163603803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=479451253163603803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/479451253163603803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/479451253163603803'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/10/footy-futsal.html' title='Footy Futsal'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-9075541752341510906</id><published>2006-10-14T13:58:00.000+08:00</published><updated>2006-10-15T00:24:07.420+08:00</updated><title type='text'>Task orientated Java development</title><content type='html'>&lt;div style="text-align: justify;"&gt;Yesterday I stumbled upon a neat Eclipse plugin called &lt;a href="http://www.infoq.com/news/mylar"&gt;Mylar&lt;/a&gt; which helps you manage tasks: for example you're working on a new module, but suddenly need to track down and fix a bug in another part of the project. With Mylar you can jump into the new task, safe in the knowledge that your previous GUI context (ie. open files, layout etc.) is stored under the old task. If you find the bug belongs to another developer, you can even share the relevant context to save time.&lt;br /&gt;&lt;br /&gt;It also keeps track of how long you spend on each task, which will keep micro-managers happy :)&lt;br /&gt;&lt;br /&gt;The site I was surfing when I saw Mylar is called &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt;, and so far it's been a really good source of the latest news and innovations in the Java/Enterprise world. It also has one of the best Web2 interfaces I've seen this year where the videos sync with the slides - understated, but helpful.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-9075541752341510906?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/9075541752341510906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=9075541752341510906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/9075541752341510906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/9075541752341510906'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/10/task-orientated-java-development.html' title='Task orientated Java development'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1865737548201411060.post-6216111524304474085</id><published>2006-10-14T13:13:00.000+08:00</published><updated>2006-10-15T00:48:59.394+08:00</updated><title type='text'>ssshh... Pisang Quiet</title><content type='html'>&lt;div style="text-align: justify;"&gt;After several months of playing around with blogger settings, and somehow never having the time to write down my thoughts (or write up, depending which hemisphere you're in) I finally got bored of choosing a colour scheme and decided to start posting.&lt;br /&gt;&lt;br /&gt;So... 'pisang quiet' ('peace and quiet' for those of you who enjoy malay+english puns, 'quiet banana' for those of you who like bananas) is my new blog, after my last &lt;a href="http://mcculls2005.blogspot.com/"&gt;one&lt;/a&gt; reached the heady heights of 11 posts. There have been a lot of changes since then - I'm now married to Hayfa, and we're living together in KL.&lt;br /&gt;&lt;br /&gt;Married life is really good - my isteri and I went to Terengganu for our honeymoon and tried snorkelling for the first time: I normally keep to my depth when swimming, but my wife helped me overcome my nerves and explore further out at sea (the life jacket helped too!). It was so cool seeing herds of fish sweep majestically across... sorry, wrong &lt;a href="http://www.fawltysite.net/episode07.htm"&gt;vacation&lt;/a&gt;. Seriously though, the trip to Redang Lang Tengah was amazing - soft white sand, clear seas with brightly coloured fish, and my sayang at my side :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1865737548201411060-6216111524304474085?l=mcculls.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcculls.blogspot.com/feeds/6216111524304474085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1865737548201411060&amp;postID=6216111524304474085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6216111524304474085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1865737548201411060/posts/default/6216111524304474085'/><link rel='alternate' type='text/html' href='http://mcculls.blogspot.com/2006/10/pisang-quiet.html' title='ssshh... Pisang Quiet'/><author><name>mcculls</name><uri>http://www.blogger.com/profile/04261077211575061061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/6985/1032/1600/mcculls.jpg'/></author><thr:total>0</thr:total></entry></feed>
