<?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-11616517</id><updated>2011-10-28T16:59:50.617+02:00</updated><category term='AgilePartner'/><category term='Social'/><category term='ExtJS Javascript UI AgilePartner'/><category term='Events'/><category term='Javascript'/><title type='text'>Zepag's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.zepag.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11616517.post-6904853702243256304</id><published>2011-06-26T10:18:00.002+02:00</published><updated>2011-06-26T10:21:15.803+02:00</updated><title type='text'>Status of OSGi</title><content type='html'>OSGi bashing seems to be a widely appreciated sport these days.&lt;br /&gt;The worrying part is where it comes from.&lt;br /&gt;&lt;br /&gt;As a disclaimer, I'd like to state that I quite love OSGi, because it provides &lt;a href="http://osgithoughts.blogspot.com/2011/05/java-se-8-modularity-requirements.html"&gt;dynamic modularity, lifecycle and many other things Java SE is lacking&lt;/a&gt;, and something the upcoming Java SE 8 modularity is not likely to provide. Besides that, it's available now and has been for a while!&lt;br /&gt;&lt;br /&gt;This being said, OSGi is currently widely-used (at least this is where I see it used, not an exhaustive report):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;in the embedded world (where it comes from)&lt;/li&gt;&lt;li&gt;in Software vendors products&lt;/li&gt;&lt;li&gt;in the core of IDEs or tools (mostly Eclipse of course) and application servers&lt;/li&gt;&lt;li&gt;Eclipse RCP rich clients&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;OSGi coming from the embedded world, the enterprise software scope has only been very recently integrated. &lt;br /&gt;Even though tooling is getting better with time (&lt;a href="http://www.aqute.biz/Bnd/Bnd"&gt;Bnd&lt;/a&gt;, &lt;a href="http://www.springsource.org/bundlor"&gt;Bundlor&lt;/a&gt;, &lt;a href="http://ops4j1.jira.com/wiki/display/paxrunner/Pax+Runner"&gt;Pax&lt;/a&gt; and many more...), frameworks are easing development a lot (&lt;a href="http://www.springsource.org/osgi"&gt;Spring dM&lt;/a&gt;, &lt;a href="http://felix.apache.org/site/apache-felix-ipojo.html"&gt;iPOJO&lt;/a&gt;...etc), and many companies are providing quality solutions and investing in it, OSGi doesn't seem to gain a lot of interest in mainstream development. Let me rephrase this explicitly: OSGi doesn't seem to gain the interest it really diserves.&lt;br /&gt;&lt;br /&gt;The main problem is context. When development is shifting towards more deployment flexibility, the &lt;b&gt;rigor&lt;/b&gt; of OSGi in this domain is both a &lt;b&gt;bliss&lt;/b&gt; and a &lt;b&gt;curse&lt;/b&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a bliss as it makes things really manageable at any scale.&lt;/li&gt;&lt;li&gt;a curse because of the difficulty for newcomers to easily integrate the dependency mechanisms and more important the difficulty to grasp/solve dependency issues.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This last point is quite important, as it is what has made people rant about Maven (and this still goes on) since its inception.&lt;br /&gt;&lt;br /&gt;Easing dependency management is already difficult statically, so doing it dynamically is even harder. OSGi is REALLY doing a great job in this domain.&lt;br /&gt;&lt;br /&gt;The main issue is that average enterprise developers, not the very clever ones hired e.g. by Oracle for the Glassfish team or by Spring for Eclipse Virgo (shameless plug there, I know or have met with people from these teams ;) ), don't want to deal with dynamic dependencies. Just as they don't want to deal with multicore development. Average enterprise developers want this to be hidden from them. This can be seen in each and every specification of JavaEE which seems recently to focus mostly on ease of development, sometimes leaving out ease of operations and flexibility. Enterprise developers don't want to know about multithreading or dynamic modularity. &lt;br /&gt;&lt;br /&gt;Don't get me wrong, I think it's a shame. And once again I think OSGi is one of the best solutions for dynamic modularity.&lt;br /&gt;&lt;br /&gt;Still when companies which embraced OSGi and invested a lot in it back out, things don't look very good.Mulesoft's founder Ross Mason &lt;a href="http://blogs.mulesoft.org/osgi-no-thanks/"&gt;started&lt;/a&gt; this a while ago after being disappointed by OSGi as a component model for Mule ESB. The Glassfish team embraced it, but only by hiding it behind the custom &lt;a href="http://java.net/projects/hk2/content"&gt;HK2&lt;/a&gt; core model. The JBoss Team has implemented an &lt;a href="http://community.jboss.org/wiki/JBossOSGi"&gt;abstraction&lt;/a&gt; above its microcontainer allowing to use OSGi, once again hiding it behind a custom layer.In the enterprise world, the only major actor (I mean no insult to the very brilliant smaller companies which provide quality OSGi enterprise solutions) embracing the OSGi model directly is (was?) SpringSource/VMWare.&lt;br /&gt;&lt;br /&gt;What came as a surprise is Rod Johnson's recent &lt;a href="http://www.theserverside.com/news/2240037102/OSGi-Not-Easy-Enough-to-Use-Not-as-Productive-as-it-Should-Be"&gt;words&lt;/a&gt; on that. Rob Harrop also backed this. Their seem to conclude that OSGi is hard to be made productive.Stated like this it's not really fair.There is little doubt OSGi is lacking many productivity boosters now found in modern frameworks: Convention over Configuration, Annotation based development helpers, Aspects, Transactions handling ...etcNevertheless I know for a fact that there are &lt;a href="http://www.eclipse.org/virgo/"&gt;good&lt;/a&gt; &lt;a href="http://felix.apache.org/site/apache-felix-ipojo.html"&gt;solutions&lt;/a&gt; &lt;a href="http://www.paremus.com/products/products.html"&gt;in the&lt;/a&gt; &lt;a href="http://karaf.apache.org/"&gt;OSGi world&lt;/a&gt;. In fact, I think that if one compares OSGi to other dynamic modularity mechanisms, it is quite productive. It should not be compared directly to component models that leave out this dynamicity.&lt;br /&gt;&lt;br /&gt;The problem I see is that the OSGi world seems to be stuck in an oldish development model that fits well enough the embedded world it comes from (where the aforementioned development boosters are not really key features). Hence my recent comment on OSGi being stuck in the smart card age, which I should have rephrased as "OSGi is still held back by its embedded focus".&lt;br /&gt;&lt;br /&gt;OSGi specifications should now enforce development boosters and not provide them as optional choices.&lt;ul&gt;&lt;li&gt;It should be possible to create an OSGi bundle without a Manifest.mf file.&lt;/li&gt;&lt;li&gt;It should be possible to create an OSGi service providers/consumers just by adding an annotation to a class.&lt;/li&gt;&lt;li&gt;It should be possible to handle transactions easily.&lt;/li&gt;&lt;li&gt;It should be easy to operate bundles replacement.&lt;/li&gt;&lt;/ul&gt;Well be glad, all of this is possible. Then be sad, as major vendors seem to turn their back on it.&lt;br /&gt;&lt;br /&gt;Two things in the end are really missing.&lt;br /&gt;One thing really missing is an official repository (à la Maven Central) for OSGi bundles, provided by the OSGi alliance. Because adapting some existing libraries as bundles is really hard and requires a very good knowledge of the inner mechanisms of OSGi. What Springsource provides could be a good template for this.&lt;br /&gt;The other thing missing is incentive for existing libraries/frameworks to provide OSGi compatible versions of their components. With companies like SpringSource sending mixed messages, it will become difficult to fuel this... Though one can't blame them for thinking that nodejs, rails, grails and such bring a breeze of fresh air to a regular OSGi developer ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6904853702243256304?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6904853702243256304/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6904853702243256304' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6904853702243256304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6904853702243256304'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2011/06/status-of-osgi.html' title='Status of OSGi'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6825328241788419617</id><published>2010-11-15T18:37:00.000+01:00</published><updated>2010-11-15T18:37:32.476+01:00</updated><title type='text'>Feelings and pointers from my Day 1 at Devoxx 2010</title><content type='html'>This day (up until now) was dedicated to Hands-on.&lt;br /&gt;&lt;br /&gt;I (sadly) arrived a bit late this morning, for what was in fact (not) a "hands-on".&lt;br /&gt;It was a presentation of interesting tools: HDFS/Hadoop, and 2 alternative interaction points with Hadoop/HDFS: Hive (SQL92-like implementation) and Pig (scripted approach)&lt;br /&gt;&lt;br /&gt;If you want to have a look at a Map/Reduce implementation with a SQL background, then definitely have a look at Hive!&lt;br /&gt;Otherwise, Pig seems more powerful and should appeal to python-lovers.&lt;br /&gt;&lt;br /&gt;In the afternoon, I went for Spring Roo and Spring STS presentations/hands-on.&lt;br /&gt;This freshened up a bit my perception of these tools, as I may have to use a lot their most recent versions in the coming times.&lt;br /&gt;&lt;br /&gt;Finally, I had a glance at a presentation about Code/API documentation. 2 pointers there: Bumblebee and JCite.&lt;br /&gt;&lt;br /&gt;I'm now going to participate to Groovy/Grails and Spring BOFs.&lt;br /&gt;&lt;br /&gt;More feedback to come later on.&lt;br /&gt;&lt;br /&gt;(This weBLOG is meant to be read by his author only, If you happen to read it, please flash your memory and fall into sleep mode ASAP)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6825328241788419617?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6825328241788419617/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6825328241788419617' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6825328241788419617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6825328241788419617'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2010/11/feelings-and-pointers-from-my-day-1-at.html' title='Feelings and pointers from my Day 1 at Devoxx 2010'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7308121442104144452</id><published>2009-12-30T15:37:00.002+01:00</published><updated>2009-12-30T21:48:08.269+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExtJS Javascript UI AgilePartner'/><title type='text'>ExtJS: Structuring your javascript code (1)</title><content type='html'>&lt;h1&gt;ExtJS and me ;) &lt;/h1&gt;In my search for good client application widgets, a few years ago, I started to look at YahooUI.&lt;br /&gt;In these days ("days of yore" would be a tad inappropriate ;) ), YahooUI had some limitations, and only a few "out-of-the-box" widgets for "enterprise" applications.&lt;br /&gt;&lt;br /&gt;The following is an approximated history of ExtJS, don't take it for granted... :p&lt;br /&gt;&lt;br /&gt;At some point, Jack Slocum forked or bundled, or rewrote a whole lot of YahooUI, known in these days as YahooUI-ext (extension).&lt;br /&gt;This is when I learned about it, thanks to my soon-to-be boss (javascript hacker in his spare time ;)).&lt;br /&gt;Though as the project evolved, and the codebase got almost completely rewritten, the project began to include YahooUI as one of its core mechanims (and therefore YahooUI-Ext was not only an extension to YahooUI anymore), which was the major shift that made the renamed ExtJS a framework in its own right. From now on, YahooUI dependency could be completely removed, and other frameworks could be used as an core mechanism (JQuery, Prototype...).&lt;br /&gt;&lt;br /&gt;At some point (version 2.0 and on) a specifically rewritten and optimized extjs mechanism was made available: ext-base. From there on, other frameworks were not even necessary anymore.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Javascript thingy... why OMG why???&lt;/h1&gt;&lt;br /&gt;In a few previous posts, I've already tried to debunk the javascript monster, in order to show that Javascript is a very good language, and that the monster in the browser is not javascript itself (though as every language, it's far from perfect), but the DOM one has to deal with (which differs from browser to browser).&lt;br /&gt;&lt;br /&gt;As a web era guy, I've always felt deeply uncomfortable coding web interfaces with server-side languages (even if they are for rich-client-like applications). It has always made me feel like playing volley-ball knee-deep in liquid honey... (ok this is a weird image, though it conveys the message I guess).&lt;br /&gt;&lt;br /&gt;In fact, HTTP is a disconnected protocol, and I've always felt like one should use the best tool on both sides.&lt;br /&gt;Before a few years ago and the dawning of AJAX, the client side was in a "ask-for-page, display-page, submit-form" paradigm which made server-side handling of web sites still relevant.&lt;br /&gt;With AJAX and modern frameworks like ExtJS, it is possible to build your client application with a notepad in an html file, and then provide a backend based on any technology you see fit: JavaEE, .Net, PHP, CGI...&lt;br /&gt;Moreover, if you need to change the UI or refresh it a bit later on, you will have the opportunity to do it without touching the logic-handling backend.&lt;br /&gt;&lt;br /&gt;I know for a fact that this ranting is directly (in my case) directed towards frameworks like JSF or GWT (the later being a specific case, as all it does is allowing you to code javascript + HTML + CSS in Java, and also because I think it's a damn good framework).&lt;br /&gt;&lt;br /&gt;There are 2 tasks one has to handle with a javascript based framework like ExtJS (in fact 3, because the first is to know a bit more than average about Javascript) in order to achieve productivity:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use an appropriate tooling: Javascript is not compiled, a validation tool is then required (and code completion is a nice-to-have)&lt;/li&gt;&lt;li&gt;Try to structure your code properly: This is (sadly) not very much documented.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I'll try to detail the second point in this post. For the first one, I'd recommend the use of Aptana, TextMate, or Spket in Eclipse. Visual Studio seems to have some Intellisense features for ExtJS. Learn more &lt;a href="http://www.extjs.com/learn/Manual:Resources#IDEs"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;The need to structure&lt;/h1&gt;When you download ExtJS, you receive a whole lot of good stuff. Among these a lot of examples...&lt;br /&gt;&lt;br /&gt;What is hard to do is to try and begin an application.&lt;br /&gt;Very quickly, you'll end up creating a grid, and asking yourself: "My Ajax server-side request seems to be called and returns JSON/XML, then why is it that my grid doesn't show the records?".&lt;br /&gt;You'll soon see that extending the default &lt;b&gt;stores&lt;/b&gt; and &lt;b&gt;readers&lt;/b&gt; will allow you to whether use browsers' consoles (when they have one) or message boxes in order to give feedback on potential errors.&lt;br /&gt;By default, the framework's widgets are quite silent about this. &lt;br /&gt;&lt;br /&gt;Though all the hooks are in place, allowing you to add the expected behaviour (e.g. a popup when server-side errors occur, or even a retry policy, or displaying a loading icon...).&lt;br /&gt;&lt;br /&gt;In order to achieve and more importantly maintain that, a bit of structure is necessary.&lt;br /&gt;This is what I'll try and demonstrate in my next blog post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7308121442104144452?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7308121442104144452/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7308121442104144452' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7308121442104144452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7308121442104144452'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/12/extjs-structuring-your-javascript-code.html' title='ExtJS: Structuring your javascript code (1)'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-9153308279052469020</id><published>2009-08-10T22:12:00.001+02:00</published><updated>2009-12-29T12:18:56.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AgilePartner'/><title type='text'>Mule will do the hard work, I'll do the reading</title><content type='html'>&lt;a href="http://ddossot.blogspot.com/2009/07/mule-in-action-now-treeware.html"&gt;http://ddossot.blogspot.com/2009/07/mule-in-action-now-treeware.html&lt;/a&gt;&lt;br /&gt;Mule in Action has been out for a while now, though as I don't live overseas (well...depends from the point of view... or not... ;) ) it took a bit of time before I received my order.&lt;br /&gt;&lt;br /&gt;I'm now the very glad owner of a "Mule in action" book.&lt;br /&gt;&lt;br /&gt;I can only recommend it to anybody wanting to deal with the donkey beast.&lt;br /&gt;It is fully packed with ESBntegration knowledge, from basic to very technical details!&lt;br /&gt;&lt;br /&gt;Everything you should know about Mule 2.x is in this book.&lt;br /&gt;&lt;br /&gt;Very good work from the very brilliant David and John!&lt;br /&gt;&lt;br /&gt;Go and &lt;a href="http://www.manning.com/dossot"&gt;order it&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-9153308279052469020?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/9153308279052469020/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=9153308279052469020' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/9153308279052469020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/9153308279052469020'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/08/mule-will-do-hard-work-ill-do-reading.html' title='Mule will do the hard work, I&apos;ll do the reading'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2024117907716167909</id><published>2009-06-27T09:00:00.002+02:00</published><updated>2009-06-29T22:46:56.204+02:00</updated><title type='text'>Jazoon Day 1: Open UAT (Universal Authentication Toolkit) for devices</title><content type='html'>&lt;h4&gt;Out of Band (OOB) Channels&lt;/h4&gt;&lt;br /&gt; Visual channel (barcodes)&lt;br /&gt; Audio channel (key encoded by audio)&lt;br /&gt; Manual string comparison (comparing codes)&lt;br /&gt; Accelerometer data (devices shaken together)&lt;br /&gt; Button presses (buttons pressed at the same time)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;J2ME Polish&lt;/h4&gt;&lt;br /&gt; Nice tool to specify the target of the build&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;ScreenSnap&lt;/h4&gt;&lt;br /&gt; In-device capture application for Java ME&lt;br /&gt;&lt;br /&gt;This Open UAT system would be interesting on Google Android for example...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2024117907716167909?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2024117907716167909/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2024117907716167909' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2024117907716167909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2024117907716167909'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-open-uat-universal.html' title='Jazoon Day 1: Open UAT (Universal Authentication Toolkit) for devices'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6075637798430117165</id><published>2009-06-27T08:59:00.003+02:00</published><updated>2009-06-29T22:45:42.155+02:00</updated><title type='text'>Jazoon Day 1: Rules engines overview and case study</title><content type='html'>&lt;h4&gt;Motivation for the use of business rules&lt;/h4&gt;&lt;br /&gt; updates in business rules have to change overnight&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Core idea&lt;/h4&gt;&lt;br /&gt; Treat business logic as business data&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BRMS&lt;/b&gt; (Business Rules Management System)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;BOM vs XOM&lt;/h4&gt;&lt;br /&gt; Business Object Model vs Execution Object Model&lt;br /&gt;&lt;br /&gt;iLog vs Drools&lt;br /&gt; equivalence of features.&lt;br /&gt;&lt;br /&gt;Business Rules format&lt;br /&gt; &lt;b&gt;when&lt;/b&gt;&lt;br /&gt;  &lt;conditions&gt;&lt;br /&gt; &lt;b&gt;then&lt;/b&gt;&lt;br /&gt;  &lt;actions&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Advanced Features&lt;/h4&gt;&lt;br /&gt; Custom, Higher level business language (translated to the same rules behind the scene&lt;br /&gt; Rule security&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Rules engine and SOA&lt;/h4&gt;&lt;br /&gt; Used for Monitoring of SLA&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Rules engine and CEP (Complex Event Processing)&lt;/h4&gt;&lt;br /&gt; Almost all BRMS have a CEP engine (well to me it seems a bit weird to say that... all engines have it, so it must be useful... :p )&lt;br /&gt;&lt;br /&gt;A bit of feedback on 2 projects with iLog and CLIPS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6075637798430117165?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6075637798430117165/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6075637798430117165' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6075637798430117165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6075637798430117165'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-rules-engines-overview-and.html' title='Jazoon Day 1: Rules engines overview and case study'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2121715008632327934</id><published>2009-06-27T08:57:00.002+02:00</published><updated>2009-06-29T22:43:01.401+02:00</updated><title type='text'>Jazoon Day 1: Maven 3.x, Tycho</title><content type='html'>Lots of attendees!!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Maven 3.0&lt;/h4&gt;&lt;br /&gt; Fewer modules&lt;br /&gt; Simpler codebase&lt;br /&gt; Better IDEs support&lt;br /&gt; Integration Testing&lt;br /&gt; Backward compatibility&lt;br /&gt;&lt;br /&gt;Pom in multiple formats (groovy, ruby)&lt;br /&gt;&lt;br /&gt;PluginManager externalized&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Queryable lifecycle&lt;/h4&gt;&lt;br /&gt; Execution plan is defined up front and depending on the environment, what it will execute will be different (compilation with JDT In Eclipse for example)&lt;br /&gt;&lt;br /&gt;Plugin Extension Points, Lifecycle Extension Points&lt;br /&gt;&lt;br /&gt;Error &amp; Integrity reporting fixed&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Mercury&lt;/h4&gt;&lt;br /&gt; async http client with ssl and streaming PGP, WebDav.&lt;br /&gt; Designed as standalone, Mercury can be embedded&lt;br /&gt; &lt;b&gt;SAT4J&lt;/b&gt; (pseudo boolean solver) for dependency resolution&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Guice + Peaberry&lt;/h4&gt;&lt;br /&gt; Plexus will be replaced&lt;br /&gt; Peaberry is the equivalent of Spring dm for Guice&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Incremental build support&lt;br /&gt;&lt;br /&gt;Extensible reporting&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;M2Eclipse&lt;/h4&gt;&lt;br /&gt; Lots of real improvements with Maven 3.0&lt;br /&gt; M2E configuration framework&lt;br /&gt; Real round-trip between Eclipse and Maven Pom! NICE!!!!&lt;br /&gt;&lt;br /&gt;Planned for September/October... can't wait... in fact, maybe I won't ;) at least for Maven 3.0!&lt;br /&gt;&lt;br /&gt;Nexus presentation: interesting point: compatible with P2 and OBR&lt;br /&gt;&lt;a href="http://repository.apache.org"&gt;http://repository.apache.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://repository.sonatype.org"&gt;http://repository.sonatype.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oss.sonatype.org"&gt;http://oss.sonatype.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://osgi.sonatype.org"&gt;http://osgi.sonatype.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Hudson&lt;/h4&gt;&lt;br /&gt; Drools workflow to build release processes&lt;br /&gt; Integrating JSecurity (Apache Shiro)&lt;br /&gt; REST layer&lt;br /&gt; Maven 3.0 like plugins&lt;br /&gt; Eclipse incremental compiler&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gosh this presentation is full of good news! Hopefully the result will be as good as promised...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2121715008632327934?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2121715008632327934/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2121715008632327934' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2121715008632327934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2121715008632327934'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-maven-3x-tycho.html' title='Jazoon Day 1: Maven 3.x, Tycho'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-1674351939596300186</id><published>2009-06-27T08:55:00.003+02:00</published><updated>2009-06-29T22:40:28.414+02:00</updated><title type='text'>Jazoon Day 1: Glassfish v3</title><content type='html'>RRails native deployment&lt;br /&gt;Modular because of the requirements of Java EE 6 Profiles&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Modularity&lt;/h4&gt;&lt;br /&gt; Based on OSGi (Apache Felix by default)&lt;br /&gt; 190 bundles (too many probably, but necessary at first, will decrease through time...or so they say ;))&lt;br /&gt; Modules have responsabilities (provide services) and a lifecycle&lt;br /&gt; Maven was used for the build&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Developer features&lt;/h4&gt;&lt;br /&gt; Integration with IDEs&lt;br /&gt; Fast startup, restart in debug&lt;br /&gt; Exploded directory deployment&lt;br /&gt; therefore... Fast deploy on save&lt;br /&gt; Preserve session across redeployment&lt;br /&gt; Application runner: java -jar glassfish.jar myWebApplication&lt;br /&gt; &gt; Maven/ANT integration&lt;br /&gt; &gt; Award winning UI console&lt;br /&gt;&lt;br /&gt;Java EE 6 EJB 3.1 in web apps is really a very nice feature. It also seems that @Resource can now inject elements that come from other sources than JNDI! NICE!!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Runtime&lt;/h4&gt;&lt;br /&gt; Kernel&lt;br /&gt;  startup/shutdown&lt;br /&gt;  deployment&lt;br /&gt;  configure reading&lt;br /&gt; Services&lt;br /&gt;  Java EE 6: Security, Naming Manager&lt;br /&gt;  Products; Admin consoles&lt;br /&gt; Containers&lt;br /&gt;  Java EE 6: Web Container, EJB Container...&lt;br /&gt;  Other possible custom containers (RRails)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Application container&lt;/h4&gt;&lt;br /&gt; Deployment&lt;br /&gt; Configuration&lt;br /&gt; Commands (CLI, REST operation)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Service Based Architecture&lt;/h4&gt;&lt;br /&gt; HK2 Services: Abstraction to OSGi services&lt;br /&gt; Per thread / Per scope scopes&lt;br /&gt; Integrated lightweight dependency injection&lt;br /&gt; Based on annotations (Container, Service, Inject...)&lt;br /&gt;&lt;br /&gt;OSGi services can be injected with @Resource Java EE annotation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-1674351939596300186?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/1674351939596300186/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=1674351939596300186' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1674351939596300186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1674351939596300186'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-glassfish-v3.html' title='Jazoon Day 1: Glassfish v3'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8425268845189163563</id><published>2009-06-27T08:51:00.002+02:00</published><updated>2009-06-29T22:38:57.768+02:00</updated><title type='text'>Jazoon Day 1: Spring 3.0</title><content type='html'>&lt;h4&gt;Java 5+ foundation&lt;/h4&gt;&lt;br /&gt; even more support for annotated components&lt;br /&gt; BeanFactory returns typed Beans &lt;br /&gt;  T getBean(String name, Class&amp;lt;T&amp;gt; requiredType)&lt;br /&gt; TaskExecutor extends java.util.concurrentExecutor&lt;br /&gt;  extended AsyncTaskExecutor supports Callables and Futures&lt;br /&gt;        Typed ApplicationListener&lt;E&gt;&lt;br /&gt;  ApplicationEventMulticaster detects declared event type and filters accordingly.&lt;br /&gt; Annotated Factory Methods&lt;br /&gt; Use of Meta-Annotations&lt;br /&gt;                This is indeed really great! It allows to potentially have only annotations from your own packages in your code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Portfolio rearrangements&lt;/h4&gt;&lt;br /&gt; Spring OXM now in the core&lt;br /&gt; Revised binding and type conversion infrastructure: Superseeding standard JDK PropertyEditors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Spring Expression Language Unified&lt;/h4&gt;&lt;br /&gt; a kind of unified EL++&lt;br /&gt; EL default attributes: systemProperties, systemEnvironment, and any spring bean through its name(s)&lt;br /&gt; Contextual attributes depending on scope (access to request/session attributes for example).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;REST Support&lt;/h4&gt;&lt;br /&gt; Client and server side&lt;br /&gt; Defining URIs&lt;br /&gt; JAX-RS&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Declarative model validation&lt;/h4&gt;&lt;br /&gt; Hibernate Validator, JSR 303&lt;br /&gt; Annotating fields with constraint annotations&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Support for Portlet 2.0&lt;/h4&gt;&lt;br /&gt; action/render/event/resource request mappings&lt;br /&gt; &lt;br /&gt;&lt;h4&gt;Early support for Java EE 6&lt;/h4&gt;&lt;br /&gt; JSF 2.0&lt;br /&gt; JPA 2.0&lt;br /&gt; JSR 303&lt;br /&gt; &lt;br /&gt;&lt;h4&gt;New Namespaces&lt;/h4&gt;&lt;br /&gt; Scheduling namespace&lt;br /&gt;  @Async annotation for methods&lt;br /&gt;  @Scheduled for cron-triggered methods&lt;br /&gt; Namespace allows scanning of these annotations, and declarative equivalent Expressions&lt;br /&gt; Custom CRON support&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Pruning&lt;/h4&gt;&lt;br /&gt; Commons Attributes support&lt;br /&gt; TopLink API&lt;br /&gt; Subclass-style Struts 1.X&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Deprecations&lt;/h4&gt;&lt;br /&gt; traditional MVC form controller hierarchy: no new features&lt;br /&gt; traditional JUnit 3.8 test class hierarchy =&gt; now Test Context framework&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8425268845189163563?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8425268845189163563/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8425268845189163563' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8425268845189163563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8425268845189163563'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-spring-30.html' title='Jazoon Day 1: Spring 3.0'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6452861762979521102</id><published>2009-06-27T08:48:00.004+02:00</published><updated>2009-06-29T22:36:46.383+02:00</updated><title type='text'>Jazoon Day 1: Concurrency and Performance reloaded</title><content type='html'>Already lots of issues in single-threaded applications.&lt;br /&gt;Moore's law is continued by multiple cores.&lt;br /&gt;Concurrent programming is not possible yet, we can only cope with it.&lt;br /&gt;&lt;br /&gt;Sadly (or not) concurrency is the main programming focus nowadays.&lt;br /&gt;&lt;br /&gt;We have to deal with concurrency explicitely while before you could just wait for the platforms to improve and gain performances ;)&lt;br /&gt;&lt;br /&gt;Problems: &lt;br /&gt;- Hardware components are not shareable.&lt;br /&gt;- Access to shared data has to be serialized.&lt;br /&gt;- Databases offer access to shared data.&lt;br /&gt;- Serialization limits scalability.&lt;br /&gt;&lt;br /&gt;He then talks about &lt;a href="http://en.wikipedia.org/wiki/Amdahl%27s_law"&gt;Amdahl's law&lt;/a&gt; (parallel computing is limited by the time needed for the sequential part of the computing)&lt;br /&gt;and Little's law (Throughput is inversely proportional to service time).&lt;br /&gt;&lt;br /&gt;In Java: locking is pessimistic. Huge problem.&lt;br /&gt;&lt;br /&gt;In fact 99% of locks are almost never really contended, and a large part of those will never be contended at all by design.&lt;br /&gt;&lt;br /&gt;In Java 1.5, we have &lt;b&gt;Java Locks and system level locks&lt;/b&gt; (hotspot profiles the application and determines if a lock is contended or not, and choose one or the other)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lock coarsening&lt;/b&gt; uses one lock only for nearby equivalently locked operations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compare And Swap (CAS)&lt;/b&gt; used in Atomic classes. Fails only if another threads updates the data during your access. Needs less locking.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Biased Locking:&lt;/b&gt;&lt;br /&gt;If a thread continuously acquires a lock, CAS is not used, and the thread keeps the lock until another one is reclaiming it (unbiasing)&lt;br /&gt;&lt;br /&gt;How to code this correctly:&lt;br /&gt;&lt;br /&gt;java.util.concurrent of course (Atomic*)&lt;br /&gt;Lock striping (ConcurrentHashMap)&lt;br /&gt;Teaching threads to steal (after all Garbage collecting is doing it).&lt;br /&gt;&lt;br /&gt;In 1.7: Fork-Join&lt;br /&gt;&lt;br /&gt;Fully concurrent lock-free algorithms:&lt;br /&gt; No blocking, threads are never waiting for anything.&lt;br /&gt; Wait free is different of course but should be achieve&lt;br /&gt; Parallel reads, serialized writes&lt;br /&gt;&lt;br /&gt;NonBlockingHashMap scales very well up to 1000 CPUs even for R/W, when ConcurrentHashMap doesn't.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fully concurrent lock-less FIFO?&lt;br /&gt; What does FIFO mean in multicore?&lt;br /&gt; =&gt; Doug Lea's wait-free queue (getAndSet(V))&lt;br /&gt;&lt;br /&gt;Things that don't make sense&lt;br /&gt; Iterator&lt;br /&gt; Size&lt;br /&gt; Contains&lt;br /&gt;&lt;br /&gt;These are not relevant in highly concurrent environment.&lt;br /&gt;APIs must therefore be re-thought through.&lt;br /&gt;&lt;br /&gt;Very nice yet intricate talk. Too bad there's not more time for &lt;a href="http://www.kodewerk.com/"&gt;Dirk Pepperdine&lt;/a&gt; to go more into details!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6452861762979521102?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6452861762979521102/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6452861762979521102' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6452861762979521102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6452861762979521102'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-concurrency-and.html' title='Jazoon Day 1: Concurrency and Performance reloaded'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-4743483369494935833</id><published>2009-06-27T08:47:00.003+02:00</published><updated>2009-06-29T22:28:32.023+02:00</updated><title type='text'>Jazoon Day 1: Keynote by James Gosling</title><content type='html'>Starting with the JavaOne video&lt;br /&gt;J.Gosling is then talking about network orientation, and the fact that Java is more about the JVM(s) than the language.&lt;br /&gt;&lt;br /&gt;He then demonstrates Glassfish v3 (finally, EJBs in webapps...) and Netbeans v6.7 which looks honestly pretty slick...&lt;br /&gt;&lt;br /&gt;Then talks about Real time JVM, and Intelligent Meshes (Sunspot (Squawk) VM, Sentilla.com).&lt;br /&gt;&lt;br /&gt;Talking about Hybrid car of Neil Young ;). May I suggest the guy is a little cocky there? ;);)&lt;br /&gt;&lt;br /&gt;Performance in java&lt;br /&gt;Actually better than C/C++ in most cases.&lt;br /&gt;He then demonstrates the now common assertion that Moore's law is now wrong if you don't consider the number of cores (not if one takes them into account).&lt;br /&gt;&lt;br /&gt;Funny point on the fact that most of what is happening on scientific calculation is driven by the progress of video games.&lt;br /&gt;&lt;br /&gt;A bit of advertizing on JDK 7 talk the following day.&lt;br /&gt;&lt;br /&gt;Java 6 updates (from 10 on)&lt;br /&gt; Fixes Desktop integration&lt;br /&gt; G1(Garbage first) collector&lt;br /&gt; Compressed pointers 32G==4G&lt;br /&gt;&lt;br /&gt;Web as the face of the Enterprise&lt;br /&gt;=&gt; JavaFX: same result as Flash, yet easier... still not convinced by that... :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-4743483369494935833?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/4743483369494935833/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=4743483369494935833' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/4743483369494935833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/4743483369494935833'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/jazoon-day-1-keynote-by-james-gosling.html' title='Jazoon Day 1: Keynote by James Gosling'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6981812035164638180</id><published>2009-06-23T09:05:00.002+02:00</published><updated>2009-06-23T09:11:02.889+02:00</updated><title type='text'>OSGi DevCon Europe: Emulation of Devices with Flash and OSGi</title><content type='html'>Interesting presentation on the emulation of devices.&lt;br /&gt;The word "Device", in the embedded "world", is used to describe  technical component which does only one kind of thing with a clear contract (display, sound, gesture capture...etc).&lt;br /&gt;Therefore, an iPhone is an assembly of devices.&lt;br /&gt;The iPhone development scheme is sadly inefficient in terms of testing.&lt;br /&gt; &lt;br /&gt;In order to test devices properly, they are advising to build an OSGi bundle for each device, and a flash interface for the device with xml-sockets (or any other equivalent client technology).&lt;br /&gt;&lt;br /&gt;Note that the client part is not mandatory, but allows product owners to define additional features and even capture test scenarios.&lt;br /&gt;&lt;br /&gt;Sadly, they are not open-sourcing (yet?) the framework they built for that.&lt;br /&gt;&lt;br /&gt;Wow... this was a fully packed day...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6981812035164638180?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6981812035164638180/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6981812035164638180' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6981812035164638180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6981812035164638180'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-emulation-of-devices.html' title='OSGi DevCon Europe: Emulation of Devices with Flash and OSGi'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5267083323314727626</id><published>2009-06-23T09:03:00.001+02:00</published><updated>2009-06-23T09:04:57.790+02:00</updated><title type='text'>OSGi DevCon Europe: RFID and OSGi devices</title><content type='html'>Collecting real data and analyse it in the I.T.System.&lt;br /&gt;&lt;br /&gt;Learned about MOSGI (JMX for OSGi) RFC 139&lt;br /&gt;&lt;br /&gt;Learned about ALE reports which are events published by RFID Readers.&lt;br /&gt;&lt;br /&gt;Starting to be a bit tired... too many presentations in one day :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5267083323314727626?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5267083323314727626/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5267083323314727626' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5267083323314727626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5267083323314727626'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-rfid-and-osgi.html' title='OSGi DevCon Europe: RFID and OSGi devices'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6476787823795332789</id><published>2009-06-23T09:01:00.001+02:00</published><updated>2009-06-23T09:03:22.077+02:00</updated><title type='text'>OSGi DevCon Europe: Transactions with OSGi</title><content type='html'>Presentation is very good. Clement Escoffier is very dynamic, and has good vocabulary, and a very pronounced frenchy accent and grammar ;) (who am I to say?)&lt;br /&gt;Very good explanation of the basics of transaction. Should be learned in schools as is ;)&lt;br /&gt;&lt;br /&gt;Indeed transactions are hard to handle in a system where the transaction manager bundle or the transaction participants can leave during a transaction!&lt;br /&gt;&lt;br /&gt;iPOJO Transaction Handler does that (amongst others). I'm still not clear if this is part of 4.2 release of OSGi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6476787823795332789?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6476787823795332789/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6476787823795332789' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6476787823795332789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6476787823795332789'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-transactions-with.html' title='OSGi DevCon Europe: Transactions with OSGi'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8960390348437875455</id><published>2009-06-23T08:57:00.001+02:00</published><updated>2009-06-23T09:01:42.395+02:00</updated><title type='text'>OSGi DevCon Europe: OSGi + Spring Integration</title><content type='html'>&lt;h4&gt;A little definition of "Performance"&lt;/h4&gt;&lt;br /&gt; Response time (classic)&lt;br /&gt;  Throughput (concurrent processing)&lt;br /&gt; Utilization (Map-Reduce)&lt;br /&gt;&lt;br /&gt;Scalability &amp; Reliability (you have to choose a good balance between both)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Code supernova&lt;/h4&gt;&lt;br /&gt; Nothing is perfect&lt;br /&gt; Code bases shall grow&lt;br /&gt; Teams grow, you get more people and therefore more bad developers&lt;br /&gt; More bugs.... ad lib...&lt;br /&gt;&lt;br /&gt;I really like this concept ;). It fits so many projects have seen which are more patchworks than real products!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Single Thread Breakdown&lt;/h4&gt;&lt;br /&gt; One thread =&gt; single core&lt;br /&gt; You can deal with more requests, but hardly improve a lot the treatment of one.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Synchronous breakdown&lt;/h4&gt;&lt;br /&gt; doing something, call another component , wait, finish.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Spring Integration is about EIP&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;Allows decoupling, if you add this to OSGi it's a nice combination.&lt;br /&gt;&lt;br /&gt;Very nice and professional demo, done with very nice Spring STS ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8960390348437875455?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8960390348437875455/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8960390348437875455' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8960390348437875455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8960390348437875455'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-osgi-spring.html' title='OSGi DevCon Europe: OSGi + Spring Integration'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8277558372657516966</id><published>2009-06-23T08:55:00.001+02:00</published><updated>2009-06-23T08:57:09.259+02:00</updated><title type='text'>OSGi DevCon Europe: Nimble</title><content type='html'>YA Dependency resolver/Provisionning tool ;)&lt;br /&gt;Looks interesting.&lt;br /&gt;&lt;br /&gt;Once again, Artifacts, Capabilities and Requirements (see p2)&lt;br /&gt;The structure there is a "Part" (see p2 IU in a sense)&lt;br /&gt;a "Rule" is a template for a "Part"&lt;br /&gt;It also defines a concept of Extensions.&lt;br /&gt;&lt;br /&gt;Gosh... such a short presentation on this results in a mess...&lt;br /&gt;&lt;br /&gt;Demo&lt;br /&gt;A lot better with a demo...&lt;br /&gt;&lt;br /&gt;Nimble allows you to enforce Policies on provisionning. NICE!!!&lt;br /&gt;&lt;br /&gt;http://nimble.codecauldron.org/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8277558372657516966?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8277558372657516966/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8277558372657516966' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8277558372657516966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8277558372657516966'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-nimble.html' title='OSGi DevCon Europe: Nimble'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2286593348092684981</id><published>2009-06-23T08:54:00.002+02:00</published><updated>2009-06-23T08:55:35.910+02:00</updated><title type='text'>OSGi DevCon Europe: p2</title><content type='html'>p2, modular provisioning for OSGi&lt;br /&gt;&lt;br /&gt;One consistent model from installation to servicing.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Concepts:&lt;/h4&gt;&lt;br /&gt; Everything is an Installable Unit (IU)&lt;br /&gt; IU can have:&lt;br /&gt;  Actions (steps to perform to fully deploy)&lt;br /&gt;  Artifact reference (allows to reference dependencies without pointing directly to its location)&lt;br /&gt;  Capabilities and Requirements&lt;br /&gt; Artifacts are:&lt;br /&gt;  Bytes/content to be installed (JARs, binary executable, RPM, MSI... etc)&lt;br /&gt;&lt;br /&gt;God these presentations are too short.. The guy is talking too fast.&lt;br /&gt;In the end, I already thought p2 was a bit of a mess, and as much as I want to like it, I'm still not clearly convinced by it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2286593348092684981?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2286593348092684981/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2286593348092684981' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2286593348092684981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2286593348092684981'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-p2.html' title='OSGi DevCon Europe: p2'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8952332568578983163</id><published>2009-06-23T08:48:00.000+02:00</published><updated>2009-06-23T08:48:34.087+02:00</updated><title type='text'>OSGi DevCon Europe: Blueprint services</title><content type='html'>DI, yet Legacy code-compatible, OSGi Dynamics, Hide OSGi API&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Configuration:&lt;/h4&gt;Uses the extender pattern: The Blueprint Extender scans bundles to find xml files, creates metadata from them, and then creates beans, services, references.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Manager Types:&lt;/h4&gt; &lt;b&gt;Bean Manager:&lt;/b&gt; creates POJOs and possibly wire dependencies.&lt;br /&gt; &lt;b&gt;Single Service Reference Manager:&lt;/b&gt; one to one mapping with OSGi service&lt;br /&gt; &lt;b&gt;Multiple Services Reference Manager:&lt;/b&gt; one to many mapping with OSGi service&lt;br /&gt; &lt;b&gt;Service Registration Manager:&lt;/b&gt; Allows to register a POJO as an OSGi service&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Bean Manager&lt;/h4&gt; takes as input a configuration which is very close from the Spring bean configuration.&lt;br /&gt; No, in fact it is Spring configuration reloaded... ;)&lt;br /&gt;&lt;br /&gt;To summarize: BluePrint is a standardization of Spring DM and of Spring DI configuration.&lt;br /&gt;BluePrint already has other implementations (amongst them Geronimo Blueprint by G.Nodet who gave this talk)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8952332568578983163?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8952332568578983163/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8952332568578983163' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8952332568578983163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8952332568578983163'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-blueprint-services.html' title='OSGi DevCon Europe: Blueprint services'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-3127074744163833465</id><published>2009-06-23T08:44:00.000+02:00</published><updated>2009-06-23T08:44:30.332+02:00</updated><title type='text'>OSGi DevCon Europe: POSH</title><content type='html'>POSH: Paremus OSGi Shell &lt;br /&gt;&lt;br /&gt;RFC 0132&lt;br /&gt;&lt;br /&gt;The man is yelling! ;) (Microphone too close to his mouth)&lt;br /&gt;&lt;br /&gt;Yet the topic is interesting, it's about standardizing OSGi commands between frameworks.&lt;br /&gt;For example "ss" in equinox is "ps" in Felix...&lt;br /&gt;Not open source... even if pieces of it are part of Newton :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-3127074744163833465?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/3127074744163833465/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=3127074744163833465' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3127074744163833465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3127074744163833465'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-posh.html' title='OSGi DevCon Europe: POSH'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2339274828973872550</id><published>2009-06-23T08:37:00.001+02:00</published><updated>2009-06-29T22:23:05.245+02:00</updated><title type='text'>OSGi DevCon Europe: Pax</title><content type='html'>Tools and service implementations (framework independent)&lt;br /&gt;Widely used (Apache Felix, Mule... etc)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;PaxConstruct&lt;/h4&gt;A bit like maven archetypes (on steroids) for OSGi.&lt;br /&gt;pax-create-project -g foo -a bar&lt;br /&gt;pax-wrap-jar&lt;br /&gt;...etc&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;PaxRunner&lt;/h4&gt;Standard launcher for major frameworks (Apache Felix, Knoplerfish, Equinox, Concierge...)&lt;br /&gt;Does the provisionning of required artifacts&lt;br /&gt;Generates Configuration files&lt;br /&gt;Generates packages for a target platform&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;PaxExam&lt;/h4&gt;Allows testing of OSGi services. NICE!&lt;br /&gt;Compatible with JUnit 4 and Maven for setup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2339274828973872550?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2339274828973872550/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2339274828973872550' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2339274828973872550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2339274828973872550'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-pax.html' title='OSGi DevCon Europe: Pax'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-1982048531566780627</id><published>2009-06-23T08:05:00.000+02:00</published><updated>2009-06-23T08:05:07.848+02:00</updated><title type='text'>OSGi DevCon Europe: Remote Services, Yet Another one ;)</title><content type='html'>&lt;h3&gt;Remote Services demo&lt;/h3&gt;service.exported.* properties for registered services&lt;br /&gt;NICE!!! OSGi service exposed with CXF&lt;br /&gt;NICE' !!! Discovery mechanism is in the works for the client side&lt;br /&gt;&lt;br /&gt;Presentation of an Asynchronous remoting example/experiment.&lt;br /&gt;This is not really available right now... and seems to be an example implementation.&lt;br /&gt;Yet interesting ;) implemented by an OSGi Event dispatcher that allows to decouple from the implementation.&lt;br /&gt;Drawbacks: No guaranteed delivery, No error handling with existing API. At least not yet, but this is experimental.&lt;br /&gt;&lt;br /&gt;Demo of ActiveMQWrapper behind the EDS (EventAdmin is the point of contact)&lt;br /&gt;&lt;br /&gt;http://cxf.apache.org/distributed-osgi.html (RI of OSGi 4.2 Remote Services)&lt;br /&gt;http://lightsabre.fusesource.org (OSGi Asynchronous Messaging, experimental)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-1982048531566780627?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/1982048531566780627/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=1982048531566780627' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1982048531566780627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1982048531566780627'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-remote-services-yet.html' title='OSGi DevCon Europe: Remote Services, Yet Another one ;)'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-702992234896722086</id><published>2009-06-23T08:01:00.002+02:00</published><updated>2009-06-24T10:34:51.451+02:00</updated><title type='text'>OSGi DevCon Europe: Persistence</title><content type='html'>&lt;h3&gt;OSGi Persistence&lt;/h3&gt;&lt;br /&gt;&lt;h4&gt;Java Persistence standards&lt;/h4&gt;JPA&lt;br /&gt;OXM: JAXB 2.X&lt;br /&gt;&lt;b&gt;EDIT (see comments)&lt;/b&gt;&lt;br /&gt;OXM: SDO 2.1&lt;b&gt;.1&lt;/b&gt; JSR 235&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Eclipse Link&lt;/h4&gt;JPA, MOXy (Object-XML), EIS, SDO, DBWS (XML-relational...Oracle :p)&lt;br /&gt;Currently JPA 1.0 compatible, and working on 2.0&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;MOXy&lt;/h4&gt;Complete Object-XML mapping&lt;br /&gt;Provides external mapping file! NICE!!! Never understood why they didn't give that option in JAXB...&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;EclipseLink available as OSGi bundles&lt;/h4&gt;Supports usage of standard APIs (Persistence.createEntity, JAXBContext.newInstance(), commonj.sdo.HelperProvider)&lt;br /&gt;Supports modular packaging&lt;br /&gt;Decouples application from provider (Through JPA &lt;provider&gt; tag)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Challenges for OSGi and JPA&lt;/h4&gt;Bootstrap in JPA scans the classpath&lt;br /&gt;Provider needs access to domain model classes&lt;br /&gt;Needs access to JDBC driver (addressed RFC 122)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Challenges for OSGi and JAXB&lt;/h4&gt;Spec SPI does not support registration of providers&lt;br /&gt;Provider needs access to domain model classes&lt;br /&gt;Though supports passing domain model classloader&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Challenges for OSGi and SDO&lt;/h4&gt;Spec hardwires everything so it doesn't support custom providers&lt;br /&gt;&lt;br /&gt;JPA 2.0 will include dynamic resolution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-702992234896722086?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/702992234896722086/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=702992234896722086' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/702992234896722086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/702992234896722086'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-persistence.html' title='OSGi DevCon Europe: Persistence'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2607504151023698650</id><published>2009-06-23T07:57:00.001+02:00</published><updated>2009-06-29T22:24:40.532+02:00</updated><title type='text'>OSGi DevCon Europe: Remote Services</title><content type='html'>&lt;h4&gt;Module management in java&lt;/h4&gt;Mystical class path&lt;br /&gt;In the end, classpath is flat&lt;br /&gt;With OSGi: explicit dependencies, yet declarative&lt;br /&gt;Allows events, dynamic handling, introspection&lt;br /&gt;Services in OSGi allow to reduce coupling, but when package dependencies are explicit it limits the modularity.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Service Registry&lt;/h4&gt;Registering services by name, therefore allowing to reference a service without dependency on the implementation&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Distributed OSGi&lt;/h4&gt;Remote can be separate machine, or separate JVM&lt;br /&gt;Why? Isolation, Redundancy, Distribution is needed by your architecture&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;OSGi 4.2 Remote Services&lt;/h4&gt;Service Hooks (can intercept service requests)&lt;br /&gt;Proxies&lt;br /&gt;Intents (denotes an abstract distribution capability, requires mutual agreement, derives from SCA)&lt;br /&gt;&lt;br /&gt;Very Nice: R-OSGi Deployment definition tool for Eclipse!&lt;br /&gt;&lt;br /&gt;Remote Services Mostly based on the fact that services are stateless.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Work in progress: replication,Research prototype: Cirrostratus&lt;/h4&gt;&lt;br /&gt;Interesting as this allows completely virtual deployment of bundles.&lt;br /&gt;&lt;br /&gt;Though it is unclear how much of what is presented is actually really available. Presentation is tough to follow, yet very interesting.&lt;br /&gt;&lt;br /&gt;To summarize, seems that for stateless services, OSGi 4.2 would be enough, Cirrostratus prototype deals with state replication, service migration and hardening policies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2607504151023698650?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2607504151023698650/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2607504151023698650' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2607504151023698650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2607504151023698650'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-remote-services.html' title='OSGi DevCon Europe: Remote Services'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7116878804339591910</id><published>2009-06-22T21:48:00.000+02:00</published><updated>2009-06-22T21:48:03.156+02:00</updated><title type='text'>OSGi DevCon Europe: Keynote</title><content type='html'>&lt;h3&gt;Keynote&lt;/h3&gt;Detailed description on what's going to be available in next releases (Core, Compendium and Enterprise).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Launching:&lt;/h4&gt;Need for a standardized launching system&lt;br /&gt;Allows to embed easily the framework in your application&lt;br /&gt;Using the service system of Java 5 (META-INF/services)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Service Hooks&lt;/h4&gt;Allows to listen service access events, therefore allowing interception for example.&lt;br /&gt;FindHook, EventHook and ListenerHook.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Negative Permissions&lt;/h4&gt;Java 2 permissions: Very heavy to enumerate explicitely what is authorized and skip what is not.&lt;br /&gt;Adding DENY and ALLOW. This is very nice! If it could just be implemented this way in Java 2 permissions...&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Remote Services&lt;/h4&gt;RFC 119 (Formerly Distributed OSGi)&lt;br /&gt;Remote access to OSGi services, protocol-independent.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Blueprint extender&lt;/h4&gt;RFC124&lt;br /&gt;Provides Spring DM-like Functionality&lt;br /&gt;Provides Service damping (wait until service is available) which is a very nice feature!&lt;br /&gt;Defined through XML, a Blueprint container retrieves Metadata for Beans, Services, and References, and then creates corresponding elements from these metadatas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Enterprise release&lt;/h4&gt;Transactions, JDBC, JMX, JNDI, JPA, Connectors&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Experimental&lt;/h4&gt;TSL Tiny script language&lt;br /&gt;Uses reflection but simplifies syntax (no new commands)&lt;br /&gt;Sounds fun!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Nested frameworks&lt;/h4&gt;Application servers need an application model&lt;br /&gt;in OSGi: Application==set of installed bundles&lt;br /&gt;Compromise: frameworks should be nested&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Java Modularity&lt;/h4&gt;module keyword would be nice for OSGi&lt;br /&gt;The rest is over simplistic and will probably introduce more issues than it will solve... and BTW, it will only be available in Java 7 (why a language feature for that????)&lt;br /&gt;&lt;br /&gt;BTW First time I hear a dog barking in a conference ;);)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7116878804339591910?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7116878804339591910/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7116878804339591910' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7116878804339591910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7116878804339591910'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/osgi-devcon-europe-keynote.html' title='OSGi DevCon Europe: Keynote'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-3357216108364736666</id><published>2009-06-22T08:31:00.000+02:00</published><updated>2009-06-22T08:31:34.569+02:00</updated><title type='text'>Conferences in Zurich, day 1 : OSGi DevCon Europe</title><content type='html'>Starting my blog marathon, especially for you, my reader ;).&lt;br /&gt;&lt;br /&gt;Today is the day before bootstrap of Jazoon.&lt;br /&gt;Today is community day and offers 2 conferences: One about Glassfish, and another about OSGi.&lt;br /&gt;&lt;br /&gt;I must say I would have loved to attend both, but, as always in this kind of conference, you have to make tough choices.&lt;br /&gt;&lt;br /&gt;Well... not so tough, as OSGi DevCon talks have a lot of diversity whereas Glassfish talks are a lot about Glassfish...&lt;br /&gt;Let's say I used diversity as a filter and leave it at that.&lt;br /&gt;I'll definitely try to attend some Glassfish 3.0 talk during Jazoon anyway.&lt;br /&gt;&lt;br /&gt;So stay tuned for regular updates my dear reader, and have a nice monday!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-3357216108364736666?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/3357216108364736666/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=3357216108364736666' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3357216108364736666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3357216108364736666'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/06/conferences-in-zurich-day-1-osgi-devcon.html' title='Conferences in Zurich, day 1 : OSGi DevCon Europe'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5357811671951128711</id><published>2009-05-27T16:34:00.003+02:00</published><updated>2009-05-27T19:05:24.017+02:00</updated><title type='text'>My wishes for a better Maven 2</title><content type='html'>My main concern with maven builds is their lack of stability. Mostly in terms of dependencies.&lt;br /&gt;&lt;br /&gt;This is why I think that the following simple (apparently as I guess implementing them, though it seems simple to me, would possibly imply errors in exotic plugins) wishes would save the day of a whole lot of people (including of course... me ;) ).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;First things first: Exclusions.&lt;/h4&gt;&lt;br /&gt;In a perfect world, everybody would declare dependencies properly (with a proper scope defined for &lt;br /&gt;each, and optional dependencies declared... optional...) and versions resolutions for conflicting dependencies would work exactly as expected.&lt;br /&gt;If you have used any of the repositories out there (even official ones) you know that some weird dependencies can irrupt in your project's &lt;i&gt;Manifest.mf&lt;/i&gt; file, &lt;i&gt;WEB-INF/lib&lt;/i&gt; folder, or any other proper place to put transitive or direct dependencies of your artifact.&lt;br /&gt;Moreover, if you are building complex multi-modules project, you'll know that versions are not always resolved as they should.&lt;br /&gt;&lt;br /&gt;Right now, the only option is to exclude artifacts one by one. What a pain in the arse!&lt;br /&gt;Please please please, add wildcard exclusion!!!, or even better, a &lt;b&gt;&amp;lt;transitive&amp;gt;true|false&amp;lt;/transitive&amp;gt;&lt;/b&gt; element to the &amp;lt;dependency/&amp;gt; element.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;One step further: I don't care about transitive&lt;/h4&gt;In some cases, you'd want to experiment, or are quite sure about the dependencies you want, but for a precise reason, don't want to retrieve any of the transitive dependencies.&lt;br /&gt;&lt;br /&gt;It would be really nice to add a &lt;b&gt;&amp;lt;transitive&amp;gt;true|false&amp;lt;/transitive&amp;gt;&lt;/b&gt; element to the &amp;lt;dependencies/&amp;gt; element of the pom.&lt;br /&gt;&lt;br /&gt;You would then be able to declare all the dependencies of your project without relying on transitive mechanisms.&lt;br /&gt;&lt;br /&gt;This would really be an asset when you are handing over your build to maintenance, or building a stable release.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Even better: How about making this automatic&lt;/h4&gt;How nice would it be in this case that when the project is in the early dynamic phases, you specify your basic dependencies and retrieve the rest transitively, and...&lt;br /&gt;...then...&lt;br /&gt;At some point where you want to stabilize things or be sure of the outcome, you just launch for example: &lt;b&gt;mvn dependency:flatten&lt;/b&gt; and "Voilà!" your pom.xml now contains all your project's transitive dependencies, with appropriate scopes computed, and the aforementioned &lt;b&gt;&amp;lt;transitive&amp;gt;false&amp;lt;/transitive&amp;gt;&lt;/b&gt; element added to the &amp;lt;dependencies/&amp;gt; element.&lt;br /&gt;&lt;br /&gt;I for myself would find this very intuitive and simple to use, without interfering with the current behaviour of maven at first glance (backward compatibility my friend!).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;For something completely different: splitting the local repository&lt;/h4&gt;&lt;br /&gt;This last wish is likely to remain a wish as I think it would require too much work.&lt;br /&gt;But it's a sad thing that the local repository is not split between a plugins repository and a artifacts repository in some way.&lt;br /&gt;The plugins repository would contain plugins and all their dependencies, and the artifacts repository would contain other artifacts and their dependencies.&lt;br /&gt;This would disallow the intrusion of plugins' dependencies in your build.&lt;br /&gt;&lt;br /&gt;Though this wish would not be a real issue anymore if the previous wishes could be granted.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;To sum it up: Dynamics and Automation, plus Control!&lt;/h4&gt;&lt;br /&gt;Maven 2 is a great tool and offers a very good way to have build with dynamically changing dependencies. When set up, you don't always have to go and look for the latest build of your dependencies, and can automatically retrieve them.&lt;br /&gt;&lt;br /&gt;Though sometimes, a bit more control is needed, and it would be very nice to have this kind of choice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT: After wishing I did my homework and went voting for &lt;a href="http://jira.codehaus.org/browse/MNG-1977"&gt;http://jira.codehaus.org/browse/MNG-1977&lt;/a&gt; Go there and vote for it!!!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5357811671951128711?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5357811671951128711/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5357811671951128711' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5357811671951128711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5357811671951128711'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/05/my-wishes-for-better-maven-2.html' title='My wishes for a better Maven 2'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6971342573187211471</id><published>2009-03-02T19:49:00.005+01:00</published><updated>2009-03-02T23:44:26.795+01:00</updated><title type='text'>Dwell in hell JaxB!</title><content type='html'>Feel free to join the JaxB bashing... ;)&lt;br /&gt;&lt;br /&gt;As pointed by &lt;a href="http://twitter.com/ddossot/status/1269729660"&gt;David&lt;/a&gt; Josh is not really happy about JaxB's behaviour.&lt;br /&gt;&lt;br /&gt;It is even worse than Josh thinks or experienced, as the specification is based on the fact that your objects are plain Java Beans (with all the quirks of this damn spec...).&lt;br /&gt;&lt;br /&gt;I had an equivalent unpleasant surprise while giving a training on JaxWS (which specifies the use of JaxB recently) last december.&lt;br /&gt;&lt;br /&gt;The week before this training, I had worked on a domain-driven persistence design, with immutable objects, write-only repositories and read-only fast-lanes (will soon blog about it hopefully if it's interesting enough)...&lt;br /&gt;With this purist state of mind, I started creating in front of all the "students" a beautiful domain with Immutables (BTW I should have stuck with the default examples, though I wanted to demonstrate how easy it is to use JaxWS starting from scratch).&lt;br /&gt;Yet be warned, an Immutable cannot be a JavaBean, as these beasts can only be created with the default no-args Constructor and their state modified by their getters/setters....&lt;br /&gt;&lt;br /&gt;Isn't that the stupidest thing in the world????&lt;br /&gt;&lt;br /&gt;What would be a best candidate for disconnected transfer (HTTP usually with WS) than an immutable object?&lt;br /&gt;&lt;br /&gt;I know for a fact that an External view of the service should separate my domain from the view I give from it to the outside, yet even if &lt;a href="http://dozer.sourceforge.net/"&gt;good APIs&lt;/a&gt; exist for the copy of the states of beans, it's still a shame to be forced into java beans which are only useful for damn Swing developments (BTW I think I could wish hell to swing for being part of the JDK and being the motivation for the addition of a default implementation of database and web services inside the JDK/JRE.... what a nonsense).&lt;br /&gt;&lt;br /&gt;So in the end I completely agree with Josh and am still looking for a better ways to use immutables in J(2)EE applications. It seems that the whole platform was build without these beasts in mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6971342573187211471?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6971342573187211471/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6971342573187211471' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6971342573187211471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6971342573187211471'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/03/dwell-in-hell-jaxb.html' title='Dwell in hell JaxB!'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8914654877285996047</id><published>2009-02-16T22:44:00.001+01:00</published><updated>2009-02-16T22:45:56.668+01:00</updated><title type='text'>Users are crappy designers</title><content type='html'>This title is of course a bit abrupt on purpose.&lt;br /&gt;What I mean is users are very often crappy "web applications" designers... still abrupt, but scoped ;). Though I'm not sure they would be good designers for any other type of application, but they are definitely used to using them a lot more.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Let's illustrate that.&lt;/h4&gt;In I.T. brand new projects are quite rare, therefore implying lots of rewriting from existing applications. As of brand new projects, they are often inspired by existing ones developed for the same system, or from a previous product built by the integrator.&lt;br /&gt;A user, or "core-business" worker, has a tendency (and we all share this burden) not to change his habits. And former application is part of these habits, along with massive paper usage, attachments to emails, client-server applications (even though this last point is not really directly relevant to the user, its side-effects cripple today's web applications, as we'll see further in this post).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Gathering requirements&lt;/h4&gt;A real effort of will is necessary when gathering requirements to avoid asking any questions to the user about how he thinks the UI should look like. This will most likely not help you design your application in any way.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;False approach to novelty&lt;/h4&gt;Adding a new face on an existing fat-client application by building a copy-cat web application is really a bad idea.&lt;br /&gt;It may look cleaner (though this depends on taste, but web applications are a lot easier to style and to adapt visually than fat clients) though is not bringing any functional novelty, and often opposite to the all-powerful user's habits (keyboard shortcuts for example) without improving the tool in the aspects of the work the user has to do.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Real knowledge of the work flow&lt;/h4&gt;Still the user has his hands on the treasure of treasures: the definite requirements a.k.a. the work flow a.k.a. the part that is almost never in the requirements.&lt;br /&gt;Of course I'm insisting on "almost", as in fact I've seen a lot of projects where it's almost too much detailed, to the point that it's really hard, for anybody trying to build a use-able tool out of it, not to get confused or to discuss for pointless hours about it.&lt;br /&gt;Because, face it, users, or even somebody talking for them, are hard beasts to tame, and even harder to have around. In most cases they are your legendary beast, you'll only read about them in the magic books of basic requirements. In Software Eden (the one advocated by Agile practices) the user is always at hand and grants you with insightful help all the time.&lt;br /&gt;Hey! Stop that dream for now! 'not talking about ideal situations there!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Real lies about the work flow&lt;/h4&gt;Users really know what they have to do and how, and at some point you may have a good grasp on it.&lt;br /&gt;This is the time, you know, this time just the day before the official release, that it hits you abruptly on the forehead: Users' lies about his work flow.&lt;br /&gt;In the requirements, during the demo, you'll face a real user or a simili-user that will act like a theoretically perfect user.&lt;br /&gt;Let's face it though: Users are not perfect, and often will leave out things that are crucial in applications design, like timing, context, concurrent use of other applications...etc&lt;br /&gt;These "lies" are not intentional, this is what people often call omissions, though when users are omitting things like the coffee break that makes it necessary to save forms before they are submitted in order to be able to work on them later on, or the fact that they will often have to work on behalf of some other user, or working offline, accessing the application through a PDA, being notified of anything important immediatly (with a very relative sense of immediatly standing from 1 sec. to 1/2 hour, to the infamously unprecise ASAP...).&lt;br /&gt;All these questions should be brought up front, though are usually not part of the "noble" requirements.&lt;br /&gt;One may argue that they should be and I cannot agree more.&lt;br /&gt;Just keep in mind that users will have bad ideas on how it should be done, and which technology to use. They just know about their agenda, how to do their core-business, and have habits (which may include technology bits...).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;So where do we go from here&lt;/h4&gt;&lt;br /&gt;Do never forget to ask the users about their habits.&lt;br /&gt;In order to build on them for better functionalities, better tools.&lt;br /&gt;In order to replace bad habits with better functionalities, better tools + training ;)&lt;br /&gt;&lt;br /&gt;Do never forget to ask the users about their timing.&lt;br /&gt;Because their minute-to-minute agenda will have a very important impact on the outcome.&lt;br /&gt;Because you need to taylor the system to their agenda, even if they don't already know how.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8914654877285996047?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8914654877285996047/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8914654877285996047' title='9 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8914654877285996047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8914654877285996047'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2009/02/users-are-crappy-designers.html' title='Users are crappy designers'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5190909950963849087</id><published>2008-10-02T23:26:00.000+02:00</published><updated>2009-02-01T09:25:53.178+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Meme(me)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__O-4q_CaPyA/SOU9H3sLMyI/AAAAAAAALJ8/JbWG8YPAfcI/s1600-h/instantane.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/__O-4q_CaPyA/SOU9H3sLMyI/AAAAAAAALJ8/syVLksoXT6s/s320-R/instantane.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://ddossot.blogspot.com/2008/10/mememe.html"&gt;David&lt;/a&gt;:&lt;br /&gt;1. Take a picture of yourself right now.&lt;br /&gt;2. Don’t change your clothes, don’t fix your hair…just take a picture.&lt;br /&gt;3. Post that picture with NO editing.&lt;br /&gt;4. Post these instructions with your picture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5190909950963849087?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5190909950963849087/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5190909950963849087' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5190909950963849087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5190909950963849087'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/10/mememe.html' title='Meme(me)'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__O-4q_CaPyA/SOU9H3sLMyI/AAAAAAAALJ8/syVLksoXT6s/s72-Rc/instantane.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7863554392956230819</id><published>2008-09-11T12:31:00.013+02:00</published><updated>2009-02-01T09:25:40.216+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Javascript: The Black Beast of Aaaaarrrrgggghhhh (part 3)</title><content type='html'>With this third part, we're starting to dig into the interesting bits: modules or how to manage the scope of your code.&lt;br /&gt;&lt;b&gt;EDIT: Modules are delayed to a further blog post :p&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;But before this, let's talk about something else as an appetizer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%;"&gt;Boolean(false) is truthy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Javascript shares the burden of C-Style truthy/falsy concept. These are non-boolean expressions that can be treated as a boolean value. It is both powerful and very dangerous, because (once again) it presumes the developer already knows everything about the language's subtleties.&lt;br /&gt;&lt;br /&gt;So let's first list the falsy elements, all the rest being truthy: &lt;b&gt;0&lt;/b&gt;,&lt;b&gt;false&lt;/b&gt; (of course), &lt;b&gt;empty string: "" or ''&lt;/b&gt;, &lt;b&gt;null&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Presented this way, it seems quite simple... though there are some quirks due to where and how you're going to take advantage of these evaluations.&lt;br /&gt;For example, 0 evaluates to false, while '0' evaluates to true (non-empty string). This sounds easy once again, but can be tricky when you receive a variable value and just test it this way: &lt;i&gt;if(myVar){...}&lt;/i&gt;. It can lead to very counter-intuitive tests...&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;var myVar=new Boolean(false);&lt;br /&gt;if(myVar){&lt;br /&gt;    alert("true");&lt;br /&gt;// Never use alert() in real applications, it blocks all javascript execution in all tabs of a browser until you close it.&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;This is one example of code where one should stop thinking in another language's logic (Java or C# for example). &lt;i&gt;new Boolean(false)&lt;/i&gt; is an object, and an object is always truthy, ending up with an alert popup showing "true".&lt;br /&gt;Though if you replace &lt;i&gt;if(myVar)...&lt;/i&gt; with &lt;i&gt;if(myVar==true)...&lt;/i&gt; the test will end up as expected, with nothing happening.&lt;br /&gt;This can be confusing... I agree, and it did confuse me. Until I heard about the === operator. In javascript, == was designed as a tolerant operator, which accepts 1=='1' as a true assertion. So in later versions of javascript (when war between Netscape and IE was raging a while ago), a new === operator was introduced for a comparison of references. This operator is the one you'd want to use in order to be sure that an object is the same as another.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oh and by the way, this may not be the last of my posts about javascript... so I'm going to drop in some of the references I used, in order not to forget them, and leave you my dear only reader with something else to read ;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.isolani.co.uk/blog/javascript/TruthyFalsyAndTypeCasting"&gt;a Blog post about Truthy falsy&lt;/a&gt;&lt;br /&gt;&lt;a href="http://javascript.crockford.com"&gt;The source of all javascript wisdom ;): Sir Crockford.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7863554392956230819?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7863554392956230819/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7863554392956230819' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7863554392956230819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7863554392956230819'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/09/javascript-black-beast-of_11.html' title='Javascript: The Black Beast of Aaaaarrrrgggghhhh (part 3)'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2502883990481321637</id><published>2008-09-09T12:21:00.023+02:00</published><updated>2009-02-01T09:25:40.217+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Javascript: The Black Beast of Aaaaarrrrgggghhhh (part 2)</title><content type='html'>First part of this "series" introduced basic concepts of the javascript language.&lt;br /&gt;This new entry will introduce the functional nature of javascript.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In javascript, there is (almost) no limit to where a function can be defined (as opposed to a class language like java for example). It doesn't even have to have a name and can be defined anonymously. A function can also be created as a local variable in another function's body (inner function).&lt;br /&gt;&lt;br /&gt;Functions represent the real power of javascript. Not understanding them means not understanding javascript.&lt;br /&gt;&lt;br /&gt;Javascript uses functions all around. Functions are &lt;b&gt;objects&lt;/b&gt;, and as such can be passed as parameters to other functions, or returned from other function's invocation.&lt;br /&gt;&lt;br /&gt;As there is no proper class, one may think that there is no such thing as a method. This is not really the case. In fact one may call "method" any function defined as an attribute to an object.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var myObj={&lt;br /&gt;    myAttribute:"valueOfAttribute",&lt;br /&gt;    myMethod: function(){&lt;br /&gt;        if(console){&lt;br /&gt;            console.log("hello universe");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Functions are (almost) always stored in a variable of some kind, and can even be stored in local variables. &lt;br /&gt;In fact, defining a function in an html script tag like this:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function myFunction(){&lt;br /&gt;    if(console){&lt;br /&gt;        console.log("hello universe");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;... is completely equivalent to the following definition:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var myFunction=function(){&lt;br /&gt;    if(console){&lt;br /&gt;        console.log("hello universe");&lt;br /&gt;    }&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;This form is much clearer, as there is now no ambiguity about its object nature and about where it is stored... at least when you understand another little thing...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%;"&gt;The global object:&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;In javascript, if you don't use the var keyword, or if you define variables in no specific construct &lt;/b&gt;(e.g. not in a function, an object, an array, or any conditional construct like if, for...etc), &lt;b&gt;variables are defined as attributes to the global object. The global object depends on the runtime you are coding for. In a browser, this global object is the &lt;u&gt;window&lt;/u&gt; object.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now read my lips: &lt;b&gt;"GLOBAL OBJECT IS EVIL"&lt;/b&gt;. This global space is the worst place for the definition of your code. Oh, and by the way, variables defined without the var keyword are &lt;u&gt;always&lt;/u&gt; defined as attributes of this global object, regardless of their scope.&lt;br /&gt;&lt;br /&gt;So, what's the solution to this?&lt;br /&gt;&lt;br /&gt;Create your own &lt;b&gt;namespace&lt;/b&gt;! &lt;br /&gt;&lt;br /&gt;You'll often ear about namespaces in the javascript world. In fact, this just refers to a container (javascript object) containing all the objects, states  and functions needed for your code. This allows you not to pollute the global namespace (though this is not sufficient to disallow access to private states, wait for 3rd part of this blog series on the module pattern).&lt;br /&gt;&lt;br /&gt;YahooUI started this trend with the YAHOO namespace. Other frameworks have also created their namespace(s) (Ext.* for ExtJS, dojo.* for Dojo, a global "$" or "jQuery" object for JQuery, Prototype.* for prototype, etc...). This allows the use of various "libraries" that are less likely to collide, or at least in a more controlled fashion.&lt;br /&gt;&lt;br /&gt;As demonstrated in previous blog entry, creating an object, and therefore a namespace, is very easy:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var MyNamespace={};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now adding elements to this namespace is as easy as invoking&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;MyNamespace.myElement="element's value";&lt;br /&gt;MyNamespace.myFunction=function(){&lt;br /&gt;    if(console){&lt;br /&gt;        console.log("hello universe");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can see that the function we mentionned before is now defined in a custom object (namespace) and that we can therefore invoke:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;MyNamespace.myFunction();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This exemple is of course very simplistic, and not very secure. In fact any code can replace these states, because objects don't have scopes! Let's detail this mind-boggling fact.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%;"&gt;Objects don't have scopes, functions do&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you create an object, its state is public and accessible to any code that has access to the object in the first place. Any other code can add, remove and update entries from this container.&lt;br /&gt;&lt;br /&gt;The only mean of reducing scope in javascript is functions. Hence the functional nature of the language.&lt;br /&gt;&lt;br /&gt;Whatever is defined in a function is only accessible to this function and to any other construct defined in this function. &lt;b&gt;The only visible thing from a given function, is the result from its invocation.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var myFunction=function(){&lt;br /&gt;    var myVar="hello universe";&lt;br /&gt;    // let's create an object accessing this 'private' state&lt;br /&gt;    var result={&lt;br /&gt;        myPublicVar:myVar+", I'm a public variable"&lt;br /&gt;    };&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;// next line will output undefined, because myVar is local to the function only.&lt;br /&gt;console.log(myFunction.myVar);&lt;br /&gt;// the next one will output 'hello universe, I'm a public variable', because the object returned by the invocation has access to the context of the function it was defined in (by the way, this is what is usually called access through a closure).&lt;br /&gt;console.log(myFunction().myPublicVar);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you may have noticed, and as a little conclusion to this post, one thing you really have to be careful with when reading or writing javascript code, is the presence of &lt;b&gt;()&lt;/b&gt;. Whether a function is invoked or not is really important. This will determine whether you are left with the function object itself, ready to be invoked at will, or with the result from this function's invocation. &lt;br /&gt;&lt;br /&gt;This is it for the moment. next entry will deal with the constructors (and the other ways to invoke a function), the concept of module, the truthy/falsy idea, and also give credit to the reference(s) used to build this little introduction to javascript ;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2502883990481321637?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2502883990481321637/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2502883990481321637' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2502883990481321637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2502883990481321637'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/09/javascript-black-beast-of.html' title='Javascript: The Black Beast of Aaaaarrrrgggghhhh (part 2)'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-3157869908889699322</id><published>2008-06-21T23:51:00.004+02:00</published><updated>2009-02-01T09:25:40.217+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Javascript: The Black Beast of Aaaaarrrrgggghhhh (part 1)</title><content type='html'>I've really wanted (and still want) to have a grasp on how Javascript should be coded &lt;span style="font-weight: bold;"&gt;the Javascript way&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;As a regular &lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt; (and occasionally other languages) developer, I've sometimes used javascript with this constant sense of weirdness on the edges, and without being able to grasp the concepts in it.&lt;br /&gt;In fact, the browsers' DOM and the history of the Javascript implementations in browsers contributed to this fuzziness (as we'll see later).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%;"&gt;Basic concepts:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Javascript has very little to do with Java. In fact its name only contains java for marketting purposes of that time. Javascript is a language from the C family like java and uses a lot of the same operators and syntax.&lt;br /&gt;&lt;br /&gt;This can be confusing, because Java and Javascript are indeed &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; different.&lt;br /&gt;&lt;br /&gt;While &lt;span style="font-style:italic;"&gt;Java&lt;/span&gt; is based on classes and inheritance &lt;span style="font-style:italic;"&gt;between classes&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;Javascript&lt;/span&gt; is based on objects and inheritance between &lt;span style="font-weight:bold;"&gt;objects&lt;/span&gt;.&lt;br /&gt;Javascript is also a prototype-based language (which is I think the hardest part to grasp...).&lt;br /&gt;&lt;br /&gt;This may sound a bit abstract, but one cannot hope coding proper javascript without at least understanding these concepts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%;"&gt;A little pause&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before we start explaining the previous concepts, you must be aware that Javascript's history has been very clumsy to say the least.&lt;br /&gt;Some good decisions were taken, and some very bad ones.&lt;br /&gt;&lt;br /&gt;Most of the bad decisions were made during the browsers' war (Netscape vs Internet Explorer) with a purpose to attract developers from Java/C++ or VBScript for example.&lt;br /&gt;&lt;br /&gt;These bad decisions leave strange reserved words in the language (like 'abstract' or 'interface' which are never used,) that should never be used or even cannot be used, and constructs that come from other worlds.&lt;br /&gt;&lt;br /&gt;If you add to that the incompatibilities of APIs and models between browsers, it's easy to understand why Javascript is still often considered as a toy language.&lt;br /&gt;&lt;br /&gt;So don't be surprised by the number of things that should not be used or touched in Javascript.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%;"&gt;Javascript is not a toy language, nor a poor OO language.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In fact, in a way, Javascript is more OO than Java is ;).&lt;br /&gt;In Javascript (almost) everything is object (think instances, forget about classes!).&lt;br /&gt;&lt;br /&gt;Here's a list of the things that are NOT objects in Javascript:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;numbers&lt;/li&gt;&lt;br /&gt;&lt;li&gt;strings&lt;/li&gt;&lt;br /&gt;&lt;li&gt;booleans&lt;/li&gt;&lt;br /&gt;&lt;li&gt;null&lt;/li&gt;&lt;br /&gt;&lt;li&gt;undefined&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Everything else is objects.&lt;/span&gt;&lt;br /&gt;Yes, everything.&lt;br /&gt;Keep that in mind, and remember (again) that I said Object (instance), not Class.&lt;br /&gt;&lt;br /&gt;One really clever thing that was done in javascript is the &lt;span style="font-weight: bold;"&gt;merging of Objects and Hashtable&lt;/span&gt;.&lt;br /&gt;A new Object is an empty container of key/value pairs.&lt;br /&gt;&lt;br /&gt;For example, one can create an object using:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var myObject={};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As Javascript is loosely typed, there is no class definition. You just created an Object with nothing in it.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var user={&lt;br /&gt;    firstname="Pierre-Antoine"&lt;br /&gt;    ,'lastname'='Grégoire'&lt;br /&gt;    ,age=31&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, it's quite easy to create an object using key/values.&lt;br /&gt;As you also probably noticed, keys can be String, therefore allowing access to members in two ways:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;using the dot notation: &lt;span style="font-style: italic;"&gt;user.firstName&lt;/span&gt; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;using the subscript notation: &lt;span style="font-style: italic;"&gt;user["firstname"]&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This is it for this first short part. Next blog entry will introduce the functional nature of Javascript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-3157869908889699322?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/3157869908889699322/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=3157869908889699322' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3157869908889699322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3157869908889699322'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/04/javascript-black-beast-of.html' title='Javascript: The Black Beast of Aaaaarrrrgggghhhh (part 1)'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2503383183415333021</id><published>2008-06-21T10:36:00.002+02:00</published><updated>2009-02-01T09:25:22.949+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: RESTFUL Web Services</title><content type='html'>&lt;span style="font-style:italic;"&gt;Late publication, didn't have the time back then ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;A general presentation of REST:&lt;/span&gt;&lt;br /&gt;- Everything is a resource (which has a value to the user). These are expressed by URIs and nouns&lt;br /&gt;- Uniform interface (GET, HEAD, POST, PUT, DELETE, OPTIONS, and optionally TRACE)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;GET:&lt;/span&gt; safe operation (can be repeated) that retrieves a representation of the Resource.&lt;br /&gt; GET is Cacheable (Servers return ETag or LastModified)&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;HEAD:&lt;/span&gt; identical to GET without response body, only headers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;POST:&lt;/span&gt; creates a new Resource (Typically as a child to another Resource)&lt;br /&gt; POST /hotels/1/bookings/ for example returns a location like: /hotels/1/bookings/50/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PUT:&lt;/span&gt; updates a resource or creates a resource when the destination URI is known.&lt;br /&gt; As opposed to POST this can be repeated affecting the same resource.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DELETE:&lt;/span&gt; IdemPotent, if an item is not there, it doesn't fail.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;OPTIONS:&lt;/span&gt; retrieves allowed HTTP methods on a resource.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Resource reprensentations&lt;/span&gt; =&gt; multiple representations (html, image, json... etc)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Stateless conversation:&lt;/span&gt; no HTTP Session! State is maintained through transitions between links. As a result, the result is very scalable and enforces loose coupling.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Hypermedia:&lt;/span&gt; fancy word for links ;), XLink is a spec for that and allows seamless evolution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2503383183415333021?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2503383183415333021/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2503383183415333021' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2503383183415333021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2503383183415333021'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-restful-web-services.html' title='SpringOne08: RESTFUL Web Services'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5755763170739435616</id><published>2008-06-21T10:33:00.001+02:00</published><updated>2009-02-01T09:25:22.950+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: MDA and Spring</title><content type='html'>&lt;span style="font-style:italic;"&gt;Late publication... didn't have the time back then ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Capgemini NL featured talk.&lt;br /&gt;Begins with some basic concepts of MD*.&lt;br /&gt;&lt;br /&gt;Then describes what an MDA tool is supposed to do and who's going to use it.&lt;br /&gt;This is one point of view.&lt;br /&gt;&lt;br /&gt;Pitfalls:&lt;br /&gt;- Prevent "architecture-driven modeling" using markings.&lt;br /&gt;- Keep applying traditional patterns of re-use, even if code generation can allow to generate a lot of boiler-plate code.&lt;br /&gt;- Don't "u-em-ellify" everything.&lt;br /&gt;- Don't touch your generated files (I tend to disagree... it just means that you need appropriate tools for that, though it does have problems with refactoring, and he recommends using Abstract classes).&lt;br /&gt;&lt;br /&gt;Recommended tooling:&lt;br /&gt;- MDA tools: OSS=&gt; OAW, Acceléo Commercial=&gt; OptimalJ&lt;br /&gt;- be sure to have markings available&lt;br /&gt;&lt;br /&gt;Advantages of MDA:&lt;br /&gt;- From his experience, MDA allows to shift most of the issues in an application from the boilerplate code towards the business code. It seems obvious, but it's always nice to have additional practical feedback.&lt;br /&gt;- Development and/or project speedup (I guess it depends on the side of the project and the extent of the use of MDA).&lt;br /&gt;- Consistent code: enforce architectural patterns&lt;br /&gt;- more flexibility&lt;br /&gt;&lt;br /&gt;Prerequisites:&lt;br /&gt;- knowledge of the models / languages&lt;br /&gt;- more tools, more learning curve&lt;br /&gt;- creating templates is hard: garbage in == garbage out&lt;br /&gt;&lt;br /&gt;In the end a quite conventional talk, yet interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5755763170739435616?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5755763170739435616/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5755763170739435616' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5755763170739435616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5755763170739435616'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-mda-and-spring.html' title='SpringOne08: MDA and Spring'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2300566875033704829</id><published>2008-06-12T13:54:00.003+02:00</published><updated>2009-02-01T09:25:22.950+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Spring Web Services</title><content type='html'>Read the interesting (IM&lt;span style="font-weight:bold;"&gt;N&lt;/span&gt;SHO) bits below.&lt;br /&gt;&lt;br /&gt;Spring Web Services is Contract-First.&lt;br /&gt;&lt;br /&gt;Tools for contract infering from an xml instance:&lt;br /&gt;Trang, XMLSpy, Microsoft XML to Schema (and an additional: Oxygen XML does that if I remember well). Why isn't there a java library for that (for use in IDEs and scripts)?&lt;br /&gt;&lt;br /&gt;(Of course) contract first is really a good practice, and schemas (once you get to know them) are really a very expressive language for message content description.&lt;br /&gt;&lt;br /&gt;New in Spring Web Services 1.5: &lt;br /&gt;- JMS and Mail transports (a bit of overlap with Spring Integration... though this may merge sooner or later).&lt;br /&gt;- WSS4J support (including client-side)&lt;br /&gt;- WS-Addressing support&lt;br /&gt;- OSGI Bundles&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2300566875033704829?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2300566875033704829/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2300566875033704829' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2300566875033704829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2300566875033704829'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/spring08-spring-web-services.html' title='SpringOne08: Spring Web Services'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7666522232208317464</id><published>2008-06-12T00:41:00.004+02:00</published><updated>2009-02-01T09:25:22.950+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Spring Integration</title><content type='html'>Great talk, great features, though you can find everything he presented on the site and blog entries.&lt;br /&gt;&lt;br /&gt;I'll probably blog on this subject as soon as I give it a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7666522232208317464?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7666522232208317464/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7666522232208317464' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7666522232208317464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7666522232208317464'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-spring-integration.html' title='SpringOne08: Spring Integration'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8567006651912498647</id><published>2008-06-11T16:45:00.007+02:00</published><updated>2009-02-01T09:25:22.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Spring Batch</title><content type='html'>This illustrates (and answers) a question I've always asked myself: Why shouldn't we code batch jobs in java...? In fact It's a lot more portable, testable and encapsulate-able than most of the usually used languages/platform nowadays.&lt;br /&gt;&lt;br /&gt;Spring Batch 2.0 will be Java 5 ready.&lt;br /&gt;&lt;br /&gt;Really interesting talk, yet already partly seen last year, and...I passed out a bit.&lt;br /&gt;&lt;br /&gt;It seems that there is an underlying convergence between Spring Batch and Spring Integration (after all Batches are only integration operations that are longer or operate on larger sets of data, with a bit more requirements in the failure handling...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8567006651912498647?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8567006651912498647/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8567006651912498647' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8567006651912498647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8567006651912498647'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-spring-batch.html' title='SpringOne08: Spring Batch'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7067414490044986056</id><published>2008-06-11T15:03:00.007+02:00</published><updated>2009-02-01T09:25:22.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Security</title><content type='html'>Not Ben Alex, but let's not judge the speaker so fast ;)&lt;br /&gt;&lt;br /&gt;Interesting demo showing a completely unsecured Spring-based (of course) application completely secured on the fly using Acegi...uh sorry Spring Security (I actually got used to Acegi ;)). Quite classical, but enhances the improvements in the configuration.&lt;br /&gt;&lt;br /&gt;A few interesting things to know:&lt;br /&gt;- new Spring 2.x namespace for lighter configuration.&lt;br /&gt;- Only one filter: DelegatingFilterProxy with a filter chain behind.&lt;br /&gt;- REST Support: you can specify the method (POST, PUT, DELETE...) in the intercept-url element.&lt;br /&gt;- very nice ldap-user-service configuration... worth checking!!!&lt;br /&gt;- Embedded Apache DS: very nice!&lt;br /&gt;- easy to mix and match multiple schemes: OpenId for authentication, and JDBC for user details or NTML for Authentication and Active Directory for User details.&lt;br /&gt;&lt;br /&gt;He mentions an interesting possibility: only testing the securisation of methods by completely removing the call to the underlying method. Sadly he doesn't go into details.&lt;br /&gt;&lt;br /&gt;A nice practice also: securing based on permissions and not on roles. This is much better for further evolutions. Roles change, permissions less likely.&lt;br /&gt;&lt;br /&gt;In the end (I knew a bit from the tests I did recently) Spring Security is an improvement in terms of useability, (if not in features, it keeps the plethora of features of the original), on Acegi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7067414490044986056?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7067414490044986056/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7067414490044986056' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7067414490044986056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7067414490044986056'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-security.html' title='SpringOne08: Security'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-36793591028392886</id><published>2008-06-11T14:03:00.007+02:00</published><updated>2009-02-01T09:25:22.952+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Persistence Optimizations</title><content type='html'>DBA-Developer relationship, try to improve it... ok... too bad DBAs are not there to here that ;)&lt;br /&gt;&lt;br /&gt;Operational considerations:&lt;br /&gt;- Data volumes, row sizes&lt;br /&gt;- Growth estimates, update frequencies&lt;br /&gt;- Availability requirements&lt;br /&gt;- Testing/QA requirements&lt;br /&gt;&lt;br /&gt;Guidelines:&lt;br /&gt;- appropriate data types&lt;br /&gt;- small rows&lt;br /&gt;- split large tables with one-to-one table containing fewer used fields&lt;br /&gt;- improve indexes&lt;br /&gt;- normalize data&lt;br /&gt;- partition data (if available)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Most important: application tuning:&lt;/span&gt;&lt;br /&gt;- keep transactions short&lt;br /&gt;- bulk processes =&gt; off-hours&lt;br /&gt;- understand locking (on writes, on reads...escalation of row locks to table locks in case of many reads...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;ORM tuning:&lt;/span&gt;&lt;br /&gt;- watch Criteria, no NULLS in the WHERE clause, they are not indexed&lt;br /&gt;- like with % at the beginning: no index either&lt;br /&gt;- pick an appropriate TransactionManager (only use XA when accessing JMS and database together)&lt;br /&gt;- use READONLY, try to avoid SERIALIZABLE&lt;br /&gt;- use lazy-loading&lt;br /&gt;- use caching&lt;br /&gt;&lt;br /&gt;JDBC Tuning:&lt;br /&gt;- set the fetch size on connections (defaults to 10 for Oracle driver...) lessens the network roundtrips&lt;br /&gt;&lt;br /&gt;Hibernate Tuning:&lt;br /&gt;- use "select" fetch mode for relationships needed sometimes - results in 1 or 2 queries.&lt;br /&gt;- use "join" fetch mode for relationships needed all the time (try to limit to one per object)&lt;br /&gt;- use "batch-size" to prefetch a number of proxies and/or collections&lt;br /&gt;&lt;br /&gt;Bulk operations:&lt;br /&gt;- do it in the database to avoid network (SQL statement, stored procedure, native data load tools...)&lt;br /&gt;- if you need to do it from the application: JdbcTemplate (batchUpdate), SimpleJdbcInsert (executeBatch), Spring Batch (BatchSqlUpdateItemWriter), Hibernate (set hibernate.jdbc.batch_size and flush and clear session after each batch)&lt;br /&gt;&lt;br /&gt;SQL Tuning:&lt;br /&gt;- Capture SQL&lt;br /&gt;- Run EXPLAIN&lt;br /&gt;- adjust: analyse, tweak optimizer, add index&lt;br /&gt;- repeat until adequate performance&lt;br /&gt;- ASK for help from your DBA ;)&lt;br /&gt;&lt;br /&gt;OpenSource JDBC monitors:&lt;br /&gt;- p6spy&lt;br /&gt;- Elvyx&lt;br /&gt;- JDBCSpy&lt;br /&gt;&lt;br /&gt;Database specific tools:&lt;br /&gt;- MySQL (slow query log with --log-slow-queries or --log-queries-not-using-indexes)&lt;br /&gt;- Oracle: Enterprise Manager, Statspack&lt;br /&gt;- Oracle XA: Monitor Top SQL&lt;br /&gt;&lt;br /&gt;Interesting tips for Oracle:&lt;br /&gt;- Use the call to a function setting the module name in Oracle in the validation query for the connection&lt;br /&gt;- Use explain and autotrace in Oracle SQL Developer&lt;br /&gt;- Use ANALYSE TABLE [table] COMPUTE STATISTICS&lt;br /&gt;- Use ANALYSE INDEX [index] COMPUTE STATISTICS&lt;br /&gt;&lt;br /&gt;Database Tuning:&lt;br /&gt;- Memory (Global Area SGA, Session Area PGA)&lt;br /&gt;- Disk (Block size, File placement)&lt;br /&gt;&lt;br /&gt;Talks about a ProxyDatasource during Q&amp;A. This seems to allow to transmit the credentials of the interactive user. Could be interesting for refactoring of legacy Oracle Forms applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-36793591028392886?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/36793591028392886/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=36793591028392886' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/36793591028392886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/36793591028392886'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-persistence-optimizations.html' title='SpringOne08: Persistence Optimizations'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-3183645856531061390</id><published>2008-06-11T12:19:00.010+02:00</published><updated>2009-02-01T09:25:22.952+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Spring 2.5 to Spring 3.0</title><content type='html'>This presentation talks about 2.5 and the future (3.0).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2.5 summary:&lt;/span&gt;&lt;br /&gt;- 2.0 kernel so-to-say plus additional features.&lt;br /&gt;- end of 1.3 support (who cares? ;););) )&lt;br /&gt;- JDK 1.6 support: JDBC 4.0, JMX MXBeans (supports runtime snapshots)&lt;br /&gt;- AspectJ load-time weaving (available in 2.0 but not mainstream as in 2.5) through a platform support or a generic Spring VM agent using &amp;lt;context:load-time-weaver /&amp;gt;&lt;br /&gt;- JEE 5.0 support (JPA support is improved, EclipseLink support) and all other JEE 5.0 APIs&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;A bit of details on 2.5:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;JSR 250 Common Annotations:&lt;/span&gt;&lt;br /&gt;Good: @PostConstruct, @PreDestroy&lt;br /&gt;Bad: @Resource ;);) of course, this annotation is a bit limited (injects a resource from JNDI from a name in a setter or field)... yet a standard. Life is a bitch... though Spring allows using it without JNDI :).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Other annotations:&lt;/span&gt;&lt;br /&gt;- @WebServiceRef/@EJB (should have been named @EJBRef... life is really a bitch)&lt;br /&gt;- @TransactionAttribute (EJB 3 transaction demarcation... a bit limited)&lt;br /&gt;- @PersistenceContext / @PersistenceUnit already supported in 2.0: JPA resource injection&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;@Autowired Spring annotation&lt;/span&gt;&lt;br /&gt;- on fields, configuration methods, constructors&lt;br /&gt;- nice sweet-spot between autowiring by type and autowiring by name: annotation-driven, less wild-guessing.&lt;br /&gt;- @Qualifier allows to narrow the potential autowired components if multiple are available. This is also available in the xml syntax in beans. Qualifier can be a bean name or an annotation applied to a bean.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;@Configurable with AspectJ&lt;/span&gt;&lt;br /&gt;- classes can be weaved and may be created by using a simple "new" constructor call!&lt;br /&gt;- using &amp;lt;context:load-time-weaver aspectj-weaving="on"/&amp;gt; and &amp;lt;context:spring-configured /&amp;gt; (and of course the appropriate class-loader/agent).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;@Transactional with AspectJ&lt;/span&gt;&lt;br /&gt;- using &amp;lt;context:load-time-weaver aspectj-weaving="on"/&amp;gt; and &amp;lt;tx:annotation-driven mode="aspectj" transaction-manager="......&lt;br /&gt;- avoids creation of proxies by using load-time weaving.&lt;br /&gt;- also works for private and protected methods, and for code from same component (common problem with proxies).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Annotated MVC:&lt;/span&gt;&lt;br /&gt;- @Controller, @RequestMapping...etc (I already tested it, you should try it ;) )&lt;br /&gt;- allows POJO Controllers for classic methods, or in portlets...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Test Context Framework:&lt;/span&gt;&lt;br /&gt;- @ContextConfiguration, @TransactionConfiguration&lt;br /&gt;- works with JUnit 4.4 (@RunWith(SpringJUnit4ClassRunner.class)) and TestNG&lt;br /&gt;- no use of class hierarchies... nice and light ;) (a bit troubling though as the test almost contains anything except metadata....)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Recommandations:&lt;/span&gt;&lt;br /&gt;- Option 1: XML-based configuration complemented with annotations.&lt;br /&gt;- Option 2: more radical: Fully annotated components. (Not that much an XML hater... so it seems a bit over-strict)...&lt;br /&gt;- Externalized configuration =&gt; XML&lt;br /&gt;- Embedded configuration =&gt; Annotations&lt;br /&gt;- Find the balance, and mix and match!!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Spring 3.0 insights:&lt;/span&gt;&lt;br /&gt;- Spring 2.5.5,2.5.6 up until July (OSGI refinements)&lt;br /&gt;- Spring 3.0 RC1 (August)&lt;br /&gt;- Spring 3.0 GA in Q4: Java 5 in the core (internal use of Generics and varargs), support of Portlet 2.0, preparation of Servlet 3.0,  =&gt; REST support, EL support, conversational support...&lt;br /&gt;- Backwards compatibility with removal of deprecated APIs.&lt;br /&gt;Pruning and Deprecation:&lt;br /&gt;-prune: Commons Attributes&lt;br /&gt;-prune: Toplink (EclipseLink)&lt;br /&gt;-deprecated: pre JDK 5.0 support&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-3183645856531061390?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/3183645856531061390/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=3183645856531061390' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3183645856531061390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3183645856531061390'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-spring-25-to-spring-30.html' title='SpringOne08: Spring 2.5 to Spring 3.0'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7221388154222319940</id><published>2008-06-11T09:30:00.010+02:00</published><updated>2009-02-01T09:25:22.952+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>SpringOne08: Keynote</title><content type='html'>9h30, Keynote should start any minute.&lt;br /&gt;&lt;br /&gt;First, the main local organizer of Spring One talks about his baby: Parleys. He shows off a very nice Flex-based UI. Flex is definitely nice, and what they've done with id also! Check for version 2 of Parleys very soon, it's great!&lt;br /&gt;&lt;br /&gt;Rod Johnson:&lt;br /&gt;A bit of commercial Blah... (sorry, but that's it... :P) though the content is quite relevant.&lt;br /&gt;This quickly turns into a (little bit) more technical talk.&lt;br /&gt;It also contains interesting bits that I didn't know of or have not yet tested:&lt;br /&gt;- Use of qualifiers in Annotation and XML configuration&lt;br /&gt;- support for Meta-Annotations (annotate annotations ;)) which allows to use your own meta-tagging for your component types and then annotate them with Spring Annotations , the org.springframework.stereotypes package also provides sensible defaults.&lt;br /&gt;- Junit 4 support through specific runner (haven't had the opportunity to test it yet, but will indeed do it very soon!)&lt;br /&gt;&lt;br /&gt;Spring Integration is mentionned there, and I think (see later in this post) that this may be very soon a very important Spring project...&lt;br /&gt;&lt;br /&gt;Enters Keith Donald who talks about the web tier.&lt;br /&gt;Interesting Javascript module... worth following...&lt;br /&gt;&lt;br /&gt;Rod Johnson again:&lt;br /&gt;Spring Powered applications: replaces more and more the JEE container.&lt;br /&gt;Decoupling of business logic from deployment platform in terms of choice. (can be argued with their new server which relies a lot on Spring ;) ).&lt;br /&gt;Obviously leads to Springsource Application Platform.&lt;br /&gt;&lt;br /&gt;Christian Dupuis:&lt;br /&gt;Nice presentation of STS. Should have been preceded by a SpringSource AP in-depth presentation.&lt;br /&gt;&lt;br /&gt;Peter Cooper-Ellis, comes from BEA, and gives a little talk about his view of SpringSource and Spring.&lt;br /&gt;&lt;br /&gt;Rod Johnson:&lt;br /&gt;Predictions =&gt; most interesting: app server and ESB fusion (see Spring integration merging with Spring AP ;), it seems so obvious)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7221388154222319940?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7221388154222319940/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7221388154222319940' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7221388154222319940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7221388154222319940'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/springone08-keynote.html' title='SpringOne08: Keynote'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8782060126346271806</id><published>2008-06-10T22:28:00.001+02:00</published><updated>2009-02-01T09:25:22.953+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One minus One</title><content type='html'>Just to tell the few potential readers of this blog that I'll blog about Spring One the two coming days from Antwerpen, Belgium.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8782060126346271806?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8782060126346271806/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8782060126346271806' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8782060126346271806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8782060126346271806'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2008/06/spring-one-minus-one.html' title='Spring One minus One'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7096892541115885452</id><published>2007-10-26T23:49:00.000+02:00</published><updated>2007-10-27T00:32:20.658+02:00</updated><title type='text'>Almost-paired programming, the shrink principle and beer</title><content type='html'>This strange thought occured to me yesterday:&lt;br /&gt;It is quite disturbing to see how coding can be close to a psychiatric sickness.&lt;br /&gt;&lt;br /&gt;I was gently coding through a piece of code while being often disturbed by phone calls, meetings and other daily stuff.&lt;br /&gt;&lt;br /&gt;The obvious outcome was a messy code with an almost as much messy runtime result.&lt;br /&gt;&lt;br /&gt;At that precise moment, I was having a hard time focusing on this "algorithm" and the fact that the states in my java code could possibly be accessed from multiple threads was going to make things less easy.&lt;br /&gt;&lt;br /&gt;Therefore, with all that mess in my mind and my phone ringing now and then, I started commenting my code to make it readable (a bad habit indeed, as code should be self-readable by separating concerns in methods with readable names and sharing states in richly defined objects... but anyway...).&lt;br /&gt;&lt;br /&gt;When I was over commenting, the code did not behave any better, but was interweaved with rich textual descriptions.&lt;br /&gt;Though it seemed that the added comments did not go further than the limitations I was already feeling (remember? difficulty to focus and phone ringing).&lt;br /&gt;The comments themselves where sitting on top of the pile of messy code I had produced, with no added value as they were a direct transcription of how I was reasoning at that moment.&lt;br /&gt;&lt;br /&gt;So I decided to remove all these comments and to create a few rich immutable objects for states, and using ConcurrentHashMap and Atomic* all around.&lt;br /&gt;My code was indeed completely thread-safe.&lt;br /&gt;&lt;br /&gt;But still... its behaviour was the same: not what I expected.&lt;br /&gt;&lt;br /&gt;So I decided to call in for help.&lt;br /&gt;&lt;br /&gt;I turned to one of my dear colleagues, and asked him to lend me a bit of his time in order to have a second look on my piece of code.&lt;br /&gt;In fact, I couldn't even think of a new way to look at it.&lt;br /&gt;&lt;br /&gt;Indeed, he gently accepted and sat next to me in order to look at my uncommented (if  he reads this, he'll eventually remember telling me how messy and uncommented it looked ;) ) piece of over-immutable code.&lt;br /&gt;&lt;br /&gt;And then began an uncontrolled shrink scene.&lt;br /&gt;&lt;br /&gt;Here's how this dialog (approximatively and "embellished" a bit) turned out:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;me:&lt;/span&gt; "So here's my code, here is what it does, and things are all immutable and stuff..."&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;colleague-shrink:&lt;/span&gt; "Mmmmh mmh... So here's your code, here is what it does, and things are all immutable and stuff?"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;me:&lt;/span&gt; "eh yes, look I've toggled breakpoints all around and I can't seem to see anything wrong"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;colleague-shrink:&lt;/span&gt; "Mmmmh mmh... So You've toggled breakpoints all around and You can't seem to see anything wrong?"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;me:&lt;/span&gt; "Oh no! this little thingy was there all the time...my algorithm was missing one point and I was looking for a synchronization issue. Well thank you for solving this issue with me!"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And then it occured to me that (even if my colleague would probably have solved this problem quite fast) the only presence of a real person to whom you explain your code acts like a catharsis for solving bugs.&lt;br /&gt;&lt;br /&gt;Though this is not very new and one of the basis of paired programming, the parallelism with the shrink made me a bit uneasy.&lt;br /&gt;&lt;br /&gt;Do I have to pay my colleague now, in order for the treatment to be efficient? ;)&lt;br /&gt;&lt;br /&gt;So I now decided that this would now be rewarded by beers. So if you happen (or happened) to be my code-shrink, don't hesitate to reclaim your beverage!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7096892541115885452?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7096892541115885452/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7096892541115885452' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7096892541115885452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7096892541115885452'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/10/almost-paired-programming-shrink.html' title='Almost-paired programming, the shrink principle and beer'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-1650085659182534895</id><published>2007-06-22T14:26:00.001+02:00</published><updated>2009-02-01T09:26:14.096+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day3) : Spring Batch</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__O-4q_CaPyA/RnvB4__bQlI/AAAAAAAABHE/hMthWIICrDo/s1600-h/DSC00219.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/__O-4q_CaPyA/RnvB4__bQlI/AAAAAAAABHE/hMthWIICrDo/s320/DSC00219.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078866189784662610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last presentation!!!&lt;br /&gt;Spring IDE's presentation occured at the same time, but as I already knew a bit about it... I skipped. But go and get release 2.0 (released next week if I'm not wrong) it is amazingly productivity-inducing!&lt;br /&gt;&lt;br /&gt;And now on to Spring Batch.&lt;br /&gt;This new product of the portfolio allows to deal with batching.&lt;br /&gt;It was a project built by Accenture and is now a co-project of Accenture and Interface 21.&lt;br /&gt;&lt;br /&gt;It starts from the statement that nothing exists covering that subject in Java, and that there's a common misconception about the fact that Batch is not possible nor efficient in java.&lt;br /&gt;&lt;br /&gt;It seems really complete and well-thought and is already production-grade.&lt;br /&gt;&lt;br /&gt;I really dig the Enterprise Message-driven processing, sadly it's not targetted for version 1.0.&lt;br /&gt;&lt;br /&gt;Features:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;multiple formats for files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Automatic retries&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Job control language (start, stop, suspend, cancel)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;status and statistics&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Entry points for launch (http, Unix script,incoming message, etc...)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ability to run concurrently with OLTP system&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ability to use multiple transaction resources&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Support services (logging...etc)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;It really deals very well with batch retries at multiple levels, with a fairly rich set of possibilities.&lt;br /&gt;Coding is (obviously one would say) POJO based, and batch behaviour is non-invasive.&lt;br /&gt;Business logic is completely separated from job execution policies.&lt;br /&gt;&lt;br /&gt;The really interesting stuff not mentionned but implicit is that jobs can now be thoroughly unit tested (not integration tested, UNIT tested with mocks and everything!!).&lt;br /&gt;&lt;br /&gt;JMX Management is soon to be released. (How about batches launched from JRuby?)&lt;br /&gt;&lt;br /&gt;Roadmap:&lt;br /&gt;Milestone 2 is soon to be released.&lt;br /&gt;In the future:&lt;br /&gt;Partitioned container,SEDA,Grid, ESB support, and more...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-1650085659182534895?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/1650085659182534895/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=1650085659182534895' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1650085659182534895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1650085659182534895'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day3-spring-batch.html' title='Spring One (day3) : Spring Batch'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__O-4q_CaPyA/RnvB4__bQlI/AAAAAAAABHE/hMthWIICrDo/s72-c/DSC00219.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8239740229085857389</id><published>2007-06-22T13:23:00.000+02:00</published><updated>2009-02-01T09:26:14.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day3) : Spring, dynamic languages and DSLs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnu1Pf_bQkI/AAAAAAAABG8/cXMEJegHHfA/s1600-h/DSC00218.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnu1Pf_bQkI/AAAAAAAABG8/cXMEJegHHfA/s320/DSC00218.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078852282680558146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rob demonstrates how to use JRuby with java with Spring and standalone.&lt;br /&gt;&lt;br /&gt;A little demo of the spring integration.&lt;br /&gt;&lt;br /&gt;Followed by a demo of &lt;i&gt;mscript.db&lt;/i&gt; allowing to interact with JMX using JRuby scripting. Very powerful indeed. This will be in my toolbox ASAP! ;)&lt;br /&gt;&lt;br /&gt;He also advertises "The Ruby way" as a good book to read for starters on Ruby.&lt;br /&gt;&lt;br /&gt;Then on to the DSLs!&lt;br /&gt;It is sad to see that support is for now a little hacky (fun and well done though) and that official support won't be there until Spring 2.2 or 2.3.&lt;br /&gt;&lt;br /&gt;Definitely worthy of attention at the end of the day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8239740229085857389?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8239740229085857389/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8239740229085857389' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8239740229085857389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8239740229085857389'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day3-spring-dynamic.html' title='Spring One (day3) : Spring, dynamic languages and DSLs'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__O-4q_CaPyA/Rnu1Pf_bQkI/AAAAAAAABG8/cXMEJegHHfA/s72-c/DSC00218.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7690388541567903876</id><published>2007-06-22T10:59:00.000+02:00</published><updated>2009-02-01T09:26:14.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day3) : ROO</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__O-4q_CaPyA/Rnuj_P_bQjI/AAAAAAAABG0/ZoRtdxjyrbM/s1600-h/DSC00216.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/__O-4q_CaPyA/Rnuj_P_bQjI/AAAAAAAABG0/ZoRtdxjyrbM/s320/DSC00216.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078833311810011698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ROO or Real Object Oriented programming.&lt;br /&gt;&lt;br /&gt;It is a really nice framework part of the portfolio and enforcing the concepts part or Eric Evans' book on Domain driven design.&lt;br /&gt;&lt;br /&gt;It's really a nice way to deal with the anemic model issue and is nicely integrated with tooling (Eclipse, Maven 2...etc).&lt;br /&gt;&lt;br /&gt;The smashing fact is that it generates and deals with DTO generation and assembly bazed on Dozer (3.4).&lt;br /&gt;They are useful as form backing objects and for remoting.&lt;br /&gt;&lt;br /&gt;Until now, it is the really neatest and newest stuff I've seen in this conference.&lt;br /&gt;&lt;br /&gt;Please please please go and see Spring ROO (possibly still named Acegi ROO at that time though)!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7690388541567903876?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7690388541567903876/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7690388541567903876' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7690388541567903876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7690388541567903876'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day3-roo.html' title='Spring One (day3) : ROO'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__O-4q_CaPyA/Rnuj_P_bQjI/AAAAAAAABG0/ZoRtdxjyrbM/s72-c/DSC00216.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-4510170167805202707</id><published>2007-06-22T09:38:00.000+02:00</published><updated>2009-02-01T09:26:14.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day3) : OSGI</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__O-4q_CaPyA/RnuEb__bQhI/AAAAAAAABGk/b6yZbY0m7o0/s1600-h/DSC00213.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/__O-4q_CaPyA/RnuEb__bQhI/AAAAAAAABGk/b6yZbY0m7o0/s320/DSC00213.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078798621359161874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/RnuEmf_bQiI/AAAAAAAABGs/lgPOK-3I7-I/s1600-h/DSC00215.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/RnuEmf_bQiI/AAAAAAAABGs/lgPOK-3I7-I/s320/DSC00215.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078798801747788322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This presentation nicely sums up OSGI.&lt;br /&gt;Key assets are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Visibility&lt;/b&gt;: a bundle is a black box if not explicitely specified. Nice but does not fit with the current classloading designs where everything is in the same space (more or less)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Operational control&lt;/b&gt;: see modules and their status, install, activate,...bundles.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Dealing with dynamics&lt;/b&gt;: types and services can be exported and contributed (passive and active contribution respectively because services changes are dynamically seen).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Then what about OSGI and Spring?&lt;br /&gt;How do you split applications into a number of OSGI bundles&lt;br /&gt;Bundles need: instanciation, configuration, assembly, decoration.&lt;br /&gt;This should not be coded, this is (mostly) boiler-plate code.&lt;br /&gt;&lt;br /&gt;The purpose is to keep the Spring development model.&lt;br /&gt;&lt;br /&gt;Main entrypoint there is an OSGI bundle-based application context.&lt;br /&gt;&lt;br /&gt;Interesting thing is that beans can easily be exposed with a specific namespace (&lt;b&gt;&amp;lt;osgi:service/&amp;gt;&lt;/b&gt; and &lt;b&gt;&amp;lt;osgi:reference/&amp;gt;&lt;/b&gt;) and all the lifecycle and (re)binding of services is dealt with by Spring OSGI.&lt;br /&gt;&lt;br /&gt;The ConfigurableBundleCreatorTests are interesting for integration testing. It can run the test of your code inside of an OSGI container. This is really a great progress, mostly if one can set it up for testing Eclipse plugins...&lt;br /&gt;&lt;br /&gt;Provisioning with Maven and Ivy is also a catch and is planned for after version 1.0 (part of Maven support already is included in pre 1.0 though).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-4510170167805202707?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/4510170167805202707/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=4510170167805202707' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/4510170167805202707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/4510170167805202707'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day3-osgi.html' title='Spring One (day3) : OSGI'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__O-4q_CaPyA/RnuEb__bQhI/AAAAAAAABGk/b6yZbY0m7o0/s72-c/DSC00213.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2794246965205815444</id><published>2007-06-21T17:58:00.000+02:00</published><updated>2009-02-01T09:26:14.098+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day2) : New features in Spring 2.1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/RnqrAv_bQgI/AAAAAAAABGc/629r9JNzh1I/s1600-h/DSC00209.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/RnqrAv_bQgI/AAAAAAAABGc/629r9JNzh1I/s320/DSC00209.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078559559184499202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will be a list of what is described:&lt;br /&gt;&lt;br /&gt;Platforms:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;JDK 1.6&lt;/b&gt; (JDBC 4.0, JMX MXBeans, JDK ServiceLoader API)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Java EE 5.0&lt;/b&gt; (Servlet 2.5,JSP 2.1, JSF 1.2, JTA 1.1, JavaMail 1.4,EJB 3.0 session beans,JPA even inside JEE 5.0 server, Deployment as JCA 1.5 RAR file, Websphere integration through specific addons)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;OSGI support&lt;/b&gt; (allows a similar programming model between OSGI or J2EE deployment)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Configuration:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;JSR 250 Common annotations&lt;/b&gt;(now supported by all JDK 1.6 and Java EE 5, and JDK 1.5 with the common annotations jar)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;@Autowired annotation&lt;/b&gt; (fits well between name and type autowiring)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;"context" configuration namespace&lt;/b&gt; (convenient context-relative functionalities)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;@Component annotation&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;AspectJ Support:&lt;br /&gt;cf. previous presentation I blogged about.&lt;br /&gt;&lt;br /&gt;@Configurable Revisited:&lt;br /&gt;no AspectJ compiler necessary (based on load-time weaving)&lt;br /&gt;&lt;br /&gt;JMS Message Listener Containers:&lt;br /&gt;"jms" XML Schema Namespace&lt;br /&gt;&lt;br /&gt;JCA 1.5 Namespace also&lt;br /&gt;&lt;br /&gt;still to come (not in RC versions):&lt;br /&gt;Junit 4 support and Rhino/javascript support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2794246965205815444?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2794246965205815444/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2794246965205815444' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2794246965205815444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2794246965205815444'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day2-new-features-in-spring.html' title='Spring One (day2) : New features in Spring 2.1'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__O-4q_CaPyA/RnqrAv_bQgI/AAAAAAAABGc/629r9JNzh1I/s72-c/DSC00209.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-748911919792924642</id><published>2007-06-21T16:46:00.000+02:00</published><updated>2009-02-01T09:26:14.098+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day2) : Concurrency and Spring</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnqk0v_bQfI/AAAAAAAABGU/Ke7azUZqXno/s1600-h/DSC00206.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnqk0v_bQfI/AAAAAAAABGU/Ke7azUZqXno/s320/DSC00206.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078552755956302322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First a definition of the Java Memory Model based on:&lt;br /&gt;- Ordering&lt;br /&gt;- Atomicity&lt;br /&gt;- Visibility&lt;br /&gt;&lt;br /&gt;Interesting thing I missed, volatile keyword guarantees atomic R/W on lon and double types.&lt;br /&gt;&lt;br /&gt;He then goes on quoting stuff from &lt;i&gt;Java Concurrency in practice&lt;/i&gt; (Brian Goetz), e.g. the Holy Bible ;).&lt;br /&gt;&lt;br /&gt;Once again I see somebody enforcing the need of immutable objects! So people! Use them!!!!!!!! It IS the key to safe publication.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-748911919792924642?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/748911919792924642/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=748911919792924642' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/748911919792924642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/748911919792924642'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day2-concurrency-and-spring.html' title='Spring One (day2) : Concurrency and Spring'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__O-4q_CaPyA/Rnqk0v_bQfI/AAAAAAAABGU/Ke7azUZqXno/s72-c/DSC00206.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-3296055026121925778</id><published>2007-06-21T14:03:00.000+02:00</published><updated>2009-02-01T09:26:14.099+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day2) : WS-DuckTyping</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__O-4q_CaPyA/Rnpzq__bQeI/AAAAAAAABGM/H0GmCQhtA3Q/s1600-h/DSC00204.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/__O-4q_CaPyA/Rnpzq__bQeI/AAAAAAAABGM/H0GmCQhtA3Q/s320/DSC00204.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078498712382816738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How to extend the concept of Duck typing to webservices.&lt;br /&gt;&lt;br /&gt;Duck typing is a feature of dynamic languages: "if it walks like a duck and sounds like a duck, then its a duck".&lt;br /&gt;&lt;br /&gt;Basics are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Don't validate incoming messages&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use XPath&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't create stubs and skeletons.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;One rule is: sending should be conservative, and receiving liberal.&lt;br /&gt;&lt;br /&gt;Schematron seems interesting in this approach because it is based on finding &lt;i&gt;tree patterns&lt;/i&gt; (RelaxNG also does this).&lt;br /&gt;More simply, XPath allows to look for an info without assuming that the surroundings (things out of the path) have any strict structure.&lt;br /&gt;&lt;br /&gt;Spring WS 1.0 RC2 is out and based on contract-first and XML use without directly doing XML.&lt;br /&gt;&lt;br /&gt;There are a lot of cool XML and particularly XPath helpers in this release, even if you don't need to use it for web services.&lt;br /&gt;XPathTemplate, NodeMapper, and annotations make it very handy and easy to use XML with the ability to switch implementations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-3296055026121925778?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/3296055026121925778/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=3296055026121925778' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3296055026121925778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3296055026121925778'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day2-ws-ducktyping.html' title='Spring One (day2) : WS-DuckTyping'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__O-4q_CaPyA/Rnpzq__bQeI/AAAAAAAABGM/H0GmCQhtA3Q/s72-c/DSC00204.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-813488775068666193</id><published>2007-06-21T12:16:00.000+02:00</published><updated>2009-02-01T09:25:05.367+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day2) : Advances in AOP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/RnpUBv_bQdI/AAAAAAAABGE/KFLCw0mmIFM/s1600-h/DSC00203.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/RnpUBv_bQdI/AAAAAAAABGE/KFLCw0mmIFM/s320/DSC00203.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078463918852751826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This time a quite technical presentation.&lt;br /&gt;&lt;br /&gt;First half is an introduction to AOP and AspectJ syntax (code, annotations, xml) with pros and cons for the different syntaxes.&lt;br /&gt;&lt;br /&gt;Interesting thing in Spring 2.1 is the new Native AspectJ weaving.&lt;br /&gt;Also of interest is now the bean(*) syntax. This allows to create pointcuts based on beans characteristics (name for example).&lt;br /&gt;&lt;br /&gt;He then demonstrates how you can use AspectJ to enforce Architecture designs.&lt;br /&gt;For example showing errors at compile time when somebody access data from the ui layer. You can basically enforce things by modifying compiling behaviour. Interesting, but this can become really messy if done too loosely.&lt;br /&gt;&lt;br /&gt;Adding mixin to interfaces is also interesting when you have to deal with boilerplate code for implemented interfaces (for Example the *Aware interfaces whose method implementations is 99,99% of the times the same).&lt;br /&gt;&lt;br /&gt;Interesting usage is also the ability to implement retry/failover strategies for remote services using around advices.&lt;br /&gt;&lt;br /&gt;Sadly AOSGI is only mentionned but not discussed in details. That was the reason of my presence in the first place in this presentation... :P&lt;br /&gt;&lt;br /&gt;Overrall it's interesting to see how AOP is now so widely used ;) (when using Spring at least).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-813488775068666193?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/813488775068666193/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=813488775068666193' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/813488775068666193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/813488775068666193'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day2-advances-in-aop.html' title='Spring One (day2) : Advances in AOP'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__O-4q_CaPyA/RnpUBv_bQdI/AAAAAAAABGE/KFLCw0mmIFM/s72-c/DSC00203.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5488792210542387010</id><published>2007-06-21T10:12:00.001+02:00</published><updated>2009-02-01T09:25:05.367+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One (day2) : Keynote</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__O-4q_CaPyA/Rnozcf_bQZI/AAAAAAAABFk/MxWaA72LVo8/s1600-h/DSC00198.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/__O-4q_CaPyA/Rnozcf_bQZI/AAAAAAAABFk/MxWaA72LVo8/s320/DSC00198.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078428094530535826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__O-4q_CaPyA/RnozQ__bQYI/AAAAAAAABFc/OmrjbTrQNnI/s1600-h/DSC00197.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/__O-4q_CaPyA/RnozQ__bQYI/AAAAAAAABFc/OmrjbTrQNnI/s320/DSC00197.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078427896962040194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This keynote describes the Spring Portfolio starting with a really funny (crazy?) show of Adrian with a duck and a chicken hand puppets... in a personal interpretation of DuckTyping.&lt;br /&gt;&lt;br /&gt;Interesting info: Spring projects will now have a release train "a la" Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__O-4q_CaPyA/RnpO7__bQbI/AAAAAAAABF0/eWlA_lboMic/s1600-h/DSC00200.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/__O-4q_CaPyA/RnpO7__bQbI/AAAAAAAABF0/eWlA_lboMic/s320/DSC00200.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078458322510365106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__O-4q_CaPyA/RnpPQP_bQcI/AAAAAAAABF8/gK7SfXjq7U8/s1600-h/DSC00201.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/__O-4q_CaPyA/RnpPQP_bQcI/AAAAAAAABF8/gK7SfXjq7U8/s320/DSC00201.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078458670402716098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second speaker is Eric Evans. Another soothing/sleep inducing voice, yet an interesting talk about the concepts of Model/Domain driven design.&lt;br /&gt;I can't wait to read his book I just bought yesterday. ;)&lt;br /&gt;Really hard to sum-up again. I'll be glad to see it on Parley.&lt;br /&gt;&lt;br /&gt;I liked the idea that quality of the code produced by a team is usually driven by the 2nd worst programmer, because all the team is already focusing on the very known worst programmer and doing damage control ;).&lt;br /&gt;&lt;br /&gt;The conclusion is that one should establish a Context Map of a system and build an anti-corruption layer. I think I'll elaborate on this in a future post because this is really interesting, and this post is getting messy :P&lt;br /&gt;&lt;br /&gt;A very nice analogy of these context maps is living cells in organisms.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the end Eric Evans'talk was a great non-technical talk!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5488792210542387010?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5488792210542387010/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5488792210542387010' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5488792210542387010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5488792210542387010'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-day2-keynote.html' title='Spring One (day2) : Keynote'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__O-4q_CaPyA/Rnozcf_bQZI/AAAAAAAABFk/MxWaA72LVo8/s72-c/DSC00198.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-4544824759016538314</id><published>2007-06-21T08:29:00.000+02:00</published><updated>2009-02-01T09:25:05.368+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One : after 1st day</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__O-4q_CaPyA/Rnoctf_bQXI/AAAAAAAABFU/85tuQkB1N6E/s1600-h/DSC00188.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/__O-4q_CaPyA/Rnoctf_bQXI/AAAAAAAABFU/85tuQkB1N6E/s320/DSC00188.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078403097820873074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnocbv_bQWI/AAAAAAAABFM/p_LCNTuE9eo/s1600-h/DSC00187.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnocbv_bQWI/AAAAAAAABFM/p_LCNTuE9eo/s320/DSC00187.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078402792878195042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A (once again not that great...Spring One should really happen in France ;)) meal and a few glasses of fresh white wine later, David, Torsten and I went back to the hotel in order to have a few beers by the pool.&lt;br /&gt;&lt;br /&gt;I guess the visit of centre-town will be for tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-4544824759016538314?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/4544824759016538314/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=4544824759016538314' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/4544824759016538314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/4544824759016538314'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-after-1st-day.html' title='Spring One : after 1st day'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__O-4q_CaPyA/Rnoctf_bQXI/AAAAAAAABFU/85tuQkB1N6E/s72-c/DSC00188.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5301937435501932658</id><published>2007-06-20T17:44:00.000+02:00</published><updated>2009-02-01T09:25:05.368+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One : SOA without Hype</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__O-4q_CaPyA/RnlZjv_bQUI/AAAAAAAABE8/FoDcao1TzOk/s1600-h/DSC00185.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/__O-4q_CaPyA/RnlZjv_bQUI/AAAAAAAABE8/FoDcao1TzOk/s320/DSC00185.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078188525549732162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/RnlZb__bQTI/AAAAAAAABE0/dV740NzyBbo/s1600-h/DSC00184.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/RnlZb__bQTI/AAAAAAAABE0/dV740NzyBbo/s320/DSC00184.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078188392405745970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/RnlZR__bQSI/AAAAAAAABEs/ul1EB4gVJ8U/s1600-h/DSC00182.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/RnlZR__bQSI/AAAAAAAABEs/ul1EB4gVJ8U/s320/DSC00182.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078188220607054114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Brilliant presentation about pragmatic SOA.&lt;br /&gt;&lt;br /&gt;Hard to sum up, but very fun and interesting.&lt;br /&gt;&lt;br /&gt;A few fun points about SOA's absurdities, WS-(death-)star specs, and about REST.&lt;br /&gt;&lt;br /&gt;Hope this will be very soon on www.parley.com.&lt;br /&gt;&lt;br /&gt;I'll remember the sentence: "tooling is often used to cope with a crappy product"...&lt;br /&gt;&lt;br /&gt;Also possibility of creating an SOA based on emails and XMPP is intriguing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5301937435501932658?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5301937435501932658/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5301937435501932658' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5301937435501932658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5301937435501932658'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-soa-without-hype.html' title='Spring One : SOA without Hype'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__O-4q_CaPyA/RnlZjv_bQUI/AAAAAAAABE8/FoDcao1TzOk/s72-c/DSC00185.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-68981664978117322</id><published>2007-06-20T16:50:00.000+02:00</published><updated>2009-02-01T09:25:05.368+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One : JSF and Spring</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__O-4q_CaPyA/RnlFDv_bQRI/AAAAAAAABEk/IvBBfFJAsLE/s1600-h/DSC00179.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/__O-4q_CaPyA/RnlFDv_bQRI/AAAAAAAABEk/IvBBfFJAsLE/s320/DSC00179.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078165985561362706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Colin is a great speaker, though his voice is so soothing that you'd fall asleep :P.&lt;br /&gt;&lt;br /&gt;First a general presentation of web frameworks and Spring /JSF.&lt;br /&gt;&lt;br /&gt;Interesting point: when using scopes like session, request, be careful of the scoping of injections.&lt;br /&gt;For example if you inject a request scoped bean in a session scoped bean, the request scoped bean will only be created once per session... not the expected behaviour!&lt;br /&gt;&lt;br /&gt;there's now an &amp;lt;aop:scoped-proxy /&amp;gt; that provides a proxy of the bean that recreates the bean for example for each new request.&lt;br /&gt;&lt;br /&gt;Then Colin goes on with the longest silence in a conference ever while going through his file system... very strange!&lt;br /&gt;&lt;br /&gt;Then the rest of the talk describes the variable resolvers, navigation handlers... etc&lt;br /&gt;&lt;br /&gt;Colin really talks more about Spring Web flow than Spring with JSF anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-68981664978117322?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/68981664978117322/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=68981664978117322' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/68981664978117322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/68981664978117322'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-jsf-and-spring.html' title='Spring One : JSF and Spring'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__O-4q_CaPyA/RnlFDv_bQRI/AAAAAAAABEk/IvBBfFJAsLE/s72-c/DSC00179.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-1746804562399309293</id><published>2007-06-20T15:43:00.000+02:00</published><updated>2009-02-01T09:25:05.368+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One : SCA</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__O-4q_CaPyA/Rnk0Pf_bQQI/AAAAAAAABEc/cb7lmOu8-Eo/s1600-h/DSC00173.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/__O-4q_CaPyA/Rnk0Pf_bQQI/AAAAAAAABEc/cb7lmOu8-Eo/s320/DSC00173.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078147495727153410" /&gt;&lt;/a&gt;&lt;br /&gt;Keywords for SCA:&lt;br /&gt;&lt;br /&gt;- Assemblies (component, reference, promote, properties, bindings)&lt;br /&gt;- Policies (intent, policyset, WS-Policy*)&lt;br /&gt;- Client &amp; Implementation models (java, C++, php, COBOL, ... etc)&lt;br /&gt;&lt;br /&gt;see &lt;a href=" http://www.osoa.org"&gt;http://www.osoa.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Presentation of SCA is hard to sum-up yet very interestingly layered like Spring. Analogies with Spring are also interesting:&lt;br /&gt;- Assemblies =&gt; context&lt;br /&gt;- Policies and intent =&gt; AOP + annotations&lt;br /&gt;- Implementation Model =&gt; bean :P or so&lt;br /&gt;&lt;br /&gt;The Java implementation model, lifecycle, asynchronous/conversational state, callback (and so on) are sadly defined through YASLF ;) (Yet Another Specific Language Feature) though Spring support should allow to bypass these specific annotations and just expose a Spring bean.&lt;br /&gt;&lt;br /&gt;Interestingly enough the Conversational and asynchronous mechanisms seems brand new to me in SOA in general (from the implementation point of view at least) as usually this is dealt with low-level solutions like a MOM.&lt;br /&gt;&lt;br /&gt;Basically the Spring mechanism for this maps on sca descriptors quite closely.&lt;br /&gt;&lt;br /&gt;On the OSS implementation side for java, Tuscany and &lt;a href="http://newton.codecauldron.org/ "&gt;Newton&lt;/a&gt; (based on OSGI).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-1746804562399309293?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/1746804562399309293/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=1746804562399309293' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1746804562399309293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/1746804562399309293'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-sca.html' title='Spring One : SCA'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__O-4q_CaPyA/Rnk0Pf_bQQI/AAAAAAAABEc/cb7lmOu8-Eo/s72-c/DSC00173.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-3925375153450403016</id><published>2007-06-20T15:05:00.000+02:00</published><updated>2009-02-01T09:25:05.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One : Introduction to Spring Web Flow</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__O-4q_CaPyA/RnkmZf_bQNI/AAAAAAAABEE/u9qw5t7nQZc/s1600-h/DSC00169.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/__O-4q_CaPyA/RnkmZf_bQNI/AAAAAAAABEE/u9qw5t7nQZc/s320/DSC00169.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078132274363056338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's interesting to compare this version of the presentation with the early drafts presented last year.&lt;br /&gt;&lt;br /&gt;Spring web flow is indeed more mature now and integrates well with JSF or Spring MVC.&lt;br /&gt;It is well fitted for Wizard-like web interfaces with a rich state management.&lt;br /&gt;&lt;br /&gt;What's interesting is that the state can be stored to anything (not only Http session, but also database for long running flows for example).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-3925375153450403016?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/3925375153450403016/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=3925375153450403016' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3925375153450403016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/3925375153450403016'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-introduction-to-spring-web.html' title='Spring One : Introduction to Spring Web Flow'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__O-4q_CaPyA/RnkmZf_bQNI/AAAAAAAABEE/u9qw5t7nQZc/s72-c/DSC00169.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-2281997244635508271</id><published>2007-06-20T14:37:00.000+02:00</published><updated>2009-02-01T09:25:05.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One: lunch</title><content type='html'>No more lunch for us... lunch delivery obviously failed which lead us to have a wonderful belgian lunch.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__O-4q_CaPyA/RnkgGv_bQMI/AAAAAAAABD8/-gPaXPK8LDc/s1600-h/DSC00167.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/__O-4q_CaPyA/RnkgGv_bQMI/AAAAAAAABD8/-gPaXPK8LDc/s320/DSC00167.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078125355170742466" /&gt;&lt;/a&gt;&lt;br /&gt;And yes, Quick fastfoods are Belgian food... or not!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-2281997244635508271?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/2281997244635508271/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=2281997244635508271' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2281997244635508271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/2281997244635508271'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-lunch.html' title='Spring One: lunch'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__O-4q_CaPyA/RnkgGv_bQMI/AAAAAAAABD8/-gPaXPK8LDc/s72-c/DSC00167.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6985397036889541077</id><published>2007-06-20T12:05:00.001+02:00</published><updated>2009-02-01T09:25:05.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One : GWT/Spring</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__O-4q_CaPyA/RnkfTP_bQKI/AAAAAAAABDs/y4iz0nv5WBI/s1600-h/DSC00166.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/__O-4q_CaPyA/RnkfTP_bQKI/AAAAAAAABDs/y4iz0nv5WBI/s320/DSC00166.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078124470407479458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Interesting presentation with mostly features of GWT plus a few integration points for Spring Business layer.&lt;br /&gt;&lt;br /&gt;Sadly, no insight on future support for Java 5 Annotations, and no first idea of the upcoming version 1.4 which deals with the IsSerializable vs. Serializable issue amongst other things (modular RPC services for example removing the need for GWTHandler in order to integrate wutg spring).&lt;br /&gt;&lt;br /&gt;Conclusion: until further notice, DTOs should be used with the addition of a specific Service Facade Layer to the business layer and a DTOConverter (Special mention for Spring's BeanUtils for the copy of objects' states).&lt;br /&gt;&lt;br /&gt;My own conclusion: wait for version 1.5 of GWT for a more completely useable GWT, and keep experimenting with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6985397036889541077?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6985397036889541077/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6985397036889541077' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6985397036889541077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6985397036889541077'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-gwtspring.html' title='Spring One : GWT/Spring'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__O-4q_CaPyA/RnkfTP_bQKI/AAAAAAAABDs/y4iz0nv5WBI/s72-c/DSC00166.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-63913059769704451</id><published>2007-06-20T11:40:00.000+02:00</published><updated>2009-02-01T09:25:05.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One: keynote</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnj5_P_bQJI/AAAAAAAABDk/qixuSXcH-v8/s1600-h/DSC00155.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/__O-4q_CaPyA/Rnj5_P_bQJI/AAAAAAAABDk/qixuSXcH-v8/s320/DSC00155.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078083444879868050" /&gt;&lt;/a&gt;&lt;br /&gt;Keynote just finished.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It surprisingly and interestingly began with a demo of Spring .NET project and how similar developing for .NET or Java is with Spring.&lt;br /&gt;&lt;br /&gt;A lot of marketting stuff for 3/4 of the rest of the show.&lt;br /&gt;The major intend was to justify the venture funding of 10M$ for Interface 21.&lt;br /&gt;Interesting thing here (from a 'technical' point of view) is that 4 Full Time Employees(FTE) will be allocated to the web part of the portfolio, and about 3 to the core Spring functionalities (against a round value of respectively 1 and 1 cumulating the work of all contributers).&lt;br /&gt;An analogy between the Eclipse and Spring momentums also made a bit of sense.&lt;br /&gt;&lt;br /&gt;For the last quarter of it, a description of a few projects of the Spring portfolio took place.&lt;br /&gt;Interesting emphasis on Spring Batch project as a replacement for existing legacy batch processing.&lt;br /&gt;Spring Web flow and its JSF support was also interesting.&lt;br /&gt;Spring IDE (my own personal favorite ;)) had an interesting little demo. Christian has really worked his $ss off on this! New features are stunning and already cover upcoming Spring 2.1.&lt;br /&gt;&lt;br /&gt;Overall the keynote was a bit boring for the marketting part (after all the audience is not made of funders nor shareholders) but gave an insight of future developments around OSGI and Web-related projects.&lt;br /&gt;&lt;br /&gt;I'm now waiting for a GWT/Spring presentation that should wake me up (I woke up at 4 this morning)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-63913059769704451?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/63913059769704451/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=63913059769704451' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/63913059769704451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/63913059769704451'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-keynote.html' title='Spring One: keynote'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__O-4q_CaPyA/Rnj5_P_bQJI/AAAAAAAABDk/qixuSXcH-v8/s72-c/DSC00155.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6034509098363580142</id><published>2007-06-20T09:05:00.000+02:00</published><updated>2009-02-01T09:25:05.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><title type='text'>Spring One: before</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__O-4q_CaPyA/Rnj1-v_bQII/AAAAAAAABDc/3ihlmvRxpKQ/s1600-h/DSC00154.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/__O-4q_CaPyA/Rnj1-v_bQII/AAAAAAAABDc/3ihlmvRxpKQ/s320/DSC00154.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5078079038243422338" /&gt;&lt;/a&gt;&lt;br /&gt;Just arrived in Antwerpen.&lt;br /&gt;&lt;br /&gt;Little breakfast in the hall next to Rod Johnson rehearsing his keynote speech in a corner of the room.&lt;br /&gt;&lt;br /&gt;2 hours of keynote indeed diserve a rehearsal!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6034509098363580142?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6034509098363580142/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6034509098363580142' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6034509098363580142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6034509098363580142'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/06/spring-one-before.html' title='Spring One: before'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__O-4q_CaPyA/Rnj1-v_bQII/AAAAAAAABDc/3ihlmvRxpKQ/s72-c/DSC00154.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-8553353487584784825</id><published>2007-04-24T20:18:00.001+02:00</published><updated>2009-02-01T09:24:38.296+01:00</updated><title type='text'>Exceptions, the Widest net effect and a new Exception catching syntax</title><content type='html'>One annoying thing with Exceptions Catching in java is obviously the fact that a lot of APIs still throw checked Exceptions (not inheriting from java.lang.RuntimeException) to your face, therefore forcing you to deal systematically with things that sometimes cannot be recovered from in your application.&lt;br /&gt;&lt;br /&gt;This often used to imply the horrible "wide net" effect, when one uses too wide a net to catch exceptions (and even sometimes never dealt with them in order to get rid of them... but this never happens anymore :P ).&lt;br /&gt;&lt;br /&gt;One interesting and possibly easy to integrate evolution to the java language would be the possibility to catch multiple exceptions in one go as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;catch([MyException,AnotherException] e){&lt;br /&gt;    throw new WrapperException("Something bad occured in my code, but I won't deal with it, though this gives you a context ;)",e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, in current java constructs, this would end up with:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;catch(MyException e){&lt;br /&gt;    throw new WrapperException("Something bad occured in my code, but I won't deal with it, though this gives you a context ;)",e);&lt;br /&gt;}catch(MyException e){&lt;br /&gt;    throw new WrapperException("Something bad occured in my code, but I won't deal with it, though this gives you a context ;)",e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or more probably because nobody likes repeated code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;catch(MyException e){&lt;br /&gt;    dealWithException(e);&lt;br /&gt;}catch(MyException e){&lt;br /&gt;    dealWithException(e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or even for lazy people:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;catch(Exception e){&lt;br /&gt;    throw new WrapperException("Something bad occured in my code, but I won't deal with it, though this gives you a context ;)",e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I vote for it... do you? ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-8553353487584784825?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/8553353487584784825/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=8553353487584784825' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8553353487584784825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/8553353487584784825'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/04/exceptions-widest-net-effect-and-new.html' title='Exceptions, the Widest net effect and a new Exception catching syntax'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-837949796152221528</id><published>2007-04-17T18:51:00.000+02:00</published><updated>2007-04-17T19:07:29.499+02:00</updated><title type='text'>TDD, TET, and TTD...</title><content type='html'>As I am quite &lt;a href="http://ddossot.blogspot.com/2007/04/seriously-infected.html"&gt;test infected&lt;/a&gt; these days, I tend to make my tests run AFAP (As Fast As Possible...).&lt;br /&gt;&lt;br /&gt;This is quite an important topic when dealing with UNIT tests. In fact it's as much crucial as encapsulation of the System Under Test. If your tests run fast, you'll run them often. Hence the "make your tests run AFAP with a good TET (Test Execution Time) when using TDD (or not).&lt;br /&gt;&lt;br /&gt;This is not quite new and has been advocated by anonymous people like &lt;a href="http://www.martinfowler.com/"&gt;Martin F&lt;/a&gt;. (Except for the TET part which I own a copyright for.... not...)&lt;br /&gt;&lt;br /&gt;This is where enters TTD.&lt;br /&gt;&lt;br /&gt;I found myself reverting from an everyday use of MyEclipse with JBoss 4.0.x to a WTP 1.5.x/JBoss 4.0.x pair.&lt;br /&gt;And believe me... it's hell on earth! I was trying to explain to a colleague of mine how Struts 2 (interceptors... etc) and Spring work together, and believe me, it's really hard to demonstrate anything efficiently when you never know the status of your deployments and when a modification of a files "sometimes" triggers an awfully slow ant task making a full redeployment of the web application!&lt;br /&gt;&lt;br /&gt;So it really seems that TTD (Time to deployment) affects a lot the productivity of a developer. Yet again nothing new, but it is very disappointing to see how a tool like WTP handles such a crucial task.&lt;br /&gt;&lt;br /&gt;My conclusion is that I'm working right now on a "Workspace to File system synchronizer" allowing to keep part(s) of your workspace in sync with another part of the file system (for example a folder in JBoss's deploy folder, or in Tomcat's webapps folder) hooked on the Platform's events.&lt;br /&gt;&lt;br /&gt;This way, with a great TET and a marvellous TTD, I'll be able to attain my goals ASAP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-837949796152221528?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/837949796152221528/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=837949796152221528' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/837949796152221528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/837949796152221528'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/04/tdd-tet-and-ttd.html' title='TDD, TET, and TTD...'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-6737393834506258580</id><published>2007-03-22T14:27:00.010+01:00</published><updated>2009-02-01T09:20:52.775+01:00</updated><title type='text'>Mocking, Stubbing, and Usurping</title><content type='html'>This post won't be about &lt;a href="http://en.wiktionary.org/wiki/mockery"&gt;mockery&lt;/a&gt; in general, nor will it be about a famous &lt;a href="http://www.toymania.com/334archives/love/stubing.htm"&gt;"Love boat" captain&lt;/a&gt; (ok ...not the same "spelling" ;) ).&lt;br /&gt;&lt;br /&gt;What I want to talk about is &lt;span style="font-style: italic;"&gt;Mock Objects&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Stubs&lt;/span&gt; used in strategies for Unit Testing.&lt;br /&gt;&lt;br /&gt;When you have to Unit test a piece of code, (if your purpose is &lt;a href="http://xunitpatterns.com/Obscure%20Test.html"&gt;really to Unit test it&lt;/a&gt;), you'll often need to isolate it from the surrounding layers/components.&lt;br /&gt;&lt;br /&gt;In order to achieve this, two common tools are used: Mocks and Stubs (Though &lt;a href="http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html"&gt;other variants&lt;/a&gt; are available).&lt;br /&gt;&lt;br /&gt;Let's begin with Stubs (in unit testing vocabulary). A &lt;span style="font-weight: bold;"&gt;Test Stub&lt;/span&gt; is a test-specific implementation of the contract of the object/component it is supposed to replace. It is ment to return the value this component is supposed to return. This Stub can also return a wrong value or throw an Exception in order to emulate error cases and test the robustness of our &lt;span style="font-style: italic;"&gt;system under test&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A &lt;span style="font-weight: bold;"&gt;Mock object&lt;/span&gt; adds some &lt;span style="font-style: italic;"&gt;behaviour testing&lt;/span&gt; to the Stub. This means that in addition to the returning of values and throwing of exceptions, it also checks the input it gets from the system under test, the number of times each method has been called...etc&lt;br /&gt;&lt;br /&gt;So why does this post's title mentions &lt;span style="font-style: italic;"&gt;Usurping&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;Now comes the part where I'll present a solution I came up to for Java applications and baptized &lt;span style="font-weight: bold; font-style: italic;"&gt;Usurper&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;When you're creating your own Stubs or using a Mock Object framework (&lt;a href="http://www.easymock.org/"&gt;easymock&lt;/a&gt;, &lt;a href="http://www.jmock.org/"&gt;jmock&lt;/a&gt;...etc) you need to feed them with the expected return values.&lt;br /&gt;&lt;br /&gt;It can sometimes be quite tedious to create a value object's instance, and even more if your Mocked component is supposed to return a list of 100 users for example.&lt;br /&gt;&lt;br /&gt;This is where Usurper comes in handy.&lt;br /&gt;&lt;br /&gt;If you have a User &lt;a href="http://wiki.java.net/bin/view/Javapedia/ValueObject"&gt;Value Object&lt;/a&gt; like this one:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;public class User{&lt;br /&gt;private String firstName;&lt;br /&gt;&lt;br /&gt;private String lastName;&lt;br /&gt;&lt;br /&gt;private Integer age;&lt;br /&gt;&lt;br /&gt;private boolean administrator;&lt;br /&gt;&lt;br /&gt;// getters and setters ...toString() method...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here's how you can create a list of 100 User objects using Usurper.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;// CREATE THE USURPER GENERATOR&lt;br /&gt;UsurperGenerator&amp;lt;User&amp;gt; userGenerator&lt;br /&gt;= new UsurperGenerator&amp;lt;User&amp;gt;(User.class);&lt;br /&gt;&lt;br /&gt;// GENERATE A LIST OF USER VALUE OBJECTS&lt;br /&gt;List&amp;lt;User&amp;gt; userList =&lt;br /&gt;userGenerator.generateUsurperList(100);&lt;/pre&gt;And you're done!&lt;br /&gt;&lt;br /&gt;At least for now if you don't need to test the contents of the object.&lt;br /&gt;In fact, the content of the generated usurper object is something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;org.org.usurper.User@1632c2d[&lt;br /&gt;lastName=dCOuSJOZQZ&lt;br /&gt;administrator=false&lt;br /&gt;age=814857147&lt;br /&gt;firstName=Zq8R9bH7LJ&lt;br /&gt;]&lt;br /&gt;&lt;/pre&gt;This is because the default field handlers allocate a random value to the fields in your object.&lt;br /&gt;So this is the part where you'll say to me this is no use at all.&lt;br /&gt;Well I'll answer that from now on this is up to you!!! ;)&lt;br /&gt;You can easily implement:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.org-libs.org/org-lib-usurper/apidocs/org/org/usurper/handlers/basic/AbstractPropertyTypeHandler.html"&gt;handlers for types of properties&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.org-libs.org/org-lib-usurper/apidocs/org/org/usurper/handlers/basic/AbstractSpecificPropertyHandler.html"&gt;handlers for specific properties&lt;/a&gt; (for example a specific handler for the property age of the User class)&lt;/li&gt;&lt;/ul&gt;This way you can customize the way some fields are dealt with.&lt;br /&gt;For example, the &lt;span style="font-style: italic;"&gt;BigInteger&lt;/span&gt; type is not handled by default. You can easily create your own implementation in a global text fixture of to a specific test's local fixture:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;// CREATE THE USURPER GENERATOR&lt;br /&gt;UsurperGenerator&amp;lt;User&amp;gt; userGenerator =&lt;br /&gt;new UsurperGenerator&amp;lt;User&amp;gt;(User.class);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;// REGISTER CUSTOM PROPERTY TYPE HANDLER&lt;/span&gt;&lt;br /&gt;Set&amp;lt;Class&amp;gt; handledTypes = new HashSet&amp;lt;Class&amp;gt;();&lt;br /&gt;handledTypes.add(BigInteger.class);&lt;br /&gt;userGenerator.registerPropertyTypeHandler(&lt;br /&gt;new AbstractPropertyTypeHandler(handledTypes) {&lt;br /&gt;public Object handle(Object targetObject, Class attributeClass,&lt;br /&gt;String attributeName, Map parentHandlers) {&lt;br /&gt;return new BigInteger(24, new Random());&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// GENERATE A LIST OF USER VALUE OBJECTS&lt;br /&gt;List&amp;lt;User&amp;gt; userList =&lt;br /&gt;userGenerator.generateUsurperList(100);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is just one basic (and probably meaningless) example of what you can easily do with &lt;span style="font-style: italic; font-weight: bold;"&gt;Usurper&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Note that &lt;span style="font-style: italic; font-weight: bold;"&gt;Usurper&lt;/span&gt; supports by default:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generation of &lt;span style="font-style: italic;"&gt;array&lt;/span&gt; properties: if your property is a BigInteger[], all you have to do is define a handler for the BigInteger type.&lt;/li&gt;&lt;li&gt;Generation of &lt;span style="font-style: italic;"&gt;Collection&lt;/span&gt; properties: if your property is a List&amp;lt;BigInteger&amp;gt;, Set&amp;lt;BigInteger&amp;gt; or Map&amp;lt;BigInteger,BigInteger&amp;gt;, all you have to do is also to define a handler for the BigInteger type.&lt;/li&gt;&lt;li&gt;Generation of &lt;span style="font-style: italic;"&gt;Enum&lt;/span&gt; properties: a default handler gives random values for Enum types.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Generation of &lt;span style="font-style: italic;"&gt;Value Object&lt;/span&gt; properties: if your property is another value object, you can easily register it through the use of the ValueObjectPropertyTypeHandler.&lt;/li&gt;&lt;/ul&gt;If you want to learn more, and hopefully give it a try and adopt it (it is LGPL licensed), follow this link:&lt;br /&gt;&lt;a href="http://www.org-libs.org/org-lib-usurper"&gt;http://www.org-libs.org/org-lib-usurper&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-6737393834506258580?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/6737393834506258580/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=6737393834506258580' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6737393834506258580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/6737393834506258580'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/03/mocking-stubbing-and-usurping_6455.html' title='Mocking, Stubbing, and Usurping'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-5459574521356940038</id><published>2007-01-05T22:15:00.000+01:00</published><updated>2007-01-06T15:57:42.829+01:00</updated><title type='text'>Paroli aux agi</title><content type='html'>How much can a &lt;a href="http://esperanto.net/"&gt;thoughtfully elaborated language &lt;/a&gt;evolve? How much without implying a sufficient amount of thinking about the real purpose of such an evolution?&lt;br /&gt;&lt;br /&gt;This sounds philosophical but is not the start of a discussion about &lt;a href="http://en.wikipedia.org/wiki/Philology"&gt;philology&lt;/a&gt; (litteraly  "the love of words" in ancient greek and &lt;a href="http://www.merp.com/essays/MichaelMartinez/copy_of_hobbitryinarmchairs"&gt;J.R.R Tolkien's speciality&lt;/a&gt;), as what I'm going to talk about is the current evolution of the java language and the java platform as a whole.&lt;br /&gt;&lt;br /&gt;There seems to be so much debate on language subjects such as &lt;a href="http://gafter.blogspot.com/2006/12/closures-talk-and-spec-update.html"&gt;closures&lt;/a&gt; and &lt;a href="http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html"&gt;erasure/reification&lt;/a&gt;... All these debates are really interesting and I think these are indeed good moves.&lt;br /&gt;&lt;br /&gt;But this seems like pulling a beautiful napkin on a dirty table : JEE...Well ok this is a bit exagerated, but I mean that the focus on ease of development for this release of the platform completely removed the focus from the ease of management of applications at runtime.&lt;br /&gt;&lt;br /&gt;All this focus on ease of development and productivity improvements is a really good move anyway. But I think that if the brilliant minds discussing on these difficult language/JVM subject could allocate a bit of their time to JEE's architecture, we would finally have something a little bit more production-ready than now.&lt;br /&gt;&lt;br /&gt;Do I need to remind that nowadays each and every peace of software is upgradeable and manages its version in one way or another (Firefox, Eclipse, Linux with packages, all MacOS software, even Microsoft software...etc).&lt;br /&gt;&lt;br /&gt;Yet JEE 5.0 applications still don't/won't have any conventions on versions of deployed artifacts...&lt;br /&gt;Is this because this kind of version management is complete fantasy?...no.&lt;br /&gt;&lt;br /&gt;In fact, &lt;a href="http://www.osgi.org/"&gt;OSGI&lt;/a&gt; implementations already provide this scheme for java applications. A fair amount of java developers have already experienced this through the plugin and update site mechanism of Eclipse through the Equinox OSGI implementation.&lt;br /&gt;The very famous Spring framework also provides an alpha &lt;a href="http://www.springframework.org/osgi"&gt;OSGI support&lt;/a&gt; for Spring-enabled applications.&lt;br /&gt;A &lt;a href="http://www.osgi.org/blog/2006/02/jsr-291-dynamic-component-support-for.html"&gt;JSR&lt;/a&gt; has even been started proposing the support by the JDK and/or J2EE of OSGI.&lt;br /&gt;&lt;br /&gt;So why in the hell WHYYYY did some "clever" folks think they could flush this away (sewers once again) and try to push in the JDK a somehow neither tested nor sufficient &lt;a href="http://www.osgi.org/blog/2006/10/jsr-277-review.html"&gt;JSR&lt;/a&gt; for a Java Module System (JMS acronym is already used BTW)...instead of contributing improvements to the already tested and proven useful OSGI initiative.&lt;br /&gt;If you look at how this &lt;a href="http://jcp.org/en/jsr/detail?id=277"&gt;JSR&lt;/a&gt; (see 2.6) sweeps away OSGI in a paragraph as simplistic, you can see how much the "not invented here" motto can get in action...&lt;br /&gt;&lt;br /&gt;It's a bit sad to see how the focus on the language and/or a narrow view of the use of java is done at the expense of the view on architecture and/or live management of applications in IT systems.&lt;br /&gt;&lt;br /&gt;The same way &lt;a href="http://en.wikipedia.org/wiki/Esperanto"&gt;Esperanto&lt;/a&gt; was a good idea and a cleverly elaborated language, is java becoming a very clever language with no soul?&lt;br /&gt;&lt;br /&gt;This seems a bit desperate, and as much as I value the language improvements, I do value a lot more OSGI, Eclipse RCP and Spring framework, not because of a hype surge, but for their fair usefulness and clean design.&lt;br /&gt;&lt;br /&gt;Wouldn't it be a lot cleaner to have a common jar pool/repository in a j2ee server (clearly specified in the repository) with a simple version handling (similar for example to the structure of a Maven or Ivy repository), and to add, say, a "dependencies.xml" file to the different deployable. This, along with a clear classloading scheme in the specification would allow people to deal with versions management.&lt;br /&gt;&lt;br /&gt;(BTW the JSR 277 people didn't even think about J2EE when elaborating it...what a clever move........not!)&lt;br /&gt;&lt;br /&gt;Wouldn't it be clean to have a "myapp-1.0.0.war" archive in a JEE server, and just have the ability to replace it at runtime by dropping a "myapp-1.0.1.war" and let the server handle the replacement and the dynamic linkage to the appropriate libraries?&lt;br /&gt;&lt;br /&gt;This definitely wouldn't be easy to implement, but woudn't it be a better place for the focus of brilliant minds than a meaningless struggle with Rubyists?&lt;br /&gt;&lt;br /&gt;I for myself prefer a lot design to language improvements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-5459574521356940038?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/5459574521356940038/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=5459574521356940038' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5459574521356940038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/5459574521356940038'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2007/01/paroli-aux-agi.html' title='Paroli aux agi'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-7586104806843558090</id><published>2006-12-17T23:14:00.000+01:00</published><updated>2007-01-06T15:16:21.640+01:00</updated><title type='text'>Mobilis in mobili</title><content type='html'>As I tend to notice, working in the IT field can be really rewarding and also humongously frustrating.&lt;br /&gt;&lt;br /&gt;While being part of an intense brainstorming with co-workers whose work you value very much (and hopefully who value yours...) is indeed really rewarding, it is a job where congratulations are quite rare.&lt;br /&gt;In fact, each and every member of your family and/or friends (those ones not part of the geeky crowd of course) think your daily work consists in installing windows XP on computers and debugging the latest Canon printer.&lt;br /&gt;&lt;br /&gt;The main issue with this is not the incommodities of the week-ends spent &lt;a href="http://www.thinkgeek.com/tshirts/frustrations/388b/"&gt;fixing your family's computers&lt;/a&gt; (well not only that...), but the real problem is that the role of IT workers is not at all clear for the society we all live in.&lt;br /&gt;&lt;br /&gt;For a little comparison, while mostly none of us has ever put a foot in a sewer system, we  have quite  a good  idea of what it looks like  (&lt;a href="http://people.howstuffworks.com/sewer3.htm"&gt;maybe a bit false&lt;/a&gt;, but  yet a good grasp) and  we  do recognize the  utility of having  people working on it... and moreover we won't ask these people if we know them to come home for a good dinner and a toilet flusher replacement.&lt;br /&gt;&lt;br /&gt;Difficulty is that, even inside the IT field, it is quite hard to keep on the track. You can never rest and think you've learnt everything for the coming ten years (but that's the beauty of it).&lt;br /&gt;&lt;br /&gt;As the Nautilus' motto "Mobilis in mobili" expressed it, IT field is constantly moving in a moving society...&lt;br /&gt;The problem being IT should be part of the society and not a wonderful submarine lost in the society's deep sea...&lt;br /&gt;&lt;br /&gt;So we have two separate moving things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A ocean of People's view on IT, not even close to the point. Yet this view is shifting; but at a slow pace.&lt;/li&gt;&lt;li&gt;A flow of the IT field, moving at a great speed, with such a thick hull that nobody can imagine what's inside.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;What do you think "normal folks" think about when they see commercials about blade servers on TV? What do you think they'll understand when they'll be served Web 3.0 and SOA 3.0 next to Windows Vista Extra and diapers?&lt;br /&gt;&lt;br /&gt;IT vocabulary has become so gibberish and acronyms so much the focus of IT business that nobody, except if properly documented, can have the equivalent of the grasp we have of the people working in sewers...&lt;br /&gt;&lt;br /&gt;So I urge each and every IT worker in the world to go out of its &lt;a href="http://cyberinkdesign.com/geek-gifts/thecubes.jpg"&gt;dark and badly ventilated office&lt;/a&gt; and explain to the world that his job is as valuable as any other in the world, and using as many metaphors as needed, to explain what he's really doing!&lt;br /&gt;&lt;br /&gt;This way we'll be able to synchronize a bit these flows...and integrate IT in our society.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-7586104806843558090?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/7586104806843558090/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=7586104806843558090' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7586104806843558090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/7586104806843558090'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2006/12/mobilis-in-mobili.html' title='Mobilis in mobili'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-115705960119334155</id><published>2006-08-31T23:26:00.000+02:00</published><updated>2006-08-31T23:28:21.146+02:00</updated><title type='text'>Get your hash covered!</title><content type='html'>Today, after a long and truly joyful refactoring session, I stumbled on this &lt;a href="http://www.informit.com/articles/article.asp?p=438990&amp;rl=1"&gt;article&lt;/a&gt; about hashcode() method's coverage.&lt;br /&gt;Which reminded me of David dossot's &lt;a href="http://ddossot.blogspot.com/2006/08/coverage-generation-or-generations-of.html"&gt;blog entry&lt;/a&gt; dealing with the problem of coverage.&lt;br /&gt;&lt;br /&gt;It made me wonder a lot about the big difference between rich client software and J2EE middle tier software : test coverage.&lt;br /&gt;&lt;br /&gt;If hashcode() methods' coverage is so hard to obtain or at least can be so boring to do when you have tenth of value objects in your code, at least it can be done!&lt;br /&gt;&lt;br /&gt;I for myself feel completely lost and have no clue on how to unit test the code of an eclipse plugin or the code of an Eclipse RCP app...&lt;br /&gt;&lt;br /&gt;As a good (well trying to...) J2EE developer and POJO fan, I tend to encapsulate all my specific logic in specific as-POJO-as-can-be classes.&lt;br /&gt;&lt;br /&gt;Therefore making these classes testable.&lt;br /&gt;&lt;br /&gt;But what about the real tricky-buggy part of these apps: GUI!&lt;br /&gt;&lt;br /&gt;I for myself am missing a lot of tricks and patterns for testing this.&lt;br /&gt;And by testing, I mean unit-testing. Because GUI also diserves it. And not only integration tests.&lt;br /&gt;&lt;br /&gt;In the end when you think about the code of an Eclipse plugin's UI and the strategies you'd have to use to unit-test it... hashCode() seems like bliss ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-115705960119334155?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/115705960119334155/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=115705960119334155' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115705960119334155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115705960119334155'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2006/08/get-your-hash-covered.html' title='Get your hash covered!'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-115645645626055884</id><published>2006-08-24T23:54:00.000+02:00</published><updated>2006-08-24T23:54:16.323+02:00</updated><title type='text'>My Kingdom for a release!</title><content type='html'>After yet another day of pom.xml and settings.xml and other properties tweaking, I must admit I'm quite satisfied with my &lt;a href="http://maven.apache.org"&gt;Maven 2&lt;/a&gt; builds.&lt;br /&gt;&lt;br /&gt;Still it is not completely satisfying...&lt;br /&gt;&lt;br /&gt;The main problem I can think of if that almost 2 thirds of the plugins available on the apache and codehaus repositories are not even officially released.&lt;br /&gt;&lt;br /&gt;And I'm not even talking about the exotic plugins generating weird things or weaving any exotic kind of AOP ;)...&lt;br /&gt;&lt;br /&gt;Some of the core features can completely be ruined from an automatic update to another (my last memory of it is the site plugin now ruined by a beta functionality from the skin plugin...).&lt;br /&gt;&lt;br /&gt;Problem is that even released plugins are often tied to beta ones.&lt;br /&gt;&lt;br /&gt;So I beg the maven plugin developpers to gather and to try and elaborate a Callisto-like release!&lt;br /&gt;&lt;br /&gt;This will benefit to both users and plugin developers.&lt;br /&gt;Even if some plugins are buggier than others, at least it will not feel like walking on a pile of rolling stones all the time ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-115645645626055884?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/115645645626055884/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=115645645626055884' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115645645626055884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115645645626055884'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2006/08/my-kingdom-for-release.html' title='My Kingdom for a release!'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-115513850750716846</id><published>2006-08-09T17:23:00.000+02:00</published><updated>2006-08-09T17:54:26.026+02:00</updated><title type='text'>Driving the change</title><content type='html'>I'm having a hard time finding people who are never in a destructive state-of-mind in the IT field.&lt;br /&gt;Each and every people has a good reason at a given moment to resist to change.&lt;br /&gt;&lt;br /&gt;It seems difficult for everybody to realize that embracing changes before they occur is the key to longevity and sanity in the IT field.&lt;br /&gt;&lt;br /&gt;The problem with IT systems is the same as with employment. Stability and Longevity are now enforced by constantly moving ahead. Trouble comes when people are in a Cobol-ish/Mainframe-ish state of mind, thinking that every single piece of an IT System is destined to last whatever happens.&lt;br /&gt;&lt;br /&gt;In the end everyone finishes up blaming the audacious for the sake of costs and responsability.&lt;br /&gt;&lt;br /&gt;In fact it is difficult to handle change when you're not driving it. I guess that's why I tend to go to the change orientation part, so that I can precede change instead of being its victim.&lt;br /&gt;&lt;br /&gt;So at the end of the day is it really a matter of resistance to change or more a matter of resistance to change driven by others?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-115513850750716846?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/115513850750716846/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=115513850750716846' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115513850750716846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115513850750716846'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2006/08/driving-change.html' title='Driving the change'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-115337706270276636</id><published>2006-07-20T08:09:00.000+02:00</published><updated>2006-07-20T08:39:53.683+02:00</updated><title type='text'>Erasure/Reification and Forward compatibility...</title><content type='html'>Recently, while I was trying to build a core mocking API based on reflection with JDK 5.0 (what one would do during his spare time...), the amazing subject of (type) Erasure with Generics appeared to me...&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;(For those already knowing everything about erasure, roll a 20 and go to number 2) Thanks to &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html"&gt;JDK 5.0 Generics&lt;/a&gt;, most people think that Collections can now be brilliantly assigned specific types of objects, removing the clutter of casting-all-around. Don't be afraid, but Generics in JDK 5.0 are not really the Generics you think they are! For reasons detailed below, Generics where sacrificed at the altar of Erasure! So let's be more specific. When you declare... say... a &lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Map&amp;lt;String,BigInteger&amp;gt; myBigIntegerMap&lt;/span&gt; and a &lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Map&amp;lt;String,Float&amp;gt;&lt;/span&gt;, the compiler will replace them with a &lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Map&lt;/span&gt; and a &lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;Map&lt;/span&gt;! The compiler keeps all the code in a common class and adds some type conversions and type checks along with bridge methods for the specific types you declared, but it completely erases your beautiful type arguments from the runtime code. This is (insert dramatic drum roll here) type &lt;a href="http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#Type%20Erasure"&gt;ERASURE&lt;/a&gt; (insert crash of cymbals here)!&lt;/li&gt;&lt;li&gt;&lt;string,biginteger&gt;&lt;string,float&gt;The positive effect is that it ensures backward/forward compatibility by (almost) not modifying existing collections and avoiding the mess that can be found in recent version of #ed languages and described in &lt;a href="http://ddossot.blogspot.com/2006/07/way-frameworks-go.html"&gt;David dossot's blog entry&lt;/a&gt;. &lt;/string,float&gt;&lt;/string,biginteger&gt;The negative one is that you will never be able to discover these types by reflection, because nothing differs &lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;myBigIntegerMap.getClass() &lt;/span&gt;from &lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;myFloatMap.getClass()&lt;/span&gt;... and you'll have the surprise to see that&lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt; (myBigIntegerMap &lt;span style="font-weight: bold;"&gt;instanceof&lt;/span&gt; Map) &lt;/span&gt;is a &lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;true&lt;/span&gt; statement! I can't wait to see the&lt;a href="http://www.amazon.com/gp/product/032133678X/103-5891489-4443060?v=glance&amp;n=283155"&gt; java puzzlers&lt;/a&gt; derived from these Generics...&lt;/li&gt;&lt;li&gt;The opposite system of Erasure is &lt;a href="http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20reification?"&gt;Reification.&lt;/a&gt; In this system, information is kept at runtime as first-class entities and can therefore be accessible for the true happiness of ORM tools developpers and such... Tough talks went on long before the release of Generics with JDK 5.0 about whether backward/forward compatibility could be attained with reification. It appears that such a goal could be attained, but is not even planned (as I know of) for JDK 6.0...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;&lt;br /&gt;So knowing that two questions pop out of my humble mind:&lt;br /&gt;&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;ul&gt;&lt;li&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;Does a software of any kind always has to ensure backward and forward compatibility, even when slowing down innovations?&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;/li&gt;&lt;li&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;Do JDK 5.0 code really has to run with older JRE's?&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;/li&gt;&lt;/ul&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;If you answered yes to any of these questions, then ask yourself : should these requirements be mainstream, or handled by adapters?&lt;br /&gt;&lt;br /&gt;JDK should at least handle backward compatibility and moreover &lt;a href="http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html"&gt;migration compatibility&lt;/a&gt;. Meaning that interoperability should be a real asset! This doesn't mean that Generics should be reduced to Erasure for the sake of it!&lt;br /&gt;This just means that :&lt;br /&gt;&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;ul&gt;&lt;li&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;adapted Serializers could be coded in order to ensure compatibility with existing older codebase used through RPC calls&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;/li&gt;&lt;li&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;adapters &lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;could be coded &lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;for older codebase used in the same VM.&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;/li&gt;&lt;/ul&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;So what do we do now?&lt;br /&gt;I for myself saved my day by just asking myself the right question : what is the most elegant way of getting to my goal as I can not wait for JDK 8.0 ? ;).&lt;br /&gt;&lt;br /&gt;My own solution was an annotation added to the Collection attribute I wanted to attain by reflection. Annotations can be attained at runtime by reflection, and are checked by the compiler. This adds a little bit of clutter and doubles the declaration of my type argument(s) but it does the job!&lt;br /&gt;So I now have to declare :&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 204, 0);"&gt;@CollectionRuntimeInfo{type=Integer.class}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;private List&amp;lt;Integer&amp;gt; myIntegerList;&lt;/span&gt;&lt;br /&gt;&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;span style="font-style: italic; color: rgb(51, 255, 51);"&gt;@CollectionRuntimeInfo{type={String.class,Integer.class}}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 102);"&gt;private Map &amp;lt;String,Integer&amp;gt; myIntegerMap;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;string,biginteger&gt;&lt;string,float&gt;&lt;string,float&gt;So I was just wondering that if instead of replacing Erasure with Reification, the compiler could automatically add an annotation to the Generics with the type arguments, we would save the day without affecting the forward/backward compatibility paradigm!&lt;br /&gt;&lt;br /&gt;But I'm not (and will surely never be) part of the JCP, and am probably occulting a lot of potential issues... but it's still worth looking ;)&lt;/string,float&gt;&lt;/string,float&gt;&lt;/string,biginteger&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-115337706270276636?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/115337706270276636/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=115337706270276636' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115337706270276636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115337706270276636'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2006/07/erasurereification-and-forward.html' title='Erasure/Reification and Forward compatibility...'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-115246514759790404</id><published>2006-07-09T19:12:00.000+02:00</published><updated>2006-07-09T19:17:37.100+02:00</updated><title type='text'>From software to detergentware...</title><content type='html'>Web 2.0, Ajax, SOA 2.0 and 3.0; those are magic words to the ears of the Gartner-worshipers all over the the world. Adding buzz-words to buzz-words seems to be the latest trend in technological cocktails.&lt;br /&gt;In fact, more than mere words, it is interesting to see how software retailers and software makers are now kept away from these buzz words.&lt;br /&gt;&lt;br /&gt;Do you remember the beginning of the web Era? How many managers or marketing people have mispronounced or misunderstood the technical web jargon? But this was a jolly foolish time when marketing of software was technologically-driven!&lt;br /&gt;Third millennium has dawned the era of real marketing in software!&lt;br /&gt;&lt;br /&gt;Computing has never been about technologies by themselves... in fact it is more about who's going to use these technologies. And this is of course the job of marketing to link companies to their customers. Customers looking for incredible things like QoS, TCO and RoI...&lt;br /&gt;But until last year or so, the frontier between technical concepts and marketing concepts was a one-way ride...&lt;br /&gt;&lt;br /&gt;So where do Web 2.0 and SOA 2.0 come from? Are these merely technical concepts?&lt;br /&gt;&lt;br /&gt;To me they are blankets pulled over the software market in order to convey a clear message :&lt;br /&gt;"Web or SOA are dangerous investments for your company? Forget about this, Web 2.0 and SOA 2.0 are there! And believe me or not, they are simpler to use and provide a better result!"&lt;br /&gt;So even if this sounds like the "even whiter than white" you could hear in any detergent commercial, this has two opposite side effects:&lt;br /&gt;on one hand it brings a new interest from cautious companies to the products, but on the other hand it conveys the ambiguous message that older or not labelled Web or SOA implementations are hell on earth.&lt;br /&gt;&lt;br /&gt;And this is where things are slowly shifting. The same way economy influences politics, economy and market clearly influences technology...&lt;br /&gt;You'll say to me that this is not new, but it is quite disturbing to realize that in order to talk about the technologies you implement and/or originate, you have to adapt yourself to these marketing concepts...&lt;br /&gt;&lt;br /&gt;In fact this shift is quite important and is quite representative of what's at stake in the coming years.&lt;br /&gt;Open source project without a clear marketing plan are more and more out of the game, but more than that, they have to adapt to the advices of marketing/management gurus like Gartner. First SOA has been sold like a complete replacement of the frightening EAI acronym. Then SOA has turned from an abstract concept like OOP or AOP to a complete marketing concept shadowing the beauty of the described technology. And the whole World Wide Web (and all the underlying concepts) is now versionned by absolutely arbitrary and meaningless numbers.&lt;br /&gt;&lt;br /&gt;But don't be mistaken, branding is quite important! Yet as long as a brand is applied to a product. But let's imagine that from now detergents enter in the era of "detergent 2.0"... and that each and every detergent company who wants to be taken seriously has to print a beautiful "detergent 2.0" logo on the product. You'll soon see all the products branded with this logo... and the concept being completely blown away.&lt;br /&gt;&lt;br /&gt;There's hopefully still some room for products branded with reason and offering a good balance between technological efficiency and QoS/TCO/RoI.&lt;br /&gt;&lt;br /&gt;But it is now a full-time job to invent detergent names for software and to understand what's white and what's whiter...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-115246514759790404?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.zepag.org/feeds/115246514759790404/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11616517&amp;postID=115246514759790404' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115246514759790404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/115246514759790404'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2006/07/from-software-to-detergentware.html' title='From software to detergentware...'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11616517.post-111148415433573205</id><published>2005-03-22T10:33:00.000+01:00</published><updated>2006-07-02T21:20:11.120+02:00</updated><title type='text'>It's fresh! fresh!</title><content type='html'>... exciting!&lt;br /&gt;It's always great to begin something like a blog, to publish your deepest thoughts...&lt;br /&gt;This is so not what I'm going to do here.&lt;br /&gt;&lt;br /&gt;You won't have even a bit of my deepest thoughts to admire, and this will be mostly about funny and stupid things I will notice, or I'm fond of, and about my everyday's work .&lt;br /&gt;&lt;br /&gt;So feel free to comment my words of wisdom (a.k.a. bullshits).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11616517-111148415433573205?l=blog.zepag.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/111148415433573205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11616517/posts/default/111148415433573205'/><link rel='alternate' type='text/html' href='http://blog.zepag.org/2005/03/its-fresh-fresh.html' title='It&apos;s fresh! fresh!'/><author><name>Pierre-Antoine Grégoire</name><uri>http://www.blogger.com/profile/07978146278885763776</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/__O-4q_CaPyA/SarEwatFSyI/AAAAAAAAOAE/CBrvBLnVzKE/S220/3214929.jpg'/></author></entry></feed>
