<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0cGR3o9cSp7ImA9WhBaEEk.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327</id><updated>2013-05-20T11:10:26.469+02:00</updated><category term="design patterns" /><category term="web" /><category term="latex" /><category term="café com tapioca" /><category term="strategy" /><category term="community" /><category term="art" /><category term="conference" /><category term="open source" /><category term="workspace" /><category term="agile" /><category term="picture" /><category term="python" /><category term="browser" /><category term="user interface" /><category term="software engineering" /><category term="family" /><category term="business process" /><category term="Vaadin" /><category term="database" /><category term="ecology" /><category term="operating system" /><category term="javafx" /><category term="cejug" /><category term="sport" /><category term="business" /><category term="research" /><category term="Java EE" /><category term="java" /><category term="refactoring" /><category term="php" /><category term="enterprise application" /><category term="security" /><category term="culture" /><category term="music" /><category term="jvm" /><category term="web services" /><category term="blog" /><category term="book" /><category term="configuration management" /><category term="trip" /><category term="netbeans" /><category term="literature" /><category term="culinary" /><category term="yasmim" /><category term="movie" /><category term="software architecture" /><category term="friendship" /><category term="integration" /><category term="europe" /><category term="JSF" /><category term="career" /><category term="publication" /><category term="machine learning" /><category term="ide" /><category term="e-commerce" /><title>Hildeberto's Blog</title><subtitle type="html">No time to make it shorter ;)</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.hildeberto.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.hildeberto.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Hildeberto Mendonça</name><uri>http://www.blogger.com/profile/00241544229335976181</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://2.bp.blogspot.com/_GRRHKr2Yk6M/S8wdoE8TK6I/AAAAAAAABhI/v7Bl4Ud3QMk/S220/me.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/HildebertosBlog" /><feedburner:info uri="hildebertosblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Ck4CQX05fyp7ImA9WhBbF0U.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-199081096039927763</id><published>2013-05-17T10:05:00.000+02:00</published><updated>2013-05-17T10:56:00.327+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-17T10:56:00.327+02:00</app:edited><title>Look At It Carefully And You Will Find Something To Improve</title><content type="html">I propose you an exercise: when you come back to work tomorrow morning, navigate through the source code of your project and try to find opportunities of refactoring. Do it even if your boss didn't ask for it. Do it because you want some exciting time at work.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Refactoring is the art of changing what is already working fine&lt;/b&gt;. But to do refactoring you need an excuse. It could be design improvement, performance issues, security roles, and many other reasons. That's a risk you take to reduce the technical debit of the application, making it more stable and, somehow, improving your own productivity in the future.&lt;br /&gt;
&lt;br /&gt;
This is not about being nice with the company or with the boss, but being nice with yourself. Why? Because problems tend to&amp;nbsp;accumulate and, at some point, you will lose the control of your code. You will face hard times to deliver&amp;nbsp;results and it will ruin your career.&lt;br /&gt;
&lt;br /&gt;
Well, let's see this from a brighter perspective instead. You will learn a lot in the process and will soon realize that you are producing better code than you ever did before. The more refactoring you do, the more clever you become until a point where you may reach the level of innovation. But, what does it mean and how do you know you are getting there?&lt;br /&gt;
&lt;br /&gt;
Innovation happens when you find a clear opportunity for improvement on what you are doing and you realize nobody else did it so far (at least you couldn't find it). That's not easy, but it usually happens when you do something&amp;nbsp;repeatedly&amp;nbsp;and you find yourself thinking about what would you do to do the same thing faster or cleaner. Let me illustrate this with a true story.&lt;br /&gt;
&lt;br /&gt;
It was about String concatenation in Java: a classical issue stressed by numerous specialists throughout the years and probably ignored nowadays. Before JDK 1.5, despite its readability and simplicity, String concatenation using the operator "+"&amp;nbsp;could produce a very inefficient code. Behind the scene, this operator was replaced by the bytecode equivalent of &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html" target="_blank"&gt;StringBuffer&lt;/a&gt;, which actually implemented the concatenation. The more you used the "+" operator the more instances of String and StringBuffer you would have in memory as well as a good amount of processing time to manage all those objects. Because of that, developers were pushed to use StringBuffer straight away and ignore the "+" operator. Look at the following example:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String title = "Mr.";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String name = "John";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String familyName = "Smith";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: Courier New, Courier, monospace;"&gt;String message = "Dear " + title +&amp;nbsp;" "&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name&amp;nbsp;+ " " + familyName +&amp;nbsp;",";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;Developers were used to write like that, but they were pushed to write this instead:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: Courier New, Courier, monospace;"&gt;StringBuffer sb = new StringBuffer();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append("Dear ");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append(title);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append(" ");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append(name);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append(" ");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append(familyName);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append(",");&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;You may agree with me that the first example is more readable than the second one. It's just natural for developers to use the "+" operator when concatenating strings, thus it was unfair to&amp;nbsp;&lt;/span&gt;abandon that syntax. Fortunately, compiler guys did something about it, making sure that the JDK 1.5 would&amp;nbsp;optimize&amp;nbsp;concatenations. Instead of using StringBuffer, a thread-safe class, they created a new one called &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html" target="_blank"&gt;StringBuilder&lt;/a&gt; (non thread-safe, thus faster) and they made sure that a single instance of it would handle all concatenations as illustrated in the first example. That's an important move because they&amp;nbsp;favored&amp;nbsp;elegance instead of technicalities. The first example is automatically transformed at compile time into something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;StringBuilder sb = new StringBuilder();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;sb.append("Dear ")&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.append(title)&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.append(" ")&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.append(name)&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.append(" ")&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.append(familyName)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.append(",");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; However, concatenations within a non trivial logic still require you to write StringBuilder in your code because the compiler is not that smart yet. For &amp;nbsp;example:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;List&amp;lt;Student&amp;gt; students = studentBean.findStudents();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String intro = "The following students were approved:\n";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String listedNames = "";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String separator = "";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;for(Student student: students) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; if(student.approved()) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if(!listedNames.isEmpty()) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; separator = ", ";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; listedNames&amp;nbsp;+=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;separator&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;+ student.getName()&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String msg&amp;nbsp;= intro +&amp;nbsp;listedNames;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;messengerBean.sendMessage(msg);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;would be more efficient if&amp;nbsp;&lt;/span&gt;written like that:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;List&amp;lt;Student&amp;gt; students = studentBean.findStudents();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;String intro = "The following students were approved:\n";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;StringBuilder listedNames = new StringBuilder();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String separator = "";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;for(Student student: students) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; if(student.approved()) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if(!listedNames.length() &amp;gt; 0) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; separator = ", ";&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; listedNames.append(&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;separator)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.append(student.getName())&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;String msg&amp;nbsp;= intro&amp;nbsp;+&amp;nbsp;listedNames.toString();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;messengerBean.sendMessage(msg);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;Ups! Did you noticed anything strange up there? It might not be obvious at a first look, but see how they check if the variable &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;listedNames&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; is empty before defining the separator. The class String has a nice readable method &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;isEmpty()&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;introduced in JDK 1.6, but StringBuilder still uses that pretty old way of comparison. Why didn't they do it for StringBuilder and StringBuffer as well?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-February/014433.html" style="font-family: inherit;" target="_blank"&gt;Discussing the issue at the core-lib-dev mailing list&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;, it turns out there is no apparent reason why they didn't do that before. Perhaps they simply forgot it :-) &lt;b&gt;Thanks to a large refactoring, trying to improve&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;inefficient&lt;/b&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;&amp;nbsp;uses of string concatenation, it was possible to find such inconsistency&lt;/b&gt;. I believe they still have time to fix that for Java 8, which is coming out next year. And they would fix that by adding the method &lt;/span&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;isEmpty()&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; in the interface &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/CharSequence.html" target="_blank"&gt;CharSequence&lt;/a&gt; to make sure that every other implementation will be equally elegant.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: inherit;"&gt;That might be a simple thing, but every single detail matters when Java is under heavy criticism for being such a verbose language. So, go for some refactoring and find opportunities to improve your code as well as the language you use to write it! Let's move Java forward!&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/-FN4rhrww9c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/199081096039927763/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2013/05/look-at-it-carefully-and-you-will-find.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/199081096039927763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/199081096039927763?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/-FN4rhrww9c/look-at-it-carefully-and-you-will-find.html" title="Look At It Carefully And You Will Find Something To Improve" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2013/05/look-at-it-carefully-and-you-will-find.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQDRXo4eCp7ImA9WhBVEkw.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-2504941955260481640</id><published>2013-04-17T16:45:00.001+02:00</published><updated>2013-04-17T18:32:54.430+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-17T18:32:54.430+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="trip" /><category scheme="http://www.blogger.com/atom/ns#" term="europe" /><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><category scheme="http://www.blogger.com/atom/ns#" term="family" /><title>Great Experience at Frankfurt Airport and with Lufthansa</title><content type="html">With all those crazy things going on all around the world these days, I believe sharing good news may help to compensate with good vibes all the negativity out there. &lt;b&gt;It's a good thing to recognize good actions made by people around us&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Having said that, I devote this post to send a big thanks to &lt;a href="http://www.frankfurt-airport.com/" target="_blank"&gt;Frankfurt Airport&lt;/a&gt; and to &lt;a href="http://www.lufthansa.com/" target="_blank"&gt;Lufthansa Airlines&lt;/a&gt;. I don't know how these companies are evaluated by their customers in general. Perhaps, we were simply lucky, but what has happened and the way we were treated are worth spreading.&lt;br /&gt;
&lt;br /&gt;
We arrived at Frankfurt Airport in an &lt;a href="https://www.united.com/" target="_blank"&gt;United Airlines&lt;/a&gt;&amp;nbsp;flight&amp;nbsp;coming from the US (I have nothing to say about this company btw :-/). We were three: My wife, my one year old boy and I. The airport is&amp;nbsp;enormous, but it couldn't be easier to get directions inside. We experienced good accessibility carrying our baby's stroller, with a negligible delay in comparison to other ways.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.frankfurt-airport.com/content/medialib/fraport/frankfurt_airport/Services/barrierefreiheitneu/_jcr_content/renditions/mv214847.file/file.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.frankfurt-airport.com/content/medialib/fraport/frankfurt_airport/Services/barrierefreiheitneu/_jcr_content/renditions/mv214847.file/file.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Everybody was genuinely gentle, from the&amp;nbsp;immigration to the arrival in Brussels. No silly jokes, no excessive friendly behavior, just fine :-) That was the first contact we had with those people, thus they have no reason to exceed kindness, unless they were selling a false image of the company, which they didn't. We actually felt relaxed dealing with those people. We needed that after a exhausting 8 hours flight from the US.&lt;br /&gt;
&lt;br /&gt;
Our baby arrived at the airport sleeping and stayed like that until Brussels. That's what I call the smoothest flight connection ever :-) The baby spaces are separated from the toilets and they are accessible within a range of 50 meters maximum. The security check has a special track for people with strollers and&amp;nbsp;wheel chairs. We followed the procedure&amp;nbsp;calmly and fast :-)&amp;nbsp;&amp;nbsp;All that is so&amp;nbsp;convenient!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-OnBrDG_dBk0/UW6b7FetXhI/AAAAAAAABVE/6XZ3BjEuppA/s1600/peluche-lion-collection-bengy-2304-autre-img.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-OnBrDG_dBk0/UW6b7FetXhI/AAAAAAAABVE/6XZ3BjEuppA/s320/peluche-lion-collection-bengy-2304-autre-img.jpg" width="307" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Even things that rarely work were working that day :-) We didn't have our seats marked in the flight to Brussels due to some technical problems during the reservation. We were afraid to have seats far from each other and be forced to&amp;nbsp;negotiate&amp;nbsp;rearrangements&amp;nbsp;within the airplane.&amp;nbsp;Fortunately, the attendant managed to put us together. It never happened before! I may&amp;nbsp;admit we were lucky ;-)&lt;br /&gt;
&lt;br /&gt;
It couldn't be better until the boarding time when our expectations were exceeded! A lot of first and business class people&amp;nbsp;around and the attendant called us to be the first ones to enter in the airplane. She called us out loud using the microphone and explained to other passengers that the baby would require some extra effort during boarding and it would help to gain some time after all. I call it intelligence and good judgment&amp;nbsp;because that's exactly what I would do in her shoes :-)&lt;br /&gt;
&lt;br /&gt;
Unfortunately, many airports out there banned such practice, which is the case of &lt;a href="http://www.brusselsairport.be/" target="_blank"&gt;Brussels Airport&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.metwashairports.com/dulles/dulles.htm" target="_blank"&gt;Washington Dulles&lt;/a&gt;, the ones we have been with our baby. &lt;b&gt;Those airports following such stupid rule should give attention to families with babies and people with&amp;nbsp;disabilities because this is not a privilege to a minority, but a&amp;nbsp;necessity&lt;/b&gt;. They ignore the fact that it's&amp;nbsp;tough to travel with a little baby. Thanks to Lufthansa, we arrived very relaxed in Belgium, with a big smile on our faces :-)&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/lfZ6pbY0OoM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/2504941955260481640/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2013/04/great-experience-at-frankfurt-airport.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2504941955260481640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2504941955260481640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/lfZ6pbY0OoM/great-experience-at-frankfurt-airport.html" title="Great Experience at Frankfurt Airport and with Lufthansa" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-OnBrDG_dBk0/UW6b7FetXhI/AAAAAAAABVE/6XZ3BjEuppA/s72-c/peluche-lion-collection-bengy-2304-autre-img.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2013/04/great-experience-at-frankfurt-airport.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAHR3c6eip7ImA9WhBXFEg.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-8071013202857757317</id><published>2013-03-27T11:40:00.001+01:00</published><updated>2013-03-28T09:02:16.912+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-28T09:02:16.912+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><category scheme="http://www.blogger.com/atom/ns#" term="publication" /><title>Interviewed by Java Magazine</title><content type="html">The March/April issue of Java Magazine is released! You should definitely &lt;a href="http://www.oracle.com/technetwork/java/javamagazine/index.html"&gt;check this out&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
By the way, they actually published an interview we did some time ago, together with Bruno Souza (SouJava, Brazil) and Michael Huttermann (Jug Cologne, Germany). That's cool! But I'm not a big star as they are, just a Java passionate guy! I do appreciate that! You can read the interview in the picture below or directly in the &lt;a href="http://www.oracle.com/technetwork/java/javamagazine/index.html"&gt;latest edition&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-khG6kc6fLuA/UVLHyhumYlI/AAAAAAAABUw/A--F3KxT7QQ/s1600/java-magazine-interview.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-khG6kc6fLuA/UVLHyhumYlI/AAAAAAAABUw/A--F3KxT7QQ/s640/java-magazine-interview.png" width="580" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Many thanks to Java Magazine's editors for publishing that interview!&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/knNmZvwNSsQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/8071013202857757317/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2013/03/interviewed-by-java-magazine.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8071013202857757317?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8071013202857757317?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/knNmZvwNSsQ/interviewed-by-java-magazine.html" title="Interviewed by Java Magazine" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-khG6kc6fLuA/UVLHyhumYlI/AAAAAAAABUw/A--F3KxT7QQ/s72-c/java-magazine-interview.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2013/03/interviewed-by-java-magazine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ICQXk8eSp7ImA9WhBUFE0.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-5102080852372786247</id><published>2013-01-27T17:41:00.000+01:00</published><updated>2013-05-01T12:52:40.771+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-01T12:52:40.771+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>On The Illusion of Controlling People's Time</title><content type="html">Software Engineering is going through an identity crisis. The old school has failed because of too much control, moving people away from what they really have to deliver. The new school, or agile fever, is more focused on humanities, directing all the attention to human beings. This approach practically&amp;nbsp;decimated the old school, showing that writing software is not an exact science. It is actually&amp;nbsp;unpredictable&amp;nbsp;and cannot be done without creativity, inspiration and transpiration. Maybe the old school, which insists to exist, got confused by the fact that software execution, data processing, and system and hardware design are engineering stuff, but it doesn't mean that developing those stuff is also engineering. On the contrary... it's&amp;nbsp;human and social.&lt;br /&gt;
&lt;br /&gt;
When I see managers trying to measure the time spent on people's daily activities, I understand they are taking into consideration only the transpiration of their teams and completely ignoring the creativity and inspiration. These two last aspects are so subjective that it's hard to compare their manifestation on different people. How to compare artists? We may find artists' comparisons out there, but they heavily rely on who is producing the comparison. Let's ask ourselves: why on earth would someone use quantitative criteria, such as time and money, to measure and compare subjective matters?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-_UYI3cybjmw/UPfthQ11C8I/AAAAAAAABSg/MFOcLUKkhVg/s1600/head_mayan_calendar.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-_UYI3cybjmw/UPfthQ11C8I/AAAAAAAABSg/MFOcLUKkhVg/s640/head_mayan_calendar.jpg" width="550" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Measurements are only useful when we're capable of making comparisons with them in an objective way. We compare the date of our birth with the calendar to know our age. In times of crisis, we pay attention to our water, gaz and electricity consumption and make comparisons, finding ways to save money. Climate is measured because we need to decide which clothes to wear or which precautions to take by comparing with previous experiences or common sense. Notice we put measured subjects into perspective to understand the real dimension, the scale, the direction, and then we're able to reason about trends, behaviours, issues, patterns, etc.&lt;br /&gt;
&lt;br /&gt;
When it comes to subjective matters, we might be able to make comparisons, but measurements are just useless in this case. Actually, we can come closer with a lot of statistical methods, multi-variable analysis, multi-criteria craziness, but do we really have time and resources to produce all these analyses in a daily basis, and even take the risk of being probabilistically far from what it's expected? It sounds complicated, isn't it? That's because it is. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;In software development, every activity is different from one another&lt;/b&gt;. It's impracticable to precisely compare two activities even if they look the same and are done by the same person. It's all subjective, otherwise it would be easy to put the project on schedule by adding more people in the team. We know that since 1975, when Frederick Brooks published "&lt;a href="http://www.amazon.com/gp/product/0201835959/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0201835959&amp;amp;linkCode=as2&amp;amp;tag=c03ce-20"&gt;The Mythical Man-Month&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=c03ce-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201835959" style="border: none !important; margin: 0px !important;" width="1" /&gt;". So, when a manager asks their developers to inform the time spent in every activity, he/she is in fact collecting lies (or non-truths). If he/she prepares a report with those collected times, this is going to be the spread of an even bigger lie (or useless information).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-T6zWEJClF4k/UQQIl2cyh7I/AAAAAAAABTA/hMO0O6GEcD4/s1600/87911.strip.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="124" src="http://2.bp.blogspot.com/-T6zWEJClF4k/UQQIl2cyh7I/AAAAAAAABTA/hMO0O6GEcD4/s400/87911.strip.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
But why lies? There are two good explanations for that:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;most people don't track exactly how much time they spent on their activities, thus they actually inform safer figures, which are usually higher than reality;&lt;/li&gt;
&lt;li&gt;time control gives a feeling of surveillance, making developers believe their&amp;nbsp;manager wants to know whether they are really working or not, thus they smartly add some extra time to mask non-productive time.&lt;/li&gt;
&lt;/ol&gt;
Managers should also be aware that &lt;b&gt;time control also kills creativity&lt;/b&gt;. When developers have new ideas, potentially useful for the project, they cannot simply turn them into activities because of scope constraints or just because those ideas are not clear enough to be described. Without activities, developers cannot report their time. Therefore, if they spend too much time working on their ideas, it will look like huge time gaps for their managers.&lt;br /&gt;
&lt;br /&gt;
Eventually, managers are moved to implement time control because of visible procrastination. I remember once when a new project was starting, a big room was allocated to a team of 12 people, and the project manager asked the team to choose their places in the room. There were 15 places available, 12 with monitors facing the wall and 3 with monitors facing the door. Guess which places were left available? That's right! The three ones facing the door :D I remember the symphony of mouse clicks and sudden movements when the manager walked through the room. That was so funny! :D But time control wouldn't solve that problem because inputing time on activities is also a distraction. Anything that is not building deliverables is a distraction. We may never eliminate them, but we can always reduce them. &lt;b&gt;The solution for procrastination, in a single word, is: Motivation!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
But, is time control totally out of&amp;nbsp;sense? It has some sense when the work is fully based on time, which is the case of consultants payed hourly. This is about their business model, not software engineering. That's a good practice for consultants to inform to customers how many hours they had spent because it's directly related to their payments. Notice that this kind of service is for a short period of time and for highly&amp;nbsp;specialised&amp;nbsp;skills. However, we are talking about software projects that last longer.&lt;br /&gt;
&lt;br /&gt;
Finding ways to motivate your team is the best strategy to put them on track and fully productive. Every form of control that threats their feelings will put them down. Motivation doesn't need to be monetary or entertaining. Sometimes, it's enough to show their wins, how important is their work for society, how it changed people's lives, and why it's important to keep doing what they're doing.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="color: #0b5394;"&gt;"&lt;i&gt;One reason programmers dislike meetings so much is that they're on a different type of schedule from other people. Meetings cost them more. For someone on the maker's schedule, having a meeting is like throwing an exception. It doesn't merely cause you to switch from on task to another, it changes the mode in which you work.&lt;/i&gt;"&lt;/span&gt; - Paul Graham&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/Ef9anRWsiW4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/5102080852372786247/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2013/01/on-illusion-of-controlling-peoples-time.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5102080852372786247?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5102080852372786247?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/Ef9anRWsiW4/on-illusion-of-controlling-peoples-time.html" title="On The Illusion of Controlling People's Time" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-_UYI3cybjmw/UPfthQ11C8I/AAAAAAAABSg/MFOcLUKkhVg/s72-c/head_mayan_calendar.jpg" height="72" width="72" /><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2013/01/on-illusion-of-controlling-peoples-time.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QGRnk6cCp7ImA9WhNaEk0.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-893556468962215846</id><published>2013-01-26T15:08:00.001+01:00</published><updated>2013-01-26T15:08:47.718+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-26T15:08:47.718+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="art" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>Featured on Oracle's Java Magazine</title><content type="html">I'm glad to see I was featured on the latest edition of &lt;a href="http://oracle.com/javamagazine" target="_blank"&gt;Oracle's Java Magazine&lt;/a&gt; (Issue January/February 2013, page 67). I would like to thank &lt;a href="http://oracle.com/" target="_blank"&gt;Oracle&lt;/a&gt; on behalf of the &lt;a href="http://cejug.org/" target="_blank"&gt;CEJUG Community&lt;/a&gt;. We have been partners for so long and this is a nice way to demonstrate that you guys, at Oracle, recognise&amp;nbsp;our contribution to the Java Community.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-oOUtbE9DTio/UQOv1eXe2wI/AAAAAAAABSw/10VRQUHlUWY/s1600/hildeberto-featured-on-java-magazine.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-oOUtbE9DTio/UQOv1eXe2wI/AAAAAAAABSw/10VRQUHlUWY/s400/hildeberto-featured-on-java-magazine.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It's important to say that they cut part of my hair using Photoshop. I'm actually more handsome than it looks like... hehehehe :D Joking! Back to work!&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/0G57gkxp9r8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/893556468962215846/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2013/01/featured-on-oracles-java-magazine.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/893556468962215846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/893556468962215846?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/0G57gkxp9r8/featured-on-oracles-java-magazine.html" title="Featured on Oracle's Java Magazine" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-oOUtbE9DTio/UQOv1eXe2wI/AAAAAAAABSw/10VRQUHlUWY/s72-c/hildeberto-featured-on-java-magazine.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2013/01/featured-on-oracles-java-magazine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABQnk-fip7ImA9WhNVGUk.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-6947898126326816233</id><published>2012-12-31T18:33:00.000+01:00</published><updated>2012-12-31T10:22:33.756+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-31T10:22:33.756+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><title>Leaving CEJUG's Leadership Team</title><content type="html">Today is my last day in CEJUG's leadership team. A journey that lasted for tireless 8 years or something. I'm not sure about the exact date I became Jug Leader, but I remember very well how it happened. I was attending a CEJUG coordination meeting at &lt;a href="http://www.fortesinformatica.com.br/" target="_blank"&gt;Fortes Informática&lt;/a&gt; because I was helping them to organize an event. Right after the meeting, Felipe Gaúcho invited me to co-lead the group, which was unexpected but very pleasant. I accepted immediately! &lt;a href="http://www.hildeberto.com/2010/03/felipe-gaucho-you-will-be-missed.html" target="_blank"&gt;Felipe is not among us anymore&lt;/a&gt;, but I am eternally grateful to him for this incredible opportunity.&lt;br /&gt;
&lt;br /&gt;
I'm not leaving because I'm tired or bored. I'm leaving because CEJUG needs renovation. It needs to change its philosophy, its soul. I'm the oldest one in the leadership team, thus I'm a dinosaur in terms of community management. My mind still believes in some practices that don't work anymore and the community is not growing as it could grow. Fresh and valuable ideas usually come from new people with a vision to help others to develop their technical capabilities. I'm sure there are a lot of people like that out there and I wish they get my place and move on faster.&lt;br /&gt;
&lt;br /&gt;
There is a CEJUG's rule that promotes ex-leaders to become advisers for the leadership team. It is a sort of recognition for the great services provided to the group. But I'm not accepting even that. To give advices to a future leader is like bringing back the old way of thinking. That's what I'm trying to avoid. Advisers are not so active anyway. I don't remember the last time I received an advice from them. Actually, it ended up becoming a definitive leave for them too. Eventually, my departure will motivate other members of the leadership team to take the same initiative, if they have the same feeling I'm describing in this post, of course.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-7BYWh04DOzI/UOBeOvPT7JI/AAAAAAAABQA/7rwUwBv2fnE/s1600/12453.strip.gif" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-7BYWh04DOzI/UOBeOvPT7JI/AAAAAAAABQA/7rwUwBv2fnE/s400/12453.strip.gif" width="550" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Sometime ago, a friend of mine was excited about CEJUG's community and he asked me what he has to do to become a JUG Leader. I told him that it's not so difficult, but it requires patience and a lot of work. That's because CEJUG is a meritocracy, where you are recognised according to your contribution to the community. The recognition is basically promoting you to the leadership team, then you have more power and resources to make things happen. It takes some time because we wanna make sure that you won't give up easily and you will just continue working as hard as before.&lt;br /&gt;
&lt;br /&gt;
The problem is that there is no glamour in the role of Jug Leader. New leaders probably realised that it's more a labor of love, donation and dedication than a professional achievement. Some people love that, like I do, but most people don't. Perhaps new leaders won't find motivation for the merit in this meritocracy model. The excitement may last for a few months and then, even the free time will be&amp;nbsp;occupied with&amp;nbsp;other priorities.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;I have been proud of my role as a Jug Leader, not because of what I did for the community, now and in the past, but because of what I feel for them and what I was willing to lose for them.&lt;/b&gt;&amp;nbsp;I will keep this feeling in my heart. You may ask me why I'm leaving since I'm still in love. This is like a relationship that doesn't work. When your love is not reciprocal the best thing you can do is set your love free.&lt;br /&gt;
&lt;br /&gt;
If you want to be the next CEJUG Leader, be aware of the need for passion, donation and dedication, with or without professional achievement. In addition to that, read a very interesting post on John Yeary's blog about &lt;a href="http://javaevangelist.blogspot.be/2012/11/what-is-definition-of-jug-leader.html" target="_blank"&gt;the definition of a Jug Leader&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
By the way, I will continue as a humble CEJUG member, trying to help people there with their technical questions. Meanwhile, I'm working on a new open source project! I'm going to launch it here soon and maybe it will end up in a new, large and successful community! ;)&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/-Kkq0uJmXag" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/6947898126326816233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/12/leaving-cejugs-leadership-team.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6947898126326816233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6947898126326816233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/-Kkq0uJmXag/leaving-cejugs-leadership-team.html" title="Leaving CEJUG's Leadership Team" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-7BYWh04DOzI/UOBeOvPT7JI/AAAAAAAABQA/7rwUwBv2fnE/s72-c/12453.strip.gif" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/12/leaving-cejugs-leadership-team.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8FSXw_fSp7ImA9WhNVGEQ.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-8012293172158257586</id><published>2012-12-23T18:25:00.000+01:00</published><updated>2012-12-30T19:06:58.245+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-30T19:06:58.245+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise application" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="user interface" /><title>Easier Multi-Field Validation with JSF 2.0</title><content type="html">One of the most frequent needs when developing application forms is multi-field validation (or cross-field, but I'm not using this term because when I put it on Google I actually got some post-war pictures). I'm talking about situations where we need to compare whether an initial date is earlier than an end date or a value is lower than another one. Isn't it an obvious feature in every business-oriented framework? Not really. Unfortunately, the JSF specification doesn't support it by default. Therefore, until its latest production release (&lt;a href="http://www.jcp.org/en/jsr/detail?id=245" target="_blank"&gt;JSR 245&lt;/a&gt; - JSF 2.1), JSF did not offer an out-of-the-box multi-field validation feature.&lt;br /&gt;
&lt;br /&gt;
We probably can hope for something coming in JSF 2.2, since the &lt;a href="http://jcp.org/en/jsr/detail?id=344" target="_blank"&gt;JSR 344&lt;/a&gt; mentions "Multi-field validation". Meanwhile, developers have used their fruitful creativity to implement their solutions. You can find plenty of working alternatives at &lt;a href="http://stackoverflow.com/questions/6282466/jsf2-0-doesnt-support-cross-field-validation-is-there-a-workaround" target="_blank"&gt;Stackoverflow.com&lt;/a&gt;; people creating their &lt;a href="http://pawelstawicki.blogspot.be/2010/12/jsf20-component-for-cross-field.html" target="_blank"&gt;own components&lt;/a&gt;; &lt;a href="http://ocpsoft.org/java/jsf-2-0-cross-field-form-validation-simpl-in-reality/" target="_blank"&gt;frameworks built on top of Java EE&lt;/a&gt; trying to cover this feature; and many other cases.&lt;br /&gt;
&lt;br /&gt;
I didn't like any solution I found. Some are complex, others are not so elegant. So, I decided to be creative as well and try a simpler solution, easy to understand and change when the time for refactoring comes. It doesn't mean that I'm proposing something better than other proposals. I'm just proposing something simpler.&lt;br /&gt;
&lt;br /&gt;
In the following example, I check whether an allocated budget is smaller than a budget limit. If not, then a message is shown to the user. The example considers only two fields, but it can scale to as many fields as you wish.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Step 1: create an attribute in the managed bean for each field to be validated:&lt;/h4&gt;
&lt;br /&gt;
The attributes below are exclusively used in the multi-field validation.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;private BigDecimal validationAllocatedBudget;&lt;br /&gt;
private BigDecimal validationBudgetLimit;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In this example, I'm coding inside a class named &lt;span style="font-family: Courier New, Courier, monospace;"&gt;MBean&lt;/span&gt;, annotated with &lt;span style="font-family: Courier New, Courier, monospace;"&gt;@ManagedBean&lt;/span&gt; and &lt;span style="font-family: Courier New, Courier, monospace;"&gt;@RequestScoped&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Step 2: create a validation method in the same managed bean for each field&lt;/h4&gt;
&lt;br /&gt;
This solution considers validation methods implemented in the managed bean instead of implementations of the interface &lt;a href="http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/api/javax/faces/validator/Validator.html"&gt;javax.faces.validator.Validator&lt;/a&gt;. &amp;nbsp;You can give any name to validation methods as long as you define three standard parameters, which are the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;FacesContext&lt;/span&gt;, the&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;UIComponent&lt;/span&gt;, and an&amp;nbsp;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;Object&lt;/span&gt;&amp;nbsp;representing the value input in the field. Only the value is useful for our validation. See the validation methods:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;public void validateAllocatedBudget(FacesContext context, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UIComponent component, Object value) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; this.validationAllocatedBudget = (BigDecimal) value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void validateBudgetLimit(FacesContext context, &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UIComponent component, Object value) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; this.validationBudgetLimit = (BigDecimal) value;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; if(this.validationBudgetLimit&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .compareTo(this.validationAllocatedBudget) &amp;lt; 0) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ValidatorException(&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FacesMessage("Invalid allocated budget!");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The method &lt;span style="font-family: Courier New, Courier, monospace;"&gt;validateAllocatedBudget&lt;/span&gt; doesn't validate the allocated budget. It simply set the attribute &lt;span style="font-family: Courier New, Courier, monospace;"&gt;validationAllocatedBudget&lt;/span&gt; to allow its value to be used afterwards. It is possible because the validation methods are called in the same sequence they are declared in the JSF code. So, you can create a simple method like that for each field involved in the validation. The effective validation occurs in the method &lt;span style="font-family: Courier New, Courier, monospace;"&gt;validateBudgetLimit&lt;/span&gt;, which is the latest called validation method in the JSF file, thus the last one to execute.&lt;br /&gt;
&lt;br /&gt;
It's a good idea to declare attributes and validation methods in the same order of the fields in the form. The order doesn't interfere the functioning of the algorithm, but it helps to understand the logic. On the other hand, the order of calls in the JSF file is important.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Step 3: use the parameter &lt;span style="font-family: Courier New, Courier, monospace;"&gt;validator&lt;/span&gt;&amp;nbsp;to reference the validation method&lt;/h4&gt;
&lt;br /&gt;
The methods described above are called from the fields below. Remember that the attributes and methods were implemented in the class &lt;span style="font-family: Courier New, Courier, monospace;"&gt;MBean&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;lt;h:outputLabel for="allocBudget" value="Allocated Budget"/&amp;gt;&lt;br /&gt;
&amp;lt;h:inputText id="allocBudget" label="&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;Allocated Budget&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; value="#{mBean.operation.allocatedBudget}"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; validator="#{mBean.validateAllocatedBudget}"/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h:outputLabel for="budgetLimit" value="Budget Limit"/&amp;gt;&lt;br /&gt;
&amp;lt;h:inputText id="budgetLimit" label="Budget Limit"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; value="#{mBean.operation.budgetLimit}"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;&amp;nbsp; &amp;nbsp; validator="#{mBean.validateBudgetLimit}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
That's it! :) Merry Christmas and Happy New Year! \o/&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/vCIQLZ3zvN8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/8012293172158257586/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/12/easier-multi-field-validation-with-jsf.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8012293172158257586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8012293172158257586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/vCIQLZ3zvN8/easier-multi-field-validation-with-jsf.html" title="Easier Multi-Field Validation with JSF 2.0" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/12/easier-multi-field-validation-with-jsf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUARng4fyp7ImA9WhNVGEQ.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-2011326816155720577</id><published>2012-12-18T10:09:00.001+01:00</published><updated>2012-12-30T18:57:27.637+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-30T18:57:27.637+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ide" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise application" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><category scheme="http://www.blogger.com/atom/ns#" term="refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="configuration management" /><title>Case Study: Migrating a Large Project from Ant to Maven</title><content type="html">The truth is we had been under difficult times. We spent almost three months to migrate our build mechanism from &lt;a href="http://ant.apache.org/" target="_blank"&gt;Ant&lt;/a&gt; to &lt;a href="http://maven.apache.org/" target="_blank"&gt;Maven&lt;/a&gt;. That's the minimum time you have to put in your schedule if you are planning to do the same in a large project. There are still some collateral effects of this migration that we are struggling to solve, but fortunately they are not so critical. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Context &lt;/h3&gt;&lt;br /&gt;
Just to contextualize a little, we have a full &lt;a href="http://www.oracle.com/technetwork/java/javaee/tech/index.html" target="_blank"&gt;Java EE 6&lt;/a&gt; system composed of 25 integrated applications and each application has an average of 3 modules (EJB, WEB, etc), reaching ~80 modules. We manage something close to 500K lines of Java code (JSs, CSSs, JSPs and JSFs files not included), according to our &lt;a href="http://www.sonarsource.org/" target="_blank"&gt;Sonar&lt;/a&gt; analysis. It takes between 15 to 20 minutes to build everything. It depends on the mood of the server.&lt;br /&gt;
&lt;br /&gt;
The decision to go for Maven came as a precondition to start a large scale refactoring of the application, which, despite using the latest technology available (Java EE 6), has suffered from a mix of frameworks, design flaws and multiple architectures over the years. We are going towards a single architecture grounded on the Java EE specification in order to optimize dependencies, reduce the evolution cost in a middle/long-term perspective and run seamless in our &lt;a href="http://glassfish.java.net/" target="_blank"&gt;Glassfish Application Server&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Duty&lt;/h3&gt;&lt;br /&gt;
The project structure is almost the same as it was with Ant, thanks to the flexibility provided by Maven. We have a super pom.xml file in the root folder, which basically declares all modules, plugins, additional repositories, and dependencies. The dependencies are declared in a dependency management (using the tag &amp;lt;dependencyManagement&amp;gt;). This way, all version numbers are declared in a single place. Besides the super pom.xml, we have a folder for each integrated application and inside each folder we have a application pom.xml and three other folders, one for each Java EE module (EAR, EJB, WEB). The application's pom.xml inherits from the super pom and it basically declares the modules composing the application. Inside the module folders we have one more level of pom files. These pom files inherit from their respective application's pom files and  describe the particularities of their modules. In summary, we have three levels of pom files, from the system as a whole to the level of Java EE modules.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bE1m7B53tUQ/UMpD83ux-ZI/AAAAAAAABJQ/dGDAbfe4jXk/s1600/maven-project-structure.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-bE1m7B53tUQ/UMpD83ux-ZI/AAAAAAAABJQ/dGDAbfe4jXk/s640/maven-project-structure.png" width="550" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Example of structure similar to the one we are using.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
For development purposes, we avoid deploying the entire application locally. That's why we have an EAR module in each application. This way, we save time deploying only the application we are working on. Those application EAR modules are not taken into consideration when packaging to deploy on the servers. To build the full EAR for the servers we have a special application that contains a EAR module, whose pom file declares all EJB and WEB modules as dependencies. Performing the goal &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;package&lt;/span&gt; on this pom.xml will actually create the super EAR file.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-elDgmTuPzr4/UMpFIraom0I/AAAAAAAABJk/3YpR16fUY8g/s1600/maven-project-structure-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-elDgmTuPzr4/UMpFIraom0I/AAAAAAAABJk/3YpR16fUY8g/s640/maven-project-structure-2.png" width="550" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EAR module to package the entire system in a single deployment file.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h3&gt;The Good&lt;/h3&gt;&lt;br /&gt;
Evaluating the project after Maven implementation, we could notice the following benefits:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1b2mgHsSWks/ULNw1vDZhDI/AAAAAAAABJA/Bpa8krTvvGs/s1600/relaxed-cat.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="157" src="http://2.bp.blogspot.com/-1b2mgHsSWks/ULNw1vDZhDI/AAAAAAAABJA/Bpa8krTvvGs/s200/relaxed-cat.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="color: #38761d;"&gt;&lt;b&gt;Maven contributed to simplify the logic behind the build&lt;/b&gt;&lt;/span&gt;: Now, everybody is aware of what is going on because pom.xml files are much easier to understand than build.xml files. Our Ant files were generated by &lt;a href="http://www.netbeans.org/" target="_blank"&gt;Netbeans&lt;/a&gt;, thus very big and unreadable. We were actually lucky to have them working for so long, since it was difficult to maintain them. No question that we would find a point of irremediable chaos very soon.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&lt;b&gt;Maven also contributed to put some order in all project dependencies&lt;/b&gt;&lt;/span&gt;: We went from a ~100 MB EAR package to a ~50MB one, a very significant reduction of 50%. It contributed to make the deployment time shorter.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&lt;b&gt;We had the opportunity to clean up the project&lt;/b&gt;&lt;/span&gt;: While gathering the dependencies to write the pom.xml files, we discovered that some modules were not needed any more; libraries spread through the modules were also removed in favour of Maven's dependency management. In summary, we have said "Maven is a nightmare" until the day we finally had everything in order and we became happier and relaxed. That's what most people say as well, since it's not easy to find solutions for a particular scenario, and everybody has a particular scenario to deal with.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&lt;b&gt;Short learning curve&lt;/b&gt;&lt;/span&gt;: Once Maven was put in place, we visited all developers, reconfigured Netbeans to recognize the Maven projects and explained to them how to proceed from that point on. All of them could immediately continue with their development activities and just a few call for support were triggered. None of these calls were blocking issues. I have to say that Netbeans contributed a lot to reduce the learning curve because all necessary goals are performed directly from the IDE and there is no need to go to the command line, as it usually happens with Eclipse.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Bad&lt;/h3&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Eb0GjnTkJbc/ULNwtaYT7FI/AAAAAAAABI4/bH0zqkmqgUc/s1600/headache.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="141" src="http://1.bp.blogspot.com/-Eb0GjnTkJbc/ULNwtaYT7FI/AAAAAAAABI4/bH0zqkmqgUc/s200/headache.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Unfortunately, we had some setbacks:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #990000;"&gt;&lt;b&gt;The build now takes longer with Maven&lt;/b&gt;&lt;/span&gt;: We have noticed a decline on developers' productivity due to that, making us a bit frustrated at the end :-( Since we are not going to rollback to Ant, we are considering &lt;a href="http://zeroturnaround.com/software/jrebel/" target="_blank"&gt;JRebel&lt;/a&gt; for dynamic reloading of changed code to compensate the additional time we are spending.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #990000;"&gt;&lt;b&gt;We are using some libraries that can't be found in Maven's central repositories or elsewhere&lt;/b&gt;&lt;/span&gt;: Some are commercial libraries and others are too old. We also found libraries available with inconsistencies, throwing many exceptions at runtime (i.e. Apache FOP). For each one of these situations we had to find workaround solutions that were not so elegant, but we cannot stay like that for so long. We have to install a local &lt;a href="http://www.sonatype.org/nexus/" target="_blank"&gt;Nexus&lt;/a&gt; repository to address special cases. This is in our check-list.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #990000;"&gt;&lt;b&gt;Occurrence of unexpected behaviours&lt;/b&gt;&lt;/span&gt;: the best of the efforts is not enough to avoid unexpected behaviours in the application. We have built a spreadsheet listing all applications and their respective modules; documented all dependencies from libraries and between modules; depicted the project structure; went deeper into details. In order to elaborate this spreadsheet we spent several days investigating the guts of the system, absorbing low level mechanisms and design decisions. All the collected information was used on the migration. Nevertheless, the rearrangement of dependencies and the removal of duplicates and unused libraries caused broken navigation flows, alert messages coming from nowhere, changes on URL paths and many other surprises. Unfortunately, we couldn't predict those problems and we spent much more time on fixes than what was initially foreseen.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Conclusion&lt;/h3&gt;&lt;br /&gt;
I would like to conclude giving some advices for those planning to adopt Maven in a middle/large scale project:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;&lt;b&gt;Communicate the migration to end-users&lt;/b&gt;&lt;/span&gt;: it's very important to communicate to end-users what is going to happen in the coming days. Users should be aware that, as they have the duty to improve their business, we also have the duty to improve ours. It means the delivery of new features will temporarily slow down to pave the way to a better product with faster releases. If they are not aware of what is going on, they will have very low tolerance to problems, undermining the reputation of the project.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;&lt;b&gt;Don't be afraid to change even what is working well&lt;/b&gt;&lt;/span&gt;: We have questioned ourselves why to migrate to Maven if Ant is working so well. Actually, our strategy is to reduce complexity to streamline the resolution of problems. So, we were not afraid to migrate because preventive measures are very important too.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;&lt;b&gt;Keep the entire migration under version control to help the investigation of problems&lt;/b&gt;&lt;/span&gt;: Once all pom files were created and versioned, every little changes in those files should be committed separately in order to revert changes in case of unexpected problems. It helps to isolate the causes. It is also good to know that there is no conflict between Ant and Maven files. So, both can stay in the same branch during the migration without any impact on developers.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;&lt;b&gt;Don't start a big refactoring without a build system like Maven&lt;/b&gt;&lt;/span&gt;: a successful refactoring depends on a detailed understanding of the application and adopting Maven will push you to perform an extensive investigation. In addition to that, the project will be cleaner and better organized.&lt;br /&gt;
&lt;br /&gt;
There are other alternatives to Maven, such as &lt;a href="http://ant.apache.org/ivy/" target="_blank"&gt;Apache Ivy&lt;/a&gt; and &lt;a href="http://www.gradle.org/" target="_blank"&gt;Gradle&lt;/a&gt;, but, despite all deserved criticism, we still recommend Maven when replacing Ant because of its maturity; vast plug-in portfolio; abundant documentation on the web; and rich IDE support. However, it's a good idea to evaluate other alternatives once Maven is put in place. After the initial tsunami, other waves will come quietly.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/HGwXiFUiPl8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/2011326816155720577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/12/case-study-migrating-large-project-from.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2011326816155720577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2011326816155720577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/HGwXiFUiPl8/case-study-migrating-large-project-from.html" title="Case Study: Migrating a Large Project from Ant to Maven" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-bE1m7B53tUQ/UMpD83ux-ZI/AAAAAAAABJQ/dGDAbfe4jXk/s72-c/maven-project-structure.png" height="72" width="72" /><thr:total>10</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/12/case-study-migrating-large-project-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMARX84fSp7ImA9WhNQFU0.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-3257734591853993384</id><published>2012-11-20T13:10:00.000+01:00</published><updated>2012-11-21T14:10:44.135+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-21T14:10:44.135+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="europe" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><title>Freedom of Thinking and Speech at Devoxx 2012</title><content type="html">I have been attending &lt;a href="http://www.devoxx.com/" target="_blank"&gt;Devoxx&lt;/a&gt; in a row since &lt;a href="http://www.hildeberto.com/2008/09/javoxx-is-coming-what-devoxx.html" target="_blank"&gt;it was called JavaPolis and then they had to change the name to Devoxx due to copyright issues with Sun Microsystems&lt;/a&gt; at the time. I have the privilege to live close (in terms of world, but far in terms of Belgium) to the hosting city, &lt;a href="http://www.visitantwerpen.be/bze.net?id=1470" target="_blank"&gt;Antwerp&lt;/a&gt;, and I'm used to be passionate and engaged with the Java international community. However, the main reason I'm &lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;successively attending this conference is because &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;they excel&lt;/span&gt; &lt;span class="hps alt-edited"&gt;every edition, making the next one &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;unmissable. This year it wasn't different.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qva_xf5kHiw/UKoMYrvz85I/AAAAAAAAA9I/z6Oo7kjGpYY/s1600/devoxx-2012.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="265" src="http://4.bp.blogspot.com/-qva_xf5kHiw/UKoMYrvz85I/AAAAAAAAA9I/z6Oo7kjGpYY/s400/devoxx-2012.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Stephen Janssen trying to find 200 available places in that crowded geek audience.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;Devoxx is probably the only conference in the world that manages to put Oracle and Google face to face without conflicts. This is such a great achievement that I would recommend Devoxx's team to the United Nations in order to address the conflict in Gaza and finally put an effective peace process in place between Israel and Palestine ;-)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;By the way, I should say something about the way Oracle leads their keynote speeches. Last year Oracle made a pretty boring presentation, but it was ok after all. This year they exceeded themselves making a pretty boring + &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;chaotic presentation.&lt;/span&gt;&lt;/span&gt; First, &lt;a href="http://devoxx.com/display/DV12/Nandini+Ramani" target="_blank"&gt;Nandini Ramani&lt;/a&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;vice president of engineering, Java client, and mobile platforms at Oracle, was clearly nervous on the stage. At some point, she called &lt;a href="http://devoxx.com/display/DV12/Stephen+Chin" target="_blank"&gt;Stephen Chin&lt;/a&gt; to join her and he didn't show up. Ups! She decided to jump to the next presentation, which was clever, but right in the middle she was interrupted by the sound of a motorcycle, causing a pretty &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps alt-edited"&gt;awkward moment&lt;/span&gt;&lt;/span&gt;. What?! :D Yep! We initially thought that the staff accidentally opened a door, bringing noise from the traffic, but in fact Stephen Chin &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;suddenly &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;came out &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;with the motorcycle used in his &lt;a href="http://steveonjava.com/nighthacking/" target="_blank"&gt;Night Hacking Project&lt;/a&gt;. That was actually pretty cool except by the fact that Nandini was completely taken by surprise. She couldn't handle that unforeseen situation and she just handed over to Stephen, leaving&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&amp;nbsp;&lt;span class="hps"&gt;the presentation&lt;/span&gt; &lt;span class="hps alt-edited"&gt;halfway. Still, we had a lot of fun watching the situation. :D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps alt-edited"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps alt-edited"&gt;On the other hand, Google made a great tech show! Wow²! They know how to hold the audience's breath. The only issue (at least for those urging to visit the toilet) was their inability to manage time. The presentation took longer than expected, but every second was &lt;/span&gt;&lt;/span&gt;pretty&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;/span&gt; &lt;span class="hps"&gt;well spent on exciting demos! Cool!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;So, what do I learn from that? From my perspective, &lt;b&gt;I see Devoxx as a great independent conference where it's possible to closely compare leading competitors and make realistic decisions about the technologies we are going to chose for the coming years.&lt;/b&gt; Devoxx is definitively the best alternative to avoid &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;brainwashing conferences such as JavaOne (It wasn't like that in the past). This is to say the least, because they managed to overcome our expectations by adding a special track named &lt;a href="http://us2.campaign-archive2.com/?u=d777b04a23f45f06379a1e710&amp;amp;id=61aa5acdd9" target="_blank"&gt;Future&amp;lt;Devoxx&amp;gt;&lt;/a&gt;, focused on the programming of tiny devices, such as &lt;a href="http://www.tinkerforge.com/" target="_blank"&gt;TinkerForge&lt;/a&gt;, &lt;a href="http://www.arduino.cc/" target="_blank"&gt;Arduino&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;, &lt;a href="http://www.raspberrypi.org/" target="_blank"&gt;Raspberry Pi&lt;/a&gt;, and others. &lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;Curiously, there wasn't&lt;/span&gt;&lt;/span&gt;&amp;nbsp;a single mention to the classic &lt;a href="http://www.sunspotworld.com/" target="_blank"&gt;SunSpot&lt;/a&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;, which is probably one of many nice projects killed by Oracle after acquiring SUN. That track added a world of possibilities to all those &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;entrepreneurial minds. Well done!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;Is that all?! Not yet. Mother Devoxx is going to have &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;a new baby next year! After Devoxx France, they announced &lt;/span&gt;&lt;/span&gt;Devoxx UK. Yeah, attending Devoxx became a touristic problem now, based on the city you wanna visit ;-) Last, but not least, &lt;a href="http://www.devoxx.com/display/4KIDS/Home" target="_blank"&gt;Devoxx4Kids&lt;/a&gt; is definitively a great initiative! I actually wanted to attend it, but I have to wait for my little boy, who is only 11 months old now. I'm giving&lt;b&gt; &lt;/b&gt;him twice more milk to watch him grow up faster :P&lt;/span&gt;&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/HT--cpw-KWE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/3257734591853993384/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/11/freedom-of-thinking-and-speech-at.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/3257734591853993384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/3257734591853993384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/HT--cpw-KWE/freedom-of-thinking-and-speech-at.html" title="Freedom of Thinking and Speech at Devoxx 2012" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-qva_xf5kHiw/UKoMYrvz85I/AAAAAAAAA9I/z6Oo7kjGpYY/s72-c/devoxx-2012.jpg" height="72" width="72" /><thr:total>1</thr:total><georss:featurename>Antuérpia, Bélgica</georss:featurename><georss:point>51.2192159 4.4028818</georss:point><georss:box>51.0600899 4.0870248 51.3783419 4.718738800000001</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/11/freedom-of-thinking-and-speech-at.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AMRH86eip7ImA9WhNQE0w.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-5477226640084938819</id><published>2012-11-18T10:13:00.002+01:00</published><updated>2012-11-19T10:03:05.112+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-19T10:03:05.112+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><category scheme="http://www.blogger.com/atom/ns#" term="user interface" /><category scheme="http://www.blogger.com/atom/ns#" term="jvm" /><title>JavaFX Must be a Joke</title><content type="html">More than 3 years ago, I wrote the post "&lt;a href="http://www.hildeberto.com/2009/06/has-javafx-strategy.html" target="_blank"&gt;Has JavaFX a Strategy?&lt;/a&gt;"&amp;nbsp;saying:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;"&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; font-style: italic; line-height: 20px;"&gt;Don't you think that the fastest way to spread the JavaFX adoption is allowing the improvement of existing applications? Why to spend a lot of resources to drag an applet from the browser to the desktop if we need the network anyway?&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;"&lt;/span&gt;&lt;/blockquote&gt;
At that time, JavaFX Script was the only alternative to develop richer Java desktop applications. Guess what Oracle did right after Sun's acquisition: they stopped evolving a pretty stupid new language which looked more like Json, which is designed for data; migrated the whole thing to a new Java library; and allowed the integration with legacy code (i.e. Swing applications). If they didn't get inspired by my old blog post, then they just followed the sane common sense.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Adobe gave up Flex and Microsoft gave up Silverlight. Strangely, Oracle kept insisting on JavaFX.&amp;nbsp;We can see a lot of JavaFX demos out there, but not so much production-ready apps. &amp;nbsp;That's a shame after all these years. The single example I have of a real world application is from a Belgian company called&amp;nbsp;&lt;a href="http://www.healthconnect.be/" target="_blank"&gt;Health Connect&lt;/a&gt;. That's all! Anybody else?! JavaFX evangelists would give a lot of confidence to Java developers if they promoted JavaFX applications in production. We have the impression that those evangelists are paid to have fun. This is really unexpected from Oracle, which looks like a very serious company.&amp;nbsp;Take the example of Apple. They are very efficient on that. Every time they present their gadgets they also present outstanding apps developed for that device. It definitively makes developers excited!&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gSmVNINr3nU/UKjkF4uyLcI/AAAAAAAAA8o/--W0xohGh4c/s1600/javafx-mobile.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-gSmVNINr3nU/UKjkF4uyLcI/AAAAAAAAA8o/--W0xohGh4c/s1600/javafx-mobile.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fake announcement of JavaFX for &lt;br /&gt;
the mobile world in 2009. &amp;nbsp;Since then&lt;br /&gt;
zero apps shipped so far!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I was about to be excited when Oracle announced JavaFX running on OS6 with an app called&amp;nbsp;&lt;a href="http://fxexperience.com/2012/10/javafx-ensemble-in-the-mac-app-store/" target="_blank"&gt;JavaFX Ensemble&lt;/a&gt;, but when I realised that the goal of the app was simply to add more demos to the shelf, I got immediately frustrated :-( Is it so difficult to convince a company out there to write a useful app in JavaFX and make it available on OS6?! Come on! We are tired of demos! In fact, this "alpha" project is not enough to convince us that Java is going mobile. In &lt;a href="http://www.hildeberto.com/2012/08/the-consequences-of-deferring-project.html" target="_blank"&gt;my previous post&lt;/a&gt; I made the following prediction:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;"... in 3 or 4 years there will be no Java on devices, and the development community will have enough knowledge to live with that. Therefore, Java will be basically a server-side technology."&lt;/i&gt;&lt;/blockquote&gt;
Now, let's imagine that JavaFX is a great technology and everybody is adopting it. Is everything ok now? Nooooooo! Even if everybody is convinced about JavaFX, &lt;a href="http://www.pcworld.com/article/261843/time_to_give_java_the_boot_.html" target="_blank"&gt;there is no stable, reliable and easy to use JVM out there for the client side at the moment&lt;/a&gt;. Therefore, we cannot efficiently distribute JavaFX apps on desktops. We have to be within a company, with full control over the network, to manage the installation, security and upgrades of the JVM in all desktops in order to distribute the application. Well, that's silly :-/ &lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-BLUC2U3gzi0/UKn0EX7uUYI/AAAAAAAAA84/erGCKEEPfD0/s1600/mise-a-jour-java-error.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="129" src="http://3.bp.blogspot.com/-BLUC2U3gzi0/UKn0EX7uUYI/AAAAAAAAA84/erGCKEEPfD0/s320/mise-a-jour-java-error.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Error during my latest attempt to update my JVM.&lt;br /&gt;
Message: &lt;span class="long_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;"Failure&lt;/span&gt; to &lt;span class="hps"&gt;download &lt;/span&gt;&lt;/span&gt;&lt;span class="long_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;&lt;span class="long_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;required &lt;/span&gt;&lt;/span&gt;files&lt;/span&gt; &lt;span class="hps"&gt;for installation&lt;/span&gt;&lt;span class=""&gt;."&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I'm quite confident to advise you to leave JavaFX aside and go for HTML5. Most of its features are already cross-browser compatible and it's possible to build amazing user interfaces with that. Client-side Java is over, so get used to an exclusively java server-side world soon. Surprisingly, it doesn't make me sad, but happier :-)&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/Tkw_y14wqA4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/5477226640084938819/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/11/javafx-must-be-joke.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5477226640084938819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5477226640084938819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/Tkw_y14wqA4/javafx-must-be-joke.html" title="JavaFX Must be a Joke" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-gSmVNINr3nU/UKjkF4uyLcI/AAAAAAAAA8o/--W0xohGh4c/s72-c/javafx-mobile.jpg" height="72" width="72" /><thr:total>5</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/11/javafx-must-be-joke.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cMQX05fSp7ImA9WhNQE0s.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-7005663537157286929</id><published>2012-08-31T11:33:00.000+02:00</published><updated>2012-11-19T22:38:00.325+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-19T22:38:00.325+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="operating system" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><category scheme="http://www.blogger.com/atom/ns#" term="jvm" /><title>The Consequences of Deferring Project Jigsaw</title><content type="html">Mr. Mark Reinhold has&amp;nbsp;&lt;a href="http://mreinhold.org/blog/late-for-the-train" target="_blank"&gt;announced&amp;nbsp;in July 2012&lt;/a&gt; that they were planning to withdraw &lt;a href="http://openjdk.java.net/projects/jigsaw/" target="_blank"&gt;Project Jigsaw&lt;/a&gt; from Java 8 because Jigsaw would delay its release, planned for September 2013 (One year from now). This date is known because Oracle has decided to implement a two years roadmap planning for Java, so September 2013 is actually 2 years after the release of Java 7.&lt;br /&gt;
&lt;br /&gt;
According to Jigsaw's website...&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
"The goal of this Project is to design and implement a standard module system for the Java SE Platform, and to apply that system to the Platform itself and to the JDK. The original goal of this Project was to design and implement a module system focused narrowly upon the goal of modularizing the JDK, and to apply that system to the JDK itself. The growing demand for a truly standard module system for the Java Platform motivated expanding the scope of the Project to produce a module system that can ultimately become a JCP-approved part of the Java SE Platform and also serve the needs of the ME and EE Platforms."&lt;/blockquote&gt;
They also say:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
"Jigsaw was originally intended for Java 7 but was deferred to Java 8."&lt;/blockquote&gt;
Now they want to defer it to Java 9 :-( More details of their decision making are available in a &lt;a href="http://mreinhold.org/blog/late-for-the-train-qa" target="_blank"&gt;Q&amp;amp;A post on Reinhold's blog&lt;/a&gt;. You may read and follow the discussion there. Here is my opinion:&lt;br /&gt;
&lt;br /&gt;
Without Jigsaw, I believe that it's very difficult to put Java everywhere. Without Jigsaw, the idea of multi-platform is getting restricted to servers in a age of smartphones and tablets. Jigsaw may be "late for the train", but it is letting Java late for the entire platform ecosystem.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dP5y50-m5QY/UECB-Ijwx7I/AAAAAAAAA74/S65Rn8Bg_Os/s1600/java-everywhere.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="303" src="http://4.bp.blogspot.com/-dP5y50-m5QY/UECB-Ijwx7I/AAAAAAAAA74/S65Rn8Bg_Os/s400/java-everywhere.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Deprecated installation screenshot&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
Observing the market, we can see that development is becoming platform-dependent (iOS, Android, etc.) Only Java can beat this trending because of its large experience on multiplatform implementation, and the time to do it is NOW! Otherwise, in 3 or 4 years there will be no Java on devices, and the development community will have&amp;nbsp;enough&amp;nbsp;knowledge to live with that. Therefore, Java will be basically a server-side technology.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The reasoning behind my prediction is the following: mobile devices are limited in terms of resources and a modular JVM would allow the creation of tailored JVM considering the constraints of each device. I put myself in the shoes of those devices manufacturers: "I wouldn't distribute something in my products that might impact negatively the user experience in terms of performance". That was the argument (at least the public one) Apple used to avoid distributing the Flash plugin for iOS's browser. Probably because of that, Adobe definitively gave up Flash on mobile devices. A modular JVM would simplify a lot Oracle's negotiation with many device players. It would be reasonable for Apple to include Java as a language for iPad and iPhone applications;&amp;nbsp;Google would finally embed the JVM into Android&amp;nbsp;to evolve faster with new Java language features,&amp;nbsp;getting busy just with a module to extend the JVM to specific Android's capabilities; it would be even possible to save Nokia from bankruptcy :D&lt;br /&gt;
&lt;br /&gt;
You may wonder whether Apple and Google would ever adopt JVM as a standard runtime platform. Have you heard about opportunity cost? It states that our current choices and activities are actually blocking other possible choices and activities. The tricky part is to chose the opportunity that is least costly or with the highest profit. Having said that, we can see the scenario considering that Java was not an option because it wasn't modular when those companies made their decisions. If Java was modular and Apple had adopted it, iOS platform would have at least three times more apps than Android. "Java" was in Google's strategy to catchup with Apple. Only Java could allow Google to do it in such a short period of time. So, it's not so simple to ignore Java.&lt;br /&gt;
&lt;br /&gt;
Now, Oracle vs. Google: Of course the effort to  move Java forward should be economically viable, and in order to use Java, Google would have to spend some money. Unfortunately, Oracle and Google work with different currencies. While Oracle thinks in terms of licenses, Google thinks in terms of advertising. These currencies are incompatible, very difficult to convert, because while license is cost, advertising is profit. Therefore, Oracle would never reach a deal increasing Google's cost, but it would be possible to get a deal decreasing Google's profit. In other words, Oracle could have a percentage of Google's profit on advertising sold through Java apps in order to make Java available for Android. Google makes this kind of deal with a lot of companies like Yahoo, AOL and others. Why not with Oracle?&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If Oracle doesn't give all resources that the JDK team needs to make Jigsaw a reality in Java 8, Oracle will be completely out of the pervasive game very soon. Without breaking the JDK into manageable and efficient pieces, Oracle won't have arguments to convince the industry that Java is the way to go on the long run.&lt;br /&gt;
&lt;br /&gt;
Before deciding to drop Jigsaw out, I beg Oracle to think about the consequences! They must ignore the fixed release roadmap and accept the difficulty of the task. We can stay happy with Java 7 (it's not widely adopted anyway) as long as Jigsaw is on the way to Java 8. This fixed release cycle can actually come back after Java 8.&lt;br /&gt;
&lt;br /&gt;
I would love to be wrong and be taken by surprise with an official Oracle's announcement of the definitive support for JavaFX on Apple and Android devices during the next JavaOne ;-) However, I think the likelihood  is very low :-(&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/CS2RVYXv0Yo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/7005663537157286929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/08/the-consequences-of-deferring-project.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/7005663537157286929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/7005663537157286929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/CS2RVYXv0Yo/the-consequences-of-deferring-project.html" title="The Consequences of Deferring Project Jigsaw" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-dP5y50-m5QY/UECB-Ijwx7I/AAAAAAAAA74/S65Rn8Bg_Os/s72-c/java-everywhere.png" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/08/the-consequences-of-deferring-project.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEHR38yeip7ImA9WhJSF0o.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-1831035093162471895</id><published>2012-07-08T13:37:00.002+02:00</published><updated>2012-07-08T21:43:56.192+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-08T21:43:56.192+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="machine learning" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Book Review: Programming Collective Intelligence</title><content type="html">When the volume of data managed by our application significantly grows, we start thinking about ways of extracting information from the databases. We know that there are a lot of hidden information there, but we don't know exactly what they are and how to get them. Year after year, people have been working on solutions such as data mining, data-warehouse, business intelligence, and others to figure out those hidden information. At the same time, people also look for ways of using those new information not only for reporting, but also to give constant feedback to the application in order to achieve better results over time. This looks very much to a self-learning mechanism, that we can formally call &lt;a href="http://en.wikipedia.org/wiki/Machine_learning" target="_blank"&gt;machine learning&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Nowadays, a new dimension are absolutely relevant when applying machine learning on data analysis: &lt;b&gt;&lt;i&gt;the user's behaviour and preferences as individuals and as part of the collectivity&lt;/i&gt;&lt;/b&gt;. This is clearly the influence of social networks on all sort of applications. They are exploring new possibilities of improving the user experience, but how can we be part of that party? Do we need to get a PhD degree to follow the wave? Is it finally possible to make the subject accessible to ordinary programmers? No, we don't need a PhD degree and yes, it's finally possible to make our applications smarter. This is what I've noticed while reading the book &lt;a href="http://shop.oreilly.com/product/9780596529321.do" target="_blank"&gt;Programming Collective Intelligence&lt;/a&gt;,&amp;nbsp;written&amp;nbsp;by &lt;a href="http://kiwitobes.com/"&gt;Toby Segaran&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://akamaicovers.oreilly.com/images/9780596529321/lrg.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://akamaicovers.oreilly.com/images/9780596529321/lrg.jpg" width="243" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
At the beginning, I felt uneasy with the chosen programming language - &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; - but I was gradually getting used to it because Python is not that hard to understand. In any case, I think this book would reach a larger audience by writing the examples in &lt;a href="http://www.oracle.com/technetwork/java/index.html"&gt;Java&lt;/a&gt;, which is constantly fighting with &lt;a href="http://www.cprogramming.com/"&gt;C&lt;/a&gt; for the first position in a &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html" target="_blank"&gt;well known ranking of popularity&lt;/a&gt;. On the other hand, the book targets more websites/portals and we know that Java is not really the first choice when companies decide to develop an application for a larger audience.&amp;nbsp;Independent on the programming language we master, we can always convert what we've understood from Python to our favorite language. At the end, the&amp;nbsp;&lt;span style="background-color: white;"&gt;success when implementing those machine learning algorithms come from&lt;/span&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;our ability to solve computational problems, not &lt;/span&gt;&lt;span style="background-color: white;"&gt;from our ability of learning new programming languages.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
On which concerns the content, the book brings together a large variety of real world problems&amp;nbsp;&lt;span style="background-color: white;"&gt;from websites and services that we frequently&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white;"&gt;use. It concludes reviewing and comparing the described algorithms, helping&lt;/span&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;the reader to easily visualize the applicability of the different methods and&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white;"&gt;to decide which one is the best for the problem we are actually facing.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: white;"&gt;This book has a new and better approach to present complex subjects such as data mining, machine learning, and statistics. By contextualizing the subject with real scenarios, the author improved the&amp;nbsp;didactic in an unprecedented manner, since this is&lt;/span&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;not the case in academic books. Actually, Programming Collective Intelligence can also be used by undergraduate and graduate students, since t&lt;/span&gt;&lt;span style="background-color: white;"&gt;here are exercises at the end of each chapter. This is great because sometimes we finish the study of a chapter without realizing what else can be done with those algorithms. This is not common in this kind of book (non-academic) and yet very appreciated.&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/fGWm6qxxzj8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/1831035093162471895/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/07/book-review-programming-collective.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/1831035093162471895?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/1831035093162471895?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/fGWm6qxxzj8/book-review-programming-collective.html" title="Book Review: Programming Collective Intelligence" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/07/book-review-programming-collective.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QBSX0_fSp7ImA9WhJSGE4.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-3517766191738478284</id><published>2012-06-30T07:24:00.001+02:00</published><updated>2012-07-09T15:09:18.345+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-09T15:09:18.345+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="business process" /><category scheme="http://www.blogger.com/atom/ns#" term="software engineering" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><title>Architects Need a Pragmatic Software Development Process</title><content type="html">I have been a non-stop software architect since 2006. During my experience, I realized that it’s really hard to perform the role of architect in an organization that doesn’t have a software development process or have it too simplified. When the development is not fairly organized, project managers don’t find a room in their schedule to implement architectural recommendations. They probably have time, people and resources, but since they don't have a precise idea of the team's productivity, they feel afraid of accepting new non-functional requirements or changing existing ones. I've noticed that, in a chaotic environment, people become excessively pragmatic, averse to changes.
&lt;br /&gt;
&lt;br /&gt;
Architects expect that the organization adopts a more predictable and transparent software process. This way, it’s possible to visualize the impact of recommendations and negotiate when they are going to be implemented. They minimally expect a process that has iterations inspired on the classical PDCA (Plan, Do, Check and Act) cycle because it has loops with feedback, which are the foundation for continuous improvement.
&lt;br /&gt;
&lt;br /&gt;
The figure below depicts what could be considered as a pragmatic software process.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/--Oa6zF0Fsy0/T98c1Ln8URI/AAAAAAAAAvw/zm7urjyxph4/s1600/iterations.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://4.bp.blogspot.com/--Oa6zF0Fsy0/T98c1Ln8URI/AAAAAAAAAvw/zm7urjyxph4/s400/iterations.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
Iterations are overlapped in time in order to optimize people allocation, use of resources and guarantee the feedback from previous iterations. Each iteration is performed in a fixed period of time. This time depends on the context and it tends to fall as the organization gains more maturity. An iteration is composed of 4 phases  (plan, do, check and act) and 5 events that may occur according to the planning. They are:

&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;T1&lt;/b&gt;: It represents the beginning of the iteration, starting with its planning. The scope of the planning covers only the period of the current iteration. It should not be mixed with the general project planning, which is produced in one of the initial iterations to plan all other iterations. All members of the team participate in the planning.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;T2&lt;/b&gt;: The execution of what was planned for the iteration starts. All members of the team must have something to do within the scope of the iteration. Nothing planned for future iterations should be done in the current iteration. People may produce all sort of output, such as documents, code, reports, meeting minutes, etc.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;T3&lt;/b&gt;: Everything that is produced should be checked. Documents should be reviewed, code should be tested, user interfaces and integrations with other systems should be tested, etc. All found issues must be registered to be solved in due time.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;T4&lt;/b&gt;: Solve all issues found during the check phase and release all planned deliverables. Everybody should deliver something. In case time is not enough to solve some found issues, they must be included in the planning of the next iteration with the highest priority. Statistics should be produced during this phase in order to compare the planning with the execution. The planning of the next iteration also starts at this point, taking advantage of the experience from the previous iteration.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;T5&lt;/b&gt;: Once everything is released, the current iteration finishes. T2 of the next iteration immediately starts because most of people and resources are already available.&lt;/li&gt;
&lt;/ul&gt;
T1 to T5 repeats several times, in a fixed period of time, until the end of the project. This suggestion is process-agnostic, thus it can be implemented no matter what software process we claim to have in place or any other modern process we can think of.
&lt;br /&gt;
&lt;br /&gt;
In addition to the process, there are also some good practices:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Consider everything that describes how the system implements business needs as use cases. It can also be functional and nonfunctional requirements, user stories, scenarios, etc; but there must be only one sort of artefact to describe business needs.&lt;/li&gt;
&lt;li&gt;Write use cases in a way that the text can be reused to: a) help business people to visualize how their needs will work; b) guide testers on the exploratory tests; and c) help the support team to prepare the user manual.&lt;/li&gt;
&lt;li&gt;Avoid technical terms in use cases. If really needed, technical details may be documented in another artefact, such as use case realizations.&lt;/li&gt;
&lt;li&gt;If needed, create use case realizations using UML models only. Representing use case realisations as documents implies on a huge overhead. Any necessary textual information can be added in the comments area of UML's elements.&lt;/li&gt;
&lt;li&gt;Fix the size of use cases according to the effort to realize it. For example: we can fix that the maximum size of a use case is 1 week. If the estimation is higher than that, then the use case must be divided in two others. If the estimation is far lower than that, then the use case must be merged with another closely related use case. By simply counting the number of use cases we immediately know the effort and the resources required to execute the project. This fixed number is a parameter to compare the planning with the execution. By performing this comparison after every iteration, we gradually know how precise our estimations are becoming.&lt;/li&gt;
&lt;li&gt;Use a wiki to document use cases and other required documentations, such as test cases, release notes, etc. Create a wiki page for each use case and use signs to indicate what is still pending to be released. The advantages of the wiki are: a) use cases are immediately available for all stakeholders as they are gathered; b) stakeholders can follow the evolution of the use cases by following updates in the page; c) it’s possible to know everyone who contributed to the use case and what exactly they did; and d) it’s possible to add comments to use cases, preserving all the discussion around it.&lt;/li&gt;
&lt;li&gt;If the organization has business processes, which is another thing that architects also love, then put references in the business process' activities pointing to the use cases that implement them. A reference is a link to the page where the use case is published on the wiki.&lt;/li&gt;
&lt;li&gt;Follow up use cases using an issue tracking system, such as &lt;a href="http://www.atlassian.com/software/jira/overview" target="_blank"&gt;Jira&lt;/a&gt;. Each use case must have a corresponding Jira ticket and every detail of the use case's planning, execution, checking and delivery must be registered in that ticket. The advantages of linking Jira tickets with use cases are: a) Jira tickets represent the execution of the planning and their figures can be compared with the planning, generating statistics on which managers can rely on; b) we know exactly every person who contributed to the use case, what they did, and for how long; and c) it’s an important source of lessons learned.&lt;/li&gt;
&lt;li&gt;Test, test, test! It must be an obsessive compulsive behaviour. Nothing goes out without passing through the extensive test session.&lt;/li&gt;
&lt;li&gt;Constantly train and provide all needed bibliography to the team on the technologies in use. The more technical knowledge we have inside of the team, the highest is our capability to solve problems and increase productivity.&lt;/li&gt;
&lt;/ol&gt;
Working this way, everything becomes quantifiable, predictable, comparable and traceable.
&lt;br /&gt;
&lt;br /&gt;
From the practices above we can extract the traceability flow from business to the lowest IT level, as depicted in the figure below.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-2hLc-BaF4WQ/T98dAQOf55I/AAAAAAAAAv4/zXy1cJ6RDwE/s1600/traceability.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://1.bp.blogspot.com/-2hLc-BaF4WQ/T98dAQOf55I/AAAAAAAAAv4/zXy1cJ6RDwE/s400/traceability.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="background-color: white;"&gt;Business process elements such as swimlanes and activities may inspire actors and use cases. Use cases and actors are documented on wiki pages. Each use case and actor has a page on the wiki, which has a unique URL and can be used to refer the element on email messages, documents, Jira tickets and so on. An Jira ticket is created for each use case and it contains a link to the use case's wiki page. This wiki page can also have a link to the ticket since it also has a unique URL. Jira tickets can be automatically linked the source code through the version control system (SVN) and declaratively linked to system's features and user interfaces. Since it's possible to create mock-ups in wiki pages, then we also link those wiki pages with user interfaces to compare the mock-ups with the final user interface. We finally have actors linked to security roles.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I admit that architects are not qualified to define and implement a software development process in the organization (they actually believe more in the &lt;a href="http://programming-motherfucker.com/" target="_blank"&gt;Programming Motherfucker philosophy&lt;/a&gt; :D), but they are constantly willing to contribute to have one in place. As they have instruments to monitor servers, releases, tests, performance and so on, they also want project managers having instruments to estimate effort, predict events, anticipate problems and, therefore, produce better planning and results. &lt;b&gt;&lt;span style="color: red;"&gt;Warning: Whatever we put in our software processes that is not quantifiable or measurable will become an expensive overhead.&lt;/span&gt;&lt;/b&gt;&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/DSP3fDPBthM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/3517766191738478284/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/06/architects-need-pragmatic-software.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/3517766191738478284?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/3517766191738478284?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/DSP3fDPBthM/architects-need-pragmatic-software.html" title="Architects Need a Pragmatic Software Development Process" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/--Oa6zF0Fsy0/T98c1Ln8URI/AAAAAAAAAvw/zm7urjyxph4/s72-c/iterations.png" height="72" width="72" /><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/06/architects-need-pragmatic-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUINQ3s6fSp7ImA9WhVVE00.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-5281609095239980547</id><published>2012-05-06T13:26:00.000+02:00</published><updated>2012-05-06T13:26:32.515+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-06T13:26:32.515+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="ide" /><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="integration" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><title>Integrating Jira with Netbeans</title><content type="html">One of the advantages of hosting your open source project at Java.net is the availability of &lt;a href="http://www.atlassian.com/software/jira/overview"&gt;Jira&lt;/a&gt; to track your issues. Jira is one of the most popular issue tracking system available on the market, which drives tool developers to support it. This is the case of &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt;, my working IDE, and also the case of &lt;a href="http://www.eclipse.org/" target="_blank"&gt;Eclipse&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I recently configured my Netbeans to access &lt;a href="http://java.net/projects/cejug/sources/jug-management/show" target="_blank"&gt;Jug Manangement&lt;/a&gt;'s issues. If you want to do the same, or with another project hosted on Java.net or even connect to the Jira available on your company's Intranet, then the following instructions may help you.&lt;br /&gt;
&lt;br /&gt;
The first step is to install Jira plugin on Netbeans. In the menu, select &lt;i&gt;Tools&lt;/i&gt; and then &lt;i&gt;Plugins&lt;/i&gt;. Go to the tab &lt;i&gt;Available Plugins&lt;/i&gt; and select &lt;i&gt;JIRA&lt;/i&gt;. Follow the installation procedure and restart the IDE at the end. The figure below shows the plugin already installed. You may check as well if &lt;i&gt;JIRA&lt;/i&gt; is in your list of &lt;i&gt;Installed&lt;/i&gt; plugins to make sure everything went well.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-x9iTMYdPO2k/T6WVB1_Eq8I/AAAAAAAAAoU/7r6ZjjKfuy4/s1600/netbeans-jira-plugin-installation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-x9iTMYdPO2k/T6WVB1_Eq8I/AAAAAAAAAoU/7r6ZjjKfuy4/s320/netbeans-jira-plugin-installation.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
In the view &lt;i&gt;Services&lt;/i&gt;, where we connect to databases, webservers and others, we also find a new kind of service called &lt;i&gt;Issue Trackers&lt;/i&gt;. By clicking with the right button on this service, you are about to create a connection to a issue tracker. A dialog like the following figure appears. Give any name to your connection, since this is not a predefined value. In case of Java.net, use the URL https://java.net/jira and the credentials you use to authenticate in the portal. Click on &lt;i&gt;Validate&lt;/i&gt; to make sure that you input the values correctly and the connection with the server is working. Click on &lt;i&gt;Ok&lt;/i&gt; to finish.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-vOzaOZ04eOw/T6WQ-i9_1NI/AAAAAAAAAn8/fwKntmrqUMo/s1600/netbeans-jira-configuration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-vOzaOZ04eOw/T6WQ-i9_1NI/AAAAAAAAAn8/fwKntmrqUMo/s1600/netbeans-jira-configuration.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Now, you are connected but not ready to work yet. The next step is to find the issues. For that, click with the right button on the issue tracker that you just created and select the option &lt;i&gt;Find Issues&lt;/i&gt;. It opens a new tab in the editor area where you are able to build your query as you usually do using Jira on a web browser. When you build the best query for your needs you can save it to constantly work with that. In the following figure I built a query that shows me all open issues of the project jug-management.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-JD0ttg2XRzw/T6WQ_qrudRI/AAAAAAAAAoE/ARzozZv_pd4/s1600/netbeans-jira-query.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="249" src="http://4.bp.blogspot.com/-JD0ttg2XRzw/T6WQ_qrudRI/AAAAAAAAAoE/ARzozZv_pd4/s320/netbeans-jira-query.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You can do something similar to your project and control your issues directly from the IDE. One of the main benefits of this approach is that, by restricting the use of the browser, we reduce the probability of losing the focus on the work due to other&amp;nbsp;entertainment activities&amp;nbsp;on the web such as news, social networks, chatting and so on.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/0chtdfhHfyM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/5281609095239980547/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/05/integrating-jira-with-netbeans.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5281609095239980547?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5281609095239980547?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/0chtdfhHfyM/integrating-jira-with-netbeans.html" title="Integrating Jira with Netbeans" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-x9iTMYdPO2k/T6WVB1_Eq8I/AAAAAAAAAoU/7r6ZjjKfuy4/s72-c/netbeans-jira-plugin-installation.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/05/integrating-jira-with-netbeans.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cESX8yeyp7ImA9WhRbEkw.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-7966579614096795774</id><published>2012-01-31T17:01:00.000+01:00</published><updated>2012-02-02T21:36:48.193+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-02T21:36:48.193+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="JSF" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="user interface" /><category scheme="http://www.blogger.com/atom/ns#" term="Vaadin" /><category scheme="http://www.blogger.com/atom/ns#" term="browser" /><title>Choosing Between Vaadin and JSF</title><content type="html">With the recent release of &lt;a href="http://blog.primefaces.org/?p=1588" target="_blank"&gt;Primefaces 3.0&lt;/a&gt;, JSF finally reaches an unprecedent level of maturity and utility that puts it face to face with other popular Rich Internet Applications (RIA) options, such as Google Web Toolkit (GWT), ExtJS, Vaadin, Flex and others. This open source project also proved to be very active and in a constant growing path.&lt;br /&gt;
&lt;br /&gt;
I have been working with JSF + Primefaces since October 2010, when I started developing the project &lt;a href="http://www.hildeberto.com/2011/01/new-cejug-open-source-project.html" target="_blank"&gt;JUG Management&lt;/a&gt;, a web application conceived to manage user groups or communities focused on a certain domain of knowledge, whose members are constantly sharing information and attending social and educational events. &lt;a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html" target="_blank"&gt;JSF&lt;/a&gt; is a standard Java framework for building user interfaces for web applications with well-established development patterns and built upon the experience of many preexisting Java Web development frameworks. It is component-based and server-side user interface rendering, sending to clients (web browsers) pre-processed web based content such as HTML, JavaScript and CSS. My experience on this technology is openly available on &lt;a href="http://java.net/projects/cejug/sources/jug-management/show" target="_blank"&gt;java.net&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, I had the opportunity to create a Proof of Concept (PoC) to compare JSF and Vaadin in order to help developers and architects to decide between one of them. Vaadin is a web application framework for RIA that offers robust server-side architecture, in contrast to other Javascript libraries and browser plugin-based solutions. The business logic runs on the server while a richer user interface, based on Google Web Toolkit (GWT), is fully rendered by the web browser, ensuring a fluent user experience.&lt;br /&gt;
&lt;br /&gt;
The result of the PoC was surprisingly interesting :) It ended up proposing both technologies instead of eliminating one of them. I found out, exploring available books, articles, blogs and websites, that despite being able to implement all sorts of web applications, each technology has special characteristics, optimized to certain&amp;nbsp;kinds of those applications. In practical terms, if we find out that JSF is better for a certain kind of application, that's because it would take more time and code to do the same&amp;nbsp;with Vaadin. The inverse logic&amp;nbsp;is also true. In order to understand that, we have to visit two fundamental concepts that have direct impact on web applications:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.4512" target="_blank"&gt;&lt;b&gt;Context of Use&lt;/b&gt;&lt;/a&gt; considers the &lt;b&gt;user&lt;/b&gt; who will operate the application, the &lt;b&gt;environment&lt;/b&gt; where the user is inserted, and the &lt;b&gt;device&lt;/b&gt; the user is interacting with.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/9780596000356.do" target="_blank"&gt;&lt;b&gt;Information Architecture&lt;/b&gt;&lt;/a&gt; considers the &lt;b&gt;user&lt;/b&gt; of the application again, the &lt;b&gt;business domain&lt;/b&gt; in which he or she works on and the &lt;b&gt;content&lt;/b&gt; managed in that domain.&lt;/li&gt;
&lt;/ul&gt;
Notice in the figure bellow that the user is always the center of&amp;nbsp;attention in both concepts. That's because we are evaluating two frameworks that have direct impact on the way users interact with web applications.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-HrYXQj9MgjI/Tw2Y9iOSEAI/AAAAAAAAAX4/aTATsdPsz_w/s1600/context-use-information-architecture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-HrYXQj9MgjI/Tw2Y9iOSEAI/AAAAAAAAAX4/aTATsdPsz_w/s1600/context-use-information-architecture.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Visiting the concepts above we have:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="color: #3d85c6; font-size: large;"&gt;Environment&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Some applications are available for internal purpose only, such as the ones available on the intranet, other applications are used by external users, such as the company website.&lt;br /&gt;
&lt;br /&gt;
Users of internal applications are more homogeneous and in limited number, which means that the UI can be a bit more complex to allow faster user interactions. That explains the fight Microsoft Office vs. Google Docs. The last one is not yet fully acceptable in the office environment&amp;nbsp;because it has less functionalities than Microsoft Office. The latter is, on the other hand,&amp;nbsp;more complex and more expensive. However, a limited number of users to a larger number of features&amp;nbsp;makes&amp;nbsp;acceptable to have some additional costs with&amp;nbsp;training sessions to profit from&amp;nbsp;the productivity features.&lt;br /&gt;
&lt;br /&gt;
A company website targets heterogeneous users in unlimited environments. It is not possible to train all this people, thus simpler user interfaces with short and self-explanatory interactions are desirable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Considering the environment, we would recommend Vaadin for homogeneous users in limited environments and JSF for heterogeneous users in unlimited environments.&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="background-color: white; color: #3d85c6; font-size: large;"&gt;Device&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Different devices demand multiple sets of UI components, designed to look great from small to large screens. Fortunately, both frameworks have components to support the full range of screen sizes from regular desktops to mobile devices. The problem is that different devices bring different connectivity capabilities and the application should be ready to deal with short band-width and reduced transfer rates. In this case, &lt;b&gt;Vaadin seems to be more suitable for multiple&amp;nbsp;devices, as long as the variety of devices is not so extensive,&amp;nbsp;because the user interface is rendered locally, using JavaScript, and it has a richer Ajax support to optimize the exchange&amp;nbsp;of application data with the server.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="color: #3d85c6; font-size: large;"&gt;Business Domain&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
In principle,&amp;nbsp;good quality UI frameworks such as JSF and Vaadin can implement any business domain. The problem is how experienced the team is with the technology or how small is the learning curve to master it. Business is about timing and the technology that offers the best productivity will certainly win. &lt;b&gt;If your team has previous experience with Swing then Vaadin is the natural choice. If the previous experience was more web-oriented, manipulating HTML, CSS ans Scripts, then JSF is recommended.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="color: #3d85c6; font-size: large;"&gt;Content&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Content is a very relevant criterion for choosing between&amp;nbsp;Vaadin and JSF.&amp;nbsp;&lt;b&gt;In case the application needs to deal with volumous content of any type, such as long textual descriptions, videos, presentations, animations, graphics, charts and so on, then JSF is the recommended over Vaadin because JSF uses a web content rendering strategy to profit from all content-types supported by web browsers without the need for additional&amp;nbsp;plugins or&amp;nbsp;tags&lt;/b&gt;. The support for multiple content is only&amp;nbsp;available on&amp;nbsp;Vaadin through&amp;nbsp;the use of plugins, which must be individually assessed before adoption.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: white; color: #3d85c6; font-size: large;"&gt;&lt;b&gt;User&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Last, but not least, we have the user, who is the most important criterion when&amp;nbsp;choosing a UI framework.&amp;nbsp;We&amp;nbsp;would emphasize two&amp;nbsp;aspects:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;The user population&lt;/b&gt;&lt;/i&gt;: the largest is the target population the highest are the concerns about application compatibility.&amp;nbsp;It&amp;nbsp;must deal with several versions and types of browsers, operating systems, computers with different memory capacity and monitor resolution. All these without failures or security issues. &lt;b&gt;For larger populations, the most appropriate technology is the most compatible one in a cross-platform environment, which is the case of JSF, since it uses a balanced combination of HTML, JavaScript and CSS, while Vaadin relies only on JavaScript and CSS. But&amp;nbsp;shorter populations would have better profit&amp;nbsp;with&amp;nbsp;Vaadin&lt;/b&gt;&amp;nbsp;because cross-browser compatibility is and will remain being&amp;nbsp;a very hard work to be done by Vaadin's development team behind the scene.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;User's tasks&lt;/b&gt;&lt;/i&gt;: If the application is intensively operated by&amp;nbsp;users then it is expected that it has more user's tasks implemented. On the other hand, if the&amp;nbsp;application is rarely used or has short intervals of intensive use, then there is a lower concentration of user's tasks. According to the PoC, &lt;b&gt;Vaadin is the technology that provides the best support on delivering user tasks with richer user interaction because of its fast visual response. JSF is less optimized on which concerns the user interaction&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;
In conclusion, instead of discarding one of these&amp;nbsp;frameworks consider both on the shelf of the company's architectural choices, but visit the criteria above to make sure that you are using the right technology to implement the expected solution. A simple way to apply those criteria would be&amp;nbsp;to assign weights to each criterion, according to the project's characteristics;&amp;nbsp;set which technology is appropriate for each criterion; and sum the weights for each technology. The highest weight elects the technology to be used in the project.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/0LkH-ykgLXs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/7966579614096795774/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/01/choosing-between-vaadin-and-jsf.html#comment-form" title="23 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/7966579614096795774?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/7966579614096795774?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/0LkH-ykgLXs/choosing-between-vaadin-and-jsf.html" title="Choosing Between Vaadin and JSF" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-HrYXQj9MgjI/Tw2Y9iOSEAI/AAAAAAAAAX4/aTATsdPsz_w/s72-c/context-use-information-architecture.png" height="72" width="72" /><thr:total>23</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/01/choosing-between-vaadin-and-jsf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ACRn89eCp7ImA9WhRbEE8.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-2670998467940853703</id><published>2012-01-05T10:21:00.001+01:00</published><updated>2012-01-31T17:02:47.160+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-31T17:02:47.160+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><title>Becoming Part of the Java Code Geek Community</title><content type="html">I'm glad to announce that I just became part of the &lt;a href="http://www.javacodegeeks.com/" target="_blank"&gt;Java Code Geeks&lt;/a&gt; (JCG) community! I have been following this community for a long time, consuming a lot of great Java articles, and now I'm part of it. This is a great honor and also a great responsibility because it is a way of pushing myself to write betters articles and do it in a more frequent way.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ktO85cYswBs/TwVrJ2t2nBI/AAAAAAAAAXw/ien2Mr1TJow/s1600/logo_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="87" src="http://4.bp.blogspot.com/-ktO85cYswBs/TwVrJ2t2nBI/AAAAAAAAAXw/ien2Mr1TJow/s320/logo_1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
For those who don't know JCG, this is a community of bloggers whose articles are of interest to the Java developer community. They simplify the process of publishing selected blog articles by JCG members on a aggregator website.&amp;nbsp; This is a win-win game because JCGs enjoy substantially increased visibility and the audience enjoys great content.&lt;br /&gt;
I also had the opportunity to include &lt;a href="http://www.cejug.org/" target="_blank"&gt;CEJUG&lt;/a&gt; as a supporting user group. In the coming days I will find time to integrate JCG's posts with CEJUG's website using rss and let people know how I did it here.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/4eqCwNYvlP8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/2670998467940853703/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2012/01/becoming-part-of-java-code-geek.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2670998467940853703?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2670998467940853703?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/4eqCwNYvlP8/becoming-part-of-java-code-geek.html" title="Becoming Part of the Java Code Geek Community" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ktO85cYswBs/TwVrJ2t2nBI/AAAAAAAAAXw/ien2Mr1TJow/s72-c/logo_1.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2012/01/becoming-part-of-java-code-geek.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEFQHg4fip7ImA9WhJSE08.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-107464752971596498</id><published>2011-10-10T11:16:00.000+02:00</published><updated>2012-07-03T15:53:31.636+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-03T15:53:31.636+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enterprise application" /><category scheme="http://www.blogger.com/atom/ns#" term="design patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>EJB Lookup in a Vaadin Application</title><content type="html">It has been a long time since the last Service Locator I have implemented. I thought it wouldn't be necessary anymore&amp;nbsp;considering the maturity of the &lt;a href="http://download.oracle.com/javaee/6/tutorial/doc/gjbnr.html"&gt;Java EE CDI&lt;/a&gt; (Contexts and Dependency Injection).&amp;nbsp;My first implementation was to make use of&amp;nbsp;EJBs in a Struts-based web application. After that, I started&amp;nbsp;working with JSF, which only requires&amp;nbsp;annotated attributes&amp;nbsp;with @EJB or @Resource to communicate with the business layer. So far, it has been a great experience until they asked me to evaluate &lt;a href="http://www.vaadin.com/"&gt;Vaadin&lt;/a&gt; as a front-end technology for business applications.&lt;br /&gt;
&lt;br /&gt;
Before going too far, I have&amp;nbsp;read&amp;nbsp;the article&amp;nbsp;"&lt;a href="https://vaadin.com/wiki/-/wiki/Main/Adding%20JPA%20to%20the%20Address%20Book%20Demo"&gt;Adding JPA to the Address Book Demo&lt;/a&gt;", published on Vaadin's wiki, which explains how to call EJBs from Vaadin's classes&amp;nbsp;to retrieve and persist data from the business layer. EJBs&amp;nbsp;use JPA to get and put data in the database.&amp;nbsp;They suggested to call EJBs from a custom servlet, which, according to the Java EE specification, has the ability to make&amp;nbsp;EJB&amp;nbsp;calls&amp;nbsp;using&amp;nbsp;CDI.&amp;nbsp;If we have 1 or 3&amp;nbsp;EJBs to call, it seems to be an appropriate solution, but what to do in the Servlet&amp;nbsp;when we have ~40 EJBs to deal with? How to pass all these references to&amp;nbsp;Vaadin's application class? The interface of this class&amp;nbsp;can go nuts! That's why I believe that&amp;nbsp;the lookup using JNDI is desirable.&lt;br /&gt;
&lt;br /&gt;
The following code is the Service Locator that I'm using in my Proof of Concept (PoC). &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;import java.util.Collections;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;import java.util.HashMap;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;import java.util.Map;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;import javax.naming.Context;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;import javax.naming.InitialContext;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;import javax.naming.NamingException;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;public class ClientServiceLocator {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; private Context initialContext;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; private Map&lt;string, object=""&gt; cache;&lt;/string,&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; private static ClientServiceLocator &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ourInstance = new ClientServiceLocator();&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; public static ClientServiceLocator getInstance() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ourInstance;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; private ClientServiceLocator() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.initialContext = new InitialContext();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.cache = Collections.synchronizedMap(new HashMap&lt;string, object=""&gt;());&lt;/string,&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;catch(NamingException ne) { &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.err.printf(&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Error in CTX looking up %s because of %s while %s",&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ne.getRemainingName(),&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ne.getCause(),&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ne.getExplanation());&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; public Object lookupEjb(String ejbName) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.cache.containsKey(ejbName)) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.cache.get(ejbName);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object ejbRef = &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialContext.lookup("java:comp/env/"+ ejbName);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.cache.put(ejbName, ejbRef);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ejbRef;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (NamingException ne) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new RuntimeException(ne);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new RuntimeException(e);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The class &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MyServiceLocator&lt;/span&gt; follows the &lt;i&gt;Singleton&lt;/i&gt; design pattern, making sure that there is only one instance of the&amp;nbsp;object to serve all requests from the web application.&amp;nbsp;The unique instance is created at the class' initialization process&amp;nbsp;and since the constructor is private, the class cannot be instantiated by another class, being available only through the method &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;getInstance()&lt;/span&gt;. The constructor initializes the context and creates a synchronized map where we store all references already created. The method &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;lookupEjb(String ejbName)&lt;/span&gt; locates EJBs whose names are available in the local JNDI context. This method only works for those EJBs whose references are declared in the web.xml file, as listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;lt;web-app version="2.5"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns="&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;http://java.sun.com/xml/ns/javaee&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemalocation="&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;http://java.sun.com/xml/ns/javaee&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;display-name&amp;gt;Information Systems&amp;lt;/display-name&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;ejb-local-ref&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ejb-ref-name&amp;gt;InformationSystemBean&amp;lt;/ejb-ref-name&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ejb-ref-type&amp;gt;Session&amp;lt;/ejb-ref-type&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;local&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; example.business.InformationSystemBeanLocal&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/local&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ejb-link&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eac-architecture-ejb.jar#InformationSystemBean&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ejb-link&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/ejb-local-ref&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The tag &amp;lt;ejb-local-ref&amp;gt; is used to declare a reference to a local EJB. The example above maps only one EJB. So, you have to repeat&amp;nbsp;it for each&amp;nbsp;EJB you&amp;nbsp;want to map.&amp;nbsp;Details about this tag can be found &lt;a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs81/webapp/web_xml.html#1013984"&gt;here&lt;/a&gt;. Once declared, we can get an instance of the EJB in any part of the application using the following code:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;private InformationSystemLocal informationSystemBsn = &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; (InformationSystemLocal)MyServiceLocator.getInstance()&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.lookupEjb("InformationSystemBean");&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The variable is typed with&amp;nbsp;the EJB local interface, which&amp;nbsp;is &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;InformationSystemLocal&lt;/span&gt;. The service locator returns an instance of the EJB named as&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;InformationSystemBean&lt;/span&gt;, which is by default the EJB's implementation class.&amp;nbsp;Notice that none of the code above is necessary when we use CDI. The invocation of AjudaBsn would be simply like that:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;@EJB&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;private InformationSystemLocal informationSystemBsn;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
CDI is good and elegant, but not widely applicable. The way it&amp;nbsp;is implemented today is the main weakness of the Java EE specification. Maybe there is some strong reason why EJB's annotations don't work in every Java class. I simply don't see this misterious reason because Spring has addressed this issue since long time ago&amp;nbsp;simply using aspect orientation.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/tnLA9jjKAsA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/107464752971596498/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/10/ejb-lookup-in-vaadin-application.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/107464752971596498?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/107464752971596498?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/tnLA9jjKAsA/ejb-lookup-in-vaadin-application.html" title="EJB Lookup in a Vaadin Application" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/10/ejb-lookup-in-vaadin-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0INRHk5fSp7ImA9WhdbEEs.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-1326047621334823849</id><published>2011-10-08T11:19:00.000+02:00</published><updated>2011-10-08T11:19:55.725+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-08T11:19:55.725+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><title>My Favorite Steve Jobs' Lesson</title><content type="html">&lt;blockquote&gt;
&lt;i&gt;"&lt;span class="Apple-style-span" style="color: #2f3236; font-family: Georgia, 'Times New Roman', serif; font-size: 14px; line-height: 20px;"&gt;Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by dogma — which is living with the results of other people’s thinking. Don’t let the noise of others’ opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary&lt;/span&gt;" - Steve Jobs (1955 - 2011)&lt;/i&gt;&lt;/blockquote&gt;
R.I.P. Steve Jobs.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/Am8u9pGB2Sc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/1326047621334823849/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/10/my-favorite-steve-jobs-lesson.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/1326047621334823849?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/1326047621334823849?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/Am8u9pGB2Sc/my-favorite-steve-jobs-lesson.html" title="My Favorite Steve Jobs' Lesson" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/10/my-favorite-steve-jobs-lesson.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEBRX88fSp7ImA9WhdUEE4.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-6696348649751692960</id><published>2011-09-26T12:24:00.000+02:00</published><updated>2011-09-26T12:24:14.175+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T12:24:14.175+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise application" /><category scheme="http://www.blogger.com/atom/ns#" term="web services" /><category scheme="http://www.blogger.com/atom/ns#" term="software engineering" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>Some Interview Questions to Hire a Java EE Developer</title><content type="html">The Internet is full of interview questions for Java developers. The main problem of those questions is that they only prove that the candidate has a good memory, remmembering all that syntax, structures, constants, etc. There is not real evaluation of his/her logical reasoning.&lt;br /&gt;
&lt;br /&gt;
I'm listing bellow some examples of interview questions that check the knowledge of the candidate based on his/her experience. The questions were formulated to verify whether the candidate is capable of fulfilling the role of a Java enterprise applications developer. I'm also putting the anwsers in case anybody want to discuss the questions. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;1. &lt;span style="font-style: italic;"&gt;Can you give some examples of improvements in the Java EE5/6 specification in comparison to the J2EE specification?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
The new specification favours convention over configuration and introduces annotations to replace the use of XML for configuration. Inheritance is not used to define components anymore. They are defined, instead, as POJOs. To empower those POJOs with enterprise features, dependency injection was put in place, simplifying the use of EJBs. The persistence layer was fully replaced by the Java Persistence API (JPA).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2. &lt;span style="font-style: italic;"&gt;Considering two enterprise systems developed in different platforms, which good options do you propose to exchange data between them?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
We can see as potential options nowadays the use of web services and message queues, depending on the scenario. For example: when a system needs to send data, as soon as they are available, to another system or make data available for several systems, then a message queuing system is recommended. When a system has data to be processed by another system and needs back the result of this processing synchronously, then web service is the most indicated option.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;3. &lt;span style="font-style: italic;"&gt;What do you suggest to implement asynchronous code in Java EE?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
There are several options: one can post messages to a queue to be consumed by a Message-Driven Bean (MDB); or annotate a method with @Timer to define the time to execute the code programmatically; or annotate a method with @Scheduler to define&amp;nbsp;the time to execute the code&amp;nbsp;declaratively.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;4. &lt;span style="font-style: italic;"&gt;Can you illustrate the use of Stateless Session Bean, Statefull Session Bean and Singleton Session Bean?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Stateless Session Beans are used when there is no need to preserve the state of objects between several business transactions. Every transaction has its own instances and instances of components can be retrieved from pools of objects. It is recommended for most cases, when several operations are performed within a transaction to keep the database consistency.&lt;br /&gt;
&lt;br /&gt;
Statefull Session Beans are used when there is the need to preserve the state of objects between business transactions. Every instance of the component has its own objects. These objects are modified by different transactions and they are discarded after reaching a predefined time of inactivity. They can be used to cache those data with intensive use, such as reference data and long record sets for pagination, in order to reduce the volume of IO operations with the database.&lt;br /&gt;
&lt;br /&gt;
A singleton session bean is instantiated once per application and exists for the lifecycle of the application. Singleton session beans are designed for circumstances in which a single enterprise bean instance is shared across and concurrently accessed by clients. They maintain their state between client invocations, which requires a careful implementation to avoid conflicts when accessed concurrently. This kind of component can be used, for example, to initialize the application at its start-up and share a specific object across the application.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;5. &lt;span style="font-style: italic;"&gt;What is the difference between queue and topic in a message queuing system?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
In a queue there is only one producer of messages and only one consumer of these messages (1 – 1). In a topic there is a publisher of messages and several subscribers that will receive those messages (1 - N).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;6. &lt;span style="font-style: italic;"&gt;Which strategies do you consider to import and export XML content?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If the XML document is formally defined in a schema, we can use JAXB to serialize and deserialize objects into/from XML according to the schema. If the XML document does not have a schema, then there are two situations: 1) when the whole XML content should be consider: In this case, serial access to the whole document is recommended using SAX, or accessed randomly using DOM; 2) when only parts of the XML content should be considered, than XPath can be used or StAX in case operations should be executed immediately after each desired part is found in the document.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;7. &lt;span style="font-style: italic;"&gt;Can you list some differences between a relational model and an object model?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
An object model can be mapped to a relational model, but there are some differences that should be taken into consideration. In the relational model a foreign key has the same type of the target's primary key, but in the object model and attribute points to the entire related object. In the object model it is possible to have N-N relationships while in the relational model an intermediary entity is needed. There is no support for inheritance, interface, and polymorphism in the relational model.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;8. &lt;span style="font-style: italic;"&gt;What is the difference between XML Schema, XSLT, WSDL and SOAP?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
A XML Schema describes the structure of an XML document and it is used to validate these documents. WSDL (Web Service Definition Language) describes the interface of SOAP-based web services. It can refer to XML schemas to define existing complex types passed by parameter or returned to the caller. SOAP (Simple Object Access Protocol) is the format of the message used to exchange data in a web service call. XSLT (eXtensible Stylesheet Language Transformation) is used to transform XML documents into other document formats.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;9. &lt;span style="font-style: italic;"&gt;How would you configure an environment to maximize productivity of a development team?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Every developer should have a personal environment capable of executing the whole application in his/her local workstation. The project should be synchronized between developers using a version control system. Integration routines must be executed periodically in order to verify the compatibility and communication between all components of the system. Unit and integration tests must be executed frequently.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
You can increment this&amp;nbsp;set of questions covering&amp;nbsp;other subjects like unit testing, dependence injection,&amp;nbsp; version control and so on. Try to formulate the questions in a way that you don't get a single answer, but a short analysis from the candidate. People can easily find answers on the Internet, but good analysis can be&amp;nbsp;provided only with&amp;nbsp;accumulated experience.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/ZHQ5LKZmMC4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/6696348649751692960/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/09/some-interview-questions-to-hire-java.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6696348649751692960?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6696348649751692960?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/ZHQ5LKZmMC4/some-interview-questions-to-hire-java.html" title="Some Interview Questions to Hire a Java EE Developer" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/09/some-interview-questions-to-hire-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08CQHc7fip7ImA9WhdVGUo.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-8899501399800599581</id><published>2011-09-24T18:15:00.001+02:00</published><updated>2011-09-25T19:31:01.906+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-25T19:31:01.906+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ide" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise application" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><category scheme="http://www.blogger.com/atom/ns#" term="workspace" /><title>Development Environment to Work with WebLogic</title><content type="html">I have to confess that, despite not evolving as fast as the Java EE specification, Oracle WebLogic is a f*** good application server. Its stability is impressive and works smoothly with popular IDEs, such as Eclipse and Netbeans. Of course its qualities come with a cost, which is expensive for poor developers like us, but it's worthwhile for companies.&lt;br /&gt;
&lt;br /&gt;
The official name of WebLogic is "Oracle WebLogic Server 11g Standard Edition". It is part of a broader range of products called "Oracle Fusion Middleware", which offers a complete support for enterprise service-oriented applications (SOA). I'm currently working with WebLogic 10.3.4, which is the first version that supports JSF 2.0, my favority web framework. WebLogic is available for download on Oracle's website. Go to the &lt;a href="http://www.oracle.com/technetwork/middleware/fusion-middleware/downloads/index.html"&gt;download page&lt;/a&gt; to get your copy. To install it:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Unzip the file in your development folder. For example &lt;i&gt;/home/you/java/weblogic&lt;/i&gt;. &lt;/li&gt;
&lt;li&gt;Create the environment variable &lt;i&gt;JAVA_HOME&lt;/i&gt;, pointing to your JDK installation.&lt;/li&gt;
&lt;li&gt;Create the environment variable &lt;i&gt;MW_HOME&lt;/i&gt; pointing to &lt;i&gt;/home/you/java/weblogic&lt;/i&gt;. &lt;/li&gt;
&lt;li&gt;Go to the command line and run the installation configuration script &lt;i&gt;$MW_HOME/configure.[sh/cmd]&lt;/i&gt;. &lt;/li&gt;
&lt;li&gt;Create the domain to start working with WebLogic, running the command &lt;i&gt;MW_HOME/wlserver/common/bin/config.[sh/cmd]&lt;/i&gt; and following the instructions on the screen. &lt;/li&gt;
&lt;li&gt;Start a web browser and open the url &lt;i&gt;http://localhost:7001/console&lt;/i&gt; to access the administration console.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 sizcache="2" sizset="70"&gt;




&lt;a href="http://www.blogger.com/blogger.g?blogID=1281882577011517327&amp;amp;pli=1" name="Architecture-Howto-JavaDevelopmentEnvironment-ChangingWeblogicClasspath"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div sizcache="2" sizset="71"&gt;
Now, we have to configure the IDE to start, debug, and stop WebLogic, as well as deploy Java EE applications. Because most developers actually use Eclipse as a working IDE, let's configure it, installing the necessary plugin. I'm using &lt;a href="http://www.oracle.com/technetwork/developer-tools/eclipse/downloads/index.html"&gt;Oracle Enterprise Pack for Eclipse (OEPE)&lt;/a&gt;, a plugin that empowers Eclipse to develop Enterprise Java Application for Oracle Products. To install it:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Open Eclipse and go to the menu &lt;i&gt;Help - Install New Software...&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Add a new repository by clicking on &lt;i&gt;Add...&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Inform the name &lt;i&gt;Oracle Enterprise Pack for Eclipse&lt;/i&gt; and the URL &lt;i&gt;http://download.oracle.com/otn_software/oepe/indigo&lt;/i&gt; if you are using Eclipse Indigo, or &lt;i&gt;http://download.oracle.com/otn_software/oepe/helios&lt;/i&gt; if you are still using Eclipse Helios.&lt;/li&gt;
&lt;li&gt;Follow the instructions and restart Eclipse to finalize.&lt;/li&gt;
&lt;/ol&gt;
&amp;nbsp;Finally, configure the plugin to integrate the IDE with Eclipse:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Go to the menu &lt;i&gt;Windows - Show View &lt;/i&gt;and select&lt;i&gt; Servers&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Click with the right button of the mouse on the working area of the view and select &lt;i&gt;New - Server&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;In the list of server types, go to the category &lt;i&gt;Oracle&lt;/i&gt; and select &lt;i&gt;Oracle WebLogic Server 11gR1 (10.3.4)&lt;/i&gt;, or the version of WebLogic that you have installed. It's important to select the right version, otherwise an error will continously occur.&lt;/li&gt;
&lt;li&gt;Make sure that the field &lt;i&gt;Server's host name&lt;/i&gt; contains the value &lt;i&gt;localhost&lt;/i&gt; and press &lt;i&gt;Next&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;In the field &lt;i&gt;WebLogic home&lt;/i&gt; inform the path &lt;i&gt;/home/you/java/weblogic/wlserver&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;In the field &lt;i&gt;Java home&lt;/i&gt; inform the path to your JDK installation.&lt;/li&gt;
&lt;li&gt;You can optionally install some server extensions. I recommend to install all available extensions, clicking on &lt;i&gt;Install&lt;/i&gt;, besides each item. Press &lt;i&gt;Next&lt;/i&gt; to continue.&lt;/li&gt;
&lt;li&gt;Leave the option &lt;i&gt;Local&lt;/i&gt; selected in the &lt;i&gt;Server type&lt;/i&gt; field and inform the location of the domain. The domain was created in the first part of this tutorial, when we executed the configuration assistent.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Press &lt;i&gt;Finish&lt;/i&gt; to conclude.&lt;/li&gt;
&lt;/ol&gt;
That's it! Make sure to select this server when creating a new Java EE application. Don't hesitate to share your experience while following this tutorial.&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/4UniplKVGN8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/8899501399800599581/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/09/development-environment-to-work-with.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8899501399800599581?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8899501399800599581?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/4UniplKVGN8/development-environment-to-work-with.html" title="Development Environment to Work with WebLogic" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/09/development-environment-to-work-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMFSXw4fCp7ImA9WhdQGU8.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-6892139137355940335</id><published>2011-08-21T11:32:00.008+02:00</published><updated>2011-08-21T12:43:38.234+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-21T12:43:38.234+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="europe" /><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><category scheme="http://www.blogger.com/atom/ns#" term="workspace" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>Creative Solution to Keep Business Running Under Special Circumstances</title><content type="html">Rue du Luxembourg, Brussels, around 7:20 in the morning, going to work. A drugstore was under complete renovation. It wouldn't be open for customers... unless they put the drugstore in a special container and place it on the sidewalk just in front of it :)
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-tqX_4zrbHV4/TlDTrUNRERI/AAAAAAAAACA/3D7I555EFwM/s1600/IMAG0103.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://1.bp.blogspot.com/-tqX_4zrbHV4/TlDTrUNRERI/AAAAAAAAACA/3D7I555EFwM/s400/IMAG0103.jpg" alt="" id="BLOGGER_PHOTO_ID_5643243074207420690" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;If you are planning to renew your business, take some time to think about a creative solution to keep it running.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/ODqu-lvwO4c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/6892139137355940335/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/08/creative-solution-to-keep-business.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6892139137355940335?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6892139137355940335?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/ODqu-lvwO4c/creative-solution-to-keep-business.html" title="Creative Solution to Keep Business Running Under Special Circumstances" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-tqX_4zrbHV4/TlDTrUNRERI/AAAAAAAAACA/3D7I555EFwM/s72-c/IMAG0103.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/08/creative-solution-to-keep-business.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8CQHw9cSp7ImA9WhdQGEs.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-5011240128075441608</id><published>2011-08-20T12:55:00.011+02:00</published><updated>2011-08-20T19:54:21.269+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T19:54:21.269+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><category scheme="http://www.blogger.com/atom/ns#" term="ecology" /><category scheme="http://www.blogger.com/atom/ns#" term="family" /><category scheme="http://www.blogger.com/atom/ns#" term="culinary" /><category scheme="http://www.blogger.com/atom/ns#" term="picture" /><title>Real Social Values that We Can't Find on Facebook</title><content type="html">Every working day, my wife and I go walking from home to the train station very early in the morning. Sometime ago, there was a singular thing on the way that caught our attention: a litle "burnt yellow" pumpkim was beautifully growing in the garden of a house in the neighborhood. Over the next 3 months we patiently followed the growth of that pumpkim, which was slowly becoming gorgeous.
&lt;br /&gt;
&lt;br /&gt;Day after day, the temptation to take that away was inevitably increasing. However, the romantism of that rare scene of mutual trust between the residents and passersby was bucolically charming, surrounded by a scenario of a calm small town on the countryside of Belgium.
&lt;br /&gt;
&lt;br /&gt;When the pumpkim was finally looking ripe, the residents put a lovely message for those of us who resisted to that daily temptation.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-AI4XtiI0t7c/Tk-WflRcrzI/AAAAAAAAAB4/83oxRQhJmM0/s1600/IMAG0106.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://4.bp.blogspot.com/-AI4XtiI0t7c/Tk-WflRcrzI/AAAAAAAAAB4/83oxRQhJmM0/s400/IMAG0106.jpg" alt="" id="BLOGGER_PHOTO_ID_5642894327443926834" border="0" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;The message translated from French was:
&lt;br /&gt;&lt;blockquote&gt;"Our pumpkim is ready to be eaten.... Thanks to all people who gave a benevolent look and resisted the temptation to take it. So, come and enjoy a good pumpkim soup among neighbors this Friday, August 19th, from 7 p.m.! Everyone is welcome."&lt;/blockquote&gt;That's a great example of social interaction that is rare to see nowadays. It comforts me, makes me believe that real social interaction is far more valuable for life than the digital ones, like Facebook and Google+. &lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/W_8cbKBvCgI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/5011240128075441608/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/08/real-social-values-that-we-cant-find-on.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5011240128075441608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/5011240128075441608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/W_8cbKBvCgI/real-social-values-that-we-cant-find-on.html" title="Real Social Values that We Can't Find on Facebook" /><author><name>Hildeberto Mendonça</name><uri>https://plus.google.com/107280863116258893642</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-zW8ZbtXHPYM/AAAAAAAAAAI/AAAAAAAABQg/Wh0aDU8B6ag/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-AI4XtiI0t7c/Tk-WflRcrzI/AAAAAAAAAB4/83oxRQhJmM0/s72-c/IMAG0106.jpg" height="72" width="72" /><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/08/real-social-values-that-we-cant-find-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8DSHw5fyp7ImA9WhZaGUo.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-2040993840420229030</id><published>2011-07-06T18:35:00.000+02:00</published><updated>2011-07-06T20:27:59.227+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-06T20:27:59.227+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="europe" /><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><category scheme="http://www.blogger.com/atom/ns#" term="family" /><title>I'm Pregnant!</title><content type="html">Today, my wife gave me the greatest news I've ever received. She said that I'm gonna be a DAD! Uhuu! \o/ This is something very powerful, you know?! I have no words to describe my expectation to become a father. The news has an&amp;nbsp;immediate impact on the way we see life from now on. All plans we made for ourselves in the coming days, months, years, are now totally forgotten. This new life has the power of attracting all our attention and dedication, which makes me think that the future cannot be designed, at least for the next nine months, and everything that will happen is&amp;nbsp;unpredictable&amp;nbsp;and deserves&amp;nbsp;immediate&amp;nbsp;response.&lt;br /&gt;
&lt;br /&gt;
You may wonder why the title is "I'm pregnant" if I'm obviously a man. It is because I'm feeling all symptoms of a pregnancy that my wife is going through. Of course my Love is reading lots of books, websites and magazines about her new experience. As she tells me what she is feeling, I get myself feeling the same! :D hehehe Nausea, fatigue, headaches, frequent urination, and everything else she tells me. I'm also following the same diet and habits. The absence of coffee is the worse part. I was used to drink 3 to 4 cups a day, which makes me realize now that I was addicted to it. I'm probably getting some weight too, but I certainly need self control about food because one big belly is enough for a pregnant couple.&lt;br /&gt;
&lt;br /&gt;
By the way, a baby is not the only good news. The package also includes 9 months (maybe more) without premenstrual irritation, menstruation, birth control, tampons, and no worries about keeping a flat tummy ;-)&lt;br /&gt;
&lt;br /&gt;
This boy or girl will probably have some time in the future to visit this post. So, I'm getting the opportunity to say a few words:&lt;br /&gt;
&lt;blockquote&gt;"&lt;i&gt;We will do our best to educate you the most constructive and positive way possible. It includes doing things that you won't like at the moment you experience it, but you will understand when you grow up. You have to understand that you are our first experience as parents and we will probably make some mistakes in the course of your education. We never know.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;We plan to have another baby, maybe a third one also, because we believe that it's important for you to have a brother or sister. When we are all growing together as a family, don't worry when you notice that we are&amp;nbsp;giving&amp;nbsp;more attention for them than for you. This is because they are younger and naturally deserve more attention, as you received when you were at the same age. We also understand that you are more mature to understand that. At some point none of you will have privileges any more and we will treat you all equally, as we love you all equally.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;Another point is concerning the language we speak with you. At home you will listen to Portuguese. At the day care center you will listen to French. Furthermore, since you were&amp;nbsp;born&amp;nbsp;in Belgium, which has three official languages, the language confusion will get even worse :D. But it is good for you. We decided to speak in Portuguese with you because we think you should speak fluently with other members of the family, like your grandparents, uncles, cousins, aunts and so on. They are really nice people and they were all waiting for you too. I wished you could see their faces when your mother told them you were coming.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;By the way, your mother is feeling great now! She is reading a lot of books that try to explain how to take care of you. We know they are not always right and the real thing will start when you show up here :) God! You have no idea how life already changed so far. Good changes of course. We have nothing to complain about. Just waiting for you now.&lt;/i&gt;"&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/P9SSoiNSbUs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/2040993840420229030/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/05/im-pregnant.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2040993840420229030?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/2040993840420229030?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/P9SSoiNSbUs/im-pregnant.html" title="I'm Pregnant!" /><author><name>Hildeberto Mendonça</name><uri>http://www.blogger.com/profile/00241544229335976181</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://2.bp.blogspot.com/_GRRHKr2Yk6M/S8wdoE8TK6I/AAAAAAAABhI/v7Bl4Ud3QMk/S220/me.jpg" /></author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/05/im-pregnant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4HQns4fSp7ImA9Wx9VEUs.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-6260747970147979267</id><published>2011-01-27T22:32:00.000+01:00</published><updated>2011-01-27T22:32:13.535+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-27T22:32:13.535+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="configuration management" /><title>JUG Management Now on Git</title><content type="html">The JUG community asked and we have moved the JUG Management source code from SVN to Git. I have to admit that I'm new in Git and it seems to be a quite change of paradigm from SVN. My first feeling is that it is more complex. For the moment, my motivation to learn Git comes from the fact that there is a big probability that the market will value this knowledge.&lt;br /&gt;
&lt;br /&gt;
To access the Java.net Git repository is not a trivial task :( You will need SSH (Security Shell protocol) to have an encrypted connection to the server. I think this is too much for our needs, since this is not such a critical system, but this is real life, thus I followed the steps below:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Download and install a Git client according to your operating system. Clients are available at&amp;nbsp;&lt;a href="http://git-scm.com/download"&gt;http://git-scm.com/download&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Installing Git is not enough to start working. You have to configure it, adding a public SSH key to your site profile as described in &lt;a href="http://java.net/projects/help/pages/GeneratingAnSSHKey"&gt;Generating an SSH Key&lt;/a&gt;. The whole process will take some time, but if you do it carefully, step by step, everything will work fine. It worked in my first attempt ;-)&lt;/li&gt;
&lt;li&gt;register yourself in &lt;a href="http://cejug.java.net/"&gt;CEJUG's project at java.net&lt;/a&gt;. You will have access to the repository only if you are a member of the project. Registering in the project doesn't mean you will become a CEJUG member. Actually, we use JUG Management to control our members ;-)&lt;/li&gt;
&lt;li&gt;When you login on Java.net and go to the &lt;a href="http://java.net/projects/cejug/sources"&gt;source code section&lt;/a&gt;, you will be able to see the checkout URI of JUG Management's repository. The address contains your username. Example: ssh://[user-name]@git.java.net/cejug~jug-management.&lt;/li&gt;
&lt;li&gt;Copy the URI above and go to the command line and type the following command to checkout the code: git clone ssh://[user-name]@git.java.net/cejug~jug-management. It will create a folder "cejug-jug-management" in the directory you ran the command and the full source code will be available there.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=c03ce-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0596520123&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt; This is a good start. Now you can open the source code and try to learn the project. I will explore in the next post how to open the source code in an IDE and build a package for deployment. At the same time, I'm learning how configuration management works with Git in order to start receiving your contributions. I'm studying the book Version Control With Git by Jon Loeliger for this. I hope the idea of branch is still there, just with a different name.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/_nAbsg7UB2I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/6260747970147979267/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/01/jug-management-now-on-git.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6260747970147979267?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/6260747970147979267?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/_nAbsg7UB2I/jug-management-now-on-git.html" title="JUG Management Now on Git" /><author><name>Hildeberto Mendonça</name><uri>http://www.blogger.com/profile/00241544229335976181</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://2.bp.blogspot.com/_GRRHKr2Yk6M/S8wdoE8TK6I/AAAAAAAABhI/v7Bl4Ud3QMk/S220/me.jpg" /></author><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/01/jug-management-now-on-git.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cHRH0zcSp7ImA9Wx9WGUQ.&quot;"><id>tag:blogger.com,1999:blog-1281882577011517327.post-8872865998715062509</id><published>2011-01-02T12:29:00.002+01:00</published><updated>2011-01-25T22:30:35.389+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-25T22:30:35.389+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="cejug" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="integration" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise application" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>New CEJUG Open Source Project</title><content type="html">As &lt;a href="http://www.hildeberto.com/2011/01/cejug-commitment-with-my-homeland.html"&gt;I have mentioned yesterday&lt;/a&gt;, I'm working on a new project, managed by the &lt;a href="http://www.cejug.org/"&gt;CEJUG&lt;/a&gt; community, which aims to develop a web application for managing Java User Groups. We put it into &lt;a href="http://www.cejug.org/jug"&gt;production&lt;/a&gt; in the first day of the decade, January 1st, 2011, and we made the &lt;a href="http://java.net/projects/cejug/sources/svn/show/trunk/jug"&gt;source code freely available&lt;/a&gt; on our &lt;a href="http://www.java.net/projects/cejug"&gt;java.net project&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
The first goal we want to achieve is the definition of what is actually being a CEJUG member. Nowadays, we simply consider all those registered in our technical mailing as members. This simplicity is good for management purposes, but we lose lots of information because of that. We don't know, for instance, for what reasons a member is leaving the group. Did we do something wrong? What can we do to get better and get members back into the boat? We also noticed that even non-technical people, as entrepreneurs, recruiters, and those  who decided to unsubscribe because of too many messages, would like to keep in touch with the group, not necessarily going into technical discussions, but proposing other ways to help. Adopting a separate application to manage subscriptions would help us to collect more feedback and be more inclusive.&lt;br /&gt;
&lt;br /&gt;
Developing our own solution can make data work in our favour and allow our sustained growth. Consequently, we are generating an additional source of knowledge for the community. This  application is open source and everyone can run and see how CEJUG works. Beginners will have a solid source to start their studies on the development of Java web applications, experts  can help with bug fixing, refactoring, and developing new features  according to our &lt;a href="http://java.net/jira/browse/CEJUG"&gt;issue tracking&lt;/a&gt;. Adopted design patterns may be subject of valuable and warming discussions in our community.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GRRHKr2Yk6M/TSBb7LpXMWI/AAAAAAAAB6s/EBjO4-0C5l4/s1600/cejug-application.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="203" src="http://3.bp.blogspot.com/_GRRHKr2Yk6M/TSBb7LpXMWI/AAAAAAAAB6s/EBjO4-0C5l4/s400/cejug-application.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Of course the application was developed in Java ;-) We have the duty to write the software architecture document in the coming days, but we can already say in advance what we are using to develop and deploy the application. The presentation layer was developed in &lt;a href="http://jcp.org/en/jsr/detail?id=314"&gt;JSF 2.0&lt;/a&gt;, using the &lt;a href="http://www.primefaces.org/"&gt;Primefaces&lt;/a&gt; component library; the business layer was implemented in &lt;a href="http://jcp.org/en/jsr/detail?id=318"&gt;EJB 3.1&lt;/a&gt;; the persistence layer was implemented in &lt;a href="http://jcp.org/en/jsr/detail?id=317"&gt;JPA 2.0&lt;/a&gt;; data is persisted in &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;; and everything is running on &lt;a href="http://glassfish.java.net/"&gt;Glassfish 3.0.1&lt;/a&gt; Application Server. The current version was developed using &lt;a href="http://www.netbeans.org/"&gt;Netbeans 6.9&lt;/a&gt; due to its productivity when developing JEE applications. We rely on the container to manage security, database transactions, connection pools, and email sessions.&lt;br /&gt;
&lt;br /&gt;
The next step is to document the application, add customisable features and internationalise it in order to spread its adoption by several other JUGs out there. We are looking for contributors and supporters to make this a successful open source project. We hope one day, we could promote interoperability between JUGs through this application, sharing mutual knowledge, events, effort on the growth of the Java platform and the Java community.&lt;img src="http://feeds.feedburner.com/~r/HildebertosBlog/~4/Y0WPvCSMrX0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.hildeberto.com/feeds/8872865998715062509/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.hildeberto.com/2011/01/new-cejug-open-source-project.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8872865998715062509?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1281882577011517327/posts/default/8872865998715062509?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HildebertosBlog/~3/Y0WPvCSMrX0/new-cejug-open-source-project.html" title="New CEJUG Open Source Project" /><author><name>Hildeberto Mendonça</name><uri>http://www.blogger.com/profile/00241544229335976181</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://2.bp.blogspot.com/_GRRHKr2Yk6M/S8wdoE8TK6I/AAAAAAAABhI/v7Bl4Ud3QMk/S220/me.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_GRRHKr2Yk6M/TSBb7LpXMWI/AAAAAAAAB6s/EBjO4-0C5l4/s72-c/cejug-application.png" height="72" width="72" /><thr:total>8</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://www.hildeberto.com/2011/01/new-cejug-open-source-project.html</feedburner:origLink></entry></feed>
