<?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-17860841</id><updated>2011-11-27T20:10:54.722-05:00</updated><category term='cool'/><category term='tizra publisher'/><category term='podcast'/><category term='tizra'/><category term='tool'/><category term='unit testing'/><category term='tizra agilepdf'/><category term='development process'/><category term='ubuntu'/><category term='book'/><category term='vista'/><category term='tip'/><category term='presentation'/><category term='software development'/><category term='experiences'/><title type='text'>Bumping my Head on the Wall</title><subtitle type='html'>Francisco Assis Rosa on software development tips and tricks, processes, languages and life in general</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17860841.post-1138800892656329298</id><published>2009-01-20T10:52:00.006-05:00</published><updated>2009-01-21T09:56:51.836-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tizra publisher'/><category scheme='http://www.blogger.com/atom/ns#' term='tizra'/><category scheme='http://www.blogger.com/atom/ns#' term='tizra agilepdf'/><title type='text'>Tizra Publisher Demo</title><content type='html'>This is why I have been so quiet...the Tizra Publisher platform has evolved immensely during the last couple of months...which of course means a pretty busy time...and fun for that matter...And we are now posting a video tour of Tizra Publisher...&lt;br /&gt;&lt;br /&gt;&lt;object height="250" width="408"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MkVdGQAqHR8&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/MkVdGQAqHR8&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="250" width="408"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;For a higher resolution demo tour, try &lt;a href="http://www.tizra.com/tour"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Oh...and since we went self-service, you can try a free plan for Tizra Publisher by subscribing for your free site &lt;a href="https://secure.agilepdf.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-1138800892656329298?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/1138800892656329298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=1138800892656329298' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/1138800892656329298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/1138800892656329298'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2009/01/tizra-publisher-demo.html' title='Tizra Publisher Demo'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-4952803762880811191</id><published>2008-07-21T22:10:00.001-04:00</published><updated>2008-07-25T13:06:49.754-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>My Essential Firefox Add-ons</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_q-Tt8v4BCsU/SITgGr9urwI/AAAAAAAAAx0/bflRztfkZNw/s1600-h/firefox.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_q-Tt8v4BCsU/SITgGr9urwI/AAAAAAAAAx0/bflRztfkZNw/s400/firefox.png" alt="" id="BLOGGER_PHOTO_ID_5225547873142091522" border="0" /&gt;&lt;/a&gt;Been too long since I last wrote here. Tizra has been pretty busy picking up a ton of enthusiasm from customers and prospects (see &lt;a href="http://tizra.blogspot.com/"&gt;Tizra Blog&lt;/a&gt;). That means, of course, a pretty busy time... :-)&lt;br /&gt;&lt;br /&gt;I recently had to do a complete reinstall of my development environment. My laptop went dead and I had to get a new one...so that leads to the typical "absolutely essential" lists...today I reinstalled all my Firefox Add-ons. The good thing about reinstalls is that you cut the fat accumulated throughout the years and the absolute musts get installed first. Here is my list of absolute musts (in no particular order):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://selenium-ide.openqa.org/"&gt;Selenium IDE&lt;/a&gt;: if you're doing any kind of serious development, you want to have a good test coverage. Selenium is a really cool tool to allow you to build automated UI and system integration testing. Selenium IDE makes your life *a whole lot easier* (although not dead-simple). You still have to tweak a lot of the generated code but hey, it's a really great start. And if you have not seen Selenium yet, you have to go &lt;a href="http://selenium.openqa.org/"&gt;take a look&lt;/a&gt;. It is not necessarily simple to get into but well worth it!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/59"&gt;User Agent Switcher&lt;/a&gt;: really nice for that kind of testing that involves user agent detection...you can even "roll your own" agent identification for test purposes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Web Developer&lt;/a&gt;: a really essential set of tools for web development. CSS inspection, changing, DOM information, source viewing, browser resizing, you name it, it's probably here.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://livehttpheaders.mozdev.org/"&gt;Live HTTP Headers&lt;/a&gt;: a nice tool to let you see the header flow from and into your browser. Sometimes essential for analysis of behavior.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;: you can't say you do web development and not know about Firebug. Simply brilliant. If you have not seen it yet, tell no one about that and &lt;a href="http://getfirebug.com/"&gt;go check it out for yourself&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3615"&gt;Delicious Bookmarks&lt;/a&gt;: currently addicted to &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt;. You can see my bookmarks &lt;a href="http://del.icio.us/fassisrosa"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;I'm always open to suggestions on new add-ons...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-4952803762880811191?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/4952803762880811191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=4952803762880811191' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/4952803762880811191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/4952803762880811191'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2008/07/my-essential-firefox-add-ons.html' title='My Essential Firefox Add-ons'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_q-Tt8v4BCsU/SITgGr9urwI/AAAAAAAAAx0/bflRztfkZNw/s72-c/firefox.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-5598166615599795527</id><published>2008-03-18T09:36:00.006-04:00</published><updated>2008-03-18T12:15:53.970-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool'/><title type='text'>Google APIs, XML, Ajax and some pretty cool pictures!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_q-Tt8v4BCsU/R9_F_1ReSSI/AAAAAAAAAv4/kUPEVIPwyCU/s1600-h/brazilpics.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_q-Tt8v4BCsU/R9_F_1ReSSI/AAAAAAAAAv4/kUPEVIPwyCU/s320/brazilpics.gif" alt="" id="BLOGGER_PHOTO_ID_5179075796922157346" border="0" /&gt;&lt;/a&gt;This is what happens when you join in a single "package" an artist and a techie...Marcelino Martins had already assembled a pretty cool site filled with really impressive pictures (see &lt;a href="http://mmartins.com/"&gt;here)&lt;/a&gt;. With &lt;a href="http://brazilpictures.net/"&gt;Brazil Pictures&lt;/a&gt;, Marcelino joins his photographic artistic talent to his techie talent...he has already developed some pretty cool packages like &lt;a href="http://www.treemenu.net/"&gt;Treeview&lt;/a&gt;...Now he's been playing the Google APIs, XML, Ajax...the result is the really interesting &lt;a href="http://brazilpictures.net/"&gt;Brazil Pictures&lt;/a&gt;. And take a look at his &lt;a href="http://brazilpictures.net/brazilpictures/about.asp"&gt;implementation notes&lt;/a&gt; for a very interesting read.&lt;br /&gt;&lt;br /&gt;Very nice....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-5598166615599795527?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/5598166615599795527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=5598166615599795527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/5598166615599795527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/5598166615599795527'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2008/03/google-apis-xml-ajax-and-some-pretty.html' title='Google APIs, XML, Ajax and some pretty cool pictures!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_q-Tt8v4BCsU/R9_F_1ReSSI/AAAAAAAAAv4/kUPEVIPwyCU/s72-c/brazilpics.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-4513711395988725116</id><published>2008-01-22T14:11:00.000-05:00</published><updated>2008-01-23T09:46:56.408-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tizra agilepdf'/><title type='text'>AgilePDF is live!</title><content type='html'>I am pretty excited to see the first set of AgilePDF sites go live...we (&lt;a href="http://www.tizra.com/"&gt;Tizra&lt;/a&gt;) are indeed live at this point. You can now see the results of this effort at the following sites.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_q-Tt8v4BCsU/R5ZV-6J77uI/AAAAAAAAAt0/no1PMTdK2TA/s1600-h/fp.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_q-Tt8v4BCsU/R5ZV-6J77uI/AAAAAAAAAt0/no1PMTdK2TA/s200/fp.gif" alt="" id="BLOGGER_PHOTO_ID_5158404962450665186" border="0" title="Click for full screen"/&gt;&lt;/a&gt;&lt;a href="http://francisco-pubs.assisrosa.com/"&gt;Francisco Assis Rosa's Publications&lt;/a&gt;. Now, would I not be eating my own dog food ?  I honestly find the system pretty cool and am publicly using it to store and offer my publications online. Privately I keep a copy of the system on an internal network where I keep all my favorite tech reading. It is really handy to be able to search through the full collection of my favorite texts and get relevant results *to the page*....nice.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_q-Tt8v4BCsU/R5ZWLqJ77vI/AAAAAAAAAt8/mZonwD1dXIc/s1600-h/es.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp1.blogger.com/_q-Tt8v4BCsU/R5ZWLqJ77vI/AAAAAAAAAt8/mZonwD1dXIc/s200/es.gif" alt="" id="BLOGGER_PHOTO_ID_5158405181493997298" border="0" title="Click for full screen"/&gt;&lt;/a&gt;&lt;a href="http://eatshop.site.agilepublisher.com/"&gt;eat.shop guides&lt;/a&gt;. Some pretty cool eating and shopping guides...smartly written, gorgeously presented.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_q-Tt8v4BCsU/R5ZWUaJ77wI/AAAAAAAAAuE/woJ06R8hlu4/s1600-h/rig.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_q-Tt8v4BCsU/R5ZWUaJ77wI/AAAAAAAAAuE/woJ06R8hlu4/s200/rig.gif" alt="" id="BLOGGER_PHOTO_ID_5158405331817852674" border="0" title="Click for full screen" /&gt;&lt;/a&gt;&lt;a href="http://liveaccess.rateitgreen.com/"&gt;Rate It Green&lt;/a&gt;. Live access digital edition to "Green Building 101".&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Why do I feel so excited about this ?&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;These customers were able to hop on online without any significant investment. We are talking days instead of months between agreement and go live (and that with full design customization!), we're talking about revenue from online selling in the first couple of days. Yup, they did not have to wait six months to see a dollar, or even more to get their money back from the site building investment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The technology set used in this system is a pretty exciting technology allowing us to take advantage of a lot that's good out there...&lt;/li&gt;&lt;li&gt;I could see a nice use for personal users like me that have some content that want to distribute online. Either free or for sale...you name it.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;As far as system features go, these are some of the items that make me believe AgilePDF is cool:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;End-user page-at-time PDF rendering, allowing for getting back web usability that was taken back by the placement of unwieldy PDFs online (50Mb PDF downloads to read *one* page anyone? Make that over slow connections ?).&lt;/li&gt;&lt;li&gt;Full text search over the content of the site/sub-site/single document with results returned at the page level (again, instead of result pointing at full PDF).&lt;/li&gt;&lt;li&gt;Full fledged configurable access control over your content.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Full ecommerce configurability. Whoever owns the site can create their own products (including products resulting from combinations of pages from different documents in the site), create their own selling offers and just put it out for the test. We allow hooking up to &lt;a href="https://www.paypal.com/"&gt;PayPal&lt;/a&gt; and &lt;a href="http://www.authorize.net/"&gt;Authorize.Net&lt;/a&gt; right now but as requests come in we will be expanding the list of payment fulfillers.&lt;/li&gt;&lt;li&gt;Full site design configurability. We offer some out-of-the-box designs you can use but you can change all the look of your site by dragging and dropping site blocks around your pages...and if you really want to go crazy on your design, just upload your CSS and you can do what you want (just compare &lt;a href="http://francisco-pubs.assisrosa.com/"&gt;Francisco Assis Rosa's Publications&lt;/a&gt; to &lt;a href="http://liveaccess.rateitgreen.com/"&gt;Rate It Green&lt;/a&gt; to &lt;a href="http://eatshop.site.agilepublisher.com/"&gt;eat.shop guides&lt;/a&gt;!).&lt;/li&gt;&lt;li&gt;Full site structure configurability. Via the administration web interface you can create sub-sites based on filtering of meta data in your documents. When I said "full site design configurability" in the previous item I really meant it, you can even have these sub-sites look completely different from the main site and/or other sub-sites.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google crawling, analytics and adsense integration...speaks for itself! ;-)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And...you can always &lt;a href="mailto:frosa@tizra.com?subject=I%20Want%20to%20use%20AgilePDF"&gt;drop me a line&lt;/a&gt; if you wish to use something like this...&lt;br /&gt;&lt;br /&gt;This is just our first release...we are and will continue to work on this...&lt;br /&gt;&lt;br /&gt;We are live! :-)&lt;br /&gt;&lt;br /&gt;I'm still alive! ;-) ;-) ;-)&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-4513711395988725116?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/4513711395988725116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=4513711395988725116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/4513711395988725116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/4513711395988725116'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2008/01/agilepdf-is-live.html' title='AgilePDF is live!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_q-Tt8v4BCsU/R5ZV-6J77uI/AAAAAAAAAt0/no1PMTdK2TA/s72-c/fp.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-3360917996937345120</id><published>2007-09-11T08:58:00.001-04:00</published><updated>2008-06-26T12:31:42.402-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Unit Testing Struts 2.0 (Part 3)</title><content type='html'>Like &lt;span style="font-style: italic;"&gt;Dan&lt;/span&gt; commented on the &lt;a href="http://fassisrosa.blogspot.com/2007/03/unit-testing-struts-20-part-2.html"&gt;Unit Testing Struts 2.0 (Part 2)&lt;/a&gt; post, Struts 2.0 has changed it's API enough to make my  previous code not work on latest version. So, in response to his comment, here is what I am using right now. Credit where it's due, the setup code is the one that &lt;a href="http://arsenalist.com/"&gt;The Arsenalist&lt;/a&gt; pointed out on his blog post &lt;a href="http://arsenalist.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/"&gt;Unit Testing Struts 2 Actions wired with Spring using JUnit&lt;/a&gt;. Again, credit where it's due...my thanks go to "The Arsenalist" for posting his solution.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt;* Class for easier support of Struts related&lt;br /&gt;* testing. Takes care of all the configuration details&lt;br /&gt;* that allow test classes to create beans (Spring),&lt;br /&gt;* actions (Struts), intercepted actions (Struts).&lt;br /&gt;* Class is singleton to minimize hit of initializing&lt;br /&gt;* Struts and related infrastructure (e.g. Hibernate).&lt;br /&gt;*&lt;br /&gt;* Adapted from code from "The Arsenalist" (http://arsenalist.com/),&lt;br /&gt;* see http://arsenalist.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/&lt;br /&gt;*/&lt;br /&gt;public class StrutsTestCaseSupport {&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Singleton variable&lt;br /&gt;    */&lt;br /&gt;   public static StrutsTestCaseSupport _theInstance = null;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Servlet context&lt;br /&gt;    */&lt;br /&gt;   private ServletContext servletContext = null;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Request dispatcher&lt;br /&gt;    */&lt;br /&gt;   private Dispatcher dispatcher = null;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Singleton access&lt;br /&gt;    */&lt;br /&gt;   public static synchronized StrutsTestCaseSupport getInstance()&lt;br /&gt;       throws Exception {&lt;br /&gt;       if ( _theInstance == null ) {&lt;br /&gt;           _theInstance = new StrutsTestCaseSupport();&lt;br /&gt;       }&lt;br /&gt;       return _theInstance;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Class constructor, take care of Struts initializations&lt;br /&gt;    */&lt;br /&gt;   private StrutsTestCaseSupport ()&lt;br /&gt;       throws Exception {&lt;br /&gt;       String[] config = new String[] { "/WEB-INF/applicationContext.xml" };&lt;br /&gt;&lt;br /&gt;       // Link the servlet context and the Spring context&lt;br /&gt;       servletContext = new MockServletContext(new FileSystemResourceLoader());&lt;br /&gt;       XmlWebApplicationContext appContext = new XmlWebApplicationContext();&lt;br /&gt;       appContext.setServletContext(servletContext);&lt;br /&gt;       appContext.setConfigLocations(config);&lt;br /&gt;       appContext.refresh();&lt;br /&gt;       servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, appContext);&lt;br /&gt;&lt;br /&gt;       // Use spring as the object factory for Struts&lt;br /&gt;       StrutsSpringObjectFactory ssf = new StrutsSpringObjectFactory(null, null, servletContext);&lt;br /&gt;       ssf.setApplicationContext(appContext);&lt;br /&gt;       StrutsSpringObjectFactory.setObjectFactory(ssf);&lt;br /&gt;&lt;br /&gt;       // Dispatcher is the guy that actually handles all requests.  Pass in&lt;br /&gt;       // an empty Map as the parameters but if you want to change stuff like&lt;br /&gt;       // what config files to read, you need to specify them here&lt;br /&gt;       // (see Dispatcher's source code)&lt;br /&gt;       dispatcher = new Dispatcher(servletContext, new HashMap());&lt;br /&gt;       dispatcher.init();&lt;br /&gt;       Dispatcher.setInstance(dispatcher);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * create a bean from the object factory (all wired up from Spring)&lt;br /&gt;    *&lt;br /&gt;    * @param beanName the name of the bean to get from the object factory&lt;br /&gt;    * @param extraContent any extra content information to pass along to the bean building&lt;br /&gt;    *        process&lt;br /&gt;    * @return the object factory created bean&lt;br /&gt;    * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;    */&lt;br /&gt;   public Object createBean ( String beanName, Map&lt;object,object&gt; extraContext )&lt;br /&gt;   throws Exception {&lt;br /&gt;       ObjectFactory objectFactory = dispatcher.getContainer().getInstance(ObjectFactory.class);&lt;br /&gt;       return objectFactory.buildBean(beanName,extraContext);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * create an action proxied by it's interceptor stack&lt;br /&gt;    *&lt;br /&gt;    * @param actionName the name/id for the action&lt;br /&gt;    * @param actionNameSpace the namespace for the action&lt;br /&gt;    * @return the proxyed action&lt;br /&gt;    * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;    */&lt;br /&gt;   public ActionProxy createActionProxy ( String actionName, String actionNamespace )&lt;br /&gt;   throws Exception {&lt;br /&gt;       // create a proxy class which is just a wrapper around the action call.&lt;br /&gt;       // The proxy is created by checking the namespace and name against the&lt;br /&gt;       // struts.xml configuration&lt;br /&gt;       ActionProxy proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(actionNamespace, actionName, null, true, false);&lt;br /&gt;&lt;br /&gt;       // by default, don't pass in any request parameters&lt;br /&gt;       proxy.getInvocation().getInvocationContext().setParameters(new HashMap());&lt;br /&gt;&lt;br /&gt;       // by default, pass along an empty session map&lt;br /&gt;       proxy.getInvocation().getInvocationContext().setSession(new HashMap&lt;object,object&gt;());&lt;br /&gt;&lt;br /&gt;       // set the actions context to the one which the proxy is using&lt;br /&gt;       ServletActionContext.setContext(proxy.getInvocation().getInvocationContext());&lt;br /&gt;       MockHttpServletRequest request = new MockHttpServletRequest();&lt;br /&gt;       MockHttpServletResponse response = new MockHttpServletResponse();&lt;br /&gt;       ServletActionContext.setRequest(request);&lt;br /&gt;       ServletActionContext.setResponse(response);&lt;br /&gt;       ServletActionContext.setServletContext(servletContext);&lt;br /&gt;&lt;br /&gt;       // set proper URI&lt;br /&gt;       request.setRequestURI(actionNamespace + "/" + actionName);&lt;br /&gt;&lt;br /&gt;       return proxy;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * create an action proxied by it's interceptor stack&lt;br /&gt;    *&lt;br /&gt;    * @param actionName the name/id for the action&lt;br /&gt;    * @param actionNameSpace the namespace for the action&lt;br /&gt;    * @param sessionMap the request/invocation session map (for http session map mocking)&lt;br /&gt;    * @return the proxyed action&lt;br /&gt;    * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;    */&lt;br /&gt;   public ActionProxy createActionProxy ( String actionName, String actionNamespace, Map&lt;object,object&gt; sessionMap )&lt;br /&gt;   throws Exception {&lt;br /&gt;&lt;br /&gt;       // create an action proxy as usual&lt;br /&gt;       ActionProxy actionProxy = createActionProxy(actionName,actionNamespace);&lt;br /&gt;&lt;br /&gt;       // set the session map in the action proxy's invocation&lt;br /&gt;       actionProxy.getInvocation().getInvocationContext().setSession(sessionMap);&lt;br /&gt;&lt;br /&gt;       return actionProxy;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * create an action object, bypass all it's stacks. Have it properly injected&lt;br /&gt;    * according to configurations.&lt;br /&gt;    *&lt;br /&gt;    * @param actionName the name/id for the action&lt;br /&gt;    * @param actionNameSpace the namespace for the action&lt;br /&gt;    * @return the properly injected action&lt;br /&gt;    * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;    */&lt;br /&gt;   public Object createAction ( String actionName, String actionNamespace )&lt;br /&gt;   throws Exception {&lt;br /&gt;       ActionProxy actionProxy = createActionProxy(actionName,actionNamespace);&lt;br /&gt;       return actionProxy.getAction();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Access to the proxy's response content as a string&lt;br /&gt;    * @param proxy the proxy to get the string response for&lt;br /&gt;    * @return the proxy's response content as a string&lt;br /&gt;    */&lt;br /&gt;   public static String getResponseContentAsString ( ActionProxy proxy )&lt;br /&gt;       throws java.io.UnsupportedEncodingException {&lt;br /&gt;       return ((MockHttpServletResponse)ServletActionContext.getResponse()).getContentAsString();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Set a hostname in proxy request&lt;br /&gt;    * @param proxy the proxy to set hostname to&lt;br /&gt;    * @param serverName the server name to set for this proxy's call&lt;br /&gt;    */&lt;br /&gt;   public static void setRequestServerName ( ActionProxy proxy, String serverName ) {&lt;br /&gt;       ((MockHttpServletRequest)ServletActionContext.getRequest()).setServerName(serverName);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Like mentioned in previous postings, using this class is pretty straightforward, within your test you just do for beans:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    YourClass yourInstance = (YourClass)StrutsTestCaseSupport.getInstance().createBean("yourBeanId",new HashMap());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For Actions:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    ActionProxy proxy = StrutsTestCaseSupport.getInstance().createActionProxy(yourActionId,yourContextPath);&lt;br /&gt;    MyActionClass myActionInstance = (MyActionClass)StrutsTestCaseSupport.getInstance().createAction(yourActionId,yourContextPath);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This code is currently being used with Struts 2.0.8.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-3360917996937345120?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/3360917996937345120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=3360917996937345120' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/3360917996937345120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/3360917996937345120'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/09/unit-testing-struts-20-part-3.html' title='Unit Testing Struts 2.0 (Part 3)'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-6804140489352971345</id><published>2007-08-29T18:49:00.000-04:00</published><updated>2007-08-29T18:55:34.748-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Return of the Stuff!</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/nfjs_logo200.gif"&gt;&lt;img style="FLOAT: left; MARGIN: 0pt 10px 10px 0pt; CURSOR: pointer" alt="" src="http://photos1.blogger.com/blogger/5970/1732/200/nfjs_logo200.gif" border="0" /&gt;&lt;/a&gt;Here we go again, it's that time of the year where good things are about to happen. September is marked by two major events: the &lt;a href="http://www.halo3.com/"&gt;release of Halo 3&lt;/a&gt; ;-) and the return of the &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff conference&lt;/a&gt; (now called the New England Software Symposium). I have written about this even before but it does not hurt to repeat it...this is a really impressive conference and a must if you live around the Boston area. It takes place during a Friday afternoon and over the weekend. This is actually a great decision since it simplifies a lot the "need to be out of work" argument with your bosses. Sure it takes over your weekend but, if you're in this business you are most probably hooked enough to this stuff for this not to be a problem. The attendance to this event is capped at around 250 which is another great feature since it does allow you to be in those rooms listening to the presentations in a much close environment. You get to interact with the presenters both during the talks and during the breaks by mingling in lunch tables or just approaching them directly. The topics are amazing and, like I mentioned before (see &lt;a href="http://fassisrosa.blogspot.com/2006/10/no-fluff-just-stuff-impressions.html"&gt;here&lt;/a&gt;), the really annoying part of the even is choosing which sessions to go to. The price for the event is really a find...pretty affordable even if, like me, you do not get your company to sponsor you&lt;br /&gt;and pay out of your own pocket.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;This fall, the Boston even takes place on the 14th (PM), 15th and 16th of September in Framingham, Massachusetts. For all the details, check out the &lt;a href="http://www.nofluffjuststuff.com/conference/boston/2007/09/index.html"&gt;event site&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;I got my place already booked, what are you waiting for ?&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-6804140489352971345?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/6804140489352971345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=6804140489352971345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6804140489352971345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6804140489352971345'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/08/return-of-stuff.html' title='Return of the Stuff!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-655957474439715166</id><published>2007-07-06T09:57:00.000-04:00</published><updated>2007-07-06T10:09:27.201-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Problems with Keyboard Mapping when Running vncviewer on Ubuntu</title><content type='html'>In the hope that this adds to the list of solutions out there that can actually help people...&lt;br /&gt;If you are having keyboard mapping issues when trying to connect via vncviewer to a machine running vncserver on Ubuntu Feisty (7.04) with gnome, try this:&lt;br /&gt;&lt;br /&gt;Create a ~/.vncrc file and add to it:&lt;br /&gt;&lt;pre&gt;        $vncStartup = "&amp;lt;your_home_dir_here&amp;gt;/.vnc/xstartup"; &lt;/pre&gt;&lt;br /&gt;Create a ~/.vnc/xstartup file (or edit) and make sure it contains:&lt;br /&gt;&lt;pre&gt;        xrdb $HOME/.Xresources&lt;br /&gt;        gnome-wm &amp;&lt;br /&gt;        gnome-panel &amp;amp;&lt;br /&gt;        nautilus --no-default-window &amp;&lt;br /&gt;        gnome-cups-icon &amp;amp;amp;&lt;br /&gt;        gnome-volume-manager &amp;&lt;br /&gt;        cd ~&lt;br /&gt;        xterm &amp;amp;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Solved the problem for me. Credit where it belongs, found the solution here: &lt;a href="http://ubuntuforums.org/showthread.php?t=382441"&gt;http://ubuntuforums.org/showthread.php?t=382441&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My take on it, posts do help find solutions, here is my contribution to try helping others find a solution quicker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-655957474439715166?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/655957474439715166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=655957474439715166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/655957474439715166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/655957474439715166'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/07/problems-with-keyboard-mapping-when.html' title='Problems with Keyboard Mapping when Running vncviewer on Ubuntu'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-7642340339738978677</id><published>2007-05-05T08:27:00.000-04:00</published><updated>2007-05-05T12:52:56.562-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='experiences'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Pity the User</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_q-Tt8v4BCsU/Rjx_vZO7rbI/AAAAAAAAABU/2w-Pfdniar0/s1600-h/ubuntu-vs-vista.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_q-Tt8v4BCsU/Rjx_vZO7rbI/AAAAAAAAABU/2w-Pfdniar0/s320/ubuntu-vs-vista.png" alt="" id="BLOGGER_PHOTO_ID_5061060533461691826" border="0" /&gt;&lt;/a&gt;I have recently got the opportunity to get my hands on a copy of &lt;a href="http://www.microsoft.com/windows/products/windowsvista/editions/ultimate/default.mspx"&gt;Vista Ultimate&lt;/a&gt; at MS employee prices. I jumped at the opportunity and, as soon as I ensured all my crucial apps actually ran on Vista (&lt;a href="http://www.vmware.com/products/ws/"&gt;VMWare Workstation&lt;/a&gt; in particular), proceeded to install it on my laptop. I spend my working hours (and others for that matter) using this laptop so, although I surely did not get to explore all the niceties of Vista, I got the daily use experience of running it. The first impression was the "Wow" that MS advertises so much. It is indeed an eye-candy-filled OS. It looks awesome and all the UI interactions have been tuned to please the eye, Windows Aero is indeed really enticing. But...the niceties of a new UI only last so much...My daily work is spent mostly on another OS environment. All my work is done on Linux and I had been used to depend on VMWare Workstation to be able to get the best of both worlds and jump around as needed. My experience with XP and VMWare Workstation had been impeccable and I could not recommend it more...Then came Vista...oh well...Suddenly my Pentium 4 3.4Ghz with Hyperthreading, 2Gb RAM started grinding to a halt. Although a year old now, this is not (I believe) a run-of-the-mill laptop...A laptop with these specs should be able to handle this OS plus the apps that I needed to run on top of it! My frustration grew when looking at memory usage on Vista...Just starting up brought me to 600Mb usage, with VMWare I was up to 1.6Gb...this on a 2Gb RAM machine...And I started looking through the nice UI and thinking seriously that I could not work daily with this...The initial "Wow" turned into "Wow, this is unbearable!". So, after some serious consideration I decided it was time to byte the bullet and wipe out my system and replace it by something more snappy that actually made good use of my hardware...&lt;a href="http://www.ubuntu.com/"&gt;Ubuntu 7.04&lt;/a&gt; to the rescue! Ok, I am not religious about the OS war and am one of the people who tries to take advantage of whatever each has to offer so, being the gamer that I am, I left Vista on a dual boot setup alongside Ubuntu (I still have hopes of playing Halo 2 on Vista someday to &lt;a href="http://gamerconnect.blogspot.com/2007/04/be-achiever.html"&gt;get my achievements&lt;/a&gt;! ). Now I am running Linux as a first OS...my life became a lot less stressing...and I can still run Windows XP or Win 2K on a VMWare Workstation virtual host for all the testing I need to do...The best of both worlds I would say...&lt;br /&gt;&lt;br /&gt;With this Windows Vista we are bound to see a new need to get new hardware where once what you had was just fine...and, to be honest, without any real *day to day* real important enhancements that I can see (again, I stress the *day to day*... you might do cool and important things on Vista but I'm betting these are completely irrelevant for the common user).&lt;br /&gt;&lt;br /&gt;But I believe Ubuntu 7.04 (and Linux in general) is still not there as well...I had to jump through some serious loops to get my Wireless card and my sound card to work on my laptop...It has evolved immensely no doubts. I still remember the old Linux installations of the early nineties where you really had to be courageous and curious to even try it. But good as it is this is hardly mass user ready...&lt;br /&gt;&lt;br /&gt;Pity the user indeed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-7642340339738978677?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/7642340339738978677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=7642340339738978677' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/7642340339738978677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/7642340339738978677'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/05/pity-user.html' title='Pity the User'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_q-Tt8v4BCsU/Rjx_vZO7rbI/AAAAAAAAABU/2w-Pfdniar0/s72-c/ubuntu-vs-vista.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-1203757697790635838</id><published>2007-03-29T20:46:00.000-04:00</published><updated>2007-09-18T11:54:40.255-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development process'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Unit Testing Struts 2.0 (Part 2)</title><content type='html'>&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;Edit: for latest on this see &lt;a href="http://fassisrosa.blogspot.com/2007/09/unit-testing-struts-20-part-3.html"&gt;recent post&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In response to a comment made to &lt;a href="http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20.html"&gt;Unit Testing Struts 2.0&lt;/a&gt;, here is the updated, complete code for Struts 2.0 testing. Hope this is useful. Have questions ? Want to discuss any of this ? Just drop me a line...Read on, includes support class code, small snippets for creation of Spring beans, Struts 2.0 actions, Struts 2.0 action proxies.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import com.opensymphony.xwork2.ActionContext;&lt;br /&gt;import com.opensymphony.xwork2.ActionProxy;&lt;br /&gt;import com.opensymphony.xwork2.ActionProxyFactory;&lt;br /&gt;import com.opensymphony.xwork2.ObjectFactory;&lt;br /&gt;import com.opensymphony.xwork2.config.ConfigurationManager;&lt;br /&gt;import com.opensymphony.xwork2.config.entities.ActionConfig;&lt;br /&gt;&lt;br /&gt;import org.apache.struts2.StrutsConstants;&lt;br /&gt;import org.apache.struts2.StrutsStatics;&lt;br /&gt;import org.apache.struts2.config.Settings;&lt;br /&gt;import org.apache.struts2.config.StrutsXmlConfigurationProvider;&lt;br /&gt;import org.apache.struts2.dispatcher.Dispatcher;&lt;br /&gt;import org.apache.struts2.impl.StrutsActionProxyFactory;&lt;br /&gt;import org.apache.struts2.spring.StrutsSpringObjectFactory;&lt;br /&gt;import org.apache.struts2.views.freemarker.FreemarkerManager;&lt;br /&gt;&lt;br /&gt;import org.springframework.core.io.FileSystemResourceLoader;&lt;br /&gt;import org.springframework.mock.web.MockServletContext;&lt;br /&gt;import org.springframework.mock.web.MockHttpServletRequest;&lt;br /&gt;import org.springframework.mock.web.MockHttpServletResponse;&lt;br /&gt;import org.springframework.web.context.ConfigurableWebApplicationContext;&lt;br /&gt;import org.springframework.web.context.WebApplicationContext;&lt;br /&gt;import org.springframework.web.context.support.XmlWebApplicationContext;&lt;br /&gt;&lt;br /&gt;import java.lang.reflect.Method;&lt;br /&gt;&lt;br /&gt;import java.net.URLEncoder;&lt;br /&gt;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import javax.servlet.ServletContext;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Class for easier support of Struts related&lt;br /&gt; * testing. Takes care of all the configuration details&lt;br /&gt; * that allow test classes to create beans (Spring),&lt;br /&gt; * actions (Struts), intercepted actions (Struts).&lt;br /&gt; * Class is singleton to minimize hit of initializing&lt;br /&gt; * Struts and related infrastructure (e.g. Hibernate).&lt;br /&gt; *&lt;br /&gt; * @author Francisco Assis Rosa&lt;br /&gt; */&lt;br /&gt;public class StrutsTestCaseSupport {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Singleton variable&lt;br /&gt;     */&lt;br /&gt;    public static StrutsTestCaseSupport _theInstance;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Singleton access&lt;br /&gt;     */&lt;br /&gt;    public static synchronized StrutsTestCaseSupport getInstance() {&lt;br /&gt;        if ( _theInstance == null ) {&lt;br /&gt;            _theInstance = new StrutsTestCaseSupport();&lt;br /&gt;        }&lt;br /&gt;        return _theInstance;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Application context class (encapsulation of applicationContext.xml)&lt;br /&gt;     */&lt;br /&gt;    ConfigurableWebApplicationContext _applicationContext;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Configuration Manager object, to allow for encapusulation of struts.xml,&lt;br /&gt;     * creation of actions and their proxied counterparts, creation of&lt;br /&gt;     * servlet context from this application context&lt;br /&gt;     */&lt;br /&gt;    ConfigurationManager _configurationManager;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Class constructor, take care of Struts initializations&lt;br /&gt;     */&lt;br /&gt;    private StrutsTestCaseSupport () {&lt;br /&gt;&lt;br /&gt;        // create the struts+spring integrated object factory&lt;br /&gt;        // set spring autowiring by name for spring object factory&lt;br /&gt;        Settings.set(StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE,"name");&lt;br /&gt;        StrutsSpringObjectFactory objectFactory = new StrutsSpringObjectFactory();&lt;br /&gt;&lt;br /&gt;        // set system object facory&lt;br /&gt;        ObjectFactory.setObjectFactory(objectFactory);&lt;br /&gt;&lt;br /&gt;        // set action proxy factory&lt;br /&gt;        ActionProxyFactory.setFactory(new StrutsActionProxyFactory());&lt;br /&gt;&lt;br /&gt;        // create a web application context instance (for spring configuration)&lt;br /&gt;        _applicationContext = new XmlWebApplicationContext();&lt;br /&gt;&lt;br /&gt;        // get ahold of a servlet context to use in the creation of the application context&lt;br /&gt;        ServletContext servletContext = createOneServletContext(_applicationContext);&lt;br /&gt;        // complete application context initialization, pass in servlet&lt;br /&gt;        // context and config file location, force reading of config (via refresh)&lt;br /&gt;        _applicationContext.setServletContext(servletContext);&lt;br /&gt;        _applicationContext.setConfigLocations(new String[] {"WEB-INF/applicationContext.xml"});&lt;br /&gt;        _applicationContext.refresh();&lt;br /&gt;&lt;br /&gt;        // initialize the object factory with the mock servlet context, application context&lt;br /&gt;        objectFactory.init(servletContext);&lt;br /&gt;        objectFactory.setApplicationContext(_applicationContext);&lt;br /&gt;&lt;br /&gt;        // add a default dispatcher to the system&lt;br /&gt;        Dispatcher du = new Dispatcher(servletContext);&lt;br /&gt;        Dispatcher.setInstance(du);&lt;br /&gt;&lt;br /&gt;        // pass over to the configuration manager location where struts-default.xml,&lt;br /&gt;        // struts-plugin.xml and struts.xml can be found, force reading all&lt;br /&gt;        _configurationManager = new ConfigurationManager();&lt;br /&gt;        _configurationManager.addConfigurationProvider( new StrutsXmlConfigurationProvider("struts-default.xml", false));&lt;br /&gt;        _configurationManager.addConfigurationProvider( new StrutsXmlConfigurationProvider("struts-plugin.xml", false));&lt;br /&gt;        _configurationManager.addConfigurationProvider( new StrutsXmlConfigurationProvider("struts.xml", false));&lt;br /&gt;        _configurationManager.reload();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * create a servlet context useable for a specific action&lt;br /&gt;     *&lt;br /&gt;     * @param applicationContext the application context to use in the servlet context&lt;br /&gt;     * @return the created servlet context&lt;br /&gt;     */&lt;br /&gt;    protected ServletContext createOneServletContext (ConfigurableWebApplicationContext applicationContext) {&lt;br /&gt;        // create a servlet context for this action, use FileSystemResourceLoader for&lt;br /&gt;        // context to find configuration files&lt;br /&gt;        ServletContext servletContext = (ServletContext) new MockServletContext(new FileSystemResourceLoader());&lt;br /&gt;&lt;br /&gt;        // initialize freemarker manager config parameter to null (let FreemarkerManager figure&lt;br /&gt;        // out configuration location out of ServletContext)&lt;br /&gt;        Settings.set(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");&lt;br /&gt;        servletContext.setAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY,null);&lt;br /&gt;&lt;br /&gt;        // hand over application context to servlet context&lt;br /&gt;        servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext);&lt;br /&gt;&lt;br /&gt;        return servletContext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Build one action context for an accessmethod and an access url&lt;br /&gt;     *&lt;br /&gt;     * @param serverName the hostname that the request will need to hook up to&lt;br /&gt;     * @param accessMethod http method to use (e.g. 'get', 'post', 'put', etc)&lt;br /&gt;     * @param accessUrl the url to access&lt;br /&gt;     * @return the map for the action's context&lt;br /&gt;     * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;     */&lt;br /&gt;    public Map&lt;Object,Object&gt; buildActionContext ( String serverName, String accessMethod, String accessUrl, Map&lt;String,String&gt; requestParamMap )&lt;br /&gt;        throws Exception {&lt;br /&gt;        // get ahold of a brand new servlet context&lt;br /&gt;        ServletContext servletContext = createOneServletContext(_applicationContext);&lt;br /&gt;&lt;br /&gt;        // create fake request and response objects&lt;br /&gt;        MockHttpServletRequest request = new MockHttpServletRequest(servletContext,accessMethod,accessUrl);&lt;br /&gt;        MockHttpServletResponse response = new MockHttpServletResponse();&lt;br /&gt;&lt;br /&gt;        // set request server name&lt;br /&gt;        request.setServerName(serverName);&lt;br /&gt;&lt;br /&gt;        // add request parameters&lt;br /&gt;        if ( "get".equals(accessMethod) ) {&lt;br /&gt;            for ( String oneParamName : requestParamMap.keySet() ) {&lt;br /&gt;                request.addParameter(oneParamName,requestParamMap.get(oneParamName));&lt;br /&gt;            }&lt;br /&gt;        } else if ( "post".equals(accessMethod) ) {&lt;br /&gt;            String requestBody = "";&lt;br /&gt;            for ( String oneParamName : requestParamMap.keySet() ) {&lt;br /&gt;                if ( requestBody.length() &gt; 0 ) {&lt;br /&gt;                    requestBody += "&amp;";&lt;br /&gt;                }&lt;br /&gt;                requestBody += oneParamName + "=" + URLEncoder.encode(requestParamMap.get(oneParamName),"UTF-8");&lt;br /&gt;            }&lt;br /&gt;            request.setContent(requestBody.getBytes());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // add context, request and response to an action context map&lt;br /&gt;        Map&lt;Object,Object&gt; actionContext = new HashMap&lt;Object,Object&gt;();&lt;br /&gt;        actionContext.put(StrutsStatics.SERVLET_CONTEXT,servletContext);&lt;br /&gt;        actionContext.put(StrutsStatics.HTTP_REQUEST,request);&lt;br /&gt;        actionContext.put(StrutsStatics.HTTP_RESPONSE,response);&lt;br /&gt;        actionContext.put(ActionContext.DEV_MODE,new Boolean(false));&lt;br /&gt;        // add request parameters to action context&lt;br /&gt;        Map&lt;Object,Object&gt; actionContextParams = new HashMap&lt;Object,Object&gt;();&lt;br /&gt;        for ( String oneParamName : requestParamMap.keySet() ) {&lt;br /&gt;            String[] paramValue = new String[1];&lt;br /&gt;            paramValue[0] = requestParamMap.get(oneParamName);&lt;br /&gt;            actionContextParams.put(oneParamName,paramValue);&lt;br /&gt;        }&lt;br /&gt;        actionContext.put(ActionContext.PARAMETERS,actionContextParams);&lt;br /&gt;&lt;br /&gt;        return actionContext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * create a bean from the object factory (all wired up from Spring)&lt;br /&gt;     *&lt;br /&gt;     * @param beanName the name of the bean to get from the object factory&lt;br /&gt;     * @param extraContent any extra content information to pass along to the bean building&lt;br /&gt;     *        process&lt;br /&gt;     * @return the object factory created bean&lt;br /&gt;     * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;     */&lt;br /&gt;    public Object createBean ( String beanName, Map&lt;Object,Object&gt; extraContext )&lt;br /&gt;    throws Exception {&lt;br /&gt;        return ObjectFactory.getObjectFactory().buildBean(beanName,extraContext);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * create an action proxied by it's interceptor stack&lt;br /&gt;     *&lt;br /&gt;     * @param actionName the name/id for the action&lt;br /&gt;     * @param actionNameSpace the namespace for the action&lt;br /&gt;     * @param actionContext the action context for creating the proxy (created from buildActionContext)&lt;br /&gt;     * @return the proxyed action&lt;br /&gt;     * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;     */&lt;br /&gt;    public ActionProxy createActionProxy ( String actionName, String actionNamespace, Map&lt;Object,Object&gt; actionContext)&lt;br /&gt;    throws Exception {&lt;br /&gt;        return createActionProxy(actionName,actionNamespace,actionContext,new HashMap&lt;Object,Object&gt;());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * create an action proxied by it's interceptor stack&lt;br /&gt;     *&lt;br /&gt;     * @param actionName the name/id for the action&lt;br /&gt;     * @param actionNameSpace the namespace for the action&lt;br /&gt;     * @param actionContext the action context for creating the proxy (created from buildActionContext)&lt;br /&gt;     * @param sessionMap the request/invocation session map (for http session map mocking)&lt;br /&gt;     * @return the proxyed action&lt;br /&gt;     * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;     */&lt;br /&gt;    public ActionProxy createActionProxy ( String actionName, String actionNamespace, Map&lt;Object,Object&gt; actionContext, Map&lt;Object,Object&gt; sessionMap )&lt;br /&gt;    throws Exception {&lt;br /&gt;        ActionProxy actionProxy = ActionProxyFactory.getFactory().createActionProxy(_configurationManager.getConfiguration(),actionNamespace,actionName,actionContext);&lt;br /&gt;&lt;br /&gt;        // set the session map in the action proxy's invocation&lt;br /&gt;        actionProxy.getInvocation().getInvocationContext().setSession(sessionMap);&lt;br /&gt;&lt;br /&gt;        return actionProxy;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * create an action object, bypass all it's stacks. Have it properly injected&lt;br /&gt;     * according to configurations.&lt;br /&gt;     *&lt;br /&gt;     * @param actionName the name/id for the action&lt;br /&gt;     * @param actionNameSpace the namespace for the action&lt;br /&gt;     * @param actionContext the action context for creating the proxy (created from buildActionContext)&lt;br /&gt;     * @return the properly injected action&lt;br /&gt;     * @throws Exception on processing, configuration errors, test failure&lt;br /&gt;     */&lt;br /&gt;    public Object createAction ( String actionName, String actionNamespace, Map&lt;Object,Object&gt; actionContext )&lt;br /&gt;    throws Exception {&lt;br /&gt;        // get ahold of the action's configuration via the XWorkConfigRetriever class&lt;br /&gt;        ActionConfig actionConfig = _configurationManager.getConfiguration().getRuntimeConfiguration().getActionConfig(actionNamespace,actionName);&lt;br /&gt;&lt;br /&gt;        // create one instance of the action to test using the object factory, pass in action config and context&lt;br /&gt;        return ObjectFactory.getObjectFactory().buildAction(actionName, actionNamespace, actionConfig, actionContext);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And using it to create any bean:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        MyClass myObject = (MyClass)StrutsTestCaseSupport.getInstance().createBean("myBeanName",new HashMap());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or to do a full fledged Struts 2.0 action proxy test:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        // create action for ActionSearchTest&lt;br /&gt;        Map&lt;String,String&gt; requestParameters = new HashMap&lt;String,String&gt;();&lt;br /&gt;        requestParameters.put("searchMode","quick");&lt;br /&gt;        requestParameters.put("searchText","Testing");&lt;br /&gt;        Map&lt;Object,Object&gt; actionContext = StrutsTestCaseSupport.getInstance().buildActionContext("struts.assisrosa.com","get","/search/results",requestParameters);&lt;br /&gt;&lt;br /&gt;        // create the proxy for the action, this encapsulates all&lt;br /&gt;        // the interception stack up to the real action&lt;br /&gt;        ActionProxy proxy = StrutsTestCaseSupport.getInstance().createActionProxy("results","/search",actionContext);&lt;br /&gt;&lt;br /&gt;        // let the full stack run&lt;br /&gt;        String result = proxy.execute();&lt;br /&gt;&lt;br /&gt;        // confirm result, any exception thrown will cause test to fail&lt;br /&gt;        assert result.equals("success");&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Or a Struts 2.0 action test (no proxy in front of it):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        MyAction myAction = (MyAction) StrutsTestCaseSupport.getInstance().createAction("hello","/site",actionContext);&lt;br /&gt;        String result = myAction.execute();&lt;br /&gt;        assert result.equals("myExpectedResult");&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-1203757697790635838?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/1203757697790635838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=1203757697790635838' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/1203757697790635838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/1203757697790635838'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/03/unit-testing-struts-20-part-2.html' title='Unit Testing Struts 2.0 (Part 2)'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-6865539142262777236</id><published>2007-02-12T09:35:00.000-05:00</published><updated>2007-02-08T08:19:11.610-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development process'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Continous Integration</title><content type='html'>Continuous integration is a practice introduced by Extreme Programming (XP) that brings in the idea that developers should check in their code often and that their work should be continuously integrated and tested to ensure that no error goes unnoticed (see &lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;article by Martin Fowler&lt;/a&gt;). The practice is tightly integrated with the concepts of source control, unit testing and automated building as these are the privileged means of bringing the code together and running tests on it. Continuous integration (CI) not only works nicely but does enforces some pretty important habits to developers.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Developers working on a CI project will be required to use source control for their code. Sounds like a basic tool for any development project but I've seen too many projects where source control is completely absent...CI simply requires it...nice.&lt;/li&gt;&lt;li&gt;Developers working on a CI project will be rewarded by putting in place as many unit tests as possible. How ? By seeing that less errors will sneak by because of the existence of this safety net of testing. It is pretty cool to see that you avoid putting mistakes into production because of this first line of defense. Better our CI screaming at us than our clients right ?&lt;/li&gt;&lt;li&gt;Developers working on a CI project get used to the concept of automated building and the concept of building from scratch. Again, often have I seen in the past cases where code that is not rebuilt regularly from scratch becomes too entangled in dependencies that prevent it from building from a clean slate.&lt;/li&gt;&lt;/ul&gt;All these make for pretty strong points in favor of CI. And it is not that hard to put it in place...There is a significant amount of tools that joined together make for a great CI platform. Just look around. A winning combination for me, developing in Java, has been:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cruisecontrol.sourceforge.net/"&gt;Cruise Control&lt;/a&gt;. A CI framework that glues together all the components to provide a pretty decent CI setup. From HTML reporting to email notification of success failures of builds, this is a pretty cool tool to use.&lt;/li&gt;&lt;li&gt;&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;. A version control system that addresses a lot of the typical weak spots of other version control systems (e.g. &lt;a href="http://www.nongnu.org/cvs/"&gt;CVS&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;. An automated build tool for Java. I doubt anyone working in Java never heard of Ant.&lt;/li&gt;&lt;li&gt;&lt;a href="http://testng.org/doc/"&gt;TestNG&lt;/a&gt;. A really cool testing framework for Java. Check it out...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;All of the above are free tools that you can get and play with, together they make up for a pretty strong CI.&lt;br /&gt;&lt;br /&gt;CI takes a step ahead when talking about Continuous Database Integration (CDBI). &lt;a href="http://www.testearly.com/category/duvall/"&gt;Paul Duvall&lt;/a&gt; at &lt;a href="http://www.testearly.com/"&gt;Test Early&lt;/a&gt; has been doing some pretty interesting &lt;a href="http://www.nofluffjuststuff.com/speaker_topic_view.jsp?topicId=349"&gt;presentations &lt;/a&gt;on it. It does bring a new level of testing to your database-driven apps. One which enforces the cooperation between developers and database administrators and builds a structure that ensures that you can deploy your application at any point in time. If you ever seen a project where to redeploy in a new system you have to go chasing for the DB schema required to deploy a clean system, you know the kind of sorrows CDBI can save you from.&lt;br /&gt;&lt;br /&gt;I simply *guarantee you* that if you ever start using CI, you will not want to work again without it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-6865539142262777236?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/6865539142262777236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=6865539142262777236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6865539142262777236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6865539142262777236'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/02/continous-integration.html' title='Continous Integration'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-6246419983318973581</id><published>2007-02-07T21:05:00.000-05:00</published><updated>2007-02-07T22:04:04.267-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Javascript: The Definitive Guide</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_q-Tt8v4BCsU/RcqF2cM9VhI/AAAAAAAAAAo/kzXs4EtfrEk/s1600-h/js_def_guide.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_q-Tt8v4BCsU/RcqF2cM9VhI/AAAAAAAAAAo/kzXs4EtfrEk/s320/js_def_guide.gif" alt="" id="BLOGGER_PHOTO_ID_5028979104242554386" border="0" /&gt;&lt;/a&gt;The title does sound presumptuous but after reading it you can only agree that if there is any Javascript book worth reading, this is it. David Flanagan does a most excellent work of introducing the Javascript language and of exploring all the kinks and nice features that you can take from it.&lt;br /&gt;&lt;br /&gt;Having known Javascript for sometime I could not avoid being wowed in some chapters by some cool features that I really did not know existed in the language.&lt;br /&gt;&lt;br /&gt;This 5&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;th&lt;/span&gt; edition is well worth it even if you read previous editions. I did have a previous version and found that this new edition brings a significant amount of new content worth spending your budget in.&lt;br /&gt;&lt;br /&gt;The book is well structure dividing it's presentation in core javascript and client-side javascript. Something I really liked seeing.&lt;br /&gt;&lt;br /&gt;The core Javascript section presents pretty successfully crucial aspects of the language like closures and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;prototyping&lt;/span&gt; (among many others)...Even if you already know Javascript you should give it a try...I'm almost sure you will learn something from it.&lt;br /&gt;&lt;br /&gt;The client-side Javascript is where this book gets even more of its value... from a fantastic &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CSS&lt;/span&gt; reference chapter (I do not believe you need much more than this to get you rolling with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;CSS&lt;/span&gt;), to even handling, DOM navigation, XML handling and scripting with Java, Flash, charting with Javascript and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CSS&lt;/span&gt; (way cool). A really interesting read.&lt;br /&gt;&lt;br /&gt;Like I said before, if you're out to get just one (or your first) Javascript book, I believe this is it! An interesting and absolutely essential read for any web developer these days.&lt;br /&gt;&lt;br /&gt;5 stars!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-6246419983318973581?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/6246419983318973581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=6246419983318973581' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6246419983318973581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6246419983318973581'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2007/02/javascript-definitive-guide.html' title='Javascript: The Definitive Guide'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_q-Tt8v4BCsU/RcqF2cM9VhI/AAAAAAAAAAo/kzXs4EtfrEk/s72-c/js_def_guide.gif' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-3364334139790453675</id><published>2006-12-05T20:36:00.000-05:00</published><updated>2007-01-27T21:50:39.110-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>DNS Analysis and Debugging</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_q-Tt8v4BCsU/RXYfBYh83II/AAAAAAAAAAM/eVID7nL0KU0/s1600-h/dnsstuff.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_q-Tt8v4BCsU/RXYfBYh83II/AAAAAAAAAAM/eVID7nL0KU0/s320/dnsstuff.gif" alt="" id="BLOGGER_PHOTO_ID_5005222144494066818" border="0" /&gt;&lt;/a&gt;If you have to deal with any DNS configuration or want to do some analysis on any other existing DNS, &lt;a href="http://www.dnsstuff.com/"&gt;DNSstuff.com&lt;/a&gt; might just do the trick for you...Including analysis such as DNS reporting (pretty useful since it can point out any errors you might have in your DNS entries), spam database lookups, DNS record retrieval, among many others, this is a time-saver and a great find. Another tool for my tool belt.&lt;br /&gt;&lt;br /&gt;Revision: since I put up this post, DNSstuff is no longer free. A shame since this was a way cool and useful service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-3364334139790453675?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/3364334139790453675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=3364334139790453675' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/3364334139790453675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/3364334139790453675'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/12/dns-analysis-and-debugging.html' title='DNS Analysis and Debugging'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_q-Tt8v4BCsU/RXYfBYh83II/AAAAAAAAAAM/eVID7nL0KU0/s72-c/dnsstuff.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-5837379911824145085</id><published>2006-11-19T23:45:00.000-05:00</published><updated>2007-09-18T11:55:27.951-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development process'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Unit Testing Struts 2.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/2281/2180/1600/42738/struts2_unit.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/2281/2180/320/475158/struts2_unit.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;Edit: for latest on this see &lt;a href="http://fassisrosa.blogspot.com/2007/09/unit-testing-struts-20-part-3.html"&gt;recent post&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unit testing is now (or should be) an established step of the development process in any project. If you're not writing unit tests, you are pretty much leaving yourself ready to commit errors over and over again. Granted there is a category of testing other than unit testing that can be put in place to give you that safety net (see &lt;a href="http://webtst.sourceforge.net/"&gt;WebTst &lt;/a&gt;;-) ) but unit testing has it's well deserved place in the must do list.&lt;br /&gt;&lt;br /&gt;Testing however will only happen, let's face it, if it becomes dead easy (or close to that) for developers to write tests. Crunch time has the tendency to make developers drop their testing efforts and if putting them up is in any way hard or cumbersome, it will not happen.&lt;br /&gt;&lt;br /&gt;So I started looking at simplifying unit testing for &lt;a href="http://struts.apache.org/2.x/"&gt;Struts 2.0&lt;/a&gt; (recently merged from &lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork&lt;/a&gt;). This is, IMHO, a pretty smart and elegant web framework (topic for another post maybe) that if you have not seen, should take a look at. I am using &lt;a href="http://testng.org/"&gt;TestNG &lt;/a&gt;for my testing framework (again, a topic for another post maybe, again a pretty smart framework). One of the selling points of WebWork and Struts 2.0 was the idea that testing your actions should be pretty simple due to the nature of the framework. Dependency injection would be a good step to achieve simplicity in testing and allow you to detach yourself from the need of a servlet container to run your tests.&lt;br /&gt;&lt;br /&gt;And so I dived into trying to add unit testing to my Struts 2.0 actions. Here is what I would like to do ideally to test my actions purely:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Action myAction = getAction("myActionUrl");&lt;br /&gt;String actionResult = myAction.execute();&lt;br /&gt;&lt;/pre&gt;and to test my actions with the interceptor chain in front of them, something which I believe should be pretty important to test in the context of Struts 2.0:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ActionProxy myActionProxy = getActionProxy("myActionUrl");&lt;br /&gt;String result = myActionProxy.execute();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I would then like to do testing on results coming out for execution of the actions. Both testing on result strings and testing on HTML returned in the case of the action proxy where we can get access to the fully processed response. Ideally I would like to make it as simple as above, could make it a bit more involved in some cases...but it should always be dead-easy to write a test. So the answer (to me) is a support class to help with writing unit tests. Ready for code dump ? Here it goes, snipped in the non-relevant aspects. Class implements the singleton pattern and relevant methods for Struts testing are:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt; * Class constructor, take care of Struts initializations&lt;br /&gt; */&lt;br /&gt;private StrutsTestCaseSupport () {&lt;br /&gt;&lt;br /&gt;    // create the struts+spring integrated object factory&lt;br /&gt;    // set spring autowiring by name for spring object factory&lt;br /&gt;    Settings.set(StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE,"name");&lt;br /&gt;    StrutsSpringObjectFactory objectFactory = new StrutsSpringObjectFactory();&lt;br /&gt;&lt;br /&gt;    // set system object facory&lt;br /&gt;    ObjectFactory.setObjectFactory(objectFactory);&lt;br /&gt;&lt;br /&gt;    // set action proxy factory&lt;br /&gt;    ActionProxyFactory.setFactory(new StrutsActionProxyFactory());&lt;br /&gt;&lt;br /&gt;    // create a web application context instance (for spring configuration)&lt;br /&gt;    _applicationContext = new XmlWebApplicationContext();&lt;br /&gt;&lt;br /&gt;    // get ahold of a servlet context to use in the creation of the application context&lt;br /&gt;    ServletContext servletContext = createOneServletContext(_applicationContext);&lt;br /&gt;&lt;br /&gt;    // complete application context initialization, pass in servlet&lt;br /&gt;    // context and config file location, force reading of config (via refresh)&lt;br /&gt;    _applicationContext.setServletContext(servletContext);&lt;br /&gt;    _applicationContext.setConfigLocations(new String[] {"WEB-INF/applicationContext.xml"});&lt;br /&gt;    _applicationContext.refresh();&lt;br /&gt;&lt;br /&gt;    // initialize the object factory with the mock servlet context, application context&lt;br /&gt;    objectFactory.init(servletContext);&lt;br /&gt;    objectFactory.setApplicationContext(_applicationContext);&lt;br /&gt;&lt;br /&gt;    // add a default dispatcher to the system&lt;br /&gt;    Dispatcher du = new Dispatcher(servletContext);&lt;br /&gt;    Dispatcher.setInstance(du);&lt;br /&gt;&lt;br /&gt;    // pass over to the configuration manager location where struts-default.xml,&lt;br /&gt;    // struts-plugin.xml and struts.xml can be found, force reading all&lt;br /&gt;    _configurationManager = new ConfigurationManager();&lt;br /&gt;    _configurationManager.addConfigurationProvider( new StrutsXmlConfigurationProvider("struts-default.xml", false));&lt;br /&gt;    _configurationManager.addConfigurationProvider( new StrutsXmlConfigurationProvider("struts-plugin.xml", false));&lt;br /&gt;    _configurationManager.addConfigurationProvider( new StrutsXmlConfigurationProvider("struts.xml", false));&lt;br /&gt;    _configurationManager.reload();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * create a servlet context useable for a specific action&lt;br /&gt; *&lt;br /&gt; * @param applicationContext the application context to use in the servlet context&lt;br /&gt; * @returns the created servlet context&lt;br /&gt; */&lt;br /&gt;protected ServletContext createOneServletContext (ConfigurableWebApplicationContext applicationContext) {&lt;br /&gt;    // create a servlet context for this action, use FileSystemResourceLoader for&lt;br /&gt;    // context to find configuration files&lt;br /&gt;    ServletContext servletContext = (ServletContext) new MockServletContext(new FileSystemResourceLoader());&lt;br /&gt;&lt;br /&gt;    // initialize freemarker manager config parameter to null (let FreemarkerManager figure&lt;br /&gt;    // out configuration location out of ServletContext)&lt;br /&gt;    Settings.set(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");&lt;br /&gt;    servletContext.setAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY,null);&lt;br /&gt;&lt;br /&gt;    // hand over application context to servlet context&lt;br /&gt;    servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext);&lt;br /&gt;&lt;br /&gt;    return servletContext;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Build one action context for an accessmethod and an access url&lt;br /&gt; *&lt;br /&gt; * @param serverName the hostname that the request will need to hook up to&lt;br /&gt; * @param accessMethod http method to use (e.g. 'get', 'post', 'put', etc)&lt;br /&gt; * @param accessUrl the url to access&lt;br /&gt; * @returns the map for the action's context&lt;br /&gt; */&lt;br /&gt;public Map&lt;object,object&gt; buildActionContext ( String serverName, String accessMethod, String accessUrl, Map&lt;string,string&gt; requestParamMap ) {&lt;br /&gt;    // get ahold of a brand new servlet context&lt;br /&gt;    ServletContext servletContext = createOneServletContext(_applicationContext);&lt;br /&gt;&lt;br /&gt;    // create fake request and response objects&lt;br /&gt;    MockHttpServletRequest request = new MockHttpServletRequest(servletContext,accessMethod,accessUrl);&lt;br /&gt;    MockHttpServletResponse response = new MockHttpServletResponse();&lt;br /&gt;&lt;br /&gt;    // set request server name&lt;br /&gt;    request.setServerName(serverName);&lt;br /&gt;&lt;br /&gt;    // add request parameters&lt;br /&gt;    for ( String oneParamName : requestParamMap.keySet() ) {&lt;br /&gt;        request.addParameter(oneParamName,requestParamMap.get(oneParamName));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // add context, request and response to an action context map&lt;br /&gt;    Map&lt;object,object&gt; actionContext = new HashMap&lt;object,object&gt;();&lt;br /&gt;    actionContext.put(StrutsStatics.SERVLET_CONTEXT,servletContext);&lt;br /&gt;    actionContext.put(StrutsStatics.HTTP_REQUEST,request);&lt;br /&gt;    actionContext.put(StrutsStatics.HTTP_RESPONSE,response);&lt;br /&gt;    actionContext.put(ActionContext.PARAMETERS,new HashMap());&lt;br /&gt;    actionContext.put(ActionContext.DEV_MODE,new Boolean(true));&lt;br /&gt;&lt;br /&gt;    return actionContext;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * create a bean from the object factory (all wired up from Spring)&lt;br /&gt; *&lt;br /&gt; * @param beanName the name of the bean to get from the object factory&lt;br /&gt; * @param extraContent any extra content information to pass along to the bean building&lt;br /&gt; *        process&lt;br /&gt; * @returns the object factory created bean&lt;br /&gt; */&lt;br /&gt;public Object createBean ( String beanName, Map&lt;object,object&gt; extraContext )&lt;br /&gt;throws Exception {&lt;br /&gt;    return ObjectFactory.getObjectFactory().buildBean(beanName,extraContext);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * create an action proxied by it's interceptor stack&lt;br /&gt; *&lt;br /&gt; * @param actionName the name/id for the action&lt;br /&gt; * @param actionNameSpace the namespace for the action&lt;br /&gt; * @param actionContext the action context for creating the proxy (created from buildActionContext)&lt;br /&gt; * @returns the proxyed action&lt;br /&gt; */&lt;br /&gt;public ActionProxy createActionProxy ( String actionName, String actionNamespace, Map&lt;object,object&gt; actionContext)&lt;br /&gt;throws Exception {&lt;br /&gt;    return createActionProxy(actionName,actionNamespace,actionContext,new HashMap&lt;object,object&gt;());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * create an action proxied by it's interceptor stack&lt;br /&gt; *&lt;br /&gt; * @param actionName the name/id for the action&lt;br /&gt; * @param actionNameSpace the namespace for the action&lt;br /&gt; * @param actionContext the action context for creating the proxy (created from buildActionContext)&lt;br /&gt; * @param sessionMap the request/invocation session map (for http session map mocking)&lt;br /&gt; * @returns the proxyed action&lt;br /&gt; */&lt;br /&gt;public ActionProxy createActionProxy ( String actionName, String actionNamespace, Map&lt;object,object&gt; actionContext, Map&lt;object,object&gt; sessionMap )&lt;br /&gt;throws Exception {&lt;br /&gt;    ActionProxy actionProxy = ActionProxyFactory.getFactory().createActionProxy(_configurationManager.getConfiguration(),actionNamespace,actionName,actionContext);&lt;br /&gt;&lt;br /&gt;    // set the session map in the action proxy's invocation&lt;br /&gt;    actionProxy.getInvocation().getInvocationContext().setSession(sessionMap);&lt;br /&gt;&lt;br /&gt;    return actionProxy;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * create an action object, bypass all it's stacks. Have it properly injected&lt;br /&gt; * according to configurations.&lt;br /&gt; *&lt;br /&gt; * @param actionName the name/id for the action&lt;br /&gt; * @param actionNameSpace the namespace for the action&lt;br /&gt; * @param actionContext the action context for creating the proxy (created from buildActionContext)&lt;br /&gt; * @returns the properly injected action&lt;br /&gt; */&lt;br /&gt;public Object createAction ( String actionName, String actionNamespace, Map&lt;object,object&gt; actionContext )&lt;br /&gt;throws Exception {&lt;br /&gt;    // get ahold of the action's configuration via the XWorkConfigRetriever class&lt;br /&gt;    ActionConfig actionConfig = _configurationManager.getConfiguration().getRuntimeConfiguration().getActionConfig(actionNamespace,actionName);&lt;br /&gt;&lt;br /&gt;    // create one instance of the action to test using the object factory, pass in action config and context&lt;br /&gt;    return ObjectFactory.getObjectFactory().buildAction(actionName, actionNamespace, actionConfig, actionContext);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/object,object&gt;&lt;/string,string&gt;&lt;/object,object&gt;&lt;/pre&gt;With this support class, I can now write my tests:&lt;br /&gt;&lt;pre&gt;       // create action context for my action, feed&lt;br /&gt;    // into the action context all request parameters&lt;br /&gt;    Map&lt;string,string&gt; requestParameters = new HashMap&lt;string,string&gt;();&lt;br /&gt;    requestParameters.put("param1","param1-value");&lt;br /&gt;    requestParameters.put("param2","param2-value");&lt;br /&gt;    Map actionContext = StrutsTestCaseSupport.getInstance().buildActionContext("my.hostname.com","get","/myActionNamespace/myActionName",requestParameters);&lt;br /&gt;&lt;br /&gt;    // create the proxy for the action, this encapsulates all&lt;br /&gt;    // the interception stack up to the real action&lt;br /&gt;    ActionProxy proxy = StrutsTestCaseSupport.getInstance().createActionProxy("myActionName","myActionNameSpace",actionContext);&lt;br /&gt;   // if needed be, get ahold of particular action underlying proxy and&lt;br /&gt;   // inject parameters as required&lt;br /&gt;&lt;br /&gt;   // let the full stack run&lt;br /&gt;    String result = proxy.execute();&lt;br /&gt;&lt;br /&gt;    // confirm result&lt;br /&gt;    assert result.equals("myTestResponseString");&lt;br /&gt;&lt;br /&gt;    // look into mock HttpServletResponse, do whatever&lt;br /&gt;    // tests I need to do: returned HTML, returned headers,&lt;br /&gt;    // cookies, etc...&lt;br /&gt;    String responseXml = ((MockHttpServletResponse)actionContext.get(StrutsStatics.HTTP_RESPONSE)).getContentAsString();&lt;br /&gt;    assert responseXml.indexOf("&lt;status&gt;success&lt;/status&gt;") != -1;&lt;br /&gt;&lt;/string,string&gt;&lt;/string,string&gt;&lt;/pre&gt;Or test unproxyed actions directly:&lt;br /&gt;&lt;pre&gt;       // create action for my action&lt;br /&gt;    Map&lt;string,string&gt; requestParameters = new HashMap&lt;string,string&gt;();&lt;br /&gt;    requestParameters.put("param1","param1-value");&lt;br /&gt;    requestParameters.put("param2","param2-value");&lt;br /&gt;    Map actionContext = StrutsTestCaseSupport.getInstance().buildActionContext("my.hostname.com","get","/myActionNamespace/myActionName",requestParameters);&lt;br /&gt;&lt;br /&gt;    // create the proxy for the action, this encapsulates all&lt;br /&gt;    // the interception stack up to the real action&lt;br /&gt;    Action myAction = StrutsTestCaseSupport.getInstance().createAction("myActionName","myActionNameSpace",actionContext);&lt;br /&gt;   // if needed be, get ahold of particular action underlying proxy and&lt;br /&gt;   // inject parameters as required&lt;br /&gt;&lt;br /&gt;   // let the full stack run&lt;br /&gt;    String result = myAction.execute();&lt;br /&gt;&lt;br /&gt;    // confirm result&lt;br /&gt;    assert result.equals("myTestResponseString");&lt;br /&gt;&lt;/string,string&gt;&lt;/string,string&gt;&lt;/pre&gt;So testing became *a lot* simpler to me...my support class deals with all infrastructure hooking up and my test is simplified...and more tests get written... ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-5837379911824145085?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/5837379911824145085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=5837379911824145085' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/5837379911824145085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/5837379911824145085'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20.html' title='Unit Testing Struts 2.0'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-7418604583129643468</id><published>2006-11-15T09:22:00.000-05:00</published><updated>2006-11-15T16:13:34.924-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'>iPodaholic</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/ipod2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/400/ipod2.png" alt="" border="0" /&gt;&lt;/a&gt;Last year I dove into the iPod addiction...Maybe not very typically, I really did not get into it because of music but because of technical podcasts. Music I can do in a number of other ways but the amount of technical podcasts that are out there for free is just overwhelming and it can be a fantastic source for free training and technical news feed. I have not regretted diving into it yet and am currently in a iPodaholic state. This is a fantastic way to make your commute useful and pleasurable. Ironically I now think my commute is just too short (got me an  &lt;a href="http://www.griffintechnology.com/products/itrip/"&gt;iTrip FM transmitter&lt;/a&gt; to hook it up to my car radio). :-) Podcast shows are getting more and more interesting and show durations are getting longer with deeper more involved content coming in. To any developer these days I say that listening to podcasts is now an essential way to keep up to date, in addition to book reading, playing with cool stuff after-hours, magazines and blogs (and I wonder where time goes!?!!?). I should also be saying that podcasting is not only about technical podcasts.....there is pretty much a podcast for any thing you might think of.&lt;br /&gt;&lt;br /&gt;Anyway, these are the must-have-on-my-iPod podcasts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javaposse.com/"&gt;The Java Posse&lt;/a&gt;: in my opinion, the best podcast out there on Java development. These guys do news info update, analysis of tools, overall software development discussions. Absolutely top of my list.&lt;/li&gt;&lt;li&gt;&lt;a href="http://softwareas.com/"&gt;Software as She Developed&lt;/a&gt;: pretty interesting podcast on software development. The author Michael Mahemoff is the author of the &lt;a href="http://www.amazon.com/Ajax-Design-Patterns-Michael-Mahemoff/dp/0596101805/sr=8-1/qid=1163601557/ref=pd_bbs_sr_1/002-7918864-5573664?ie=UTF8&amp;s=books"&gt;Ajax Design Patterns&lt;/a&gt; book so you can expect this podcast to bring in a good amount of that experience.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ajaxian.com/"&gt;Audible Ajax&lt;/a&gt;: name says all, a really good podcast on Ajax.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt;: good presentations on software engineering in general. Covering topics like agile development, SOA, development processes, etc.&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapolis.libsyn.com/rss.xml"&gt;Javapolis&lt;/a&gt;: one of the best Java conferences around. You can find podcast feeds for some of the presentations in here. A free way to "be" at the conference.&lt;/li&gt;&lt;li&gt;&lt;a href="http://talkcrunch.com/"&gt;TalkCrunch&lt;/a&gt;: a really interesting podcast on web 2.0 companies.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.venturevoice.com/"&gt;Venture Voice&lt;/a&gt;: talks and discussions on entrepreneurship.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.podtech.net/entrepreneurship/"&gt;PodTech's Entrepreneurship Podcast&lt;/a&gt;: talks and discussions on entrepeneurship.&lt;/li&gt;&lt;/ul&gt;If you have not tried the podcasting listening experience I would say you &lt;span style="font-weight: bold;"&gt;need &lt;/span&gt;to try it! You can try it before you buy your player just by getting &lt;a href="http://www.apple.com/itunes/"&gt;iTunes &lt;/a&gt;for instance...&lt;br /&gt;&lt;br /&gt;And...if you have any other interesting tech podcast please drop me a line! I want more! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-7418604583129643468?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/7418604583129643468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=7418604583129643468' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/7418604583129643468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/7418604583129643468'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/11/ipodaholic.html' title='iPodaholic'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-6795734701412925148</id><published>2006-10-13T09:45:00.000-04:00</published><updated>2006-10-13T09:54:13.173-04:00</updated><title type='text'>Tizra Blog is alive!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/tizraLogo.0.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/320/tizraLogo.jpg" alt="" border="0" /&gt;&lt;/a&gt;Tizra's blog is now alive! In there you should hope to find the Tizra's team ramblings on the web publishing world...technical hints, development process observations, geekly comments and cool notes on what is going on. The blog is alive at &lt;a href="http://tizra.blogspot.com/"&gt;http://tizra.blogspot.com/&lt;/a&gt;. I will be splitting some of my blogging time between this blog and the new Tizra blog, but putting on the new blog some more focus on what we are doing at Tizra and practices that worked there. Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-6795734701412925148?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/6795734701412925148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=6795734701412925148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6795734701412925148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6795734701412925148'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/10/tizra-blog-is-alive.html' title='Tizra Blog is alive!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-6572386362739897446</id><published>2006-10-01T23:00:00.001-04:00</published><updated>2006-10-01T23:00:12.006-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><title type='text'>TiddlyWiki</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/tiddlyWiki.1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/200/tiddlyWiki.jpg" alt="" border="0" /&gt;&lt;/a&gt;Wikis should now hold, I believe, a crucial place in every development team's utility belt. Information sharing, knowledge transmission, they all represent fundamental aspects of the development process within a team. There are a ton of wikis out there (e.g. see &lt;a href="http://jspwiki.org/"&gt;JSPWiki &lt;/a&gt;for instance) that provide the full features that will allow for this information knowledge base repository to be implemented.&lt;br /&gt;&lt;br /&gt;Now, sometimes wouldn't it be nice to have a small personal wiki to jot your thoughts, todo lists, tips and tricks ? Something that you probably would not want to store on a shared wiki. &lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki &lt;/a&gt;gives you just that. For starters it is pretty impressive the ease in which you can start doing something with it....You just download a single html file (loaded with javascript functionality) drop it into a directory on your disk and access it via a browser. That's it. no more installation steps/tools/servers required! You're up-and-running ready to start writing. How cool is that ? And bringing features like tagging, RSS this brings an even more useful experience to the mix.&lt;br /&gt;&lt;br /&gt;Yet another tool in my tool belt (will probably need a new belt sometime soon...mine is getting too crowded...;-) ).&lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;Another tip picked up at the &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff&lt;/a&gt; conference. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-6572386362739897446?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/6572386362739897446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=6572386362739897446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6572386362739897446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/6572386362739897446'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/10/tiddlywiki.html' title='TiddlyWiki'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-9050413909842995943</id><published>2006-10-01T22:59:00.000-04:00</published><updated>2006-10-01T23:00:01.422-04:00</updated><title type='text'>No Fluff Just Stuff Impressions</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/nfjs_logo200.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5970/1732/200/nfjs_logo200.gif" alt="" border="0" /&gt;&lt;/a&gt;Damn you Jay Zimmerman for making my life so hard during the &lt;span style="font-style: italic;"&gt;No Fluff Just Stuff &lt;/span&gt;conference days ;-). For two and a half days you made me go through the excruciating pain of having to choose one presentation for each time slot...I mean...you could have put boring, uninteresting sessions in there to make my life easier but nooooooo...you had to give us a choice of absolutely fascinating topics presented by brilliant speakers. And pretty much at all time slots ? Come on....I came back refreshed and enthusiastic from the presentations, exhausted from the selection process.&lt;br /&gt;&lt;br /&gt;Now seriously (in case you have not picked up *yet* that I'm joking), the &lt;span style="font-style: italic;"&gt;No Fluff Just Stuff &lt;/span&gt;conference was simply fantastic. The organization, and Jay Zimmerman in particular, did a fantastic job of putting this together. The place was pretty well setup, the materials were really good and organized, the topics impressive (I would have gone to all of them could I clone myself!), the speaker list really overwhelming. You would get to hear the presentations in decently sized rooms (not huge theater like places like other conferences), you would get to interact with the speakers (in and out of the sessions) to ask questions and just exchange ideas.  And there were even nice goodies raffled among the audience (I was not one of the lucky ones to get a prize but hey, that was not what I went there for ... obviously still trying to rationalize! ;-) )&lt;br /&gt;&lt;br /&gt;In short...count me in for the next one! This is a hidden gem of a conference!&lt;br /&gt;&lt;br /&gt;And, if you could not make it, you can still get the &lt;a href="http://www.amazon.com/Fluff-Stuff-Anthology-Pragmatic-Programmers/dp/0977616665/sr=8-1/qid=1159980524/ref=pd_bbs_1/002-7918864-5573664?ie=UTF8&amp;amp;s=books"&gt;No Fluff Just Stuff Anthology&lt;/a&gt; from any shelf of any good tech bookstore (or amazon if you also consider virtual shelves for that matter).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-9050413909842995943?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/9050413909842995943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=9050413909842995943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/9050413909842995943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/9050413909842995943'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/10/no-fluff-just-stuff-impressions.html' title='No Fluff Just Stuff Impressions'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-5035752041603585825</id><published>2006-09-16T23:39:00.000-04:00</published><updated>2006-09-16T23:56:35.989-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='tizra'/><title type='text'>Blogger Enhancements and Tizra AgilePDF Boasting</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/logo100.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/320/logo100.gif" alt="" border="0" /&gt;&lt;/a&gt;Now we're cooking! Last week I upgraded my Blogger blogs to the new Blogger Beta...This new beta adds a couple of new features that I consider to be crucial for a useful and rich blog.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You are now able to add tags to my blog entries (have you checked my right navigation bar since then ? ;-) ) thus effectively  achieving category grouping of these entries.&lt;/li&gt;&lt;li&gt;You can now create private blogs. And why would I want that you may ask ? For small teams it is often useful to have a repository of shared information and/or comments. While for some things the use of a Wiki (see &lt;a href="http://en.wikipedia.org/wiki/Wiki"&gt;Wikipedia entry for Wiki&lt;/a&gt;) fits the bill of storing and sharing knowledge, for others the use of a blog can be more appropriate (not impossible to do via a Wiki, just a bit more awkward). Recent news of interest, cool interesting things out there, these all fall more into the info better usable in a blog.&lt;/li&gt;&lt;li&gt;It provides a drag-and-drop interface for blog template management, provides an enhanced set of blogger tags for simpler layout management.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It provides an enhanced user interface for some of the blog's visual components, take a look for instance at the new archive navigation tree, pretty cool.&lt;/li&gt;&lt;/ul&gt;At this point I will have to boast a bit and put in my shameless plug...;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&amp;lt;shamelessPlug&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/agilepdf1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/200/agilepdf1.jpg" alt="Defining page layout structure" title="Defining page layout structure" border="0" /&gt;&lt;/a&gt;If you like what you see in terms of control of the appearance of your blog, you should *really* see what we are doing at &lt;a href="http://www.tizra.com/"&gt;Tizra&lt;/a&gt;...We are building a web tool for pdf content publishers, the AgilePDF product, that gives the admin user total control over all aspects of their site including presentation, content management, search, access control, creation and selling of admin defined products. The layout definition component in particular is a component that currently really overwhelms what the Blogger page editor is offering, if you liked that one, you should see ours! ;-) It offer the means to change the presentation of the site by providing a pretty nifty drag-and-drop interface for site structuring definition and CSS definition interface.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/agilepdf2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/200/agilepdf2.jpg" alt="Publishing Content" title="Publishing Content" border="0" /&gt;&lt;/a&gt;The Publishing experience makes use of currently available rich client technologies thus eliminating the typical "Push and Pray" experience of a good number of publisher applications out there making it possible for people to *actually know* what is going on when interacting with the system.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/agilepdf3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/200/agilepdf3.jpg" alt="Published and looking just like you wanted!" title="Published and looking just like you wanted!" border="0" /&gt;&lt;/a&gt;At the end of the day, a nice looking (actually as nice as you might want to make it! ;-) we offer nice looking canned solutions that might get you started towards a nice looking site but you are free to do whatever you want with it, including make it look ugly if for nothing else to make a statement! :-) ), site is out there with your content properly presented, giving you a nice web-like experience to content that usually is not very web-friendly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&amp;lt;/shamelessPlug&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If Blogger was already a nice tool for bloggers and small companies, it becomes even more so after these nice enhancements. I'll keep drilling through the new beta...blogging...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-5035752041603585825?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/5035752041603585825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=5035752041603585825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/5035752041603585825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/5035752041603585825'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/09/blogger-enhancements-and-tizra-agilepdf.html' title='Blogger Enhancements and Tizra AgilePDF Boasting'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-425700839305873764</id><published>2006-09-15T17:55:00.001-04:00</published><updated>2006-09-15T17:55:40.034-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Computer Science Talks</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2281/2180/1600/sptm133.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2281/2180/320/sptm133.jpg" alt="" border="0" /&gt;&lt;/a&gt;If you are looking for some computer science talks/presentations, &lt;a href="http://www.researchchannel.org/prog/"&gt;Research Channel&lt;/a&gt; is a nice gathering place for a whole number of interesting presentations on a number of different topics (and other non CS related topics for that matter). The &lt;a href="http://www.cs.washington.edu/news/colloq.info.html"&gt;University of Washington Computer Science and Engineering site&lt;/a&gt; also presents a pretty cool list of colloquiums available for public viewing. Spanning a whole slew of CS subjects, from &lt;a href="http://norfolk.cs.washington.edu/htbin-post/unrestricted/colloq/details.cgi?id=437"&gt;Distributed Storage Systems&lt;/a&gt; to &lt;a href="http://norfolk.cs.washington.edu/htbin-post/unrestricted/colloq/details.cgi?id=105"&gt;Google's Linux Cluster&lt;/a&gt;, the list is just too big to reproduce here....&lt;br /&gt;&lt;br /&gt;All in all a pretty cool resource for getting to learn a bit more....Fair warning: you could be in there for some serious time...;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-425700839305873764?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/425700839305873764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=425700839305873764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/425700839305873764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/425700839305873764'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/09/computer-science-talks.html' title='Computer Science Talks'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-115331820488639743</id><published>2006-07-19T10:02:00.000-04:00</published><updated>2006-07-19T10:12:01.213-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>No Fluff Just Stuff</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/nfjs_logo200.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5970/1732/200/nfjs_logo200.gif" alt="" border="0" /&gt;&lt;/a&gt;The No Fluff Just Stuff Symposium has been doing the rounds for sometime now...This is an excellent event for Java developers, architects, testers, etc... It usually displays an impressive list of presentations covering a good range of Java and/or Software Development topics and usually brings some pretty interesting names of the Java development community for the presentations. The symposium goes around the country so there is a good chance you might get one close to you...If you have not heard about it, check it out at the &lt;a href="http://www.nofluffjuststuff.com/index.jsp"&gt;No Fluff Just Stuff site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My registration to the &lt;a href="http://www.nofluffjuststuff.com/show_view.jsp?showId=69"&gt;Boston NFJS symposium&lt;/a&gt; Sep. 29 - Oct. 1 2006 is already in...See you there! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-115331820488639743?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/115331820488639743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=115331820488639743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115331820488639743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115331820488639743'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/07/presentation-no-fluff-just-stuff.html' title='No Fluff Just Stuff'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-115323845493158168</id><published>2006-07-18T11:52:00.000-04:00</published><updated>2006-07-18T12:03:51.326-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Free books online!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/MasteringEJB.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5970/1732/200/MasteringEJB.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Not a pitch...they are really free. &lt;a href="http://www.theserverside.com/"&gt;TheServerSide&lt;/a&gt;, which happens to be a really good site for java related technical content (got my RSS feed reader hooked up to it, read through the feed always with eager anticipation), is offering a couple of books in PDF format for free. All Java related these include:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/wiley/masteringEJB3/index.tss"&gt;Mastering Enterprise JavaBeans 3.0&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/wiley/masteringEJB/index.tss"&gt;Mastering Enterprise JavaBeans 3rd edt (EJB 2.1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/DVTPress/J2EEArchitectsHandbook/index.tss"&gt;The J2EE Architect's Handbook&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/addisonwesley/ServletsJSP/index.tss"&gt;Servlets and JavaServer Pages: The J2EE Technology Web Tier&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/prenticeHall/JavaTestingAndDesign/index.tss"&gt;Java Testing and Design&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/sourcebeat/JakartaStrutsLive/index.tss"&gt;Jakarta Struts Live&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/books/wiley/EJBDesignPatterns/index.tss"&gt;EJB Design Patterns&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;You need to register on the site to "get the goodies" but it is worth it. Pretty interesting stuff, yet again, from &lt;a href="http://www.theserverside.com/"&gt;TheServerSide&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-115323845493158168?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/115323845493158168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=115323845493158168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115323845493158168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115323845493158168'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/07/booktip-free-books-online.html' title='Free books online!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-115279820913088471</id><published>2006-07-13T09:38:00.000-04:00</published><updated>2006-07-13T09:43:29.130-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>JavaOne 2006 Sessions Online</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/java.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5970/1732/320/java.jpg" alt="" border="0" /&gt;&lt;/a&gt;Sun has posted the JavaOne conference technical content online. These can be found at  the &lt;a href="http://developers.sun.com/learning/javaoneonline/"&gt;Sun Developer Network site&lt;/a&gt; in PDF  and multimedia format (audio + slides). Really interesting information in there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-115279820913088471?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/115279820913088471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=115279820913088471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115279820913088471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115279820913088471'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/07/presentation-javaone-2006-sessions.html' title='JavaOne 2006 Sessions Online'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-115271182388607852</id><published>2006-07-12T09:35:00.000-04:00</published><updated>2006-07-12T10:10:47.673-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><title type='text'>Getting organized!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/airset.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5970/1732/320/airset.jpg" alt="" border="0" /&gt;&lt;/a&gt;When you work on several things at time it becomes really important for you to track what you need to do, when you need to do it and to be "nudged" when it is time to do them...And along come things like &lt;a href="http://www.google.com/calendar"&gt;Google Calendar&lt;/a&gt; and &lt;a href="http://www.airset.com/"&gt;Airset &lt;/a&gt;(among tons of others!). I have personally been using &lt;a href="http://www.airset.com/"&gt;Airset &lt;/a&gt;for quite sometime (long before &lt;a href="http://www.google.com/calendar"&gt;Google Calendar&lt;/a&gt; showed up) and have been pretty impressed with what they have. With such an application I can keep separate calendars for my private life and my work. Even within the work information we can keep separate events from different activities (e.g. management roles activities, development activities, staff vacation). Nicest thing, you can have separate views or integrated views....easy enough to provide people synchronization since some of those calendar sections (tabs in their nomenclature) can be made shareable effectively allowing for people to know what each other is doing. And....for people like me that like to be "nudged" you can have as many warnings as you want on an event that is about to happen...&lt;br /&gt;&lt;br /&gt;So.....no more excuses...Get organized!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-115271182388607852?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/115271182388607852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=115271182388607852' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115271182388607852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/115271182388607852'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/07/tool-getting-organized.html' title='Getting organized!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-114986387479234779</id><published>2006-06-09T10:37:00.000-04:00</published><updated>2006-07-11T22:40:25.243-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Sharing initialization across Unit Tests</title><content type='html'>In principle unit tests should be isolated from each other to ensure that running one unit test does not influence another. There is however, I believe, a case where having a shared initialization between unit tests can make a lot of sense. Whenever a time consuming initialization needs to take place, and when one can ensure that the state of the initialized environment does not influence in any way the tests, then it is really important to share initialization. One of the goals of unit testing is to make it easy to test, to promote a test-often approach and that will conflict with long initialization times. An initialization that takes a couple of seconds, although very acceptable for a running application is not acceptable at all for unit testing. If you do follow the test-often approach, you will be building a large number of tests (not hard to admit you will have several dozens, hundreds of tests). Multiply that by the initialization cost and testing becomes unbearable.&lt;br /&gt;&lt;br /&gt;Example of the above. I have been working for sometime with &lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork&lt;/a&gt;+&lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;+&lt;a href="http://www.hibernate.org/"&gt;Hibernate &lt;/a&gt;and using &lt;a href="http://www.junit.org/index.htm"&gt;JUnit &lt;/a&gt;for unit testing integrated in the build/deployment process via &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;. The startup time for the system is around 8 seconds (still way lower than a full J2EE application server startup time ;-)...but after even a mere 12 tests it becomes impossible to have to wait for a simple test run. By isolating the initialization of WebWork+Spring+Hibernate in a shared initialization class, I was able to reduce the overall tests run time by a huge factor. Somewhere from 104s to 12s in my simple (very simple) case of 12 tests.&lt;br /&gt;&lt;br /&gt;The solution for me, I create a singleton class that isolates all shared initialization then I make sure all tests run via ant using the task batchtest with forking enabled and with forkmode set to 'perBatch' (see &lt;a href="http://ant.apache.org/manual/OptionalTasks/junit.html"&gt;http://ant.apache.org/manual/OptionalTasks/junit.html&lt;/a&gt;) and voila, I get shared initialization and a huge reduction in test running.&lt;br /&gt;&lt;br /&gt;After looking online for similar issues, I found the link &lt;a href="http://beust.com/weblog/archives/000082.html"&gt;http://beust.com/weblog/archives/000082.html&lt;/a&gt; that talks a bit about this same issue confirming my worries and validating this approach.&lt;br /&gt;&lt;br /&gt;My belief in unit testing restored, I continue my development with my nice safety net in place...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-114986387479234779?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/114986387479234779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=114986387479234779' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114986387479234779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114986387479234779'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/06/tip-sharing-initialization-across-unit.html' title='Sharing initialization across Unit Tests'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-114968774917695133</id><published>2006-06-07T09:42:00.000-04:00</published><updated>2006-07-07T09:55:33.000-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><title type='text'>FireBug</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5970/1732/1600/firebug.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/5970/1732/320/firebug.jpg" alt="" border="0" /&gt;&lt;/a&gt;Every developer "carries" his bag of tools around when doing their work...This bag of tools can represent a precious advantage since a good tool applied at the right moment can bring speed and quality to the development effort. It is quite unlikely you will find a tool that "fits all" (a tool for each job) and the developer does need to know enough of the tool and problem to solve to make it useful (it is not the weapon that makes the warrior, it is the warrior that makes the weapon). But sure enough, some tools are just too good and should be in every developer's bag. A tool which I found to be a must for any serious web developer doing from just regular HTML coding to AJAX development is the &lt;a href="http://www.joehewitt.com/software/firebug/"&gt;Firebug &lt;/a&gt;Firefox extension (you are using Firefox right?!?! ;-) ). The tool allows you (among other functionality) to:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Inspect HTML, by moving your mouse around you can get to see the HTML snippet relevant to the element highlighted on the browser.&lt;/li&gt;&lt;li&gt;Inspect properties like positioning, styles on inspected HTML elements.&lt;/li&gt;&lt;li&gt;Inspect events happening in your pages.&lt;/li&gt;&lt;li&gt;Inspect the DOM of your page.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Perform Javascript debugging.&lt;/li&gt;&lt;li&gt;Show all AJAX interactions between your page and the underlying server.&lt;/li&gt;&lt;li&gt;Show all kinds of errors (e.g. CSS, Javascript, etc)&lt;/li&gt;&lt;/ul&gt;In short, if you are doing web development and have not seen Firebug in action before, you should spend sometime looking at it...It will save you hours in any future development. It sure is in my bag of tools to stay. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-114968774917695133?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/114968774917695133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=114968774917695133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114968774917695133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114968774917695133'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/06/tool-firebug.html' title='FireBug'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-114788973820277435</id><published>2006-05-17T14:02:00.000-04:00</published><updated>2006-05-22T11:52:24.740-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><title type='text'>Eventum Issue/Bug Tracking System</title><content type='html'>I had been looking for an  issue bug tracking  system in my spare time...I had of course had previous encounters with several bug/issue tracking systems (BITS :-) ) but had found them to be either not very useful in terms of information gathered and reporting (e.g. several in-house built/adapted systems I've worked with) or overly complicated for simple bugs/issue reporting (e.g. Bugzilla). Do you really want to have your users go through the pain of a million selections to report a bug, especially when most of these selections do not make sense to a user of your software ? Do you instead use a system from which you can not extract information how you want it ? After some browsing around, I have bumped into &lt;a href="http://dev.mysql.com/downloads/other/eventum/features.html"&gt;Eventum&lt;/a&gt; a BITS from the MySQL AB technical support team. I have been surprised with what I have seen so far....Here is a list of things which impressed me:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reporting format configurable per user role. You can hide those nasty fields from your end-users, but still allow these fields to be visible/manipulated by higher privileges users. Decision control to where it makes sense to be.&lt;/li&gt;&lt;li&gt;Built-in release planning. Bug resolution can be assigned to specific releases of your software giving you a nice planning tool synched with your BITS.&lt;/li&gt;&lt;li&gt;Integration with &lt;span class="default"&gt;Source Control Management (SCM). Pretty cool that you can have your SCM synch with the BITS to have software check ins cross-referenced with bug/issues.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;Reports. Loads of them....Pretty useful the majority of them.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;Time tracking (a dear topic of mine...See &lt;a href="http://trackitez.sourceforge.net/"&gt;TrackItEZ&lt;/a&gt;). The system allows for bug/issue fixing estimation, tracking of time spent and reporting on estimate deviation.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;Pretty cool nice visuals on overall bug listings...Eye candy I know, but often a picture is worth more than a thousand words... ;-)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;Definition *per project* of priority definitions for bugs/issues. You can not believe the amount of people complain about the kind of priorities BITS impose on you...Roll your own then....It is a fact that bugs/issues priorities definitions *should* be different depending on the kind of project you are working with (a web served application project is indeed different from a pure desktop applications, different worries, different types of issues).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;CSS driven design...Yup...You are free to make it as ugly looking as you want... ;-)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;Email bug/issue reporting: you get to configure email accounts to receive bugs/issues into the system. Nice.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="default"&gt;It's open-source and free (&lt;a href="http://www.gnu.org/copyleft/gpl.html"&gt;GPL&lt;/a&gt;).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;I will indeed be playing more with it but so far it looks like these guys got their stuff right....Bravo! I'll keep using it and see if I keep liking it as much as I have been so far....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-114788973820277435?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/114788973820277435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=114788973820277435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114788973820277435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114788973820277435'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/05/tool-eventum-issuebug-tracking-system.html' title='Eventum Issue/Bug Tracking System'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-114458559024348177</id><published>2006-04-09T08:26:00.000-04:00</published><updated>2006-04-09T23:15:54.863-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Java Server Faces in Action</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/jsfInAction.jpg"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/5970/1732/200/jsfInAction.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I have recently been looking at Java Server Faces and, as usual, went through the first phase of trying to understand what is involved in using it....What it can bring in and what are the compromises one has to do when using it. I am a firm believer of a tool for each job and just dove in trying to understand what kind of tool this is...So...I picked up &lt;em&gt;Java Server Faces in Action&lt;/em&gt; and went wild with a mix of reading then diving into action (staying true to the philosophy of the &lt;em&gt;in Action&lt;/em&gt; series). So here are my conclusions...&lt;br /&gt;&lt;br /&gt;The book is actually a good book. Would not say excellent since it spends a whole lot listing components and attributes before diving into application of it. Something which makes for a bit of what feels like a slow reading. That being said, it does expose pretty well what you can do with JSF. Granted it is pretty valuable, but I also found a bit annoying the fact that there are an extra set of 5 chapters and 4 appendixes online and not in the print version (not published after the fact! They are even listed in the book's table of contents!!). There is a reason why I buy hardcopy books and that is that I really like having the print version and be free to read something irrespective of the presence of a internet connection or the presence of a computer with a downloaded PDF. And I really can do without printing an extra set of 270 pages (got to give a break to my home printers!).&lt;br /&gt;&lt;br /&gt;What about JSF ? Well, I do get mixed feelings about it and to be honest I do not think that, given the nature of applications I write, I am ready to start using it just right now...Some comments on what I read and played with...&lt;br /&gt;As I read this, I also browsed online for comments and applications of JSF. In particular I listened to the &lt;a href="http://timshadel.com/"&gt;ZDot Podcasts&lt;/a&gt; by Tim Shadel. A lot of fuss was raised in the Java community around this podcast (see &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=38601"&gt;TheServerSide&lt;/a&gt; for instance, a ton more out there). Tim does point out some interesting and somewhat valid issues if JSF. Some are surely no longer applicable since he had been using an old version of JSF and do believe some of the issues he faced (e.g. bad quality of generated HTML) is no longer that much of an issue. I also believe that most importantly he might have missed an important point that you have &lt;em&gt;each tool for each job&lt;/em&gt;. After reading and playing a ton with JSF I am convinced that the kind of applications JSF applies to are rich, almost desktop like, web applications and not your regular website.&lt;br /&gt;But he does make pretty good points about some shortcomings of the technology. Taking that and my experiments here is what I liked and did not like about JSF.&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It is a pretty cool technology with a well thought of architecture. I really like the concept of components and regardless of other comments, I like the 7 layer burrito to implement the life cycle of a component. &lt;/li&gt;&lt;li&gt;Being component oriented I do see the huge advantages of getting pre-built components that already do the "dirty work" for you. It is indeed the basis for efficient code reuse.  &lt;a href="http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/jsf/index.html"&gt;Oracle ADF&lt;/a&gt; and &lt;a href="http://myfaces.apache.org/"&gt;Apache MyFaces&lt;/a&gt; are just two examples of component libraries for JSF. Both provide pretty cool and useful component sets.&lt;/li&gt;&lt;li&gt;JSF has good tool support. If you use something like &lt;a href="http://developers.sun.com/prodtech/javatools/jscreator/"&gt;Java Studio Creator&lt;/a&gt; you can quickly take the best advantage of the component-oriented approach of JSF for rich app development (although I also have some issues with Java Studio Creator -- I have a pretty beefed up machine and my god, is this thing a performance hog sometimes!).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Cons:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Getting components to do the work for you prevent you from tweaking what you can do with the generated HTML. That makes sense in the scope of a rich client app, not so much in a web site where you want to get finer control over placement and presentation of all your design items. In particular, interactions with professional designers (usually non-programmers) can be dificult if working from component rendered HTML.  Furthermore, some components provide their own stylesheets making it harder for proper integration with a site design.&lt;/li&gt;&lt;li&gt;There are components for JSF out there...I played with &lt;a href="http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/jsf/index.html"&gt;Oracle ADF&lt;/a&gt; and with &lt;a href="http://myfaces.apache.org/"&gt;Apache MyFaces&lt;/a&gt;. MyFaces was, by far, a lot more to my liking. Easier to use and deploy into your own app. I had a ton of issues with ADF. Both components libraries miss (IMHO) some more documentation to make them more usable. The goal of components is to make them easy to reuse and that *has* to equate to good documentation. &lt;/li&gt;&lt;li&gt;Every interaction involves a full roundtrip. Take for instance validation of fields. This involves a full post to the server, interaction with the component lifecycle and a return of the full HTML back to the client. With things like AJAX around, it does sound a bit hard to swallow that a full roundtrip needs to be performed to do simple validation...it sounds just to heavy for what we should be doing. Granted there are approaches to join JSF with AJAX but they start to sound a bit hybrid solutions and start taking away a bit the nature of JSF. Some components available in the JSF components libs can already be found as lightweight Javascript/AJAX components...something I would rather favor to server side full roundtrip requiring solutions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Bottom line....I did like the book, I was not 100% convinced by the technology. I see some uses in the realm of rich web applications, I see the elegance of the architecture, I see the advantage of having good components libraries. However I feel it does not give you necessarily the best user interaction experience (POST for every interaction),  might not give you ease of control over presentation aspects should you need it (e.g. a complete web site, not just a web app), components are still not that straightforward to use.&lt;/p&gt;&lt;p&gt;I am not jumping into the JSF wagon just yet...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-114458559024348177?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/114458559024348177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=114458559024348177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114458559024348177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114458559024348177'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/04/book-java-server-faces-in-action.html' title='Java Server Faces in Action'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-114252382153414999</id><published>2006-03-16T10:38:00.000-05:00</published><updated>2006-03-17T09:35:44.433-05:00</updated><title type='text'>An official name!</title><content type='html'>It's alive! We now have a name and a short blurb page about the new company. Tizra is the chosen name. After a careful round with several candidates this is the one that stuck. Check out our blurb page at &lt;a href="http://www.tizra.com/"&gt;http://www.tizra.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You might be wondering what on earth does Tizra mean (if anything)...well, check it our for yourself in this &lt;a href="http://palimpsest.stanford.edu/don/dt/dt3536.html"&gt;A Dictionary of Descriptive Terminology&lt;/a&gt; entry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-114252382153414999?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/114252382153414999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=114252382153414999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114252382153414999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114252382153414999'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/03/official-name.html' title='An official name!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-114140400196076512</id><published>2006-03-03T11:35:00.000-05:00</published><updated>2006-03-03T12:20:12.540-05:00</updated><title type='text'>New Company, New Life!</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/lightbulb.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/5970/1732/400/lightbulb.jpg" border="0" /&gt;&lt;/a&gt; Big changes in my life! I decided to quit my job at Ingenta and take a shot at starting a new business with two other partners. We are now one week into this....Lots of productive discussions regarding the company structuring, logistics, lots of discussions in fleshing out the product we are going for. We believe we have a pretty cool idea that could gain traction. Next couple of months will tell. I will add to this blog further new company information as it becomes possible to make it public.&lt;br /&gt;&lt;br /&gt;I'm sure to continue bumping my head on the wall but with a happy smile on my face...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-114140400196076512?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/114140400196076512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=114140400196076512' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114140400196076512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/114140400196076512'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/03/new-company-new-life.html' title='New Company, New Life!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113985450029723382</id><published>2006-02-13T13:06:00.000-05:00</published><updated>2006-02-13T13:25:18.666-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Lucene in action</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/luceneInAction.1.jpg"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/5970/1732/320/luceneInAction.1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I would call this the "everything you wanted to know to get started with Lucene in 70 pages" book. True enough, in a mere 70 pages the authors give you enough information for you to understand the basic Lucene workings and make you feel like jumping into action and starting to do something with Lucene. In addition to that, the book simply throws some gems in there that pretty much solve the issues you would hear mentioned over and over in the context of search engines. Wildcard searching, search optimization, multiple language support (analysers in detail), highlight snippets, search within search, Latent Semantic Indexing, common document formats indexing (PDF, HTML, XML, RTF)...you name it, they probably put in there.&lt;br /&gt;&lt;br /&gt;A fundamental read if you want to know what Lucene is all about. Even more if you actually need to use it! A really good read!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113985450029723382?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113985450029723382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113985450029723382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113985450029723382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113985450029723382'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/02/book-lucene-in-action.html' title='Lucene in action'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113733919745874181</id><published>2006-01-15T10:31:00.000-05:00</published><updated>2006-01-15T10:33:23.226-05:00</updated><title type='text'>JBoss EJB 3.0 TrailBlazer</title><content type='html'>&lt;p&gt;A nice EJB 3.0 in JBoss presentation can be found under the &lt;a href="http://trailblazer.demo.jboss.com/EJB3Trail/"&gt;JBoss TrailBlazer &lt;/a&gt;pages. It allows you to get a quick overview of what you can do with EJB 3.0 within JBoss and the new changes in EJB 3.0. Pretty worth taking a look.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113733919745874181?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113733919745874181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113733919745874181' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113733919745874181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113733919745874181'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/01/jboss-ejb-30-trailblazer.html' title='JBoss EJB 3.0 TrailBlazer'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113733732683645255</id><published>2006-01-15T09:57:00.000-05:00</published><updated>2006-01-15T10:28:40.030-05:00</updated><title type='text'>New England Java Users Group January Meeting</title><content type='html'>I attended the &lt;a href="http://www.nejug.org/"&gt;NEJUG &lt;/a&gt;January meeting &lt;a href="http://www.nejug.org/2006/jan06.jsp"&gt;&lt;em&gt;Struts 2006: An embarrassment of riches&lt;/em&gt;&lt;/a&gt;. This was a pretty interesting and information filled meeting. The future of &lt;a href="http://struts.apache.org/"&gt;Struts &lt;/a&gt;was discussed, in particular details on the integration between Struts codebase and &lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork &lt;/a&gt;codebase were outlined. Looks like WebWork 2.2 recently released will provide the codebase from which Struts 2.0 will be developed upon so the two technologies will merge. Pretty interesting to see as well the underlying &lt;a href="http://www.springframework.org/"&gt;Spring &lt;/a&gt;support on which WebWork is based, clearly showing the coolness of this infrastructure. This was a full room presentation with around 230 participants and it well worth the 1 hour drive each way to attend. Next NEJUG meetings promise to be pretty interesting as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113733732683645255?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113733732683645255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113733732683645255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113733732683645255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113733732683645255'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/01/new-england-java-users-group-january.html' title='New England Java Users Group January Meeting'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113733697738688925</id><published>2006-01-15T09:43:00.000-05:00</published><updated>2006-01-15T10:13:42.120-05:00</updated><title type='text'>Healing my head from the bumping on the wall [Part 2]</title><content type='html'>Yup...head feels a lot better...and the reading material was one of the most interesting ones I took on vacation so far...Both technologies have some elements of &lt;a href="http://acronyms.thefreedictionary.com/QWAN"&gt;QWAN&lt;/a&gt; and it definitely been showing their influence in latest and greatest developments in the Java community. Just take a look:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hibernate is now the underlying ORM technology for persistence in the likes of &lt;a href="http://www.jboss.com/products/jbossas"&gt;JBoss' &lt;/a&gt;implementation of EJB 3.0&lt;/li&gt;&lt;li&gt;Dependency Injection is also a concept that is being introduced in latest EJB 3.0 (although, IMHO, still awkward in some aspects).&lt;/li&gt;&lt;li&gt;Interceptor queue and aspect oriented programming start showing themselves in EJB 3.0 as well (again in a much cleaner fashion in Spring).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.opensymphony.com/webwork/"&gt;WebWork 2.2&lt;/a&gt;, the future Struts Action 2.0 is based on Spring and brings (as a result) lots of the great ideas of Spring into the mix.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Unit testing in Spring becomes dead easy since, if you follow the Dependency Injection approach as you should in Spring, you can easily use something like Mock Objects to actually inject pretty much all kinds of stand ins allowing you to test code deterministically and without the need for large, heavy or hard to integrate into testing support infrastructures. Web Unit Testing in particular becomes sane to use by following this approach...&lt;/p&gt;&lt;p&gt;More to follow on this pretty soon....&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113733697738688925?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113733697738688925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113733697738688925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113733697738688925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113733697738688925'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2006/01/healing-my-head-from-bumping-on-wall.html' title='Healing my head from the bumping on the wall [Part 2]'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113522811595286064</id><published>2005-12-22T00:03:00.000-05:00</published><updated>2005-12-22T00:11:22.640-05:00</updated><title type='text'>Healing my head from the bumping on the wall ?</title><content type='html'>Yup...time for a pause...usual Christmas/New year's break...Will not be blogging but will be taking with me a couple of books...my "christmas break collection" will include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hibernate: A Developer's Notebook&lt;/li&gt;&lt;li&gt;Spring: A Developer's Notebook&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The Developer's Notebook series is actually proving to be pretty cool....granted it does not cover all you need to know and probably implies that you already know *something* but still...worth a read...They also deviate a bit from the "standard" technical book ranging around 150 pages instead of the 500-1000 typical tech book size...would consider them to be "quick reads"... As all tech books, reading them is not enough and some "hands in the dirt" is a requirement...mine are happilly getting dirty since these are technologies that I really want to play with and grok...&lt;/p&gt;&lt;p&gt;Blogging should resume in 2006...Happy hollidays and happy new year!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113522811595286064?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113522811595286064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113522811595286064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113522811595286064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113522811595286064'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/12/healing-my-head-from-bumping-on-wall.html' title='Healing my head from the bumping on the wall ?'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113462256810122732</id><published>2005-12-14T23:53:00.000-05:00</published><updated>2005-12-15T00:06:51.250-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>JBoss a Developer's Notebook and JBoss at Work</title><content type='html'>Two good &lt;a href="http://www.jboss.org/"&gt;JBoss&lt;/a&gt; books this time. Both seem to complement each other and should be a must read for someone wanting to learn about JBoss.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/jbossatwork.gif"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/5970/1732/320/jbossatwork.gif" border="0" /&gt;&lt;/a&gt; The first one is &lt;i&gt;JBoss at Work: A Practical Guide&lt;/i&gt;. What I liked about this book can also be one of its shortcomings. The book follows a incremental development approach where concepts and technologies are introduced chapter by chapter, one step at a time. This might be a bit tedious for experience, seasoned developers who know already about the concepts being introduced. The way they are introduced however is, I believe, pretty interesting and does make up for an interesting read. I did like reading it a lot even though it was far from the first time I looked into these concepts, technologies and approaches. I would have liked to see a bit more on Entity Beans but do understand the reason why they were not approached in the book.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/jbossdn.gif"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/5970/1732/320/jbossdn.gif" border="0" /&gt;&lt;/a&gt; The second book is yet another of the &lt;i&gt;Developer's Notebook&lt;/i&gt; series. Like clearly stated in the book, you will not end up being an expert or even getting close to knowing all there is on the subject but by the end of it you should have grasped a set of important items in a very pragmatic perspective. This is a book which is probably more recommended for developers who have already read something about JBoss otherwise some of the nice pearls in the book might get lost among the rest.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Both books are in my recommended books list!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113462256810122732?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113462256810122732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113462256810122732' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113462256810122732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113462256810122732'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/12/book-jboss-developers-notebook-and.html' title='JBoss a Developer&apos;s Notebook and JBoss at Work'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113332386876832898</id><published>2005-11-29T23:03:00.000-05:00</published><updated>2005-11-29T23:12:24.413-05:00</updated><title type='text'>Synch with team members off-site!</title><content type='html'>If you ever had to work with team members off-site you know that it can be extremely difficult to convey ideas or to explain/discuss ideas. There are however a ton of tools that can help with that effort...In typical "Bumping my Head on the Wall" style, here is one that is working really nice for me. &lt;a href="http://www.microsoft.com/office/rtc/livemeeting/default.mspx"&gt;Microsoft Office LiveMeeting&lt;/a&gt; does what I need and more...I can share my apps with whoever I am talking to, can give control of those apps to the other party, etc... From the distributed development team perspective this does seem to be a very very cool and useful tool. It does solve a bit the issue of the difficulty of showing things or discussing ideas with off-site team members...Kind of gives you back that "drop by your cube" feeling. Like I said, this is far from being the single tool doing it out there...I have also used &lt;a href="http://webex.com/"&gt;Webex&lt;/a&gt; in the past with also pretty good results. But if you have off-site team members &lt;strong&gt;you have got&lt;/strong&gt; to have something like this in your tool bag!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113332386876832898?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113332386876832898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113332386876832898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113332386876832898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113332386876832898'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/11/synch-with-team-members-off-site.html' title='Synch with team members off-site!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113297633360874149</id><published>2005-11-25T22:33:00.000-05:00</published><updated>2005-11-25T22:45:15.300-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Professional Apache Tomcat 5</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/professionalTomcat5.jpg"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/5970/1732/320/professionalTomcat5.jpg" border="0" /&gt;&lt;/a&gt; Here's a nice book I just finished reading a couple of weeks ago. Since I actually work with Tomcat I found the book to be pretty useful. I did learn about a series of items that I did not know as much as I should and would recommend without any hesitation this book to anyone wanting to know a bit more about Tomcat. It does shed some light into features of Tomcat that I had not explored before (e.g. built-in DB connection Pooling, tomcat clustering, JMX). If there is anything that I would correct about this book, it would definitely be the chapter on Tomcat+Apache integration. The book is all about mod_jk2 which is now a connection component dropped by Apache in favor of mod_jk and proxy_ajp. The examples for database connection pooling actually did not work for me, but getting the gist of it was enough to allow me to explore and figure out the right way to achieve it.&lt;br /&gt;&lt;br /&gt;Veredict: rates pretty high on my list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113297633360874149?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113297633360874149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113297633360874149' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113297633360874149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113297633360874149'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/11/book-professional-apache-tomcat-5.html' title='Professional Apache Tomcat 5'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113228214908903387</id><published>2005-11-17T21:46:00.000-05:00</published><updated>2005-11-17T21:53:07.953-05:00</updated><title type='text'>Keep your Tomcat up to date!</title><content type='html'>It is definitely worth it...a 2x to 3x performance improvement between version 5.5.9 and 5.5.12...now, I would never expect that but sure enough that is the kind of performance enhancements I got when updating to this newer version....pretty impressive...Well, if you take into account that performance of 5.5.9 for my specific example was lower than a 4.0.4 version, I would say Tomcat got their act together with this new update...Bottom line: consider keeping up to date with the usual precautions!&lt;br /&gt;&lt;br /&gt;And by the way....NetBeans 5.0 Beta 2 is out! Supposed to contain over 1,800 bug fixes from Beta 1...Since I am still pretty happy with NetBeans 5.0 I already got my NetBeans update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113228214908903387?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113228214908903387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113228214908903387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113228214908903387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113228214908903387'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/11/keep-your-tomcat-up-to-date.html' title='Keep your Tomcat up to date!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113171398645945265</id><published>2005-11-11T07:53:00.000-05:00</published><updated>2005-11-11T21:20:54.046-05:00</updated><title type='text'>WebTst 0.9.3 has been released!</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/webtst.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/5970/1732/320/webtst.jpg" border="0" /&gt;&lt;/a&gt; I finally got around churning out another release of &lt;a href="http://webtst.assisrosa.com/"&gt;WebTst&lt;/a&gt;. For this version I had some pretty important feedback to work from and was able to address some major issues in the code. WebTst 0.9.3 is now more robust than ever.&lt;br /&gt;&lt;br /&gt;This has been my "night" project for the last month or so...I am really happy to be able to report that it has now been released. Meanwhile I still continue to use it avidly at work and at home.&lt;br /&gt;&lt;br /&gt;WebTst is a web testing infrastructure that aims at making and maintaining system integration tests as simple as possible. It provides web interfaces for test capturing making creating tests literally as easy as browsing the web (it implements an http/https proxy for those curious), web interfaces for maintaning and enhancing capturing tests, graphical analysis tools and test suites maintenance capabilities. With it you can do monitoring, smoke, regression tests.&lt;br /&gt;&lt;br /&gt;It has been hosted at SourceForge for quite sometime and you can check it out at &lt;a href="http://sourceforge.net/projects/webtst/"&gt;http://sourceforge.net/projects/webtst/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113171398645945265?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113171398645945265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113171398645945265' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113171398645945265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113171398645945265'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/11/webtst-093-has-been-released.html' title='WebTst 0.9.3 has been released!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113055441996108022</id><published>2005-10-28T22:44:00.000-04:00</published><updated>2005-10-28T23:16:23.483-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>VMWare Rocks!</title><content type='html'>And it rocks really hard! Since I evaluated &lt;a href="http://www.vmware.com/"&gt;VMWare 5.0&lt;/a&gt; I became completely hooked on it. To the point where I really can not conceive anymore (professional) life without it. I have it on my XP box running Linux Ubuntu and Windows 2000. Have played as well with other OSes with equally impressive results.&lt;br /&gt;&lt;br /&gt;Here's an example of handy use. I was working on &lt;a href="http://webtst.assisrosa.com/"&gt;WebTst&lt;/a&gt; (topic for another post) and was faced with the problem. I had to try my code with different versions of an installed set of packages. Big pain in an typical scenario. Install set one, develop, test, once happy either deinstall set or reinstall OS, install set two, develop, test, once happy go back to set one to make sure is not broken. Of course same drill could be done with two machines with different configurations or two OSes on same machine. Paaaainfull. Enter VWMare. I simply install a fresh version of the OS, capture a snapshot, install set one of packages, take a snapshot, test, develop, once happy, revert to clean install snapshot, install set two of packages, test, develop, once happy can freely jump between snapshots with package set one or two....no more installs for me...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/vwware.jpg"&gt;&lt;img style="" alt="VMWare Snapshot Manager" src="http://photos1.blogger.com/blogger/5970/1732/320/vwware.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now *that* is pretty nice!&lt;br /&gt;&lt;br /&gt;It's uses do not stop here, from different combos of browsers and plugins to different configurations altogether....&lt;br /&gt;&lt;br /&gt;Now get this one: you can actually setup a server (e.g. Linux) running a database, with a server running in there (e.g. Tomcat running). Take a snapshot of this state. Mess whatever you want....even power off....once you revert to previous snapshot, you will be brought to the *exact* same state that you had when you took the snapshot....database state, servers running and all...again...pretty impressive...&lt;br /&gt;&lt;br /&gt;The list goes on and on and on....&lt;br /&gt;&lt;br /&gt;My (professional) life *did* change with it!&lt;br /&gt;&lt;br /&gt;(My personal life not so much...VMWare still does not change diapers at 3:00 AM or does dishes...I'm hoping for version 6.0....)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113055441996108022?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113055441996108022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113055441996108022' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113055441996108022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113055441996108022'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/vmware-rocks.html' title='VMWare Rocks!'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113054842895654448</id><published>2005-10-28T21:10:00.000-04:00</published><updated>2005-10-28T21:13:48.966-04:00</updated><title type='text'>Microsoft PDC 2005 Videos</title><content type='html'>Microsoft's PDC 2005 videos are available online at &lt;a href="http://www.sys-con.tv/read/category/1238.htm"&gt;http://www.sys-con.tv/read/category/1238.htm&lt;/a&gt;. Lots of content available.&lt;br /&gt;&lt;br /&gt;I have no prejudice against Microsoft technologies. I do believe the principle&lt;br /&gt;of "each tool for it's job". Microsoft technologies do have its place and its use&lt;br /&gt;and the latest .NET platform, languages and tools are way too cool! Just check&lt;br /&gt;them out for a bit and let me know if you agree....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113054842895654448?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113054842895654448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113054842895654448' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113054842895654448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113054842895654448'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/microsoft-pdc-2005-videos.html' title='Microsoft PDC 2005 Videos'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113053141166643595</id><published>2005-10-28T16:27:00.000-04:00</published><updated>2005-11-11T09:22:04.116-05:00</updated><title type='text'>JavaOne Sessions, Java Posse Podcast</title><content type='html'>Yup. They can be found online at &lt;a href="http://developers.sun.com/learning/javaoneonline/"&gt;http://developers.sun.com/learning/javaoneonline/&lt;/a&gt;.&lt;br /&gt;Worth taking a look....Found about their existence while listening to a &lt;a href="http://javaposse.com/"&gt;Java Posse &lt;/a&gt;podcast.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://javaposse.com/"&gt;Java Posse&lt;/a&gt; is the successor to the now dead JavaCast podcasts. Pretty interesting podcasts filled with Java news, reviews, tech discussions and experience sharing. This is a fundamental item on my iPod.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-113053141166643595?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113053141166643595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113053141166643595' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113053141166643595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113053141166643595'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/javaone-sessions-java-posse-podcast.html' title='JavaOne Sessions, Java Posse Podcast'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-113030250649582006</id><published>2005-10-26T00:52:00.000-04:00</published><updated>2005-10-26T01:30:06.916-04:00</updated><title type='text'>Experiments in Load Balancing and High Availability (Part 2)</title><content type='html'>&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;The Architecture&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;disclaimer&amp;gt;&lt;br /&gt;Let me start by saying that this was just one possible solution...As I investigated and played with this a ton of other possible solutions popped up. This is just one solution I liked putting in place and that worked fine for me.&lt;br /&gt;&amp;lt;/disclaimer&amp;gt;&lt;br /&gt;&lt;br /&gt;The following picture illustrates what I was trying to achieve:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5970/1732/1600/lbsol.jpg" target="_newWindow"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/5970/1732/320/lbsol.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The basic infrastructure and functional elements:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A firewall to isolate the internal network from the outside. In my testing, achieved by my trusty router with built-in simple firewall.&lt;/li&gt;&lt;li&gt;One main load balancer server. Responsible for picking up requests from end-users and directing to server machines available in the defined cluster of servers. Equipped with two network cards.&lt;/li&gt;&lt;li&gt;One backup load balancer server. Responsible for monitoring the main load balancer server and picking up for him in case of main load balancer server failure. Equipped with two network cards.&lt;/li&gt;&lt;li&gt;A cluster of servers ready to receive requests from the load balancer and ready to do the serious work to fulfill the requests and get the responses.&lt;/li&gt;&lt;li&gt;An internal network connecting all machines. In my testing, my five machines (would like to see this number grow!).&lt;/li&gt;&lt;li&gt;A dedicated network between main and backup load balancing servers to allow for more reliable and fast monitoring of load balancing servers.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The interactions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A request coming from a user should come via the firewall (router) to the main load balancer&lt;/li&gt;&lt;li&gt;The main load balancer should then send over the request based on a configured heuristic to the appropriate server in the cluster.&lt;/li&gt;&lt;li&gt;The selected server should fulfill the request and send the request to the end-user. &lt;/li&gt;&lt;li&gt;The main load balancers constantly monitors the cluster to remove failed servers or add new added servers. &lt;/li&gt;&lt;li&gt;The backup load balancer server constantly monitors the main load balancer server to ensure that it is working, taking over the load balancing function if main load balancer server is detected to be down. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Redundancy of services is therefore present both at the server level and at the load balancing solution level. We should in this way achieve load balancing and high availability. &lt;/p&gt;&lt;p&gt;More to follow in the next parts on this subject:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Solutions for Load Balancing Layer, where some possible solutions are discussed, one in particular is presented in detail.&lt;/li&gt;&lt;li&gt;Worker Server Clustering, where a solution to a particular problem is presented.&lt;/li&gt;&lt;li&gt;Remaining issues&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/17860841-113030250649582006?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/113030250649582006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=113030250649582006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113030250649582006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/113030250649582006'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/experiments-in-load-balancing-and-high_26.html' title='Experiments in Load Balancing and High Availability (Part 2)'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-112964612754542192</id><published>2005-10-18T10:33:00.000-04:00</published><updated>2005-10-18T14:17:14.526-04:00</updated><title type='text'>Experiments in Load Balancing and High Availability (Part 1)</title><content type='html'>&lt;p&gt;&lt;u&gt;Part 1: The issue&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;The questions have always been in the back of my mind "What if my site is just too overloaded ? What if it crashes ?"....not that it matters that much to my personal sites...It's not like I have millions of users.....or that the world economy would fall over if my personal sites were down or just too slow...But still....I always felt the urge to play with solutions to overcome any performance and availability issues with my sites (but I will &lt;strong&gt;not&lt;/strong&gt; stop playing Halo to make my site more performing..not that!!!). So I started my investigation on the subject....What could I put in place to provide me load balancing and high availability on a site ? I bumped, not surprisingly, into a ton of solutions...From dedicated hardware to complex software solutions. But....this being kind of "I want to explore it" experience and since I am not really not into throwing a ton of money into the experience, my aim was directed into trying to make the best of the cheapest solution possible. And there began my quest...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I was very close to getting a cheap &lt;a href="http://www.f5.com/products/bigip/"&gt;BIG-IP&lt;/a&gt;. But most of what I could find on &lt;a href="http://www.ebay.com"&gt;eBay&lt;/a&gt; was typically locked out systems or incomplete systems. Other solutions outside eBay were just outrageously expensive. For my pocket anyway. So....off with the hardware box solution...next! &lt;/p&gt;&lt;p&gt;I then bumped into a pretty interesting project called &lt;a href="http://www.ultramonkey.org/"&gt;Ultra Monkey&lt;/a&gt;. I started having hope finally that I might be onto something. I jumped again onto eBay and got me an extremely expensive set of hardware (yeah sure!)...Two Pentium III 500Mhz for the much more agreeable price of $80 for both...Armed with those two and with my two other more decent computers, a Pentium 4 2.6 Ghz and a Pentium 4 2.8 Ghz, I started then to elaborate on an realistic, usable architecture to make load balancing and high availability possible on a short budget. &lt;/p&gt;&lt;p&gt;Plans taking shape...Ultra Monkey doing the management of my application, I started to think about issues like back-end application distribution and synchronization. With my first goal being to get to a solution for a Java Web application I looked a bit more into books on &lt;a href="http://jakarta.apache.org/"&gt;Tomcat&lt;/a&gt;...and eventually found the way to implement Tomcat clustering behind any load balancing and high availability solution. That led me to the final piece of this puzzle. I now have a solution that convinces me that I can put load balancing and high availability in place....Working on my personal sites...my site users probably could not care less, but I now can finally put it to rest....&lt;/p&gt;&lt;p&gt;More to follow in the next parts on this subject:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Overall architecture &lt;/li&gt;&lt;li&gt;Solutions for Load Balancing Layer &lt;/li&gt;&lt;li&gt;Tomcat Clustering&lt;/li&gt;&lt;li&gt;Remaining issues&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-112964612754542192?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/112964612754542192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=112964612754542192' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/112964612754542192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/112964612754542192'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/experiments-in-load-balancing-and-high.html' title='Experiments in Load Balancing and High Availability (Part 1)'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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-17860841.post-112934659082409354</id><published>2005-10-14T23:22:00.000-04:00</published><updated>2005-10-15T00:04:39.963-04:00</updated><title type='text'>NetBeans 5.0 Beta</title><content type='html'>I have been looking at Eclipse for quite sometime but was never quite convinced by it (let the flames start). Seemed awkward to use and most of the functionality was not where I expected it to be. In addition to that, handling of pre-existing projects with rich, complex ant files seemed hard to say the least....Enter NetBeans 5.0...Using it with pre-existing projects has been a breeze...For starters there is right out-of-the-box a "create a project from ant file" which creates a project that not only gets bootstrapped from the ant file but keeps control in the ant file. Builds can still happen via the existing ant file with nice integration between the IDE and the ant file. All functionality is right where I would expect it to be making my life a lot easier and reducing immensely the effort of getting into a new tool.&lt;br /&gt;&lt;br /&gt;As if that was not enough (for me at least), there are a ton of new features in NetBeans 5.0 which make it worthy to invest some time to evaluate. Matisse -- a WYSIWYG dialog editor, code completion, tighter CVS integration, tighter JUnit integration, support for Ant file debugging (how cool is that?!?!?), JBoss support (among others, I happen to be more interested in JBoss), deployment descriptor editors, easier plug-in development, AJAX solutions....and the list goes on.&lt;br /&gt;&lt;br /&gt;If you do not want much time looking at the IDE itself, you can at least watch a small presentation on it:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.javalobby.org/eps/netbeans5/"&gt;http://www.javalobby.org/eps/netbeans5/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And new features are supposed to be coming in later after the final launch. As far as I'm concerned, this IDE works pretty nicely for me. Move over Eclipse, here's NetBeans 5.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-112934659082409354?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/112934659082409354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=112934659082409354' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/112934659082409354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/112934659082409354'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/netbeans-50-beta.html' title='NetBeans 5.0 Beta'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17860841.post-112931390113464732</id><published>2005-10-14T14:17:00.000-04:00</published><updated>2005-10-14T23:04:14.816-04:00</updated><title type='text'>Bumping my head on the wall</title><content type='html'>Yup. For anyone working in software development, sometimes it sure feels like &lt;span style="font-style: italic;"&gt;bumping my head on the wall&lt;/span&gt;. Traps and pitfalls, tips and tricks, new tools, new processes, cool books, cool technologies, interesting and useful links. I'll keep adding them here.&lt;br /&gt;&lt;br /&gt;If you have any comments or feedback, send them along!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17860841-112931390113464732?l=fassisrosa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fassisrosa.blogspot.com/feeds/112931390113464732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17860841&amp;postID=112931390113464732' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/112931390113464732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17860841/posts/default/112931390113464732'/><link rel='alternate' type='text/html' href='http://fassisrosa.blogspot.com/2005/10/bumping-my-head-on-wall.html' title='Bumping my head on the wall'/><author><name>Francisco Assis Rosa</name><uri>http://www.blogger.com/profile/12855998998098058553</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></feed>
