<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7373504975428818830</id><updated>2011-11-28T01:29:25.367+01:00</updated><category term='images'/><category term='knowledge transfer'/><category term='Mockito'/><category term='tools'/><category term='books'/><category term='soa'/><category term='information modeling'/><category term='Java 7'/><category term='methodology'/><category term='minimize'/><category term='Data Modeling'/><category term='Terracotta'/><category term='Henrik Engström'/><category term='blazeds'/><category term='quicksilver'/><category term='jobserve'/><category term='JProfiler'/><category term='Concurrency'/><category term='trends'/><category term='positives'/><category term='JRuby'/><category term='the future of programming'/><category term='DSL'/><category term='Mac'/><category term='QCon'/><category term='nosql'/><category term='performance'/><category term='Elevate'/><category term='eclipse'/><category term='Stateful'/><category term='actionscript'/><category term='blogs'/><category term='Porsche'/><category term='java7'/><category term='Dan North'/><category term='FLV'/><category term='Builder Pattern'/><category term='BlogTrog'/><category term='java'/><category term='Web Services'/><category term='Avega'/><category term='hamcrest'/><category term='parameters'/><category term='Spotify'/><category term='XML'/><category term='event handler'/><category term='JavaDoc'/><category term='links'/><category term='flex'/><category term='pair programming'/><category term='Grinder'/><category term='desktop'/><category term='multi-threading'/><category term='ubiquitous language'/><category term='unit testing'/><category term='Spring-WS'/><category term='many-core processors'/><category term='Wordle'/><category term='OS'/><category term='locking'/><category term='recursion'/><category term='ruby'/><category term='negatives'/><category term='Date'/><category term='varargs'/><category term='London'/><category term='osx'/><category term='inspiration'/><category term='VM settings'/><category term='Scala'/><category term='VM'/><category term='agile'/><category term='SVN 1.6'/><category term='neo4j'/><category term='Clustering'/><category term='rat race'/><category term='kanban'/><category term='service modeling'/><category term='abstract method'/><category term='bea'/><category term='Spring'/><category term='hofstadter'/><category term='lean'/><category term='JVM'/><category term='web pages'/><category term='IntelliJ9'/><category term='programming'/><category term='videos'/><category term='2010'/><category term='alsb'/><category term='quirks osx'/><category term='thomas erl'/><category term='Google App Engine'/><category term='IntelliJ 8.1'/><category term='db40'/><category term='IntelliJ'/><category term='scrum'/><category term='Maven'/><category term='Joe Armstrong'/><category term='Glassfish'/><category term='Erlang'/><category term='pair switching problems'/><title type='text'>Recursion: See Recursion</title><subtitle type='html'>A blog about bits and pieces in the computer science sphere.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5950388927247967928</id><published>2010-08-06T16:16:00.002+02:00</published><updated>2010-08-06T16:16:59.571+02:00</updated><title type='text'>New Blog URL</title><content type='html'>This blog has moved to a new URL:&lt;br /&gt;&lt;a href="http://r-c-r.tumblr.com/"&gt;http://r-c-r.tumblr.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5950388927247967928?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5950388927247967928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5950388927247967928&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5950388927247967928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5950388927247967928'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/08/new-blog-url.html' title='New Blog URL'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-8709015279949848497</id><published>2010-06-28T14:56:00.003+02:00</published><updated>2010-06-28T14:59:38.654+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='trends'/><title type='text'>Java and Scala Trends</title><content type='html'>Here's a comparison of what the relative Java and Scala trends are:&lt;br /&gt;&lt;div style="width:540px"&gt;&lt;br /&gt;&lt;a href="http://www.indeed.com/jobtrends?q=scala%2C+java&amp;relative=1&amp;relative=1" title="scala, java Job Trends"&gt;&lt;br /&gt;&lt;img width="540" height="300" src="http://www.indeed.com/trendgraph/jobgraph.png?q=scala%2C+java&amp;relative=1" border="0" alt="scala, java Job Trends graph"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;table width="100%" cellpadding="6" cellspacing="0" border="0" style="font-size:80%"&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://www.indeed.com/jobtrends?q=scala%2C+java&amp;relative=1&amp;relative=1"&gt;scala, java Job Trends&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td align="right"&gt;&lt;a href="http://www.indeed.com/q-Scala-jobs.html"&gt;Scala jobs&lt;/a&gt; - &lt;a href="http://www.indeed.com/q-Java-jobs.html"&gt;Java jobs&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This shows the absolute comparison:&lt;br /&gt;&lt;div style="width:540px"&gt;&lt;br /&gt;&lt;a href="http://www.indeed.com/jobtrends?q=scala%2C+java" title="scala, java Job Trends"&gt;&lt;br /&gt;&lt;img width="540" height="300" src="http://www.indeed.com/trendgraph/jobgraph.png?q=scala%2C+java" border="0" alt="scala, java Job Trends graph"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;table width="100%" cellpadding="6" cellspacing="0" border="0" style="font-size:80%"&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://www.indeed.com/jobtrends?q=scala%2C+java"&gt;scala, java Job Trends&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td align="right"&gt;&lt;a href="http://www.indeed.com/q-Scala-jobs.html"&gt;Scala jobs&lt;/a&gt; - &lt;a href="http://www.indeed.com/q-Java-jobs.html"&gt;Java jobs&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-8709015279949848497?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/8709015279949848497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=8709015279949848497&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8709015279949848497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8709015279949848497'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/06/java-and-scala-trends.html' title='Java and Scala Trends'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-8771486711898666522</id><published>2010-04-25T15:11:00.002+02:00</published><updated>2010-04-25T15:14:53.717+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ'/><title type='text'>Note to self about Scala and IntelliJ</title><content type='html'>I am using IntelliJ as IDE for almost everything including Scala.&lt;div&gt;However, I had an issue with IntelliJ not compiling my Scala code due to the following error:&lt;/div&gt;&lt;div&gt;"&lt;span class="Apple-style-span" style="font-family: 'trebuchet ms', verdana, tahoma, arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); line-height: 19px; "&gt;Error: fatal error: object scala not found."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:'trebuchet ms', verdana, tahoma, arial, sans-serif;font-size:100%;color:#333333;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia, serif; line-height: normal; font-size: 16px; "&gt;If you have the same error the solution is to add a module dependency to the scala-library.jar file (found in your Scala distribution).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:'trebuchet ms', verdana, tahoma, arial, sans-serif;font-size:100%;color:#333333;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia, serif; line-height: normal; font-size: 16px; "&gt;Happy coding!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;meta charset="utf-8"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-8771486711898666522?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/8771486711898666522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=8771486711898666522&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8771486711898666522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8771486711898666522'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/04/note-to-self-about-scala-and-intellij.html' title='Note to self about Scala and IntelliJ'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6839775895729452120</id><published>2010-03-23T10:54:00.004+01:00</published><updated>2010-03-23T11:00:36.678+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Mockito'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>The key to successful unit testing is isolation</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The key to successful unit testing is isolation!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A couple of years ago, when Spring framework entered the scene, we had some issues with unit testing in my team. Since Spring is based on IOC we felt we had no control of the code since just instancing a class and run tests on it would generate a lot of null pointers.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;So we came up with the, what we thought back then, brilliant idea to wire up Spring for every unit test. This way we knew that all Spring beans would be set on the class to be tested and, hence, we got rid of the malicious null pointers.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;But this introduced another problem, namely that if we have a service bean that utilizes a DAO bean we would have to make sure that the DAO bean being used would have a database to run on. Enter in-memory databases! &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;So now we had a test suite that could be run and no framework errors would prevent us from implementing unit tests for the code.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;However, we did not realize that we were actually testing more than we wanted to!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;In reality the tests we wrote for our service layer would also test the DAO layer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Not really an ideal situation...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;So what to do about this then? Spring is being used as defacto standard these days.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Enter Mockito :-)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;With Mockito you have a tool that enables you to unit test exactly what you want.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Let me give you a little real-world example that I ran into the other day.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;I am working with the customer system at my current employer and for each change it is important to track these changes with an audit trail. So, for example, if a customer logs into the system correctly an audit trail should be created with information about status (success) and some other information. Should the login fail then the same information apart from status = access_denied should be generated.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The audit trail is created with Spring's JmsTemplate and ActiveMQ's vm://localhost functionality (no socket connections involved).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;So the code I want to test looks something like this (names etc. has been changed to protect my customer's code):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px; white-space: pre; "&gt;&lt;span style="color:#0000FF;"&gt;package&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.service;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div id="'noIframeDiva5d6aaae-152d-4983-8b14-652e928ab05a'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.springframework.stereotype.Service;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.springframework.util.Assert;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.Authentication;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.AuthenticationStatus;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.LoginDetails;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.infrastructure.messaging.AuditLoggingProducer;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;@Service(&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;authenticationService&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuthenticationServiceImpl &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;implements&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuthenticationService {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    @Autowired&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuditLoggingProducer auditLoggingProducer;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Authentication login(LoginDetails loginDetails) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        Assert.notNull(loginDetails, &lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;LoginDetails cannot be null&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Simplified code - used for illustration of this example&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        Authentication authentication &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (loginDetails.getUserId() &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;            &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Allow user with id to login - every one else should be denied&lt;/span&gt;&lt;/div&gt;&lt;div&gt;            &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The winner (pos 1) takes it all, huh? :-)&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;            authentication &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; createAuthentication(AuthenticationStatus.SUCCESS, loginDetails.getUserId());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        } &lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;            authentication &lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; createAuthentication(AuthenticationStatus.FAILURE, loginDetails.getUserId());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; authentication;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;    &lt;span style="color:#008000;"&gt;/**&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     * Creates authentication and makes sure that auditing service is called&lt;/div&gt;&lt;div&gt;     &lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Authentication createAuthentication(AuthenticationStatus status, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; userId) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        Authentication authentication &lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Authentication(status, userId);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        auditLoggingProducer.audit(authentication);&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; authentication;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('a5d6aaae-152d-4983-8b14-652e928ab05a');&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Now, in order to test the code above I will use some nice features of Mockito and Spring:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div id="'noIframeDiv63161dc6-250e-4e4b-8f2c-aa9ef4a5e71c'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color:#0000FF;"&gt;package&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.service;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.mockito.ArgumentCaptor;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.springframework.test.util.ReflectionTestUtils;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.mockito.Mockito.&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; org.junit.Assert.&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.Authentication;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.LoginDetails;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;import&lt;/span&gt;&lt;span style="color:#000000;"&gt; com.x.domain.infrastructure.messaging.AuditLoggingProducer;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuthenticationServiceTest {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArgumentCaptor&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Athentication&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; argument &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArgumentCaptor.forClass(Authentication.&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuthenticationServiceImpl authenticationServiceImpl;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuditLoggerProducer auditLoggerProducer;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;    @Before &lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; setUp() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Just create a simple instance&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        authenticationServiceImpl &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AuthenticationServiceImpl();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now wire it up with a mock (to prevent null pointer exception)&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        auditLoggingProducer &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; mock(AuditLoggingProducer.&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        ReflectionTestUtils.setField(authenticationServiceImpl, &lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;auditLoggingProducer&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;, auditLoggingProducer);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;    @Test&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; loginInWithValidUserShouldCreateSuccess() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        LoginDetails loginDetails &lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; LoginDetails(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ...);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Login with valid user&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        Authentication authentication &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; authenticationServiceImpl.login(loginDetails);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Assert that the returned authentication is of correct status&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        assertEquals(AuthenticationStatus.SUCCESS, authentication.getStatus());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Here comes the tricky bit to test:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Make sure that audit logging has been called (1 time), but&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; also make sure that the sent message is of status success&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        verify(auditLoggingProducer, times(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;)).audit(argument.capture());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        assertEquals(AuthenticationStatus.SUCCESS, argument.getValue().getStatus());    &lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;    @Test&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; loginInWithInvalidUserShouldCreateFailure() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        LoginDetails loginDetails &lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; LoginDetails(&lt;/span&gt;&lt;span style="color:#000000;"&gt;123&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ...);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Login with valid user&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        Authentication authentication &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; authenticationServiceImpl.login(loginDetails);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Assert that the returned authentication is of correct status&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        assertEquals(AuthenticationStatus.FAILURE, authentication.getStatus());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Here comes the tricky bit to test:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Make sure that audit logging has been called (1 time), but&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; also make sure that the sent message is of status failure&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        verify(auditLoggingProducer, times(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;)).audit(argument.capture());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        assertEquals(AuthenticationStatus.FAILURE, argument.getValue().getStatus());        &lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('63161dc6-250e-4e4b-8f2c-aa9ef4a5e71c');&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;By utilizing the tools Mockito brings you can isolate you unit tests 100% (or close to) and therefore do proper unit testing!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Best of luck.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6839775895729452120?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6839775895729452120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6839775895729452120&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6839775895729452120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6839775895729452120'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/03/key-to-successful-unit-testing-is.html' title='The key to successful unit testing is isolation'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5080748314047447145</id><published>2010-03-13T22:57:00.002+01:00</published><updated>2010-03-13T23:08:12.734+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='neo4j'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='London'/><title type='text'>QCon 2010 London - Not Only SQL, Emil Eifrém, Neo4J</title><content type='html'>&lt;div&gt;&lt;i&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Here are my notes from the "&lt;span class="Apple-style-span" style="font-style: normal; "&gt;Not Only SQL: Alternative Data Persistence and Neo4J&lt;i&gt;"-session from Emil Eifrém (@emileifrem) at &lt;a href="http://qconlondon.com/"&gt;QCon London&lt;/a&gt; 2010. Please note that these are my notes and I might have misinterpreted some parts of the session, hence, read at own risk :-)&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;4 trends during 2009 that lead up to NOSQL&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;#1 data set size: more data will be created during 2010 than all previous years together&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;#2 connectedness: blogs, wikis, tagging, ontologies, …&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;#3 semi-strucuture&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;#4 architecture&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;The meaning of the term NOSQL is:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;not "Never SQL"&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;not "No To SQL"&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;is "Not Only SQL"&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;4 Emerging Categories of NOSQL&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;key-value stores (based on Amazon's Dynamo Paper). &lt;/span&gt;Example Programmes&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;: Dynomyte, Voldemort&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;big table clones (based on Google's Big Table Paper). &lt;/span&gt;E&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;xample Programmes: HBase, Hypertable, Cassandra (which is used by e.g. Twitter)&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;document databases (collection of key-value pairs, inspired by Lotus Notes!). &lt;/span&gt;E&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;xample Programmes: CouchDB, MongoDB&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;graph databases (nodes, relations, key-value pairs). &lt;/span&gt;E&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;xample Programmes: Sones, Neo4J, AllegroGraph&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;Grap Database Neo4J&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;disk based &lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;JTA/transactional&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;whiteboard friendly: model your datamodel on a whiteboard and the implementation will look about the same!&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;scales up&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;robust&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Go check it out here &lt;a href="http://neo4j.org/"&gt;Neo4J&lt;/a&gt;. I know I will!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5080748314047447145?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5080748314047447145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5080748314047447145&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5080748314047447145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5080748314047447145'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/03/qcon-2010-london-not-only-sql-emil.html' title='QCon 2010 London - Not Only SQL, Emil Eifrém, Neo4J'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-795675026298574518</id><published>2010-03-13T22:25:00.004+01:00</published><updated>2010-03-13T22:40:27.508+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dan North'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='London'/><title type='text'>QCon 2010 London - Sharpening the Tools, Dan North, DRW</title><content type='html'>&lt;i&gt;Here are my notes from the "Sharpening the Tools"-session from Dan North at &lt;a href="http://qconlondon.com/"&gt;QCon London&lt;/a&gt; 2010. Please note that these are my notes and I might have misinterpreted some parts of the session, hence, read at own risk :-)&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;I would also like to point out that if you have the chance to go to any QCon conference you should! They are the best.&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;We all follow the &lt;a href="http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition"&gt;Dreyfus Model&lt;/a&gt; - 5 levels of skill acquisition (for everything: crawl, walk, c++ programming)&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Novice : follow all rules&lt;/li&gt;&lt;li&gt;Advanced Beginner: breaking rules, testing boundaries&lt;/li&gt;&lt;li&gt;Competent: goal oriented&lt;/li&gt;&lt;li&gt;Proficient: intuition (thoughts starting with "I"), analogies/war stories/patterns usage&lt;/li&gt;&lt;li&gt;Expert: operating of instinct (knowing the right decision)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Remember this model and analyze where you are in it for every task. This way you can ask the right questions and get the right help.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tools used by Dan North to become a better software developer (remember the 5 levels)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Technical Tools&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;languages/libraries&lt;/li&gt;&lt;li&gt;IDEs, OS&lt;/li&gt;&lt;li&gt;SCM, build tools&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Programming Tools&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;refactoring &lt;/li&gt;&lt;li&gt;patterns&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Modeling Tools&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;UML (should only stay on the white board - or else someone is trying to sell you something :-))&lt;/li&gt;&lt;li&gt;DDD&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Methodology Tools&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;XP, SCRUM, BDD&lt;/li&gt;&lt;li&gt;Lean, Kanban, ToC&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Personal Tools&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ToDo-lists, GTD, Pomodoro (write down all "subconscious" thoughts/wishes on a piece of paper during the session to keep focus)&lt;/li&gt;&lt;li&gt;GROW framework&lt;/li&gt;&lt;li&gt;NLP (chunking)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Group Tools&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Six_Thinking_Hats"&gt;Six Thinking Hats&lt;/a&gt; (used by e.g. NASA)&lt;/li&gt;&lt;li&gt;Stand-Ups&lt;/li&gt;&lt;li&gt;Retrospectives&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Some tips for how to become an expert software developer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip #1: Practice the basics&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;practice Katas (&lt;i&gt;auth. &lt;/i&gt;but you need a sensei to learn from)&lt;/li&gt;&lt;li&gt;code 4 fun (dojos) - solve problems in different manners (no params, only void methods, …)&lt;/li&gt;&lt;li&gt;learn a language you don't need in work (bridging languages/concepts)&lt;/li&gt;&lt;li&gt;learn IDE shortcuts!&lt;/li&gt;&lt;li&gt;practice your "shell-fu"&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip #2: Learn from other people&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;stalk experts :-)&lt;/li&gt;&lt;li&gt;listen to novices (the beginners mind)&lt;/li&gt;&lt;li&gt;read and give books journeys&lt;/li&gt;&lt;li&gt;read code&lt;/li&gt;&lt;li&gt;follow people (twitter, rss, …)&lt;/li&gt;&lt;li&gt;programme in pairs&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip #3: Understand trends&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;build up a network that you listen to&lt;/li&gt;&lt;li&gt;"Do you know what you don't know?" - use trends to find out what's lurking around the corner&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip #4: Share knowledge&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Blog about success (and failure)&lt;/li&gt;&lt;li&gt;Join mailing lists (and help answering questions)&lt;/li&gt;&lt;li&gt;Use learning lunches, muffin mornings, etc. Keep these simple (no PPT - only white board)&lt;/li&gt;&lt;li&gt;speak @ conferences - but don't become a conference speaker!&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip #5: Maintain your toolbox&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;some tools are timeless, others disposable&lt;/li&gt;&lt;li&gt;use the "clothing" rule to update your tools&lt;/li&gt;&lt;li&gt;ivy instead of maven :-)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip #6: Learn how to learn&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;check out the book: &lt;a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1268516051&amp;amp;sr=8-1"&gt;Pragmatic thinking and learning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1268516051&amp;amp;sr=8-1"&gt;&lt;/a&gt;understand second-order incompetence&lt;/li&gt;&lt;li&gt;start using "six thinking hats"&lt;/li&gt;&lt;li&gt;practice chunking: "what for?", "how?", "how else?"&lt;/li&gt;&lt;li&gt;eat your own dog food&lt;/li&gt;&lt;li&gt;listen like you don't know the answer&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;always assume you're out of date&lt;/li&gt;&lt;li&gt;you owe it to yourself to keep current&lt;/li&gt;&lt;li&gt;learning is a continual cycle&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;I would like to send out a big thank you to Dan North for this highly entertaining and interesting talk - Henrik Engstrom&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-795675026298574518?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/795675026298574518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=795675026298574518&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/795675026298574518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/795675026298574518'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/03/qcon-2010-london-sharpening-tools-dan.html' title='QCon 2010 London - Sharpening the Tools, Dan North, DRW'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-4345244215230124485</id><published>2010-01-26T17:37:00.005+01:00</published><updated>2010-01-26T17:48:17.445+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='videos'/><category scheme='http://www.blogger.com/atom/ns#' term='images'/><category scheme='http://www.blogger.com/atom/ns#' term='FLV'/><title type='text'>Drawing on top of a FLV stream - not as straight forward as you may think</title><content type='html'>I have spent the last 3 hours trying to make my Flex application draw images on top of a media stream (FLV). It turns out not being as straight forward anymore (since Flash 9 and the new security model).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After plenty of Googling and recompilation I found, what turns out to be, a very simple solution.&lt;/div&gt;&lt;div&gt;To spare you a couple of hours extra work I think it is a nice gesture to share my findings :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Add the following row in the Flash client: &lt;/div&gt;&lt;div&gt;&lt;b&gt;Security.loadPolicyFile("http://&lt;your&gt;/crossdomain.xml");&lt;/your&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;2. Add a &lt;i&gt;crossdomain.xml&lt;/i&gt; file in the &lt;b&gt;&lt;i&gt;ROOT&lt;/i&gt;&lt;/b&gt; of your domain, e.g.:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="'noIframeDivec8f0bc2-b2bc-415b-a78e-eb6de36fd955'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;xml version="1.0"&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;cross-domain-policy&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;allow-access-from &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;domain&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="*"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;site-control &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;permitted-cross-domain-policies&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="all"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;cross-domain-policy&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('ec8f0bc2-b2bc-415b-a78e-eb6de36fd955');&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simple enough, isn't it? Well, as long as you put your crossdomain.xml file in the root domain it is... I struggled with understanding this until I found &lt;a href="http://board.flashkit.com/board/showthread.php?t=782484"&gt;this&lt;/a&gt; thread. In the middle of the discussions there a guy writes that it is important to put the file in the root of your domain. Thanks dude! That saved a couple of more hours of work for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-4345244215230124485?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/4345244215230124485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=4345244215230124485&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/4345244215230124485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/4345244215230124485'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2010/01/drawing-on-top-of-flv-stream-not-as.html' title='Drawing on top of a FLV stream - not as straight forward as you may think'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-3806568924485916441</id><published>2009-12-28T17:26:00.003+01:00</published><updated>2009-12-28T17:40:41.949+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><title type='text'>The one book you should buy and learn by heart if you are a professional developer is...</title><content type='html'>&lt;a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1262017803&amp;amp;sr=8-1"&gt;Lean Software Development - An Agile Toolkit&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/a&gt; by Mary and Tom Poppendieck. I have had this book lying around on my desk for maybe 2 years without reading it. Last weekend I didn't have anything to read so by coincidence I picked up this book and got started. It is a page turner filled with common sense. Though it is common sense that can be repeated over and over again because it contains some tools you need to success with your software development projects.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have worked as consultant for 11+ years now and I nod my head at every statement in this book recalling similar situations I have experienced first hand at different clients.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is divided into 7 chapters devoted to 7 lean principles and thinking tools for translating each principle into agile practices:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Eliminate Waste&lt;/li&gt;&lt;li&gt;Amplify Learning&lt;/li&gt;&lt;li&gt;Decide as Late as Possible&lt;/li&gt;&lt;li&gt;Deliver as Fast as Possible&lt;/li&gt;&lt;li&gt;Empower the Team&lt;/li&gt;&lt;li&gt;Build Integrity In&lt;/li&gt;&lt;li&gt;See the Whole&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Yes, these principles are common sense, I know, however, none of the projects I have been involved in has managed to adhere to these "simple" principles. I just wish this book could be mandatory reading for all professional developers out there. It would simplify life for us (developers) and our customers.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-3806568924485916441?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/3806568924485916441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=3806568924485916441&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3806568924485916441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3806568924485916441'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/12/one-book-you-should-buy-and-learn-by.html' title='The one book you should buy and learn by heart if you are a professional developer is...'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6498857036875193534</id><published>2009-12-28T02:30:00.008+01:00</published><updated>2009-12-28T02:45:12.797+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='abstract method'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Abstract methods with ActionScript</title><content type='html'>The other day I wanted to use the &lt;a href="http://en.wikipedia.org/wiki/Template_method_pattern"&gt;Template Method pattern&lt;/a&gt; with ActionScript. I suddenly realized, to my astonishment I must admit, that there are no abstract methods in AS. But of course there is a solution for it. Not the greatest one, but still...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First the abstract class:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="'iframeDiv34aa44ab-e7f8-4ff9-8324-6ae8535b179f'" style="'display:none;margin:0px;'"&gt;&lt;/div&gt;&lt;div id="'noIframeDiv34aa44ab-e7f8-4ff9-8324-6ae8535b179f'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color: #000000;"&gt;package se.x.y {&lt;/div&gt;&lt;div&gt;public class AbstractSpecialCanvas extends Canvas {&lt;/div&gt;&lt;div&gt;  public AbstractSpecialCanvas(name:String) {&lt;/div&gt;&lt;div&gt;    _name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; name;&lt;/div&gt;&lt;div&gt;    init();&lt;/div&gt;&lt;div&gt;  }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  public &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; init() : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/div&gt;&lt;div&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Setup of some graphical components&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;   &lt;/div&gt;&lt;div&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; createButton:Button &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Button();&lt;/div&gt;&lt;div&gt;    createButton.label &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Create Legend&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/div&gt;&lt;div&gt;    createButton.setStyle(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;fontSize&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/div&gt;&lt;div&gt;    createButton.addEventListener(MouseEvent.CLICK, submitForm);    &lt;/div&gt;&lt;div&gt;   &lt;/div&gt;&lt;div&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  public &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; submitForm(event:MouseEvent) : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; { }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('34aa44ab-e7f8-4ff9-8324-6ae8535b179f');&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice the empty function called &lt;b&gt;submitForm&lt;/b&gt; in the code snippet above. This is the trick, i.e. to declare an empty method that can be referenced from the class.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And now the implementing sub class:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="'iframeDivffbb8dca-7c7e-4a33-9221-fd5274cd7a29'" style="'display:none;margin:0px;'"&gt;&lt;/div&gt;&lt;div id="'noIframeDivffbb8dca-7c7e-4a33-9221-fd5274cd7a29'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color: #000000;"&gt;package se.x.y {&lt;/div&gt;&lt;div&gt;public class MySpecialCanvas extends Canvas {&lt;/div&gt;&lt;div&gt;  public MySpecialCanvas(name:String) {&lt;/div&gt;&lt;div&gt;    super(name);&lt;/div&gt;&lt;div&gt;    init();&lt;/div&gt;&lt;div&gt;  }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  public &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; init() : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/div&gt;&lt;div&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Setup of specific graphical components&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  public override &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; submitForm(event:MouseEvent) : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; { &lt;/div&gt;&lt;div&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; handle specific data gathering and submit the stuff to the server&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('ffbb8dca-7c7e-4a33-9221-fd5274cd7a29');&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously you will have to remember to override the method in the super class. One way to do this is to have the method in the super class print an error message or similar. This way you would catch the mistake of not remembering early. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6498857036875193534?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6498857036875193534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6498857036875193534&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6498857036875193534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6498857036875193534'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/12/abstract-methods-with-actionscript.html' title='Abstract methods with ActionScript'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-4169731602556827926</id><published>2009-12-28T02:18:00.005+01:00</published><updated>2009-12-28T02:24:42.750+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum vs Kanban</title><content type='html'>Scrum vs Kanban. Interested in the difference and similarities? I can highly recommend the book &lt;a href="http://www.infoq.com/minibooks/kanban-scrum-minibook"&gt;&lt;b&gt;Kanban and Scrum - making the most of both&lt;/b&gt;&lt;/a&gt; written by &lt;a href="http://blog.crisp.se/henrikkniberg"&gt;Henrik Kniberg&lt;/a&gt; and &lt;a href="http://blog.crisp.se/mattiasskarin"&gt;Mattias Skarin&lt;/a&gt;. It's great reading and should be read by everyone who consider themselves professional developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-4169731602556827926?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/4169731602556827926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=4169731602556827926&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/4169731602556827926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/4169731602556827926'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/12/scrum-v-kanban.html' title='Scrum vs Kanban'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-7066891901646432876</id><published>2009-12-14T15:32:00.005+01:00</published><updated>2009-12-14T15:50:43.400+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='negatives'/><category scheme='http://www.blogger.com/atom/ns#' term='positives'/><category scheme='http://www.blogger.com/atom/ns#' term='Java 7'/><title type='text'>My take on what's good and bad with Java 7</title><content type='html'>Last week I attended a session about Java 7 with &lt;a href="http://blogs.sun.com/trurl/"&gt;Thorbiörn Fritzon&lt;/a&gt; from Sun Microsystems. I want to share my view on what is good and bad with the coming release of Java.&lt;br /&gt;&lt;br /&gt;Positives:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;G1 - the new garbage collector will make the JVM even better&lt;/li&gt;&lt;li&gt;Compressed 64-bit pointers&lt;/li&gt;&lt;li&gt;Modules - this could be the end of JAR hell&lt;/li&gt;&lt;li&gt;Jigsaw - breaking the JDK into modules is a good move&lt;/li&gt;&lt;li&gt;util.concurrent - this already outstanding package will become even better&lt;/li&gt;&lt;li&gt;Null safe dereference - a feature that rocks!&lt;/li&gt;&lt;li&gt;Invoke dynamic - a new bytecode instruction that will simplify life for dynamic languages that want to run on the JVM&lt;/li&gt;&lt;/ul&gt;Negatives:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Late release date du to the inclusion of closures - October 2010 is what Sun is aiming for. Why not add closures into the language later and release what is available now?&lt;/li&gt;&lt;li&gt;Not enough attention on the many-core architectures - how will Sun tackle this issue? We need a better thread architecture! Using 1MB for every thread is not feasible in the future.&lt;/li&gt;&lt;/ul&gt;Ridiculous:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Switch cases with strings! Is this really needed? After 14 years of Java's existence I think we have learned to cope without it :-)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-7066891901646432876?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/7066891901646432876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=7066891901646432876&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7066891901646432876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7066891901646432876'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/12/my-take-on-whats-good-and-bad-with-java.html' title='My take on what&apos;s good and bad with Java 7'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-3417209077505634854</id><published>2009-12-14T13:34:00.003+01:00</published><updated>2009-12-14T13:39:43.630+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parameters'/><category scheme='http://www.blogger.com/atom/ns#' term='event handler'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Passing parameters to an EventHandler in ActionScript</title><content type='html'>I ran into a problem the other day when I wanted to pass parameters to an EventHandler. What I wanted to achieve was to add 2 handlers (MouseEvent.MOUSE_OVER and MouseEvent.MOUSE_OUT) in order to change the background color of some canvases. The parameters I wanted to pass was canvas and color to use.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the solution I came up with:&lt;/div&gt;&lt;div&gt;&lt;div id="'iframeDiv9aa5c3d5-50aa-4d57-9a42-64142e7bde1a'" style="'display:none;margin:0px;'"&gt;&lt;/div&gt;&lt;div id="'noIframeDiv9aa5c3d5-50aa-4d57-9a42-64142e7bde1a'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color: #000000;"&gt;canvas.addEventListener(MouseEvent.MOUSE_OVER, getHandler(canvas, &lt;/span&gt;&lt;span style="color: #000000;"&gt;0x404040&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; function getHandler(canvas:Canvas, color:uint) : Function {&lt;/div&gt;&lt;div&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; function(event:MouseEvent) : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/div&gt;&lt;div&gt;        changeBackgroundColor(canvas, color);&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; function changeBackgroundColor(canvas:Canvas, color:uint) : &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/div&gt;&lt;div&gt;    canvas.setStyle(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;backgroundColor&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, color);&lt;/div&gt;&lt;div&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('9aa5c3d5-50aa-4d57-9a42-64142e7bde1a');&lt;/script&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-3417209077505634854?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/3417209077505634854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=3417209077505634854&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3417209077505634854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3417209077505634854'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/12/passing-parameters-to-eventhandler-in.html' title='Passing parameters to an EventHandler in ActionScript'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-1259812827324464427</id><published>2009-12-01T11:21:00.003+01:00</published><updated>2009-12-01T11:37:18.559+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VM settings'/><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ9'/><title type='text'>Setting VM parameters for IntelliJ 9.0 Beta on OSX</title><content type='html'>To change the default VM parameters of IntelliJ 9 on OSX it's simply to do the following:&lt;div&gt;1. Open Finder and click your way to &lt;applications&gt;, right click on &lt;intellij&gt;, and select "Show Package Contents".&lt;/intellij&gt;&lt;/applications&gt;&lt;/div&gt;&lt;div&gt;2. Browse to the folder &lt;i&gt;Contents&lt;/i&gt; and open the file &lt;i&gt;info.plist&lt;/i&gt; &lt;/div&gt;&lt;div&gt;3. Search for:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="'iframeDiv823d1887-54f5-41b6-bf94-61a6e57a69ab'" style="'display:none;margin:0px;'"&gt;&lt;/div&gt;&lt;div id="'noIframeDiv823d1887-54f5-41b6-bf94-61a6e57a69ab'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;VMOptions&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;key&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('823d1887-54f5-41b6-bf94-61a6e57a69ab');&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;4. Under the found line you can specify what the memory settings for IntelliJ should be like, e.g.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="'noIframeDiv2d9d7b98-2891-4476-901c-04157f08df96'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;string&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;-Xms256m -Xmx1024m -XX:MaxPermSize=150m -ea Xbootclasspath/a:../lib/boot.jar&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;string&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('2d9d7b98-2891-4476-901c-04157f08df96');&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-1259812827324464427?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/1259812827324464427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=1259812827324464427&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1259812827324464427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1259812827324464427'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/12/setting-vm-parameters-for-intellij-90.html' title='Setting VM parameters for IntelliJ 9.0 Beta on OSX'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-2693996783600759911</id><published>2009-11-30T23:12:00.003+01:00</published><updated>2009-11-30T23:27:55.290+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>ActionScript and XML</title><content type='html'>I have been playing around with Flex/ActionScript for quite some time now and as an experienced Java developer I must say I like it a lot. I will share some findings in this space (mostly because my memory is not what it should be so it's a good place for me to re-find my findings :-)).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Howto-Marshal&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="'iframeDiva3196670-4593-4e3a-9558-2a04b04dfdba'" style="'display:none;margin:0px;'"&gt;&lt;/div&gt;&lt;div id="'noIframeDiva3196670-4593-4e3a-9558-2a04b04dfdba'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/div&gt;&lt;div&gt;http://www.CodeHighlighter.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; function marshalMetaMedia(order:Order) : XML {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        var xml:XML &lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;                &lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ns:order xmlns:ns&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;http://www.ordersystem.se/schema/order/1.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;                    &lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;id&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{order.id}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;id&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;                &lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ns:metamedia&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;        &lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; xml;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('a3196670-4593-4e3a-9558-2a04b04dfdba');&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;See how simple it is to create XML and to intertwine it with the values passed to the method! It's to easy to believe, huh? :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;HowTo-Unmarshal:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;div id="'noIframeDiv2e9dd95c-45e2-4881-805a-c6efab182813'" style="'display:block;margin:0px;'"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;http://www.CodeHighlighter.com/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;--&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; function unmarshalOrder(xml:XML):MetaMedia {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    var order:Order &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Order();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;        order.id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; xml[&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;id&lt;/span&gt;&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;].text();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; order;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="'javascript'" src="'http://www.blogtrog.com/scripts/bt_code.js'" type="'text/javascript'"&gt;&lt;/script&gt;&lt;script language="'javascript'" type="'text/javascript'"&gt;bt_code_init('2e9dd95c-45e2-4881-805a-c6efab182813');&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Simple is beautiful!&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-2693996783600759911?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/2693996783600759911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=2693996783600759911&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/2693996783600759911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/2693996783600759911'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/11/actionscript-and-xml.html' title='ActionScript and XML'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-3640604991875119003</id><published>2009-10-04T08:17:00.006+02:00</published><updated>2009-10-04T08:42:43.127+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quirks osx'/><title type='text'>OSX Tips and Tricks</title><content type='html'>Although I love my MacBook Pro and OSX (I have upgraded to the snowy version) there are some strange "quirks" that I have struggled with. Below is a description of the "quirks" and a solution for each of them. Hope they come in handy to you - at least this will serve as a space where I can find the solution should I forget how to solve it in the future.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quirk 1: The checkbox "Always Open With" does not seem to stick&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Description&lt;/i&gt;: &lt;/div&gt;&lt;div&gt;Let's say you want to open an xml file and the default application suggested by OSX is Safari. As a developer I am not a bit interested in viewing an xml file in Safari so therefore I "right click" and select "Open with" -&gt; "Other..." and finally an application, e.g. TextEdit. There is a checkbox at this stage which says "Always Open With". I thought that checking this box would solve the problem, but it doesn't! Apparently this only applies to the specific file, not &lt;i&gt;all&lt;/i&gt; xml files.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Solution:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;/i&gt;"Right click" the xml file (in this example) and select "Get Info". A new window opens up and about in the middle of it you can find the arrow "Open with". Click on it and select the TextEdit application and then click "Change all...". Voila! That's it. Now all xml files will open in TextEdit. Nice huh? :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quirk 2: There is no "Print Screen" button&lt;/b&gt; &lt;/div&gt;&lt;div&gt;&lt;i&gt;Description: &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;/i&gt;Having used a PC for a long time before I got my MacBook Pro I got used to the "Print Screen" button. On the MacBook Pro there is no such button so how do I copy stuff as it's shown on the screen?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Solution:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;It turns out there are a couple of commands in OSX to serve the needed functionality rather than just the old "print screen" button. Any of the commands below will create an png file on your desktop.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Command + Shift + 3&lt;/b&gt; takes a screenshot of the entire screen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Command + Shift + 4&lt;/b&gt; brings up a selection tool so you can decide what rectangular area you want to be copied.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Command + Shift + 4 + Spac&lt;/b&gt;&lt;b&gt;e&lt;/b&gt; brings up a camera with which you can select any modular window (or even the dock) on the screen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want any of the images created to be automatically copied to the clipboard you just hold down the Control key during the above commands.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-3640604991875119003?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/3640604991875119003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=3640604991875119003&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3640604991875119003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3640604991875119003'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/10/osx-tips-and-tricks.html' title='OSX Tips and Tricks'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5347498388670002427</id><published>2009-04-13T13:28:00.008+02:00</published><updated>2009-04-13T14:54:11.494+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>My first impressions of Google App Engine for Java</title><content type='html'>I've played around with Google App Engine for Java for a couple of hours now. This is an area that I think all enterprise Java developers should keep track of. I think that this way of deploying applications will become more or less default within a couple of years.&lt;br /&gt;&lt;br /&gt;Here are my immediate findings:&lt;br /&gt;+ Easy to get started with and to be productive within a couple of minutes. &lt;a href="http://code.google.com/appengine/docs/java/gettingstarted/"&gt;See this getting started guide&lt;/a&gt;.&lt;br /&gt;+ Integrated Server Environment - no restarts needed.&lt;br /&gt;+ Changes the Java perspective totally?! This is the route all enterprise companies will deploy their apps soon, isn't it?&lt;br /&gt;&lt;br /&gt;- No IntelliJ support. See this &lt;a href="http://www.gridshore.nl/2009/04/08/java-on-google-app-engine-with-intellij/"&gt;blog&lt;/a&gt; for more information of how to get IntelliJ to work with GAE.&lt;br /&gt;- And on the no-IntelliJ-support note: JSP Support in Eclipse sucks (no code completion or compilation).&lt;br /&gt;- No utilization of IOC and I just hate static things.&lt;br /&gt;&lt;br /&gt;I urge all interested Java developers to have a go at GAE. It is easy and fun and, perhaps the most important part, it is a glimpse of what your future work environment will look like.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5347498388670002427?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5347498388670002427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5347498388670002427&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5347498388670002427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5347498388670002427'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/04/my-first-impressions-of-google-app.html' title='My first impressions of Google App Engine for Java'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-8549997784375428709</id><published>2009-03-31T09:37:00.006+02:00</published><updated>2009-04-16T08:34:35.249+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ 8.1'/><category scheme='http://www.blogger.com/atom/ns#' term='SVN 1.6'/><title type='text'>How to make IntelliJ 8.1 and SVN 1.6 cooperate</title><content type='html'>Yesterday some guy at work decided to upgrade to SVN 1.6. The decision to do this came from nowhere and left us IntelliJ guys with a non-working IDE. So in retrospective it might have been a good idea, pun intended, to ask around before performing this step.&lt;br /&gt;&lt;br /&gt;Anyway, what's done is done! We still wanted to use IntelliJ without Tortoise or some other SVN tool and investigated how this could be done. A collegue of mine still had his IDEA working with SVN after an upgrade and we look for differences in the ".svn" folder. We soon found out that the file entries had a "9" in the beginning of the file whereas my had a "10".  So to make IntelliJ work with SVN 1.6 all you have to do is to replace all 9s with 10s in all the entries files.&lt;br /&gt;&lt;br /&gt;Here's one way to do it:&lt;br /&gt;1. Make all your entries files writeable (in Windowz: Open Explorer -&gt; Go to local repo -&gt; Right click and select Search -&gt; Enter "entries" as file name -&gt; Click "More advanced options" -&gt; Make sure that "Search hidden files and folders" is checked -&gt; Click Search -&gt; Select all found files (Ctrl-A) -&gt; Right click and select properties -&gt; Uncheck "Read only" and click OK)&lt;br /&gt;2. Download and install &lt;a href="http://www.divlocsoft.com/"&gt;Actual Search and Replace&lt;/a&gt;&lt;br /&gt;3. Start Actual Search and Replace and enter the path to your local repo.&lt;br /&gt;4. Select the "Search and Replace" tab&lt;br /&gt;5. Use Reg Exp as Search Type&lt;br /&gt;6. In the To Search you enter &lt;span style="font-style: italic;"&gt;^10$&lt;/span&gt; and in the To Replace or Insert you enter &lt;span style="font-style: italic;"&gt;9&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(please note that you should only change the "entries"&lt;span style="font-style: italic;"&gt; files).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;7. Click Search and then Modify All&lt;br /&gt;&lt;br /&gt;That's it! Good luck :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Please note that I do not take any responsibility if, for some reason, this manoeuvre fails! &lt;/span&gt;&lt;a id="tyda_transR9" href="http://tyda.se/search/manoeuvre"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-8549997784375428709?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/8549997784375428709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=8549997784375428709&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8549997784375428709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8549997784375428709'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/03/how-to-make-intellij-81-and-svn-16.html' title='How to make IntelliJ 8.1 and SVN 1.6 cooperate'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-7001800735960150559</id><published>2009-03-09T23:16:00.004+01:00</published><updated>2009-03-09T23:36:33.948+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pair switching problems'/><category scheme='http://www.blogger.com/atom/ns#' term='pair programming'/><category scheme='http://www.blogger.com/atom/ns#' term='knowledge transfer'/><title type='text'>Pair Programming - There's no reason to not do it, or is there?</title><content type='html'>Reading &lt;a href="http://www.infoq.com/articles/adopting-pair-programming"&gt;this&lt;/a&gt; very interesting and well-written article about pair programming today really inspired me to get started with true pairing. I still have some questions to be sorted about how to introduce this into an organization working with SCRUM (which is the current project methodology they use at my current assignment).&lt;br /&gt;&lt;br /&gt;Things that I haven't thought about before reading the article are the value of having "pairing stations" - a developer neutral work station specifically designed for development. In previous projects whenever we have used pair programming this basically means that two developers sit down at one of their machines and start to program. However, in most cases this means that the developer that "owns" the machine has some custom settings. Using neutral machines, preferably with dual screens, would eliminate such custom settings - something that I feel will improve the quality of the code.&lt;br /&gt;&lt;br /&gt;Another obvious benefit (that I had thought of before) by using pairing is knowledge transfer. I don't think that I have been at a single customer where knowledge transfer has not been a problem. Why not use pair programming to enhance this transfer? I guess the solution is too obvious for anyone to see it! :-) &lt;br /&gt;&lt;br /&gt;A question I have asked the author of the article though is how to use one day pair switching in an environment where the tasks are up to 16h? Also we tend to develop all the tasks in a domain to create domain experts. How should this work with pair switching? Isn't there a risk of creating a bunch of "no-red-line" modules - or is it perhaps the task of the architect to ensure that no such monster is created?&lt;br /&gt;&lt;br /&gt;I would really like to try more 100% pair programming because I truly believe that the efficiency and quality of the end product is much higher that what the normal head-phone using developers produce.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-7001800735960150559?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/7001800735960150559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=7001800735960150559&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7001800735960150559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7001800735960150559'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/03/pair-programming-theres-no-reason-to.html' title='Pair Programming - There&apos;s no reason to not do it, or is there?'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-2957599737187903466</id><published>2009-03-05T13:12:00.003+01:00</published><updated>2009-03-05T13:19:51.671+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recursion'/><category scheme='http://www.blogger.com/atom/ns#' term='hofstadter'/><title type='text'>Recursion: see Douglas Hofstadter</title><content type='html'>The name of this blog is &lt;span style="font-style: italic;"&gt;"Recursion: See Recursion"&lt;/span&gt;. This joke has been around for a while but I still think it is funny. I read a better, more accurate, variation on the same theme today though:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Recursion: If you still don't get it, see: "Recursion"&lt;/span&gt;&lt;br /&gt;Why is it more accurate? Because the reader will terminate once s/he gets what recursion is.&lt;br /&gt;Every recursive call must have a termination condition - if not it is a plain indefinite loop.&lt;br /&gt;&lt;br /&gt;A big reason for my interest in recursion, weird as it may sound, is the author &lt;a href="http://en.wikipedia.org/wiki/Douglas_Hofstadter"&gt;Douglas Hofstadter&lt;/a&gt;. He is best known for this &lt;a href="http://www.amazon.com/Godel-Escher-Bach-Eternal-Golden/dp/0465026567/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1236250267&amp;amp;sr=1-1"&gt;Gödel, Escher, Bach: An Eternal Golden Braid&lt;/a&gt; but most people I have met are unfamiliar with his, perhaps even better, book &lt;a href="http://www.amazon.com/metamagical-themas-douglas-r-hofstadter/dp/B001FB7I4O/ref=sr_1_6?ie=UTF8&amp;amp;s=books&amp;amp;qid=1236250267&amp;amp;sr=1-6"&gt;Metamagical Themas&lt;/a&gt;.&lt;br /&gt;In this epic book you can find a whole section dedicated to "self-referential sentences".&lt;br /&gt;I really recommend you to buy this book and I promise several joyful hours pondering about linguistic recursion.&lt;br /&gt;&lt;br /&gt;Here are some some appetizers of what you can find in his book:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The whole point of this sentence is to make clear what the whole point of this sentence is."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“The proverbial German phenomenon of the verb-at-the-end about which droll tales of absentminded professors who would begin a sentence, ramble on for an entire lecture, and then finish up by rattling off a string of verbs by which their audience, for whom the stack had long since lost its coherence, would be totally nonplussed, are told, is an excellent example of linguistic recursion.”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Hofstadter's Law states that: It always takes longer than you expect, even when you take into account Hofstadter's Law."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"This sentence contradicts itself - no actually it doesn't."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm sure I will write more about my findings in this interesting topic, recursion, later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-2957599737187903466?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/2957599737187903466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=2957599737187903466&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/2957599737187903466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/2957599737187903466'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/03/recursion-see-douglas-hofstadter.html' title='Recursion: see Douglas Hofstadter'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6314227426579511507</id><published>2009-02-23T17:25:00.007+01:00</published><updated>2009-02-23T17:42:54.708+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Builder Pattern'/><title type='text'>ObjectMother's better friend: The Test Data Builder Pattern</title><content type='html'>Having used the &lt;a href="http://c2.com/cgi/wiki?ObjectMother"&gt;Object Mother pattern&lt;/a&gt; a couple of times before I have felt that it always looks tidy and nice in the beginning of the project. Over time, though, the clearness of the "mother" degrades dramatically.&lt;br /&gt;&lt;br /&gt;Having googled for a while I found that a lot of people recommended using the &lt;a href="http://c2.com/cgi/wiki?TestDataBuilder"&gt;Test Data Builder pattern&lt;/a&gt; instead. Just by having had a look at the notation I must say that I immediately prefer it to the Object Mother. Who cannot say that this looks nice:&lt;br /&gt;&lt;div id='iframeDiv6a5f5e4b-d892-4f8d-9b68-5648ad28bfa8' style='display:none;margin:0px;'&gt;&lt;iframe id='iframe6a5f5e4b-d892-4f8d-9b68-5648ad28bfa8' src='http://www.blogtrog.com/code.aspx?id=6a5f5e4b-d892-4f8d-9b68-5648ad28bfa8' style='width: 600px; height: 200px; border: 1px solid #e0e0e0;margin:0px;' frameborder='0'&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div id='noIframeDiv6a5f5e4b-d892-4f8d-9b68-5648ad28bfa8' style='display:block;margin:0px;'&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;Address address &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; AddressBuilder()&lt;br /&gt;        .withStreet(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Rue Pont Neuf 12&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        .withCity(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Bombay&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        .withCountry(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Iceland&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        .build();&lt;br /&gt;Person person &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; PersonBuilder()&lt;br /&gt;        .withSSN(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;123456-1234&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        .withName(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Henrik Engstrom&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        .withAddress(address)&lt;br /&gt;        .withSalary(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;too little&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        .build();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language='javascript' src='http://www.blogtrog.com/scripts/bt_code.js' type='text/javascript'&gt;&lt;/script&gt;&lt;script language='javascript' type='text/javascript'&gt;bt_code_init('6a5f5e4b-d892-4f8d-9b68-5648ad28bfa8');&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I know that I do :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6314227426579511507?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6314227426579511507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6314227426579511507&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6314227426579511507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6314227426579511507'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/02/objectmothers-better-friend-test-data.html' title='ObjectMother&apos;s better friend: The Test Data Builder Pattern'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-1210297836667009201</id><published>2009-02-05T23:09:00.011+01:00</published><updated>2009-02-06T00:03:10.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='BlogTrog'/><category scheme='http://www.blogger.com/atom/ns#' term='hamcrest'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Mockito'/><category scheme='http://www.blogger.com/atom/ns#' term='varargs'/><title type='text'>A trip into Mockito land with varargs as traveling company</title><content type='html'>&lt;span style=";font-family:arial;font-size:100%;"  &gt;I have used &lt;a href="http://www.mockito.org/"&gt;Mockito&lt;/a&gt; in a couple of previous projects with joy. In comparison to other mock frameworks I have used it is simple and good enough for what I want in a project.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;However, the other day I ran into an interesting problem; mocking out methods containing varargs. I wanted to share my problem to see if anyone out there has run into the same problem and, perhaps, have been more successful in resolving it.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Let's start by creating a simple class:&lt;/span&gt;&lt;br /&gt;&lt;div id="iframeDiv242d7f8f-2141-4545-b7f6-dc9131389772" style="margin: 0px; display: none;"&gt;&lt;iframe id="iframe242d7f8f-2141-4545-b7f6-dc9131389772" src="http://www.blogtrog.com/Code.aspx?id=242d7f8f-2141-4545-b7f6-dc9131389772" style="border: 1px solid rgb(224, 224, 224); margin: 0px; width: 600px; height: 200px;" frameborder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div id="noIframeDiv242d7f8f-2141-4545-b7f6-dc9131389772" style="margin: 0px; display: block;"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; MyClass {&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; useVarArgs(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;... args) {&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; result &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; arg : args) {&lt;br /&gt;     result &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; arg;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; result;&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language="javascript" src="http://www.blogtrog.com/scripts/bt_code.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script language="javascript" type="text/javascript"&gt;bt_code_init('242d7f8f-2141-4545-b7f6-dc9131389772'&lt;/script&gt;&lt;br /&gt;Here' s the corresponding test class:&lt;br /&gt;&lt;div id='iframeDiv46a68cb1-155d-4530-97ed-0c535a4709a4' style='display:none;margin:0px;'&gt;&lt;iframe id='iframe46a68cb1-155d-4530-97ed-0c535a4709a4' src='http://www.blogtrog.com/Code.aspx?id=46a68cb1-155d-4530-97ed-0c535a4709a4' style='width: 600px; height: 200px; border: 1px solid #e0e0e0;margin:0px;' frameborder='0'&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div id='noIframeDiv46a68cb1-155d-4530-97ed-0c535a4709a4' style='display:block;margin:0px;'&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClassTest {&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; useVarArgs() {&lt;br /&gt;        MyClass myClass &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; myClass.useVarArgs(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result10 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; myClass.useVarArgs(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        assertEquals(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, result1);&lt;br /&gt;        assertEquals(&lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;, result10);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Test&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; mockMethod() {&lt;br /&gt;        MyClass myClass &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; mock(MyClass.&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        when(myClass.useVarArgs((&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]) Matchers.notNull())).&lt;br /&gt;                       thenReturn(&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result3 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; myClass.useVarArgs(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; result10 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; myClass.useVarArgs(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        assertEquals(&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, result3);&lt;br /&gt;        assertEquals(&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, result10);&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script language='javascript' src='http://www.blogtrog.com/scripts/bt_code.js' type='text/javascript'&gt;&lt;/script&gt;&lt;script language='javascript' type='text/javascript'&gt;bt_code_init('46a68cb1-155d-4530-97ed-0c535a4709a4');&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;What I am trying to achieve in the test above is first to verify the correct behavior of the tested method (done in test method useVarArgs). Thereafter I simulate a test in which we need to mock out the default behavior (done in test method mockMethod).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, the last test method fails!&lt;br /&gt;&lt;span style="font-style: italic;"&gt;java.lang.AssertionError: expected:&lt;2&gt; but was:&lt;0&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firstly, I'd like to clarify that I have tried different "matchers" than the Matchers.notNull(), e.g. Matchers.anyObject(). It does not affect the result of the test.&lt;br /&gt;&lt;br /&gt;Trying a custom matcher and using the Matcher&lt;code&gt;&lt;/code&gt;s.anyThat(org.hamcrest.matcher&lt;t&gt; matcher) does not solve my problem either, or have I misunderstood the power of &lt;a href="http://code.google.com/p/hamcrest/"&gt;Hamcrest&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;I have inspected the source code in Mockito by following the debugger but to no avail. If there are any Mockito expert that would help me with this I'd much appreciate it since it is bugging me a lot! I have promoted Mockito as the best thing since sliced bread to my colleagues and now I need to prove this...&lt;br /&gt;&lt;br /&gt;PS. If you blog with Blogger and like some nice code formatting tool (I have missed one since I started blogging - a fact that is quite obvious by looking at my blog posts) then I highly recommend &lt;a href="http://www.blogtrog.com/default.aspx"&gt;BlogTrog&lt;/a&gt;. DS.&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-1210297836667009201?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/1210297836667009201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=1210297836667009201&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1210297836667009201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1210297836667009201'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/02/trip-into-mockito-land-with-varargs-as.html' title='A trip into Mockito land with varargs as traveling company'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5318204694579803736</id><published>2009-01-21T13:02:00.009+01:00</published><updated>2009-01-21T23:39:10.469+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Grinder'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><category scheme='http://www.blogger.com/atom/ns#' term='JProfiler'/><title type='text'>A Quick Guide to Java Performance Tuning</title><content type='html'>&lt;pre&gt;The last couple of weeks I have been working intensely&lt;br /&gt;with performance of a JEE application (EJB3, JPA) that&lt;br /&gt;runs on Glassfish v2.1.&lt;br /&gt;&lt;br /&gt;When the application server was stressed tested we found&lt;br /&gt;that the CPU (4 cores + 8GB) load was between 80-90% and&lt;br /&gt;the throughput and latency was not good enough.&lt;br /&gt;&lt;br /&gt;Hence we began investigating what the cause of the&lt;br /&gt;problem was. I'd like to share some of the findings as it&lt;br /&gt;might point someone else in the right direction when&lt;br /&gt;it comes to JEE applications and performance.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Loading the Application&lt;/span&gt;&lt;br /&gt;To find out the performance (latency and throughput) of&lt;br /&gt;your application you must be able to load it. We use &lt;a href="http://grinder.sourceforge.net/"&gt;Grinder&lt;/a&gt;&lt;br /&gt;for this. If possible it is definitely better to set up the&lt;br /&gt;load server on another machine than the one you run&lt;br /&gt;your app server on.&lt;br /&gt;&lt;br /&gt;Measure and analyze the results of the load test.&lt;br /&gt;If it turns out to not fulfill the performance requirements of&lt;br /&gt;the application below you can find a checklist that I have&lt;br /&gt;found useful when tracing the root cause of the problem(s).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Suspicion 1 - Database Issues&lt;/span&gt;&lt;br /&gt;The first performance problem a JEE application "normally"&lt;br /&gt;runs into is db performance (at least this is my experience as&lt;br /&gt;a JEE developer since 1999).&lt;br /&gt;&lt;br /&gt;Check CPU load on the db server to get an indication of if&lt;br /&gt;this is the reason of the experienced performance problems.&lt;br /&gt;If it is then tuning the database application is where you&lt;br /&gt;should start! But this topic is not covered here - Google it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Suspicion 2 - Code Issues &lt;/span&gt;&lt;br /&gt;You may have unintentionally written your code in a non-&lt;br /&gt;performing way. This happens some time you know :-)&lt;br /&gt;&lt;br /&gt;I suggest that you download a Java profiler and use it to&lt;br /&gt;introspect how your code really operates.&lt;br /&gt;&lt;br /&gt;We have used JProfiler (v5.2.1) to profile the JEE application&lt;br /&gt;running in Glassfish (v.2.1). You can install and try it for&lt;br /&gt;10 days for free. JProfiler worked well as long as we kept the&lt;br /&gt;number of HTTP threads to a small number. When running&lt;br /&gt;Glassfish with 128 HTTP threads they all ended up&lt;br /&gt;in a deadlock.&lt;br /&gt;&lt;br /&gt;We could not determine if JProfiler was the cause of this or&lt;br /&gt;something else. (Although, running the application server&lt;br /&gt;without JProfiler did not cause this faulty behavior).&lt;br /&gt;&lt;br /&gt;If you want to use freeware you may test NetBeans Java profiler.&lt;br /&gt;It worked ok too, but since it only measured wall time and we&lt;br /&gt;wanted to see the real CPU time it did not suffice to our needs.&lt;br /&gt;&lt;br /&gt;Run the profiler and try to locate memory leaks,&lt;br /&gt;performance issues, and so on.&lt;br /&gt;The documentation of the profiler will give you a good&lt;br /&gt;starting point for how to do this.&lt;br /&gt;&lt;br /&gt;In our case we could not find any obvious issues with our&lt;br /&gt;JEE code and, hence, we continued with the next step (below).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Suspicion 3 - App Server Issues&lt;br /&gt;&lt;/span&gt;Could it be an application server problem that was causing&lt;br /&gt;our issues? As written above we run Glassfish and the&lt;br /&gt;first thing we did was to read this:&lt;br /&gt;&lt;a href="http://docs.sun.com/app/docs/doc/819-3681"&gt;Glassfish Performance Tuning Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Glassfish out of the box is targeting a development environment&lt;br /&gt;so therefore you can tune a lot of parameters to squeeze out&lt;br /&gt;higher performance.&lt;br /&gt;&lt;br /&gt;Although our performance problems did not go away after the&lt;br /&gt;tuning made. We had better performance now, but not good enough.&lt;br /&gt;&lt;br /&gt;I wondered if it could be a Glassfish thing?&lt;br /&gt;What if we ran our application on another application server&lt;br /&gt;and compared the latency and throughput!&lt;br /&gt;This would be a good indicator whether it was a&lt;br /&gt;app server problem.&lt;br /&gt;&lt;br /&gt;After trying to deploy our application onto a JBoss 5&lt;br /&gt;application server for a couple of hours without any&lt;br /&gt;success I gave up! There are too many differences between&lt;br /&gt;the two servers.&lt;br /&gt;"Write once, run everywhere" my ass! (pardon my french).&lt;br /&gt;&lt;br /&gt;Also I found &lt;a href="http://www.blogger.com/wiki.glassfish.java.net/attach/GlassFishDay2008Sydney/WotifCaseStudy.pdf"&gt;this document&lt;/a&gt; and felt quite confident&lt;br /&gt;that Glassfish could perform.&lt;br /&gt;So, the next step is to tune the JVM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Suspicion 4 - JVM Issues&lt;/span&gt;&lt;br /&gt;If you're not familiar with the JVM GC parameters you&lt;br /&gt;should start this investigation by reading:&lt;br /&gt;&lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;JVM GC documentation&lt;/a&gt;.&lt;br /&gt;Altering GC params can do wonders :-)&lt;br /&gt;&lt;br /&gt;Also I highly suggest that you download and install &lt;a href="http://java.sun.com/performance/jvmstat/"&gt;JVMStat&lt;/a&gt;.&lt;br /&gt;It's a great tool to get an overview of what is going on&lt;br /&gt;with the heap.&lt;br /&gt;&lt;br /&gt;When you feel confident enough you can play around with&lt;br /&gt;some parameters. Some we found useful&lt;br /&gt;(i.e. improved the performance significantly):&lt;br /&gt;* -XX:+UseParallelGC&lt;br /&gt;* -XX:+AggressiveHeap&lt;br /&gt;* -XX:NewRatio=z (where z = 1, 2, 3, ...)&lt;br /&gt;&lt;br /&gt;Of course you must adjust and tune these parameters to&lt;br /&gt;fit your environment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Lessons Learned&lt;/span&gt;&lt;br /&gt;Run performance tests for every release (and store the results -&lt;br /&gt;as they can serve as benchmarks for coming releases).&lt;br /&gt;&lt;br /&gt;Always run performance tests early in the projects lifecycle.&lt;br /&gt;It is hard to detect, and isolate, problematic areas&lt;br /&gt;in the latter stages of the project.&lt;br /&gt;Also, it can prove very time consuming to fix any of the&lt;br /&gt;found problems, i.e. you may not be able to deliver on time.&lt;br /&gt;&lt;br /&gt;Don't underestimate the issues with tuning the JVM and&lt;br /&gt;its GC behavior! GC in itself is a topic in which you&lt;br /&gt;can get a PhD :-) If your app is to run in an environment&lt;br /&gt;where throughput and latency are keywords you should&lt;br /&gt;invest some time in understanding the JVM GC concepts -&lt;br /&gt;or hire an expert to the tuning for you.&lt;br /&gt;&lt;br /&gt;Happy tracing!&lt;br /&gt;&lt;/pre&gt;Resources:&lt;br /&gt;&lt;a href="http://grinder.sourceforge.net/"&gt;Grinder&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ej-technologies.com/products/jprofiler/overview.html"&gt;JProfiler&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;Java 5 GC Tuning Documentation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/performance/jvmstat/"&gt;JVMStat&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5318204694579803736?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5318204694579803736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5318204694579803736&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5318204694579803736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5318204694579803736'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2009/01/quick-guide-to-java-performance-tuning.html' title='A Quick Guide to Java Performance Tuning'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-3360432902306422155</id><published>2008-12-11T23:39:00.001+01:00</published><updated>2008-12-11T23:42:11.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wordle'/><title type='text'>This blog as an image</title><content type='html'>I just found this cool site: &lt;a href="http://www.wordle.net/"&gt;Worlde&lt;/a&gt;.&lt;br /&gt;Go there and create your own word illustration!&lt;br /&gt;Here's my blog as a word cloud.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wordle.net/gallery/wrdl/379893/r-c-r" title="Wordle: r-c-r"&gt;&lt;img src="http://www.wordle.net/thumb/wrdl/379893/r-c-r" style="border: 1px solid rgb(221, 221, 221); padding: 4px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-3360432902306422155?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/3360432902306422155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=3360432902306422155&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3360432902306422155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3360432902306422155'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/12/this-blog-as-image.html' title='This blog as an image'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-1144351908804694806</id><published>2008-12-11T22:43:00.004+01:00</published><updated>2008-12-11T23:06:19.242+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='Spotify'/><title type='text'>First stumbling Terracotta steps on my Mac</title><content type='html'>A couple of days ago I got this &lt;a href="http://www.amazon.com/Definitive-Guide-Terracotta-Hibernate-Scalability/dp/1590599861/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1229031892&amp;amp;sr=8-1"&gt;book&lt;/a&gt;. So far, about 85 pages in, it is very interesting and informative. After reading a couple of chapters I felt the urge to try some "Terracotting" on my brand new IMac 24" :-) Here are some findings for all you Mac freaks out there :-)&lt;br /&gt;&lt;br /&gt;Firstly, download the Linux version of &lt;a href="http://www.terracotta.org/web/display/orgsite/DownloadDestination?name=terracotta-generic-2.7.1.tar.gz&amp;amp;bucket=TCreleases&amp;amp;file=terracotta-generic-2.7.1.tar.gz"&gt;Terracotta&lt;/a&gt;. Unzip it and put it somewhere convenient on your disk.&lt;br /&gt;&lt;br /&gt;In order to make Terracotta work on your Mac you must rebuild it. Set JAVA_HOME and TC_JAVA_HOME to /Library/Java/Home. The easiest way to do this is to create a .profile file in your home directory:&lt;br /&gt;1. Open up a Terminal window (since I have installed &lt;a href="http://www.blacktree.com/"&gt;Quicksilver&lt;/a&gt; I use this eminent tool to open the Terminal window for me).&lt;br /&gt;2. Type 'cd' to get to your home directory&lt;br /&gt;3. Type 'touch .profile' to create an empty .profile file (if it doesn't already exist)&lt;br /&gt;4. Type 'edit .profile' to open a text editor an enter the following text:&lt;br /&gt;JAVA_HOME=/Library/Java/Home&lt;br /&gt;TC_JAVA_HOME=/Library/Java/Home&lt;br /&gt;5. Save the file and close the editor&lt;br /&gt;&lt;br /&gt;Now we are ready to rebuild Terracotta:&lt;br /&gt;1. Start a new Terminal window&lt;br /&gt;2. Go to the Terracotta home directory (where you have put it on your disk).&lt;br /&gt;3. Type 'cd bin' and then './make-boot-jar.sh'&lt;br /&gt;This will rebuild your Terracotta boot jar.&lt;br /&gt;&lt;br /&gt;Try to run Terracotta (to verify that it is working):&lt;br /&gt;Type './start-tc-server.sh' and you should see a text saying something with "Terracotta Server has started ..."&lt;br /&gt;&lt;br /&gt;So the next step for you is to create some Java code, compile it into byte code, having Terracotta instrument this byte code, and finally run this code from several JVMs. You can find examples and more information on the &lt;a href="http://www.terracotta.org/web/display/orgsite/Documentation"&gt;Terracotta site&lt;/a&gt;. Best of luck and happy coding!&lt;br /&gt;&lt;br /&gt;This blog was created under influence of a lot of music provided by the best tool since sliced bread: &lt;a href="http://www.spotify.com/en/"&gt;Spotify&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-1144351908804694806?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/1144351908804694806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=1144351908804694806&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1144351908804694806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1144351908804694806'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/12/first-stumbling-terracotta-steps-on-my.html' title='First stumbling Terracotta steps on my Mac'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5046777846150570709</id><published>2008-10-23T23:35:00.002+02:00</published><updated>2008-10-23T23:38:55.470+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quicksilver'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>Quicksilver - a must have for Mac users</title><content type='html'>I think my life has just changed (to the better) ;-)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even though I am extremely satisfied with my Mac as it is I just found a tool that will make it even better: &lt;a href="http://www.blacktree.com/"&gt;Quicksilver&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have a look at &lt;a href="http://www.youtube.com/watch?v=EBvFUhTqKK4"&gt;this tutorial&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Great stuff huh?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5046777846150570709?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5046777846150570709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5046777846150570709&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5046777846150570709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5046777846150570709'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/10/quicksilver-must-have-for-mac-users.html' title='Quicksilver - a must have for Mac users'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6916738345976103957</id><published>2008-10-23T16:11:00.013+02:00</published><updated>2008-10-23T23:10:19.694+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring-WS'/><title type='text'>Web Services, Spring-WS, and Maven - Part 2</title><content type='html'>&lt;div&gt;&lt;span &gt;In part1 you learnt how to setup Maven and use it from Eclipse. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;In this post we will drill down into nitty gritty details. If you follow this post you will be able to deploy a web service using Spring-WS in Tomcat.&lt;/span&gt;&lt;/div&gt;&lt;span &gt;&lt;div&gt;&lt;br /&gt;Before getting started with the example you should download a web server to be able to deploy the web services. For example you can download &lt;a href="http://tomcat.apache.org/download-60.cgi"&gt;Tomcat 6.x from here&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Unzip and install, e.g. in catalogue&lt;span class="Apple-style-span" style="font-style: italic;"&gt; /usr/local/tomcat/tomcat6018&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;In order to be able to work properly with web services I suggest that you download the eminent free WS tool called &lt;a href="http://www.soapui.org/"&gt;SoapUI&lt;/a&gt;. Unzip and install. It will be useful later in this tutorial.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;In the examples below we put the code in the directory &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;Create one if it does not already exists. Now we are ready to get started.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;The WSDL File&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Spring-WS is designed from a top-down perspecitve i.e. you create a web service definition and based on this we generate/create the necessary code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So let's define a really simple WSDL file with 1 service operation "helloWorld":&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:definitions name="HelloWorld"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;targetNamespace="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://mycompany.helloworld.com/wsdl/v1_0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://mycompany.helloworld.com/wsdl/v1_0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns:tns="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://mycompany.helloworld.com/wsdl/v1_0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://mycompany.helloworld.com/wsdl/v1_0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns:wsdl="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://schemas.xmlsoap.org/wsdl/"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://schemas.xmlsoap.org/wsdl/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns:xsd="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.w3.org/2001/XMLSchema&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns:soap="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://schemas.xmlsoap.org/wsdl/soap/%22&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://schemas.xmlsoap.org/wsdl/soap/"&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:message   name="HelloWorldRequest"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:part name="userName" type="xsd:string"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:message&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:message name="HelloWorldResponse"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:part name="greeting" type="xsd:string"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:message&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:portType name="HelloWorldPortType"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:operation name="helloWorld"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:input message="tns:HelloWorldRequest"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:output message="tns:HelloWorldResponse"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:operation&amp;gt;     &amp;lt;/wsdl:portType&amp;gt;&lt;br /&gt;&amp;lt;wsdl:binding name="HelloWorldSOAP" type="tns:HelloWorldPortType"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;soap:binding style="document"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  transport="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://schemas.xmlsoap.org/soap/http%22/&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://schemas.xmlsoap.org/soap/http"/&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:operation name="helloWorld"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;soap:operation soapAction="helloWorld"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &amp;lt;wsdl:input&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;soap:body use="literal"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:input&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:output&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;soap:body use="literal"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:output&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:operation&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:binding&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:service name="HelloWorld"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;wsdl:port name="HelloWorldService" binding="tns:HelloWorldSOAP"&amp;gt;           &amp;lt;soap:address location="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://localhost:8080/HelloWorldWeb/helloWorld"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://localhost:8080/HelloWorldWeb/helloWorld&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;" /&amp;gt;     &amp;lt;/wsdl:port&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/wsdl:service&amp;gt;&amp;lt;/wsdl:definitions&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;Save the file above as "HelloWorld.wsdl" (into "/projects/helloworld").&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;&lt;strong&gt;Wiring up Maven Infrastructure&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Now we need to create the necessary Java projects with Maven.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Start by entering following commands in the command prompt (from the dir &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld&lt;/span&gt;) (Press enter and type in "Y" for the questions that pops up):&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mvn archetype:generate \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-DarchetypeArtifactId=maven-archetype-quickstart \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-DgroupId=org.mycompany \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-DartifactId=hw-ear&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;and&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mvn archetype:generate \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-DarchetypeArtifactId=maven-archetype-webapp \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-DgroupId=org.mycompany \&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-DartifactId=hw-web&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;The commands above will create two directories: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-ear&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-web&lt;/span&gt;. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;In each respective directory you will find a pom.xml file. We need to do some alterations in those files. For each of the POM files created we must add a "parent reference" -&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;open the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-ear/pom.xml&lt;/span&gt; and make it look like this:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;project&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns:xsi="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xsi:schemaLocation="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/maven-v4_0_0.xsd%22&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/maven-v4_0_0.xsd"&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;modelVersion&amp;gt;4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-main&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-ear&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;packaging&amp;gt;ear&amp;lt;/packaging&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;name&amp;gt;hw-ear&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Now open &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-web/pom.xml&lt;/span&gt; and make it look like this:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;project&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns:xsi="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xsi:schemaLocation="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/maven-v4_0_0.xsd%22&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/maven-v4_0_0.xsd"&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-main&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-web&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;name&amp;gt;hw-web&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;finalName&amp;gt;hw-web&amp;lt;/finalName&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;inherited&amp;gt;true&amp;lt;/inherited&amp;gt;                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;source&amp;gt;1.5&amp;lt;/source&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span &gt;Now you need to create a "parent POM" file. Add a file called &lt;span class="Apple-style-span" style="font-style: italic;"&gt;pom.xml&lt;/span&gt; to the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld&lt;/span&gt; directory with the following content:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&amp;lt;project  xmlns="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"    xmlns:xsi="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"   xsi:schemaLocation="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://maven.apache.org/maven-v4_0_0.xsd%22&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://maven.apache.org/maven-v4_0_0.xsd"&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;      &amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-main&amp;lt;/artifactId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;name&amp;gt;hw-main&amp;lt;/name&amp;gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;!-- Modules used by this POM --&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;modules&amp;gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;module&amp;gt;hw-ear&amp;lt;/module&amp;gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;module&amp;gt;hw-web&amp;lt;/module&amp;gt;      &amp;lt;/modules&amp;gt;&lt;br /&gt; &amp;lt;!-- Dependent JAR files --&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependencyManagement&amp;gt;     &amp;lt;dependencies&amp;gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;                         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;                         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-web&amp;lt;/artifactId&amp;gt;                         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;                             &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;4.5&amp;lt;/version&amp;gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependencies&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependencyManagement&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Run the command &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mvn test&lt;/span&gt; in the command window. Somewhere in the trace it should say &lt;span class="Apple-style-span" style="font-style: italic;"&gt;BUILD SUCCESSFUL&lt;/span&gt; to indicate just that, i.e. success.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Integrating Eclipse into the Equation&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Type &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mvn eclipse:eclipse&lt;/span&gt; (or &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mvn eclipse:rad&lt;/span&gt; if you are unlucky enough to use RAD).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;This will generate the necessary project files for Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Now we need to import the created projects into Eclipse.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Start Eclipse (this example is using v3.3.2).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;File-&amp;gt;Import...Select "Existing Projects into Workspace" and click "Next &amp;gt;"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;In the "Select root directory:" you browse to the folder &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld&lt;/span&gt; and click "OK"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Select both projects &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-ear&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-web&lt;/span&gt; and click "Finish"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;If you get a build error this is due to the fact the the M2_REPO variable is not properly set:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Window-&amp;gt;Preferences...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Select Java-&amp;gt;Build Path-&amp;gt;Classpath Variables&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Click "New..." and click "Folder..."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Enter the name "M2_REPO"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Select your Maven home directory &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/&amp;lt;user&amp;gt;/.m2/repository&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Click "OK" two times and "Yes" when prompted if you want to rebuild the projects&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Now you can build the project from both Eclipse and Maven (at the command prompt).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Amending the pom.xml files to build an EAR project&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;In order for Maven to be able to build a proper EAR project we need to adjust the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld/hw-ear/pom.xml&lt;/span&gt; accordingly (add this below the line &amp;lt;url&amp;gt;...&amp;lt;/url&amp;gt;):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependencies&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-web&amp;lt;/artifactId&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;build&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;defaultGoal&amp;gt;ear:ear&amp;lt;/defaultGoal&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;pluginManagement&amp;gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;plugins&amp;gt;             &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;plugin&amp;gt;                   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;                   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;maven-ear-plugin&amp;lt;/artifactId&amp;gt;                   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;                   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;configuration&amp;gt;                     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;modules&amp;gt;                          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;webModule id="hw-web"&amp;gt;                             &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.mycompany&amp;lt;/groupId&amp;gt;                             &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;hw-web&amp;lt;/artifactId&amp;gt;                             &amp;lt;contextRoot&amp;gt;helloworldweb&amp;lt;/contextRoot&amp;gt;                         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/webModule&amp;gt;                     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/modules&amp;gt;                 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/configuration&amp;gt;             &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/plugin&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/plugins&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/pluginManagement&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;The section above will make Maven create a EAR package including the WAR package when executing the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mvn install&lt;/span&gt; command. Try it out, why don't ya? :-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Finally, some Spring-WS stuff&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Making Spring-WS integrate with the setup above is not a big deal.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Open up the file &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld/hw-web/src/main/webapp/WEB-INF/web.xml&lt;/span&gt; and amend it accordingly:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;web-app id="ISB-PME-Web" version="2.4"     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;xmlns="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://java.sun.com/xml/ns/j2ee"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://java.sun.com/xml/ns/j2ee&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"     xmlns:xsi="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"     xsi:schemaLocation="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://java.sun.com/xml/ns/j2ee"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://java.sun.com/xml/ns/j2ee&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd%22&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;display-name&amp;gt;Hello World&amp;lt;/display-name&amp;gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;servlet&amp;gt;        &amp;lt;servlet-name&amp;gt;hwServlet&amp;lt;/servlet-name&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;servletclass&amp;gt;org.springframework.ws.transport.http.MessageDispatcherServlet&amp;lt;/servlet-class&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/servlet&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;servlet-mapping&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;servlet-name&amp;gt;hwServlet&amp;lt;/servlet-name&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;Run &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mvn install&lt;/span&gt; from the top directory, i.e. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Deploying the application to Tomcat&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Goto your Tomcat installation (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;/usr/local/tomcat/tomcat6018&lt;/span&gt;) and open the bin catalogue.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Type in the command &lt;span class="Apple-style-span" style="font-style: italic;"&gt;catalina run&lt;/span&gt; to start up Catalina (i.e. the servlet container of Tomcat).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;All you have to do to deploy is to copy the WAR file into a directory:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;cp /&amp;lt;user&amp;gt;/.m2/repository/com/mycompany/hw-web/1.0-SNAPSHOT/hw-web.war /usr/local/tomcat/tomcat6018/webapps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Some sort of trace should be outputted in the command window of Catalina similar to &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;INFO: Deploying web application archive hw-web-1.0-SNAPSHOT.war&lt;/span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;Note that if you intend to deploy on an application server, e.g. WebSphere, you will need to deploy the EAR file instead of the WAR file.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Invoking the web service&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;For now we will use a web browser to invoke the web application. Open one and type in &lt;/span&gt;&lt;a href="http://localhost:8080/hw-web-1.0-SNAPSHOT"&gt;&lt;span &gt;http://localhost:8080/hw-web-1.0-SNAPSHOT&lt;/span&gt;&lt;/a&gt;&lt;span &gt; and it will say Servlet hwServlet is not available.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;What does this mean? &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;It means that the class &lt;span class="Apple-style-span" style="font-style: italic;"&gt;org.springframework.ws.transport.http.MessageDispatcherServlet&lt;/span&gt; is not available in the classloader.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;Why not? &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Because the JAR package that it is included in (and dependencies to that JAR package) is not a part of the WAR package.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;How do we make it part of the WAR package?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;By adding it to the pom.xml files used by Maven! Open up &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld/hw-web/pom.xml &lt;/span&gt;and add the following dependencies:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;depedencies&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;org.springframework.ws&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;spring-ws-core&amp;lt;/artifactId&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;javax.xml.soap&amp;lt;/groupId&amp;gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;saaj-api&amp;lt;/artifactId&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.sun.xml.messaging.saaj&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;saaj-impl&amp;lt;/artifactId&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;javax.activation&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;activation&amp;lt;/artifactId&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;And you need to make the same adjustment (with version information) in the file &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld/pom.xml&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;depedencies&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;org.springframework.ws&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;spring-ws-core&amp;lt;/artifactId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;verision&amp;gt;1.5.4&amp;lt;/version&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;javax.xml.soap&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;saaj-api&amp;lt;/artifactId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;com.sun.xml.messaging.saaj&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;saaj-impl&amp;lt;/artifactId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;dependency&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;groupId&amp;gt;javax.activation&amp;lt;/groupId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;artifactId&amp;gt;activation&amp;lt;/artifactId&amp;gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;Build the project once more (by running the command &lt;span class="Apple-style-span" style="font-style: italic;"&gt;mvn install&lt;/span&gt; in &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld&lt;/span&gt;).&lt;br /&gt;Copy the WAR package into the Tomcat webapps folder.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Invoke the web server &lt;/span&gt;&lt;a href="http://localhost:8080/hw-web-1.0-SNAPSHOT"&gt;&lt;span &gt;http://localhost:8080/hw-web-1.0-SNAPSHOT&lt;/span&gt;&lt;/a&gt;&lt;span &gt;. Have a look in the Tomcat command window. It should say something like: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/hwServlet-servlet.xml]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;What this mean?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;It means that Spring-WS is expecting a XML file containing the Spring configuration stuff. The name pattern of the file is always &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&amp;lt;servlet_name&amp;gt;-servlet.xml&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;So let's get on with adding some Spring configuration shall we!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Spring-WS Configuration&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Open up Eclipse and browse (in the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hw-web&lt;/span&gt; project) to the folder &lt;span class="Apple-style-span" style="font-style: italic;"&gt;src/main/webapp/WEB-INF&lt;/span&gt;. Create a file called &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hwServlet-servlet.xml&lt;/span&gt; in this folder. Add the following content to this file:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;beans   xmlns="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.springframework.org/schema/beans"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.springframework.org/schema/beans&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"   xmlns:xsi="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"    xsi:schemaLocation="&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.springframework.org/schema/beans"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.springframework.org/schema/beans&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd%22&amp;amp;gt"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&amp;amp;gt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;  &lt;br /&gt; &amp;lt;bean id="HelloWorldServiceDefinition"      class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition"&amp;gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;constructor-arg value="WEB-INF/wsdl/HelloWorld.wsdl" /&amp;gt;    &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;In order to have the code above execute without any problems we must add a folder and a file to our project. Add a folder &lt;span class="Apple-style-span" style="font-style: italic;"&gt;wsdl&lt;/span&gt; in the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;WEB-INF&lt;/span&gt; folder and copy the WSDL file &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/projects/helloworld/HelloWorld.wsdl&lt;/span&gt; we built above into this created folder.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;We must also add an endpoint implementation for Spring to invoke.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;Create a new Java class in package &lt;span class="Apple-style-span" style="font-style: italic;"&gt;com.mycompany.ws.endpoint&lt;/span&gt; named &lt;span class="Apple-style-span" style="font-style: italic;"&gt;HelloWorldEndpoint&lt;/span&gt; and add the following code:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;package com.mycompany.ws.endpoint;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import org.springframework.ws.server.endpoint.AbstractDomPayloadEndpoint;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import org.w3c.dom.Document;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;import org.w3c.dom.Element;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class HelloWorldEndpoint extends AbstractDomPayloadEndpoint {    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;@Override    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;protected Element invokeInternal(Element arg0, Document arg1) throws Exception {     System.out.println("*** IN ENDPOINT ***");        &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return null;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span &gt;After a rebuild of everything and a deploy into Tomcat we should now be able to invoke the web service.&lt;/span&gt;&lt;/div&gt;&lt;span &gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;Now it's time for SoapUI&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Fire up SoapUI. Create a new project (File-&amp;gt;New WSDL Project). Enter HelloWorld as project name and click "OK". "Right click" on the newly created project and select "Add WSDL from file". Browse to the WSDL file &lt;span class="Apple-style-span" style="font-style: italic;"&gt;HelloWorld.wsdl&lt;/span&gt; and click "OK".&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;span &gt;&lt;br /&gt;SoapUI will automatically generate a sample request; open it (HelloWorldSOAP -&amp;gt; helloWorld -&amp;gt; request1). Change the address in the address bar to say &lt;/span&gt;&lt;a href="http://localhost:8080/hw-web-1.0-SNAPSHOT/helloWorld"&gt;&lt;span &gt;http://localhost:8080/hw-web-1.0-SNAPSHOT/helloWorld&lt;/span&gt;&lt;/a&gt;&lt;span &gt; and press "play" (the green button) to invoke the web service.&lt;/span&gt;&lt;/div&gt;&lt;span &gt;&lt;div&gt;&lt;br /&gt;You will get no response message (since we have not implemented one yet), but there should be a trace saying &lt;span class="Apple-style-span" style="font-style: italic;"&gt;*** IN ENDPOINT ***&lt;/span&gt; in the Tomcat log. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;That's it for this session!&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;span &gt;In the next part we will look at setting up interceptors and other fun stuff with Spring-WS.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6916738345976103957?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6916738345976103957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6916738345976103957&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6916738345976103957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6916738345976103957'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/10/web-services-spring-ws-and-maven-part-2.html' title='Web Services, Spring-WS, and Maven - Part 2'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6119628938322713018</id><published>2008-10-16T15:42:00.007+02:00</published><updated>2008-10-16T20:47:54.527+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring-WS'/><title type='text'>Web Services, Spring-WS, and Maven - Part 1</title><content type='html'>&lt;div&gt;Over the next coming weeks I will discuss web services, Spring-WS, Maven, and other stuff I have been working with for the last couple of months.&lt;br /&gt;&lt;br /&gt;The posts will contain web service design in general and more technical posts in a "how-to" style.&lt;br /&gt;&lt;br /&gt;In order to follow the how-tos and guidelines you need to set up some needed software/tools. In this post we will go through how to install &lt;strong&gt;&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;&lt;/strong&gt; and hook it up with &lt;a style="font-weight: bold;" href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So here it goes - howto install Maven:&lt;br /&gt;&lt;br /&gt;1. First you must download Maven (v2.0.9) which can be done from here:&lt;span style="font-size:85%;"&gt;&lt;a href="http://maven.apache.org/download.html"&gt; http://maven.apache.org/download.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. Install it to a folder of your choice (e.g. &lt;span style="font-size:85%;"&gt;/usr/local/apache/maven/maven-2.0.9&lt;/span&gt;).&lt;br /&gt;You can find the installation instructions here: &lt;span style="font-size:85%;"&gt;&lt;a href="http://maven.apache.org/download.html"&gt;http://maven.apache.org/download.html&lt;/a&gt;&lt;/span&gt; (@ bottom of the page)&lt;br /&gt;&lt;br /&gt;3. If you're behind a proxy server you must add some additional information. Add the a file named "settings.xml" to the folder: &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: verdana;"&gt;/users/&amp;lt;your_login_name&amp;gt;/&lt;/span&gt;&lt;/span&gt;&lt;your&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: verdana;"&gt;.m2&lt;/span&gt;&lt;/span&gt; (If you don't have any .m2 folder you can run the command "mvn" to create it).&lt;br /&gt;The content of the file should be:&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;settings&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;proxies&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;proxy&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;protocol&amp;gt;http&amp;lt;/protocol&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;host&amp;gt;&lt;em&gt;ip_to_your_proxy_server&lt;/em&gt;&amp;lt;/host&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;port&amp;gt;&lt;em&gt;port&lt;/em&gt;&amp;lt;/port&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;username&amp;gt;&amp;lt;/username&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;password&amp;gt;&amp;lt;/password&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;nonProxyHosts&amp;gt;locahost&amp;lt;/nonProxyHosts&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;/proxy&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;/proxies&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&amp;lt;/settings&amp;gt;&lt;settings&gt;&lt;/settings&gt;&lt;/span&gt; &lt;/your&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;4. Now you're up and running with Maven2. Open a command prompt and type "mvn --version" which should give you somehthing like:Maven version: 2.0.9Java version: 1.5.0_15OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"&lt;br /&gt;&lt;br /&gt;5. In order to make Maven and Eclipse work fine together I suggest that you add a classpath variable named "M2_REPO" pointing to your local repository:&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;a. Open RAD/Eclipse &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;b. Window-&gt;Preferences...-&gt;Java-&gt;Build Path-&gt;Classpath Variables &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;c. Click "New..."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;d. Set name as "M2_REPO" and folder as "C:\Documents and Settings\&lt;your&gt;\.m2\repository"&lt;/your&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;e. Click OK 2 times&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;6. Now you're ready to start working with Maven and Eclipse. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6119628938322713018?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6119628938322713018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6119628938322713018&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6119628938322713018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6119628938322713018'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/10/web-services-spring-ws-and-maven-part-1.html' title='Web Services, Spring-WS, and Maven - Part 1'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-8421774449681538015</id><published>2008-07-08T13:34:00.006+02:00</published><updated>2008-07-09T09:14:32.268+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubiquitous language'/><title type='text'>The question of to code in Swedish or not?</title><content type='html'>There is an ongoing debate at work whether or not to code in the same language as the company/business you are operating in/working for.&lt;br /&gt;&lt;br /&gt;A very astute colleague of mine (Joakim Sundén) has &lt;a href="http://blogg.joakimsunden.se/2008/06/du-kodar-vl-p-svenska.html"&gt;blogged&lt;/a&gt;[Swedish only] about the reasons for choosing Swedish as language if you are working for a Swedish company.Since his blog is in Swedish (he operates and lives in Sweden) I will translate some of the arguments and then rebut them with, what I think, good arguments. All translations are marked with quote signs, i.e. "".&lt;br /&gt;&lt;br /&gt;Whenever the the word Swedish is used you should, of course, use your corresponding native language. Us Swedes are not looking for world domination, it is not what this discussion is about :-)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument 1: Ubiquitous Language&lt;/strong&gt;&lt;br /&gt;"Eric Evans is one of the persons who have best formulated the need of a "ubiquitous language", a common language ... The terminology used in daily discussions is disconnected with the terminology in the code ... To minimize problems like this one should use the domain model as a base for a common language and to get the team to use this language coherently in all communication within the team and in the code."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rebuttal 1:&lt;/strong&gt;&lt;br /&gt;I totally agree that a common language is a must when communicating with whomever it might be inside a company. But it is to simplify the problems by using the argument that if we speak the same natural language we are saying, and meaning, the same thing. Instead the terminology used is highly context sensitive. The term "customer" for example is two orthogonal things when you speak with the retail and the investment section within the bank. Therefore you have to define what you mean with "customer" and to be able to explain this to the listener.&lt;br /&gt;My argument is that, since you need a definition of what you intend with a domain entity, there is no problem if you translate this definition to English inside your code as long as you have a static translation into whatever language the domain experts are speaking.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument 2: Arguments why to use Swedish&lt;/strong&gt;&lt;br /&gt;"If we aim to get a common language that permeats everything from code to conversations in a Swedish company where the domain experts are speaking Swedish it should be common sense to use Swedish in the code? We do not want to force the domain experts into using English, do we?"&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rebuttal 2: &lt;/strong&gt;&lt;br /&gt;The domain experts should not be bothered with the code. Most of the domain experts I have met do not have the competence to read my code and understand the purpose of it - and no, I don't think it's because I coded in English instead of Swedish.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument 3: Arguments why to use Swedish continued&lt;/strong&gt;&lt;br /&gt;Joakim writes about his own experiences from the insurance domain. He finds it difficult to understand the terminology used, let alone translate these words into English. "It was invaluable to use the same terminology in the code and domain expressions when discussing business rules with the domain experts."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rebuttal 3: &lt;/strong&gt;&lt;br /&gt;I don't understand the problem of using a corresponding term in another language. If something is called X when discussing it with the domain expert and this is translated into Y in the code all we have to do is to create a map (read dictionary) that says X = Y. It is important to point out that the terms X and Y is a good example since for a developer with no domain expertize the terminology used, regardless of language, will be interpreted and carry the same meaning as X and Y. You have to learn the domain language from scratch and to do this you have to create a corresponding dictionary! Is is an easy task to translate a term X in one language into Y in another language. If you do this then you end up with: X = Y and a corresponding meaning (i.e. how this should be interpreted).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument 4: "YAGNI: Taking outsourcing, offshoring, and mergers/acquisitions into account" &lt;/strong&gt;&lt;br /&gt;"There are some good arguments for using English (see above), but these reasons are only relevant for a minority of the development projects in Sweden."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rebuttal 4:&lt;/strong&gt;&lt;br /&gt;Globalization is a fact that cannot be neglected. I argue that if you work for a medium/large sized company situated in Sweden you shall never code in Swedish just because of the reasons above (outsouring, offshoring, mergers/acquisitions, etc.). Before you know it you will have a forreign owner! There are to many examples to be bothered to count all of them but I will give you some relevant ones: OMX -&gt; Nasdaq, Volvo -&gt; Ford, JRockit -&gt; BEA, Avega -&gt; IBM (joke!). These examples are just a selection of all of them.&lt;br /&gt;I will argue that coding in another language then English will in fact lower the value of the company!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument 5: "YAGNI continued"&lt;/strong&gt;&lt;br /&gt;"I most cases you have to assess the possibility of outsourcing to another country against the additional cost of aggravate the common language."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rebuttal 5:&lt;/strong&gt;&lt;br /&gt;I don't agree with that there is an aggravation of a common language by using English in the code. I do, however, as stated above, agree with that it is important to use a common vocabulary. But as previously explained it is not enough to lean back and think that the same natural language serves as a silver bullet for this.&lt;br /&gt;Also, are there any studies that proves that using the same natural language improves productivity and, hence, lowers the development costs?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Argument 6:&lt;/strong&gt;&lt;br /&gt;"If you have developed code in Swedish for a while you find it natural - a matter of habit. I have met developers that have programmed in Swedish and they think it is incomprehensible that there are developers that translates the Swedish domain expressions into English in their code."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rebuttal 6:&lt;/strong&gt;&lt;br /&gt;Just because there are some developers that think something doesn't make it right. I have worked in Finland with code written in Finnish (and I don't speak Finnish). This didn't exactly improve my productivity! I am sure that the developers that created the original code never thought that their company would one day end up in a Swedish ownership - and that some Swedish consultants would end up in their hall telling them what to do and, mostly, what not to do!&lt;br /&gt;&lt;br /&gt;I am sure that there are some rare cases when one could argue that Swedish code is better than English, but as a default I will always argue to use English as the "coding language".&lt;br /&gt;My rebuttals above also serves as arguments for why not to code in Swedish. I am sure that there are several more of them. Please join the discussion and let me know what you think! If you write your comments in English it will be easier for the English speaking population to follow (pun intended) :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-8421774449681538015?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/8421774449681538015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=8421774449681538015&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8421774449681538015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8421774449681538015'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/07/question-of-to-code-in-swedish-or-not.html' title='The question of to code in Swedish&lt;replace with your native language&gt; or not?'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-1589856309709723392</id><published>2008-06-04T00:11:00.006+02:00</published><updated>2008-06-04T00:47:03.741+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='the future of programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='Joe Armstrong'/><title type='text'>This is an absolute must-see for everyone interested in programming!!!</title><content type='html'>Mind blowing really :-)&lt;br /&gt;But I have blogged (warned you) about Erlang before.&lt;br /&gt;Us Swedes should be proud that this language has been invented in our country :-)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/erlang-software-for-a-concurrent-world"&gt;http://www.infoq.com/presentations/erlang-software-for-a-concurrent-world&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-1589856309709723392?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/1589856309709723392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=1589856309709723392&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1589856309709723392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1589856309709723392'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/06/this-is-absolute-must-see-for-everyone.html' title='This is an absolute must-see for everyone interested in programming!!!'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-8699749313291657522</id><published>2008-06-03T10:47:00.006+02:00</published><updated>2008-06-05T21:59:20.662+02:00</updated><title type='text'>Building a betting site in ActionScript/Spring/DB4O (part 1)</title><content type='html'>&lt;span style="font-weight: bold;font-family:verdana;font-size:100%;"  &gt;BACKGROUND&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Every year there is a major football tournament I build a betting site for my friends and relatives. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;The last time (World Cup in 2006) we where 110 punters and that year the implementation was made in Ruby on Rails.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Here's a recap of the platforms/tools I have used throughout the years:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;2000 (European Cup): Struts + EJB1.1 + WebLogic + MS SQL Server&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;2002 (World Cup): Struts + EJB2 + WebLogic + MySql&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;2004 (European Cup): ASP.Net + IIS + MS SQL Server&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;2006 (World Cup): Ruby on Rails + MySql&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;2008 (European Cup): Flex/ActionScript + Spring + DB4O&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;In this series of learnings I will write about my findings from working with Flex/ActionScript and DB4O. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;These are the new tools (i.e. unused by me) that I want to share with this community.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:100%;"  &gt;THE APPLICATION IN A FEW WORDS&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Punters (betters for you who are not in the betting business) register on the site with a nick name and an e-mail address.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;An e-mail is sent to them with a temporary password. They surf to the site, log on with their credentials, and start to bet.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; Betting is done in two ways:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;All group stage matches with score for each team, i.e. Spain-Sweden 1-3&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Teams to make it for finals (quarter, semi, final, champions) are selected.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;For the right result in a group stage match (with correct score) 2 points is given.&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; If the score is incorrect but the right team (1/X/2) is chosen that is 1 point. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;A QF team gives 2 points, SF team 3p, F team 4p, and Champions 5p. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;The maximum points a punter can get is 89 points but none of my friends are that good :-)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:100%;"  &gt;DOMAIN MODEL&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;The domain model is quite simple. I will try to descibe it with words rather than an UML digram. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Below you can see the classes and their main attributes.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;font-family:verdana;font-size:100%;"  &gt;Group&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; [name:String]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;font-family:verdana;font-size:100%;"  &gt;Team&lt;/span&gt;&lt;span style="font-size:100%;"&gt; [&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;name:String, &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;group:Group]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;&lt;span style="font-style: italic;"&gt;Punter&lt;/span&gt; [&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;name:String,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; nick:String&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;, email:String&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;, groupStageMatches:MatchBet[]&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;, qfTeams:Team[],&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; sfTeams:Team[],&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; fTeams:Team[],&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; champions:Team]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;&lt;span style="font-style: italic;"&gt;MatchBet&lt;/span&gt; [&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;homeTeamScore:int,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; awayTeamScore:int&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;, match:Match]&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;font-family:verdana;font-size:100%;"  &gt;Match &lt;/span&gt;&lt;span style="font-size:100%;"&gt;[&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;homeTeam:Team,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; homeTeamResult:int,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; awayTeam:Team,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; awayTeamResult:int,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; location:String,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; date:Date,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; isPlayed:boolean]&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;There are a couple of more classes but their purposes is just to add functionality to the site. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;The main classes involved in betting are the ones described above.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:100%;"  &gt;GETTING STARTED&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;In this section I will describe how to set up the development environment. &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;You need to download the following (if you want to make the installation on your computer):&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:verdana;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email"&gt;FlexBuilder 3.0&lt;/a&gt;&lt;a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS"&gt;BlazeDS Turnkey&lt;/a&gt;&lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.eclipse.org/downloads/"&gt;Eclipse 3.3/3.4&lt;/a&gt;&lt;a href="http://www.eclipse.org/downloads/" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.springframework.org/download"&gt;Spring 2.5.4&lt;/a&gt;&lt;a href="http://www.springframework.org/download" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://developer.db4o.com/files/"&gt;DB4O 7.2&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Install the software above by following the instructions accordingly.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="Ih2E3d"  style="font-family:verdana;"&gt;&lt;span style="font-size:100%;"&gt; Okay, so let's get started with the nitty gritty details.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:100%;"  &gt;FLEX IN A NUTSHELL&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;I have never coded a line in Flex or ActionScript before this project.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;However, I have been involved in web development projects since 1999 so I have some background knowledge.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; My first reflection of using Flex and ActionScript (FA) is that it is very easy.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;If you compare the time to get started between FA and e.g. Struts it is days between them before you get productive!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Eclipse is my favorite IDE and FlexBuilder is based on Eclipse. (You can even download plug-ins to your Eclipse installation instead of FlexBuilder.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt; Anyway, let's concentrate on the code instead of handing out praise to the Flex team :-)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;If you do not have basic knowledge of FA you should have a look here (&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;a style="font-family: verdana;" href="http://learn.adobe.com/wiki/display/Flex/Getting+Started" target="_blank"&gt;http://learn.adobe.com/wiki&lt;wbr&gt;/display/Flex/Getting+Started&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;) before you read on.&lt;br /&gt;&lt;br /&gt;Well, that's about it for now. In the coming blogs I will write about the following:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;SETTING UP CLIENT-SERVER COMMUNICATION&lt;br /&gt;WIRING BLAZE DS SERVLET TO SPRING&lt;br /&gt;SPRING and DB4O ROCKS!&lt;br /&gt;FINAL THOUGHTS&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-8699749313291657522?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/8699749313291657522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=8699749313291657522&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8699749313291657522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8699749313291657522'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/06/building-betting-site-in.html' title='Building a betting site in ActionScript/Spring/DB4O (part 1)'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6500833411755666365</id><published>2008-05-12T17:41:00.002+02:00</published><updated>2008-05-12T17:46:54.818+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='blazeds'/><category scheme='http://www.blogger.com/atom/ns#' term='db40'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Teaser: Flex/ActionScript, Java, Spring, and DB4O</title><content type='html'>I have been busy both at work and with a private project the last couple of weeks. Therefore this space has been really silent. I just wanted to let you know that I will soon post my findings about developing a RIA with Flex/ActionScript, BlazeDS, Tomcat, Spring, and DB4O.&lt;br /&gt;It is very interesting and I am learning a lot (I haven't done any development with either Flex/ActionScript or DB4O until now). Since I already have run into issues regarding lack of documentation (or docs not good enough) regarding development with these tools I will help you with my findings. But that will be in a couple of weeks time. First I need to make sure that my app is up and running. The aim is to deliver a betting tool for all my friends to use during the EuroCup (which starts in approx 3 weeks).&lt;br /&gt;L8R&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6500833411755666365?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6500833411755666365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6500833411755666365&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6500833411755666365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6500833411755666365'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/05/teaser-flexactionscript-java-spring-and.html' title='Teaser: Flex/ActionScript, Java, Spring, and DB4O'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-557513176310279268</id><published>2008-04-01T23:40:00.004+02:00</published><updated>2008-04-01T23:47:30.645+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Date'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaDoc'/><title type='text'>My favorite JavaDoc class</title><content type='html'>It's not always fun to read the JavaDoc you run into. Therefore I feel it's refreshing to read the documentation for the class &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Date.html"&gt;java.util.Date&lt;/a&gt;.&lt;br /&gt;I read it many years ago and I still think it's one of the best out there. (The implementation however is not that great...). Before I read it I didn't have a clue that there was something called leap-seconds. Oh I just wish that the JavaDocs I'm forced to read every now and then would be half as informative about how the world works. If that was the case I would already be grand master in Jeopardy or something...&lt;br /&gt;&lt;br /&gt;What's your favorite JavaDoc class?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-557513176310279268?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/557513176310279268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=557513176310279268&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/557513176310279268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/557513176310279268'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/04/my-favorite-javadoc-class.html' title='My favorite JavaDoc class'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-7029942142183132292</id><published>2008-03-31T17:22:00.005+02:00</published><updated>2008-04-01T08:46:12.422+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Porsche'/><title type='text'>DSL - State of Affairs</title><content type='html'>DSL is a buzzword that you see everywhere nowadays. But what's hidden behind this acronym and what impact will it have (if any) on the daily life as a programmer? In this blog I will dissect the acronym and also add some thoughts of my own.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Definition of DSL (Domain Specific Language)&lt;/span&gt;&lt;br /&gt;I guess that there are as many definitions as there are blogs, but I will use &lt;a href="http://martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;the definition by one of the leading gurus out there: Martin Fowler&lt;/a&gt;(MF). According to MF a DSL is "&lt;span style="font-style: italic;"&gt;a computer   language that's targeted to a particular kind of problem, rather   than a general purpose language that's aimed at any kind of   software problem.&lt;/span&gt;" I like this definition. It is easy to understand and I guess that most people would agree that this is, at least, the core of what constitutes a DSL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The purpose of a DSL?&lt;br /&gt;&lt;/span&gt;I am a bit puzzled about this to be honest. Why would one create a DSL? As far as I can see it would be one, or a combination, of the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Effectiveness (TTM)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Quality of Code&lt;/li&gt;&lt;li&gt;Ease of Maintenance&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Existing DSLs&lt;/span&gt;&lt;br /&gt;Are there any DSLs out there today or is it just a buzzword without any real implementations? No, on the contrary DSLs have been around longer than most of us think! It's just that the name "DSL" has been coined rather newly. I will focus on some DSLs that I have worked with in the web application domain as examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Struts&lt;/li&gt;&lt;li&gt;Spring MVC&lt;/li&gt;&lt;li&gt;Ruby on Rails&lt;/li&gt;&lt;li&gt;Flex&lt;/li&gt;&lt;/ul&gt;As you can see most of us have worked with DSLs before!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Benefits of DSLs?&lt;/span&gt;&lt;br /&gt;I can see several benefits with using DSLs, but at the same time I see a lot of downsides... I would argue that the value of learning a DSL, as a programmer at least, depends on the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Expressiveness: Is the DSL powerful enough to describe and solve the problem in an easy manner?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Commonality: Is it a DSL used in many development shops? If not, then the value of learning it might be minor (depending on if you want to reuse the DSL in other projects).&lt;/li&gt;&lt;/ul&gt;Based on the two items above I'd say that &lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt; is a DSL that fulfills both of them. &lt;a href="http://blog.8thlight.com/articles/2007/05/20/ruby-dls-blocks"&gt;The Starbucks DSL&lt;/a&gt; however does not. The latter is very specific. And being specific, as per definition as DSL should be (see above), is one of the main problems with DSLs as I see it...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Specific vs. Generic Languages&lt;br /&gt;&lt;/span&gt;Let's say we are in the DSL creating business and we want to create a DSL describing car manufacturing.  Further on, let's stipulate we are developers situated in Stuttgart working for Porsche with the &lt;a href="http://en.wikipedia.org/wiki/Porsche_997#Turbo"&gt;911 (997) Turbo&lt;/a&gt;. Also, we are not responsible for the whole car but the gear box. Now let's go about creating a DSL that is specific for the gear box of a Porsche 911 (997) Turbo. 1-2-3 done!&lt;br /&gt;&lt;br /&gt;The result is a DSL describing the specific problem domain with terminology (nomenclature) known to all engineers in Zuffenhausen (the HQ of Porsche in Stuttgart)  --&gt; &lt;span style="font-style: italic;"&gt;Expressiveness&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;But as a developer you also think about reuse, don't you? So perhaps we would like to create a DSL that is applicable for all gear box manufacturing in Germany (Mercedes, BMW, Audi, VW, ...). Or even more generic; let's try to create one that is usable throughout the globe. The problem with creating a generic DSL for all gear box manufacturing is for all involved parties to agree on the terminology.&lt;br /&gt;&lt;br /&gt;Bringing the example of gear box manufacturing into the programming language domain we can translate gear box to O/R mapping for example. Rather than each project involved in O/R mapping developing their own DSL for the problem, we aim to reuse an already existing one (e.g. Hibernate or iBatis) and not invent the wheel once again --&gt; &lt;span style="font-style: italic;"&gt;Commonality&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The future of DSLs...&lt;br /&gt;&lt;/span&gt;...looks bright :-)&lt;br /&gt;There is already a hype surrounding DSLs today, and I don't expect this to go away anytime soon. It's just that I question the hype a bit. It's not something brand new on the block and, according to me, we should not try to invent a new DSL for every problem we run into! Reuse is good. Let's try to streamline and improve the existing DSLs so that we get effectiveness and commonality. This is one way forward, and it is the path I will walk (or ride in my Porsche 911 Turbo...) ;-)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-7029942142183132292?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/7029942142183132292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=7029942142183132292&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7029942142183132292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7029942142183132292'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/03/dsl-state-of-affairs.html' title='DSL - State of Affairs'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5564677649511825185</id><published>2008-03-25T18:30:00.004+01:00</published><updated>2008-03-25T22:47:38.514+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Concurrency'/><category scheme='http://www.blogger.com/atom/ns#' term='java7'/><category scheme='http://www.blogger.com/atom/ns#' term='many-core processors'/><category scheme='http://www.blogger.com/atom/ns#' term='the future of programming'/><title type='text'>The concurrency support in Java7 is not enough</title><content type='html'>I am very interested in how today's programming languages will tackle the many-core hardware trend that is going to continue to grow. In a couple of years time it's not difficult to foresee processors with up to 1000 cores or more. My personal feeling is that we need new languages to support this new hardware, but of course the current big ones (Java, C#, VB.Net) will try to add on features to handle many-cores.&lt;br /&gt;&lt;br /&gt;In the Java programming language it is easy to see the evolution of the language:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1995: Support for threads built into the language (Thread, synchronized, volatile)&lt;/li&gt;&lt;li&gt;Java5: Included java.util.concurrent (which adds a lot of nice to have classes when doing Thread programming)&lt;/li&gt;&lt;li&gt;Java7:  Talk about introducing  frameworks supporting further multi-core  usage&lt;/li&gt;&lt;/ul&gt;My main concern for Java7 is that it might not be enough to cover the new ballpark being brought forward by the many-core hardware. What do I base this fear on then?&lt;br /&gt;&lt;br /&gt;Well first and foremost I think that the new programming languages must have support to handle many-cores built into the language rather than adding these important features as APIs later on.&lt;br /&gt;&lt;br /&gt;Another issue is that the new features in Java7 (e.g. fork-join framework) aims to solve problems that are a minute part of the overall problem. Let me give you an example taken from the article &lt;a href="http://www.ibm.com/developerworks/java/library/j-jtp11137.html"&gt;"Java theory and practice: Stick a fork in it, Part 1"&lt;/a&gt;. In this well written article the fork-join framework is introduced to the reader and it is a very handy tool when used for the right problem. And this is the springing point: &lt;span style="font-style: italic;"&gt;"When used for the right problem".&lt;/span&gt; In this case that is sorting. But let's not get into sorting with fork-join rather address the real problem: I/O.&lt;br /&gt;&lt;br /&gt;In the article mentioned above the author (Brian Goetz) writes the following "Server applications normally run many more threads than there are processors available. The reason is because in most server applications, the processing of a request includes a fair amount of I/O which does not require very much of the processor" ... "As processor counts increse there may not be enough concurrent requests to keep the processors busy.".&lt;br /&gt;From there on the article describes how to divide the parts that can be divided (sorting etc.) into sub-problems and solve them all in parallel.&lt;br /&gt;&lt;br /&gt;I'd like to focus on the second quoted sentence above though. What Brian writes is basically that unless we solve the real problems (I/O) then there will be no way to keep our many-cores busy.&lt;br /&gt;&lt;br /&gt;This means that there will be idle computer power but it will be impossible to improve the speed of the programs! What CTO will be comfortable with this? What architect would want to go into the board room explaining why the CPUs are more or less idle but it's not possible to handle the peak hour requests?&lt;br /&gt;&lt;br /&gt;When this happens, and trust me it will happen sooner than we think, it will open up the ballpark to new languages. There has been a lot of buzz around Erlang the last 1.5 years, and there are good reasons for it. Just check out this &lt;a href="http://www.sics.se/%7Ejoe/apachevsyaws.html"&gt;comparison&lt;/a&gt; between Tomcat and Yaws (an Erlang based web server).  I don't think Erlang will ever be a contender to Java in terms of popularity or usage, but perhaps other languages similar to Erlang will.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is a programming language gaining momentum within the Java community. This language incorporates both functional and object oriented features. It could serve as bridge between the two camps and work as an eye-opener for all those hard-core-Java-will-prevail-and-survive-anything coders :-)&lt;br /&gt;&lt;br /&gt;Only future will tell what languages we'll be coding in when many-core platforms are here. No one can be sure for certain, but I'd put my 2c on that Java (and C# for that matter) will struggle keeping the same attention from the IT community in a couple of years time.&lt;br /&gt;&lt;br /&gt;What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5564677649511825185?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5564677649511825185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5564677649511825185&amp;isPopup=true' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5564677649511825185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5564677649511825185'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/03/concurrency-support-in-java7-is-not.html' title='The concurrency support in Java7 is not enough'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-2682232896468587248</id><published>2008-03-17T18:00:00.003+01:00</published><updated>2008-03-17T18:55:52.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jobserve'/><category scheme='http://www.blogger.com/atom/ns#' term='trends'/><title type='text'>This month's trends in the SW industry</title><content type='html'>Every now and then I play around with www.jobserve.com to see what contracts are out there and to make sure that I am within the circle where things are happening. It is sooooo easy to become passé in this line of work.&lt;br /&gt;&lt;br /&gt;So how are the demands of the new trends and frameworks this month? Here's a completely unscientific survey. I will start with the most obvious keywords like Java, .Net a.s.o. But I will also check how the emerging(?) tools and frameworks are doing. (The search options are contracts or permanent positions posted within 7 days).&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java: 3406&lt;/li&gt;&lt;li&gt;.net: 4478&lt;/li&gt;&lt;li&gt;Spring: 515&lt;/li&gt;&lt;li&gt;Hibernate: 458&lt;/li&gt;&lt;li&gt;EJB: 218&lt;/li&gt;&lt;li&gt;EJB3: 15&lt;/li&gt;&lt;li&gt;"EJB 3": 6&lt;/li&gt;&lt;li&gt;SOA: 482&lt;/li&gt;&lt;li&gt;Agile: 922&lt;/li&gt;&lt;li&gt;Scrum: 211&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So let's do the more "exotic" and/or emerging tools now:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ruby: 115&lt;/li&gt;&lt;li&gt;Rails: 68&lt;/li&gt;&lt;li&gt;JRuby: 1&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Silverlight: 37&lt;/li&gt;&lt;li&gt;Flex: 111&lt;/li&gt;&lt;li&gt;JSF: 76&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Linq: 14&lt;/li&gt;&lt;li&gt;Scala and Lift: 0&lt;/li&gt;&lt;li&gt;Terracotta: 38&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So it seems that .net won the competition this month!&lt;br /&gt;&lt;br /&gt;It would be interesting to do a similar search based on the pay.&lt;br /&gt;The highest paying job I'm able to find @ jobserve.com right now pays £900 for a "Specialist C# Developer" or £950 for a "API Developer Investment Bank London E-Speed BrokerTec Java C++". I could live with that :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-2682232896468587248?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/2682232896468587248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=2682232896468587248&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/2682232896468587248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/2682232896468587248'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/03/this-months-trends-in-sw-industry.html' title='This month&apos;s trends in the SW industry'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-353941376688694551</id><published>2008-01-15T13:06:00.001+01:00</published><updated>2008-01-15T13:21:18.465+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='locking'/><category scheme='http://www.blogger.com/atom/ns#' term='minimize'/><title type='text'>Transformation Windows -&gt; OSX: Final pieces have fallen into place.</title><content type='html'>Basically there have been two major features in Windows that I have missed when moving from Windows to OSX. They have not been missing in OSX, it's just that I did not know how to use them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Item no.1: Minimize all windows (and show desktop).&lt;/span&gt;&lt;br /&gt;There is no, as far as I know, built in functionality in OSX to get this behaviour. Instead you point your web browser here &lt;a href="http://www.everydaysoftware.net/showdesktop/index.html"&gt;Show Desktop&lt;/a&gt;. Download the application and install it.&lt;br /&gt;&lt;br /&gt;Voila! That's it. You now have an application that minimizes all open applications and shows the desktop. I have checked the "Show in Menubar" option so that the icon for Show Desktop is always accessible from whatever "space" I am working in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Item no.2: Locking Screen&lt;/span&gt;&lt;br /&gt;This is just a matter of setting up OSX correctly.&lt;br /&gt;1. Open Keychain Access (Applications-&gt;Utilities-&gt;Keychain Access)&lt;br /&gt;2. Open Preferences (Keychain Access Menu-&gt;Preferences...)&lt;br /&gt;3. Check the option "Show Status in Menubar"&lt;br /&gt;This will add an icon (looking like a lock) to your menubar.&lt;br /&gt;Click on the icon whenever you wish to lock the screen.&lt;br /&gt;&lt;br /&gt;Since both of these features are applications you can also set up key commands for the operations. I have not done this yet, though.&lt;br /&gt;&lt;br /&gt;Best of luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-353941376688694551?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/353941376688694551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=353941376688694551&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/353941376688694551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/353941376688694551'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/01/transformation-windows-osx-final-pieces.html' title='Transformation Windows -&gt; OSX: Final pieces have fallen into place.'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-860184893378535921</id><published>2008-01-14T18:41:00.000+01:00</published><updated>2008-01-14T18:54:42.084+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VM'/><category scheme='http://www.blogger.com/atom/ns#' term='OS'/><title type='text'>The perfect (final) OS installation?</title><content type='html'>The next time I come around to make a re-installation of my computer @ home I will use a new strategy that I have not applied before: VMs.&lt;br /&gt;&lt;br /&gt;A newly installed OS degenerates pretty fast don't you agree? I installed MS Vista @ my machine perhaps 8 months ago with the intention of keeping it "clean". 8 months later I realize that this is not the case... Having a quick look in the programs folder (where I try to install new software) shows that there are 30+ programs installed. And that's not including mandatory MS software!&lt;br /&gt;&lt;br /&gt;The old strategy I used when installing MS OS:es was to partition the HDD into 2 parts; one for the OS itself, and the other one for misc. programs. This was a good one, but it does not stop the OS installation from becoming bogged down with software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enter virtual machines&lt;/span&gt;&lt;br /&gt;The next time I re-install my computer with a MS OS I will use VMs to the maximum.&lt;br /&gt;I will just install the OS directly onto the HDD. Everything else will go into a VM.&lt;br /&gt;This way the OS itself will never get cluttered down.&lt;br /&gt;&lt;br /&gt;Yes, I have know that an alternative would be to install Linux or OSX or similar, but sometimes I need Windows for work related purposes. (BTW: I am a vivid OSX fan, and I own a MacBook that I just love.)&lt;br /&gt;&lt;br /&gt;Just think about having one VM for surfing, one for development, and so on.&lt;br /&gt;This would be very nice.&lt;br /&gt;&lt;br /&gt;The only downside I can see is that it would slow down the performance of the programs running, but my PC is pretty powerful so I do not really mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-860184893378535921?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/860184893378535921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=860184893378535921&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/860184893378535921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/860184893378535921'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/01/perfect-final-os-installation.html' title='The perfect (final) OS installation?'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5553436098660542967</id><published>2008-01-14T15:16:00.000+01:00</published><updated>2008-01-14T15:39:42.836+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web pages'/><category scheme='http://www.blogger.com/atom/ns#' term='rat race'/><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>Inspiration plz!</title><content type='html'>Working as a Java consultant is sometimes a pain in the a**.&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There's simply too much happening! Rest on your knowledge for a year or two and you are more or less obsolete on the market.&lt;br /&gt;Therefore I try to read as much as possible from the net to keep updated. But I feel that my current sources of knowledge are not enough. So I will state a couple of sources for inspiration and perhaps you can give me some back?&lt;br /&gt;&lt;br /&gt;My favorite sources of inspiration are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoq.com"&gt;www.infoq.com&lt;/a&gt; (there is no better, is there?)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javablogs.com"&gt;www.javablogs.com&lt;/a&gt; (the quality is somewhat fluctuating though)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com"&gt;www.theserverside.com&lt;/a&gt; (is not as fun as it used to be)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/"&gt;http://www.ibm.com/developerworks/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Apart from these I try to read as many interesting blogs as possible. Please point me to some more!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5553436098660542967?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5553436098660542967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5553436098660542967&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5553436098660542967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5553436098660542967'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/01/inspiration-plz.html' title='Inspiration plz!'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6044069481265792203</id><published>2008-01-07T10:15:00.000+01:00</published><updated>2008-01-14T18:56:33.585+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VM'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='multi-threading'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>The good thing about Java is not the language</title><content type='html'>The good thing about Java is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; the language, it's the JVM!&lt;br /&gt;&lt;br /&gt;When Sun introduced Java5 a couple of good features where introduced (boxing/unboxing, generics, annotations, ...) but as always the extra features comes with a price. The price according to me is that Java is now a much more difficult language to understand. It is no more practical as the introduction language used in universities (at least not with the full blown features). Any experienced Java developers out there disagreeing with my statement should take a look at the following: &lt;a href="http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html"&gt;Angelika Langer's 427 page FAQ about Java Generics&lt;/a&gt;.&lt;br /&gt;Perhaps that will humble you a bit? :-)&lt;br /&gt;&lt;br /&gt;Besides being a more complex language to use and understand, there is an ongoing trend that experienced leaders in the Java community are looking for alternatives, e.g. Dave Thomas (Java-&gt;Ruby), Martin Fowler (Java-&gt;Everything), etc.&lt;br /&gt;&lt;br /&gt;Personally I feel that Java, at least at the enterprise level, has become to much configuration.  For every new project I join there is at least 2 weeks for setting up the environment, and after that it is all about finding the right XML file! The blessings of Rails "convention over configuration" cannot be praised enough :-) This is something we must incorporate in Java Enterprise. Simplify things to enable "common" developers to get started with projects.&lt;br /&gt;&lt;br /&gt;So many developers are looking for alternatives, and right now there are a couple of contenders out there (C#, Python, Perl, Ruby, ...).&lt;br /&gt;But even if people are leaving Java for other languages I still think Java will play a major role in the future of programming. Although I don't necessarily think it is the programming language of Java that will be the driver of this - it is the JVM.&lt;br /&gt;&lt;br /&gt;The JVM is the best virtual machine out there. It runs on all major platforms and has a very well proven track record. The performance is getting better with every day.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[A small reservation: The advent of multi-core processors will bring new challenges to Java (and similar languages) - the developers must start developing with multi-threading in mind. More on this topic in a later blog.]&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;So even if Java will not continue to be the dominating programming language (&lt;a href="http://www.tiobe.com/tpci.htm"&gt;Programming Language Popularity Index&lt;/a&gt;) I think that the JVM will continue to make an impact on everyday programming for many years still.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6044069481265792203?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6044069481265792203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6044069481265792203&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6044069481265792203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6044069481265792203'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/01/good-thing-about-java-is-not-language.html' title='The good thing about Java is not the language'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-7283621617291002121</id><published>2008-01-03T14:11:00.000+01:00</published><updated>2008-01-03T14:32:28.907+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alsb'/><category scheme='http://www.blogger.com/atom/ns#' term='bea'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Lies created in the BEA marketing machine</title><content type='html'>I don't like to bash people nor companies, but I feel that I have to share some of the lies I have found out the last year in the SOA craze out there in the market. This time it's a company that will be on the receiving end, namely BEA.&lt;br /&gt;&lt;br /&gt;I have worked with several consultants from BEA and the are all very talented. Unfortunately the products BEA builds are not as talented... At least not when it comes to the ALSB (AquaLogic Service Bus).&lt;br /&gt;&lt;br /&gt;The ALSB is the mothership in the SOA enterprise force. It is the hub, the central, and even sometimes the brain, in a service oriented architecture. At least this is how it is marketed.&lt;br /&gt;However, when you start to drill down behind the marketing buzzwords and try to accomplish something of a business value for the customer the product does not deliver.&lt;br /&gt;&lt;br /&gt;Just a recap for people who have not worked with services and service composition: there are two types of services:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Atomic: There is a 1-to-1 relationship between the service exposed in the bus and the one  in the back-end.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Composite: There is a 1-to-n relationship, i.e. what looks like a service to the consumer is in reality composed out of several services.&lt;/li&gt;&lt;/ul&gt;Composite services and how to compose your services is one of the most important tasks in a SOA effort. Without proper thought on how to compose your services you (or rather the company you work for) will end up in a big spaghetti soup of services. Therefore we did put a lot of thought and effort in how to go about this in the company I used to work for. The only problem was that we took for granted that the ESB product (which in our case was ALSB) would be able to handle both type of services. Especially since they both are the cornerstones in a service oriented architecture. However, the ALSB can only handle the first variant, i.e. an atomic service implementation! When bringing this topic up with BEA they say, well if you want to use composite services you have to do that with the WLI.&lt;br /&gt;&lt;br /&gt;My question to BEA is:&lt;br /&gt;Have you ever seen a full fledged SOA implementation &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; using composite services? I don't have to wait for the answer since I know it myself :-)&lt;br /&gt;And with that answer in mind I have another question:&lt;br /&gt;If you know that composite services should be used, why is not the WLI part of the SOA stack?&lt;br /&gt;&lt;br /&gt;One of the crucial points with this post is that we should never believe the hype. But hey, this is no news, huh? :-) I am just reiterating the fact I suppose.&lt;br /&gt;&lt;br /&gt;I know that BEA is about to release v3 of their ALSB. I have not had the time to look at any of the new features. Let's hope that it will enable us developers to use the ESB as it must be in order to build a service oriented architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-7283621617291002121?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/7283621617291002121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=7283621617291002121&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7283621617291002121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7283621617291002121'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2008/01/lies-created-in-bea-marketing-machine.html' title='Lies created in the BEA marketing machine'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-7237756870698144568</id><published>2007-12-20T16:29:00.000+01:00</published><updated>2007-12-20T16:34:15.345+01:00</updated><title type='text'>First impressions of a new sect member</title><content type='html'>Okay, so I've finally jumped on the bandwagon and purchased a MacBook Pro.&lt;br /&gt;It's a 2.4 GHz, 2GB RAM, 200GB 7200 rpm HDD, so it's pretty fast... :-)&lt;br /&gt;&lt;br /&gt;It's no wonder that Apple are taking customers away from M$!&lt;br /&gt;The laptop is very slick and everything is working out of the box.&lt;br /&gt;Another bonus is that the OS is fast and responsive - not Vista-like with other words.&lt;br /&gt;&lt;br /&gt;The only con I've found so far is that the keyboard and I have not yet become friends...&lt;br /&gt;But I suppose that I will learn over time.&lt;br /&gt;&lt;br /&gt;More updates on my Mac journey l8r.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-7237756870698144568?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/7237756870698144568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=7237756870698144568&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7237756870698144568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/7237756870698144568'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/first-impressions-of-new-sect-member.html' title='First impressions of a new sect member'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-1941612173480509221</id><published>2007-12-18T10:46:00.000+01:00</published><updated>2007-12-18T11:02:45.560+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thomas erl'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>On SOA and starting points</title><content type='html'>&lt;span style="font-family: arial;font-size:100%;" &gt;Having worked with SOA for over a year now I have read a couple of books + done some surfing.&lt;br /&gt;As it happens some of the books I have read I quite like, and also I have stumbled upon some good internet resources if you're interested in learning more about the &lt;span style="font-style: italic;"&gt;mystical&lt;/span&gt; SOA :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Books&lt;/span&gt;&lt;br /&gt;First I would like to recommend all of Thomas Erl's books. I have read 2 of them and I think they contain everything you need to get started on understanding SOA.&lt;br /&gt;&lt;/span&gt;&lt;ul style="font-family: arial;"&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Service-Oriented-Architecture-SOA-Technology-Computing/dp/0131858580/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1197971111&amp;amp;sr=8-2"&gt;&lt;span style="font-size:100%;"&gt;&lt;span class="sans"&gt;Service-Oriented Architecture (SOA): Concepts, Technology, and Design&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Principles-Service-Prentice-Service-Oriented-Computing/dp/0132344823/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1197971111&amp;amp;sr=8-1"&gt;&lt;span class="sans"&gt;SOA Principles of Service Design&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;This book by the same author has not been released yet (but I'm very much looking forward to it):&lt;a href="http://www.amazon.com/Design-Patterns-Prentice-Service-Oriented-Computing/dp/0136135161/ref=pd_bbs_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1197971111&amp;amp;sr=8-3"&gt;&lt;br /&gt;&lt;/a&gt;&lt;ul style="font-family: arial;"&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Design-Patterns-Prentice-Service-Oriented-Computing/dp/0136135161/ref=pd_bbs_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1197971111&amp;amp;sr=8-3"&gt;&lt;span class="sans"&gt;SOA Design Patterns&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;In the meantime you can find the list of patterns here:&lt;a href="http://www.soapatterns.org/masterlist_a.asp"&gt; http://www.soapatterns.org/masterlist_a.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some Web Resources&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;IBM's &lt;a href="http://www.ibm.com/developerworks/webservices"&gt;developerWorks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ebizq.net/"&gt;ebizq&lt;/a&gt; - a great resource for everything related to SOA&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-1941612173480509221?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/1941612173480509221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=1941612173480509221&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1941612173480509221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1941612173480509221'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/on-soa-and-starting-points.html' title='On SOA and starting points'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-1095425904974882630</id><published>2007-12-13T14:23:00.000+01:00</published><updated>2007-12-13T19:26:14.675+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Concurrency'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>On Concurrency</title><content type='html'>&lt;span style=";font-family:arial;font-size:100%;"  &gt;The last couple of months I have seen more and more blogs and articles about concurrency and the problems it brings to programming (in the standard languages).&lt;br /&gt;&lt;br /&gt;What's the reason behind the interest then? One of the main reasons is that computer hardware is changing. And it's not a small change either - it's a paradigm shift. The rat race to create processors that have faster clock rates is over. From here on the processor producers will focus on adding cores in the processors. The more cores, the faster the program - if the languages can utilize them that is!! And this is what the discussions revolve around in the different blogs and articles. The modern OO languages are not equipped to handle safe multi threading when it comes to multiple cores.&lt;br /&gt;&lt;br /&gt;There are languages that do handle concurrency though:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Erlang&lt;/li&gt;&lt;li&gt;Haskell&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:arial;"&gt;Listen to the interview below to get more information on this highly interesting topic:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=351659#351659"&gt;&lt;span style="font-family:arial;"&gt;http://channel9.msdn.com/ShowPost.aspx?PostID=351659#351659&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-1095425904974882630?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/1095425904974882630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=1095425904974882630&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1095425904974882630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/1095425904974882630'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/on-concurrency.html' title='On Concurrency'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-9123713555981159718</id><published>2007-12-13T11:48:00.000+01:00</published><updated>2007-12-13T12:21:29.382+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='Terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='Stateful'/><title type='text'>The Future is here (and it's spelled Terracotta)</title><content type='html'>Yesterday I attended Elevate @ Avega (see below for more information) and listened to Jonas Bonér when he presented Terracotta. I knew this product is cool, but not this cool!! I felt blown away when walking home after the seminar.&lt;br /&gt;Why do I feel this way then? Well, I feel that the impact of this product (and similar ones) will be immense on how we develop systems in the Java sphere. &lt;br /&gt;I can foresee 2 big topics that will emerge during the coming year and I will explain these in detail below:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stateful Programming&lt;/li&gt;&lt;li&gt;Data Modeling&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Stateful Programming&lt;/span&gt;&lt;br /&gt;This has been considered a bad way of building systems. The culprit, according to me, is the infamous stateful EJB introduced by Sun in 1999. Using stateful EJBs in a system was equal to building an application that simply did not scale! Therefore almost all Java developers have shied away from this type of EJB.&lt;br /&gt;&lt;br /&gt;"We are now seeing interest in moving towards a more stateful model."&lt;br /&gt;- Rod Johnson, founder of Interface 21 (and creator of the Spring Framework)&lt;br /&gt;&lt;br /&gt;There are several reasons for using a stateful model. One is that it's simply a more natural way of programming and thinking about how your program works. Take the example of a shopping cart. It is not interesting to persist the content of the cart  into a database before  the check out is performed and the transaction is committed. But are forced to resolve to persisting if we are not to keep it in the HTTP session. And then we need to make sure that the HTTP session is replicated between web servers (to get 100% availability).&lt;br /&gt;&lt;br /&gt;Now on we can use Terracotta to solve this problem for us. Let Terracotta replicate the state between the servers and we can program a stateful approach without any specific API calls or anything like that. Terracotta handles clustering in an non-intrusive way similar to how Spring handles dependencies.&lt;br /&gt;&lt;br /&gt;Speaking of Spring and Terracotta. I feel that these two are a perfect match and I will certainly investigate more within this topic. What "design patterns" should be used to achieve the best performance from Terracotta, i.e. what should be cached? Interesting topic, eh? :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Modeling&lt;/span&gt;&lt;br /&gt;What does data modeling have to do with Terracotta? Have I gone absolutely bezerk? Nope. I'm no doctor, but I don't think I am crazy... You see with the advent of Terracotta we can decide what to put in a database and what to keep out of it. I will try to explain this more below.&lt;br /&gt;&lt;br /&gt;Terracotta has its own persistence storage (on disk). It keeps track of the state of data, so if a JVM in a Terracotta "domain" crashes there is no data loss. When the JVM comes back up again it will ask the Terracotta server for the "missing" data and, like some magic, the data is back in your application. The fact that the Terracotta server persists can be used when designing applications. In the "old days" (3 weeks ago) the systems designers simply took for granted that all data in the application had to be persisted in a database. This is not the case anymore. Instead, when designing a new system, a data analysis should be conducted and based on the outcome of this we should decide what data to store where. Some data must reside in a database e.g. for data warehousing purposes, where as other data might as well be kept in the Terracotta persistence storage. It is still retrievable only that you have to use a Java application to retrieve it. (Or at least an application that is compiled into Java byte code - read JRuby :-)).&lt;br /&gt;&lt;br /&gt;How cool isn't this?? :-)&lt;br /&gt;At least I'm excited.&lt;br /&gt;What about you?&lt;br /&gt;Download Terracotta and start playing around with it.&lt;br /&gt;&lt;br /&gt;L8r&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-9123713555981159718?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/9123713555981159718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=9123713555981159718&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/9123713555981159718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/9123713555981159718'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/future-is-here-and-its-spelled.html' title='The Future is here (and it&apos;s spelled Terracotta)'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-8137656181889593648</id><published>2007-12-10T23:39:00.000+01:00</published><updated>2007-12-10T23:43:35.975+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='Terracotta'/><title type='text'>JRuby and Terracotta</title><content type='html'>If you're in to new technologies and cool stuff you should definitely have a look at Jonas Bonérs blog about using Terracotta for clustering JRuby objects. You can find his blog here:&lt;br /&gt;&lt;a href="http://jonasboner.com/2007/02/05/clustering-jruby-with-open-terracotta/"&gt;http://jonasboner.com/2007/02/05/clustering-jruby-with-open-terracotta/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I played around with the code he presented in NetBeans 6.0. If you don't have this IDE and are developing Ruby/RoR/JRuby I am not sure what you're up to? (You are probably one of them over-wintered Emacs freak :-)). Download and install now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-8137656181889593648?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/8137656181889593648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=8137656181889593648&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8137656181889593648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/8137656181889593648'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/jruby-and-terracotta.html' title='JRuby and Terracotta'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-6057141796358267528</id><published>2007-12-10T22:48:00.000+01:00</published><updated>2007-12-10T23:00:05.997+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Clustering'/><category scheme='http://www.blogger.com/atom/ns#' term='Avega'/><category scheme='http://www.blogger.com/atom/ns#' term='Terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='Elevate'/><title type='text'>Elevate @ Avega</title><content type='html'>As a consultant I am always forced to keep up to date with what's the latest on the market. Sometimes I can't help feeling like a mouse in a spinning wheel.&lt;br /&gt;But at the same time I love working in this environment where no things are happening all the time and you just cannot lay back and say: we did this 5 years ago so listen to me and learn how it's done! (This business contains to many experts anyway...)&lt;br /&gt;&lt;br /&gt;I have several sources of information in order to try and catch up with what is going on but one of my favorite ones is a forum at my employee Avega. The forum is called Elevate and every 3 weeks or so we invite experts to talk on different subjects. The experts are normally externals but we also have some consultants from Avega who have held presentations. Since it is a forum at work people are not shy of ventilating their opinions and this, according to me, is the main difference from public meetings/conferences etc.&lt;br /&gt;&lt;br /&gt;On Wednesday (12th December) Jonas Bonér from Terracotta will come and talk about their product. I am very much looking forward to this since from what I have heard about Terracotta it would have come in handy in several of the previous projects I have been participating. Simply using Spring and Hibernate out of the box is good up into a certain point. After that we enter the sacred clustering domain and most people (consultants included) are lost.&lt;br /&gt;&lt;br /&gt;Clustering on the JVM level and, hence, excluding serialization and also only sending the updated data (instead of all data/objects) are two features in Terracotta I am looking forward to learn more about. Perhaps I will write a short summary of Jonas' presentation here?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-6057141796358267528?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/6057141796358267528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=6057141796358267528&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6057141796358267528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/6057141796358267528'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/elevate-avega.html' title='Elevate @ Avega'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-3137076852741049039</id><published>2007-12-10T19:04:00.000+01:00</published><updated>2007-12-10T19:20:31.475+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='service modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Is a Common Information Model a must to succeed with SOA?</title><content type='html'>This question has puzzled me for some time now.&lt;br /&gt;&lt;br /&gt;Some people argue that without this CIM the services created and exposed in a ESB will not be reusable and, hence, the aim to create a service portfolio fails.&lt;br /&gt;&lt;br /&gt;On the other side of the pitch stands the people that argue that it is virtually impossible to create a CIM for a medium to large sized company, and even if this huge task succeed it would also create a built in inertia.&lt;br /&gt;&lt;br /&gt;Having worked in a SOA initiative for approx. 12 months now I must say that I am a follower of the latter arguments. In my project the people creating this common information model have been busy for 6+ months now and are still nowhere close to finalize the model. The more they dig into the entities the more exceptions to the model they find. It is almost an impossible task to finish and I almost feel sorry for them. Especially since everyone is waiting for their work!&lt;br /&gt;&lt;br /&gt;My customer is using a variant of &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_analysis_and_design"&gt;SOMA&lt;/a&gt; and according to SOMA the outcome of the CIM should be building blocks for the created services. In a theoretical world this seems the best approach but I am yet to be convinced if this is feasible in my world...&lt;br /&gt;&lt;br /&gt;If it was up to me I would probably approach this by the &lt;a href="http://en.wikipedia.org/wiki/Domain-driven_design"&gt;domain-driven design&lt;/a&gt; approach and apply the anti-corruption pattern. But I don't know if this would work in an enterprise environment?&lt;br /&gt;&lt;br /&gt;I would be glad to hear any other suggestions on how to approach this problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-3137076852741049039?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/3137076852741049039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=3137076852741049039&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3137076852741049039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/3137076852741049039'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/is-common-information-model-must-to.html' title='Is a Common Information Model a must to succeed with SOA?'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-441150243483251413</id><published>2007-12-10T18:47:00.000+01:00</published><updated>2007-12-10T19:00:12.966+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Henrik Engström'/><title type='text'>About me and this blog</title><content type='html'>Since this is the first blog I create in this forum I'd like give a brief introduction to me and what this blog is about.&lt;br /&gt;&lt;br /&gt;About me. Please find my CV &lt;a href="http://www.linkedin.com/pub/0/a81/485"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;About this blog:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Systems Design and Architecture in general&lt;/li&gt;&lt;li&gt;Methodologies&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SOA&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Process Modeling&lt;/li&gt;&lt;li&gt;Information Modeling&lt;/li&gt;&lt;li&gt;Service Modeling&lt;/li&gt;&lt;li&gt;Implementation&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Java (SE/EE)&lt;/li&gt;&lt;li&gt;Ruby/RoR/JRuby&lt;/li&gt;&lt;li&gt;Upcoming Technologies&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-441150243483251413?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/441150243483251413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=441150243483251413&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/441150243483251413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/441150243483251413'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/about-me-and-this-blog.html' title='About me and this blog'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7373504975428818830.post-5560738641221266654</id><published>2007-12-10T17:59:00.000+01:00</published><updated>2007-12-10T18:53:56.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><title type='text'>Are you working lean?</title><content type='html'>Having worked as a software consultant for 10+ years I have come across all sorts of development methodologies. The last 3 years there has been a major trend to incorporate &lt;span style="font-style: italic;"&gt;agile&lt;/span&gt; in every software shop. For some it's just a buzz word where as for others it actually means something.&lt;br /&gt;&lt;br /&gt;The last couple of days I have browsed a book called &lt;a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1197306374&amp;amp;sr=8-1"&gt;Lean Software Development - An Agile Toolkit&lt;/a&gt; and I think these lean principles should be applied regardless of your current methodology.&lt;br /&gt;Here's a very brief intro to the lean principles (for more detail please buy the book and support the authors):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Eliminate Waste&lt;/span&gt;. Waste is anything that does not add value to a product from a customer perception. Whatever gets in the way of rapidly satisfying a customer need is waste.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Amplify Learning&lt;/span&gt;&lt;/span&gt;. Development is like creating a recipe, while production is like making the dish. Recipes are designed by experienced chefs who have developed an instinct for what works and the capability to adapt ingredients to suit the occasion. But chefs are not expected to get a recipe perfect on the first attempt; they are expected to produce several variations on a theme as part of the learning process.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Decide as late as possible&lt;/span&gt;. Delaying decisions is valuable because better decisions can be made when they're based on facts, not speculation.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Deliver as fast as possible&lt;/span&gt;. In development the discovery cycle is critical for learning: design, implement, feedback, and improve. The shorter these cycles are, the more can be learned.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Empower the Team&lt;/span&gt;. When a team is equipped with necessary expertise and guided by a leader, they will make better technical and process decisions than anyone can make for them.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Build Integrity in&lt;/span&gt;. A system is perceived to have integrity when a user thinks, "Yes! That's exactly what I want.". Research has shown that integrity comes from wise leadership, relevant expertise, effective communication, and healthy discipline; processes, procedures, and measurements are &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; adequate substitutes.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;See the whole&lt;/span&gt;. Quite often, the common good suffers if people attend first their own specialized interests.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7373504975428818830-5560738641221266654?l=r-c-r.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://r-c-r.blogspot.com/feeds/5560738641221266654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7373504975428818830&amp;postID=5560738641221266654&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5560738641221266654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7373504975428818830/posts/default/5560738641221266654'/><link rel='alternate' type='text/html' href='http://r-c-r.blogspot.com/2007/12/are-you-working-lean.html' title='Are you working lean?'/><author><name>Henrik Engström</name><uri>http://www.blogger.com/profile/02542891972462290971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
