<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" version="2.0">
  <channel>
    <title>The Rich Web Experience</title>
    <link>http://www.therichwebexperience.com</link>
    <description>The best value in the Java/Open Source conferencing space hands down</description>
    <item>
      <title>Community Liaison</title>
      <link>http://www.therichwebexperience.com/blog/pete_muir/2010/03/community_liaison?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description />
      <pubDate>Mon, 15 Mar 2010 08:00:11 CDT</pubDate>
      <guid isPermaLink="true">http://in.relation.to/Bloggers/CommunityLiaison</guid>
      <dc:creator>Pete Muir</dc:creator>
    </item>
    <item>
      <title>Lovely Review of Manage Your Project Portfolio</title>
      <link>http://www.therichwebexperience.com/blog/johanna_rothman/2010/03/lovely_review_of_manage_your_project_portfolio?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;Steve Berczuk has a lovely discussion of &lt;a href="http://steveberczuk.blogspot.com/2010/03/agile-portfolio-management.html" target="_blank"&gt;Manage Your Project Portfolio&lt;/a&gt;. You can see his review &lt;a href="http://www.berczuk.com/bookstore/all.html#1934356298" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p align="left"&gt;&lt;a class="tt" href="http://twitter.com/home/?status=Lovely+Review+of+Manage+Your+Project+Portfolio+http://rzah8.th8.us" title="Post to Twitter"&gt;&lt;img class="nothumb" src="http://jrothman.com/blog/mpd/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /&gt;&lt;/a&gt; &lt;a class="tt" href="http://twitter.com/home/?status=Lovely+Review+of+Manage+Your+Project+Portfolio+http://rzah8.th8.us" title="Post to Twitter"&gt;Tweet This Post&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=C68_IQgcnxM:OwO_jqMTuyg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=C68_IQgcnxM:OwO_jqMTuyg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=C68_IQgcnxM:OwO_jqMTuyg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=C68_IQgcnxM:OwO_jqMTuyg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=C68_IQgcnxM:OwO_jqMTuyg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=C68_IQgcnxM:OwO_jqMTuyg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=C68_IQgcnxM:OwO_jqMTuyg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=C68_IQgcnxM:OwO_jqMTuyg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/C68_IQgcnxM" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 14 Mar 2010 13:00:09 CDT</pubDate>
      <guid isPermaLink="true">http://jrothman.com/blog/mpd/?p=9057</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
    <item>
      <title>Open Source Your Project (with Jasig)</title>
      <link>http://www.therichwebexperience.com/blog/john_lewis/2010/03/open_source_your_project_with_jasig_?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;Here is the full screencast from my Jasig 2010 Conference Session on "Open Sourcing Your Project (with Jasig)". Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.unicon.net/node/1368"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 14 Mar 2010 11:00:15 CDT</pubDate>
      <guid isPermaLink="true">1368 at http://www.unicon.net</guid>
      <dc:creator>John Lewis</dc:creator>
    </item>
    <item>
      <title>Live from DrupalCamp Nashville</title>
      <link>http://www.therichwebexperience.com/blog/cal_evans/2010/03/live_from_drupalcamp_nashville?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>Dear Reader, I&amp;#8217;m sitting here in a session at DrupalCamp Nashville on the Vandy campus. The day has been great and the Nashville Drupelars should be commended for running such a great camp. From a conference organizer PoV, this camp has run smoothly. The Wi-Fi is rock solid, the sessions start on time and the [...]&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?a=1j6zUHOLZmA:S2WM0HTQKQQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?a=1j6zUHOLZmA:S2WM0HTQKQQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?a=1j6zUHOLZmA:S2WM0HTQKQQ:aKCwKftKxY0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?i=1j6zUHOLZmA:S2WM0HTQKQQ:aKCwKftKxY0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?a=1j6zUHOLZmA:S2WM0HTQKQQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?a=1j6zUHOLZmA:S2WM0HTQKQQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PostcardsFromMyLife?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PostcardsFromMyLife/~4/1j6zUHOLZmA" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 14 Mar 2010 08:00:13 CDT</pubDate>
      <guid isPermaLink="true">http://blog.calevans.com/?p=1536</guid>
      <dc:creator>Cal Evans</dc:creator>
    </item>
    <item>
      <title>JBoss Tools 3.1 is now out</title>
      <link>http://www.therichwebexperience.com/blog/max_katz/2010/03/jboss_tools_3_1_is_now_out?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;JBoss Tools team released JBoss Tools version 3.1 this week. It&amp;#8217;s the best IDE for doing enterprise Java development with JSF, RichFaces, Seam, JPA, Hibernate &lt;a href="http://java.dzone.com/news/opening-jboss-toolbox-31"&gt;more&lt;/a&gt;. You now get JSF2 as well as CDI support. You may or may not have known but over 50% of code in JBoss Tools is being written by &lt;a href="http://www.exadel.com"&gt;Exadel&lt;/a&gt; team. I want to thank them for doing an amazing job!  It&amp;#8217;s an excellent set of tools that really makes enterprise Java development much easier. &lt;/p&gt;</description>
      <pubDate>Sat, 13 Mar 2010 16:00:04 CST</pubDate>
      <guid isPermaLink="true">http://mkblog.exadel.com/?p=1372</guid>
      <dc:creator>Max Katz</dc:creator>
    </item>
    <item>
      <title>Open Source Update: jQuery PeriodicalUpdater, TestingLabs, GPars, etc.</title>
      <link>http://www.therichwebexperience.com/blog/robert_fischer/2010/03/open_source_update_jquery_periodicalupdater_testinglabs_gpars_etc_?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I&amp;#8217;ve done a fair bit of fairly small open source updates recently.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jQuery PeriodicalUpdater&lt;/code&gt;: The main function now returns a handle that can be used to call &lt;code&gt;stop()&lt;/code&gt;, thereby ignoring any updates that may come back and preventing future updates from being sent.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TestingLabs&lt;/code&gt;: I released TestingLabs 0.4 to work with Grails 1.2.0. Had a bug with versioning under Grails: &lt;a rel="nofollow" target="_blank" href="http://jira.codehaus.org/browse/GRAILSPLUGINS-2023"&gt;More info on JIRA&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Presentations&lt;/code&gt;: I&amp;#8217;m now storing the slides for my presentations on GitHub. They&amp;#8217;re under a Creative Commons License.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ClosureBridge&lt;/code&gt;: This is a tiny library (up on &lt;a rel="nofollow" target="_blank" href="http://repo.smokejumperit.com"&gt;the repo.smokejumperit.com Maven repo&lt;/a&gt;) that provides a link between Groovy&amp;#8217;s Closures and Callable/Runnable/Java code.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Fun with GPars&lt;/code&gt;: A small library where I was experimenting with GPars&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPars&lt;/code&gt;: Submitted a fix and generally been discussing things with the GPars community (and by that, I mean Vacalv Pech)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a rel="nofollow" target="_blank" href="https://github.com/RobertFischer"&gt;my GitHub page&lt;/a&gt; for more info.&lt;/p&gt;
&lt;hr /&gt;
This post was by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/author/candide/"&gt;Robert Fischer&lt;/a&gt;, written on March 12, 2010.&lt;br /&gt;
Comment on this post: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/os-update-march2010/#respond"&gt;http://enfranchisedmind.com/blog/posts/os-update-march2010/#respond&lt;/a&gt;&lt;br /&gt;
Public Permalink: &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/posts/os-update-march2010/"&gt;http://enfranchisedmind.com/blog/posts/os-update-march2010/&lt;/a&gt;
&lt;hr /&gt;&lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;&lt;img alt="Creative Commons License" style="border-width:0;" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png"/&gt;&lt;/a&gt;&lt;br /&gt;This article was a post on &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog"&gt;the EnfranchisedMind blog&lt;/a&gt;. &lt;span&gt;EnfranchisedMind Blog&lt;/span&gt; by &lt;a rel="nofollow" target="_blank" href="http://enfranchisedmind.com/blog/"&gt;Robert Fischer, Brian Hurt, and Other Authors&lt;/a&gt; is licensed under a &lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/us/"&gt;Creative Commons Attribution-Share Alike 3.0 United States License&lt;/a&gt;.&lt;p style="display:none;"&gt;(Digital Fingerprint: bcecb67d74ab248f06f068724220e340 (64.78.155.100) )&lt;/p&gt;</description>
      <pubDate>Sat, 13 Mar 2010 13:00:07 CST</pubDate>
      <guid isPermaLink="true">http://enfranchisedmind.com/blog/?p=2353</guid>
      <dc:creator>Robert Fischer</dc:creator>
    </item>
    <item>
      <title>I have moved to a new blog</title>
      <link>http://www.therichwebexperience.com/blog/matt_taylor/2010/03/i_have_moved_to_a_new_blog?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I am tired of maintaining blog software on my own, so I&amp;#8217;ve created a &lt;a href="http://rhyolight.posterous.com"&gt;new blog here&lt;/a&gt;. This site will stick around indefinitely, but I won&amp;#8217;t be posting here, and I probably won&amp;#8217;t be very responsive to comments.&lt;/p&gt;
&lt;div align="center"&gt;&lt;a href="http://rhyolight.posterous.com" title="link to my new blog"&gt;&lt;img src="http://weblog.dangertree.net/wp-content/uploads/2010/03/posterous.png" alt="posterous" title="posterous" width="612" height="531" class="alignleft size-full wp-image-631" /&gt;&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 13 Mar 2010 11:00:06 CST</pubDate>
      <guid isPermaLink="true">http://weblog.dangertree.net/?p=630</guid>
      <dc:creator>Matthew Taylor</dc:creator>
    </item>
    <item>
      <title>Links for 2010-03-12 [del.icio.us]</title>
      <link>http://www.therichwebexperience.com/blog/aaron_gustafson/2010/03/links_for_2010_03_12_del_icio_us_?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.alistapart.com/issues/302"&gt;A List Apart: Issue 302&lt;/a&gt;&lt;br/&gt;
Format wars: HTML5 vs. Flash, ePub HTML vs. proprietary technologies.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/EasyReader/~4/JKmX2dgQR0I" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 13 Mar 2010 08:00:04 CST</pubDate>
      <guid isPermaLink="true">http://del.icio.us/aarongustafson#2010-03-12</guid>
      <dc:creator>Aaron Gustafson</dc:creator>
    </item>
    <item>
      <title>RichFaces rich:isUserInRole function</title>
      <link>http://www.therichwebexperience.com/blog/max_katz/2010/03/richfaces_rich_isuserinrole_function?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I &lt;a href="http://mkblog.exadel.com/ria/richfaces-ria/richfaces-built-in-client-functions/"&gt;blogged&lt;/a&gt; earlier about four built-in RichFaces functions that come in very handy, especially the rich:component(id) one. Many rich components (from rich;* tag library) provide client-side JavaScript API. To access this API, you need to use rich:component(id) and add the JavaScript method name, such as: #{rich:component(&amp;#8216;id&amp;#8217;)}.someMethod(). For example, go to &lt;a href="http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_listShuttle.html"&gt; rich:listShuttle component&lt;/a&gt; in RichFaces Developers Guide and scroll to ReferenceData/JavaScript API section. That&amp;#8217;s the JavaScript API you can call on this component. &lt;/p&gt;
&lt;p&gt;There is one more, less known function available in RichFaces. It&amp;#8217;s called rich:isUserInRole(role). It lets you define security roles in web.xml file and then use the role on a page. For example, suppose only the administrator should see some part of a page:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;rich:panel&lt;/span&gt; &lt;span style="color: #000066;"&gt;header&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Admin panel&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rendered&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;#{rich:isUserInRole('admin')}&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  Very sensitive information
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/rich:panel&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;rich:panel&lt;/span&gt; &lt;span style="color: #000066;"&gt;header&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;User panel&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
   General information
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/rich:panel&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the above example, unless you were authenticated as &amp;#8216;amdin&amp;#8217;, you will not see the top panel. Of course you need the security role in web.xml file. It&amp;#8217;s a nice and handy feature to have available. &lt;/p&gt;</description>
      <pubDate>Fri, 12 Mar 2010 16:00:07 CST</pubDate>
      <guid isPermaLink="true">http://mkblog.exadel.com/?p=1376</guid>
      <dc:creator>Max Katz</dc:creator>
    </item>
    <item>
      <title>Live Service Reloading in Tapestry 5.2</title>
      <link>http://www.therichwebexperience.com/blog/howard_lewis_ship/2010/03/live_service_reloading_in_tapestry_5_2?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;A common question I get during &lt;a href="http://howardlewisship.com/training.html"&gt;Tapestry training sessions&lt;/a&gt; is: &lt;em&gt;Why can't Tapestry reload my services as well as my pages and components?&lt;/em&gt;.  It does seem odd that I talk about how agile Tapestry is, with the live class reloading, and how nicely OO it is, what with services ... but when you move common logic to a service, you lose the agility because services do not live reload.

&lt;p&gt;This came up yet again, during my &lt;a href="http://skillsmatter.com/course-details/java-jee/tapestry-web-development"&gt;latest training session, in London&lt;/a&gt;.

&lt;p&gt;I've considered this before, and I've been opposed to live service reloading for a couple of reasons. First, live reloading requires creating new class loaders, and that causes conflicts with other frameworks and libraries. You get those crazy ClassCastExceptions even though the class name is correct (same name, different class loader, different class).  Further, in Tapestry IoC, services can be utilized to make contributions to other services ... changing one service implementation, or one module, can cause a ripple effect across an untraceable number of other services. How do you know what needs to be reloaded or re-initialized?

&lt;p&gt;
When I last really considered this, back in the HiveMind days, my conclusion was that it was not possible to create a perfect reloading process: one that would ensure that the live-reloaded Registry (and all of its services with all their internal state) would be an exact match for what configuration you'd get by doing a cold restart.

&lt;p&gt;So I shelved the idea, thinking that simply redeploying the WAR containing the application (and the services and modules) would accomplish the desired effect.

&lt;p&gt;
But as they say, &lt;strong&gt;The Perfect Is The Enemy Of The Good&lt;/strong&gt;.  One very sharp student, &lt;a href="http://homepage.mac.com/pardeike/resume.html"&gt;Andreas Pardeike&lt;/a&gt;, asked: &lt;em&gt;Why not just reload the service implementations?&lt;/em&gt;.

&lt;p&gt;
Why not indeed?  Why not limit the behavior to something understandable, trackable, and not very expensive.  Most of the infrastructure was already present, used for reloading of component classes. What about ClassCastExceptions?  In Tapestry, service implementations are already buried under multiple layers of dynamically generated proxies that implement the service interface. The underlying service implementation is never automatically exposed.

&lt;p&gt;
A few hours of work later ... and we have live service reloading. Each reloadable service gets its own class loader, just to load the service interface class. When Tapestry is  periodically checking for updated files, it checks each reloadable service. If necessary, the existing instance, class and class loader is discarded and a new class loader created for the updated .class file.

&lt;p&gt;
This is going to make a big difference for me, and for most Tapestry developers. Both applications I'm working on have enough Hibernate entities and other clutter to take some time (20 - 30 seconds) to restart, and most functionality is hidden past a login page. Being able to change a service, for example to tweak a Hibernate query, with the same speed with which I can tweak a template or component class, is just one more thing to keep me &lt;a href="http://en.wikipedia.org/wiki/Flow_(psychology)"&gt;in the flow&lt;/a&gt; and super productive.

&lt;p&gt;
Give it a try ... it's one more step towards making Tapestry so compelling, you wouldn't think of using anything else!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4110180-1640769601284894714?l=tapestryjava.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TapestryCentral/~4/VbQipguiWcw" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 12 Mar 2010 13:00:11 CST</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-4110180.post-1640769601284894714</guid>
      <dc:creator>Howard Lewis Ship</dc:creator>
    </item>
    <item>
      <title>Testing Java EE the JBoss way</title>
      <link>http://www.therichwebexperience.com/blog/pete_muir/2010/03/testing_java_ee_the_jboss_way?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description />
      <pubDate>Fri, 12 Mar 2010 11:00:10 CST</pubDate>
      <guid isPermaLink="true">http://in.relation.to/Bloggers/TestingJavaEETheJBossWay</guid>
      <dc:creator>Pete Muir</dc:creator>
    </item>
    <item>
      <title>Why Eclipse leaves me wanting</title>
      <link>http://www.therichwebexperience.com/blog/howard_lewis_ship/2010/03/why_eclipse_leaves_me_wanting?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I think I've come to understand why Eclipse leaves me always feeling a bit frustrated.  Yes, it is more stable than IDEA, uses less memory, has some documentation, and a lot of acceptance ... but even so, it just leaves me cold (and I was an early adopter, signed up for the beta way back in 2000!).

&lt;h3&gt;Keystrokes are &lt;strong&gt;not&lt;/strong&gt; modal&lt;/h3&gt;

&lt;p&gt;
The fact that I can type a common keystroke into an Eclipse window and not know what it will do is painful. How a keystroke is interpreted depends on what perspective is active, what view or editor has focus, and what kind of data is being edited in the editor.  That's &lt;strong&gt;dead wrong&lt;/strong&gt;; keystrokes are about muscle memory, and muscle memory remembers motion, not context. The end result is that I get frustrated hitting keystrokes and seeing nothing happening. It doesn't help that I cycle between Mac and a PC on most days.

&lt;h3&gt;You &lt;strong&gt;can't&lt;/strong&gt; have it your way&lt;/h3&gt;

&lt;p&gt;
A tool as powerful and extensible as Eclipse walks the tightrope of offering lots of features and customizations without overwhelming the user. Alas, Eclipse is lying in a broken heap fifty feet below that tightrope.  Eclipse has an unending set of options and defaults for things I don't care about, but anything I do care about seems to never be presents.  Here's a few ideas of the top of my head:

&lt;ul&gt;
&lt;li&gt;Stop running launches when I close the project (I often have to kill them from the command line)&lt;/li&gt;
&lt;li&gt;Give me a quick way to stop all running launches&lt;/l1&gt;
&lt;li&gt;Why so many steps to implement an interface? It's the second most common thing I do!&lt;/li&gt;
&lt;li&gt;How about a button to quickly relaunch the current running launch?&lt;/li&gt;
&lt;li&gt;Why are the available refactorings so paltry and where are the 3rd party ones?
&lt;/ul&gt;

&lt;h3&gt;Who's eating their own dog food?&lt;/h3&gt;

&lt;p&gt;When I used IDEA, I was constantly struck by little details that showed that the IDE developers were also its prime users.  For example, it has open-type and open-resource dialogs much like Eclipse ... but each recognizes the keystroke for the other, so that if you mistakenly activate the open-type dialog, you just hit the normal keystroke to switch over to open-resource. Eclipse makes you cancel the dialog first.

&lt;p&gt;Another example: in IDEA if you rename a field, it notices the getter and setter and will offer to rename those as well.

&lt;p&gt;IDEA also has lots of quick fixes everywhere, such as "implement this interface" and lots of other tiny, cool things I miss every single day I use Eclipse. It's been about a year since I gave up on IDEA and I still miss it.

&lt;p&gt;Is it cultural or organizational?  Eclipse gives me the impression that day-to-day developers either have no concept of how the IDE gets used (and what rough spots are causing some serious chafing) &lt;em&gt;OR&lt;/em&gt; they are somehow prohibited from fixing things that are obviously wrong. 

&lt;h3&gt;If you love IDEA so much why don't you marry it?&lt;/h3&gt;

&lt;p&gt;So why don't I use IDEA anymore?  Two main reasons:  first, it's become very bloated, to the point that unless you go in and shut off a ton of features, it's unusable on my hardware. Merlyn has the same problem doing GWT work on his MacBook Pro ... all the help it gives you comes at a cost in terms of CPU and memory utilization and some instability.

&lt;p&gt;Secondly, I tried (even before IDEA went open source) to use IDEA in my training labs and I hit a stone wall of non-acceptance. Switching to Eclipse was a benefit to my students since, even running in Ubuntu instead of Windows, it was familiar and easy to navigate. It also out-performs IDEA inside my Ubuntu Virtual Machine.  I simply lack the ability to switch between the two on a constant basis without getting completely confused and frustrated. I had to choose  one, and I chose Eclipse: stable and accepted, even if it is brain dead.

&lt;h3&gt;Why call it Ugly?&lt;/h3&gt;

&lt;p&gt;One thing I don't get is how many people claim Eclipse is "ugly" and IDEA "beautiful".  I found IDEA to be overly chock-full of modal dialogs and a number of improperly resized (or non-resizable) dialogs and windows. It's a real dog's breakfast in terms of UI, and has the classically ugly Swing look and feel.

&lt;p&gt;I've always found Eclipse to look sharp and somewhat elegant. You can have a debate about the technical merits of SWT vs. AWT and Swing, or the ability to tune Swing to look like SWT ... but SWT out of the box is simply a better L&amp;F visually.  

&lt;p&gt;On a Mac they both suck at keyboard navigation, though.

&lt;p&gt;There, I've vented.  See what going cold-turkey from Twitter can do?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4110180-7613338214682473566?l=tapestryjava.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TapestryCentral/~4/t7UqTO_DIUQ" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 12 Mar 2010 08:00:04 CST</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-4110180.post-7613338214682473566</guid>
      <dc:creator>Howard Lewis Ship</dc:creator>
    </item>
    <item>
      <title>Weld extensions alpha available</title>
      <link>http://www.therichwebexperience.com/blog/pete_muir/2010/03/weld_extensions_alpha_available?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description />
      <pubDate>Thu, 11 Mar 2010 16:00:11 CST</pubDate>
      <guid isPermaLink="true">http://in.relation.to/Bloggers/WeldExtensionsAlphaAvailable</guid>
      <dc:creator>Pete Muir</dc:creator>
    </item>
    <item>
      <title>simplejson 2.1.0</title>
      <link>http://www.therichwebexperience.com/blog/bob_ippolito/2010/03/simplejson_2_1_0?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://undefined.org/python/#simplejson"&gt;simplejson&lt;/a&gt; (&lt;a href="http://simplejson.googlecode.com/svn/tags/simplejson-2.1.0/docs/index.html"&gt;documentation&lt;/a&gt;) is a simple, fast, complete, correct and extensible &lt;a href="http://json.org/"&gt;JSON&lt;/a&gt; (&lt;a href="http://www.ietf.org/rfc/rfc4627.txt"&gt;RFC 4627&lt;/a&gt;) encoder/decoder for Python 2.5+.  It is pure Python code with no dependencies, but features an optional C extension for speed-ups.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://undefined.org/python/#simplejson"&gt;simplejson&lt;/a&gt; 2.1.0 is a major update with several new features and bug-fixes:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     Decimal serialization officially supported for encoding with use_decimal=True. For encoding this encodes Decimal objects and for decoding it implies parse_float=Decimal
 &lt;/li&gt;

 &lt;li&gt;
     Python 2.4 no longer supported (may still work, but no longer tested)
 &lt;/li&gt;

 &lt;li&gt;
     Decoding performance and memory utilization enhancements &lt;a href="http://bugs.python.org/issue7451"&gt;http://bugs.python.org/issue7451&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     JSONEncoderForHTML class for escaping &amp;amp;, &amp;lt;, &amp;gt; &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=66"&gt;http://code.google.com/p/simplejson/issues/detail?id=66&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Memoization of object keys during encoding (when using speedups)
 &lt;/li&gt;

 &lt;li&gt;
     Encoder changed to use PyIter_Next for list iteration to avoid potential threading issues
 &lt;/li&gt;

 &lt;li&gt;
     Encoder changed to use iteritems rather than PyDict_Next in order to support dict subclasses that have a well defined ordering &lt;a href="http://bugs.python.org/issue6105"&gt;http://bugs.python.org/issue6105&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     indent encoding parameter changed to be a string rather than an integer (integer use still supported for backwards compatibility) &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=56"&gt;http://code.google.com/p/simplejson/issues/detail?id=56&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Test suite (python setup.py test) now automatically runs with and without speedups &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=55"&gt;http://code.google.com/p/simplejson/issues/detail?id=55&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Fixed support for older versions of easy_install (e.g. stock Mac OS X config) &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=54"&gt;http://code.google.com/p/simplejson/issues/detail?id=54&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Fixed str/unicode mismatches when using ensure_ascii=False &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=48"&gt;http://code.google.com/p/simplejson/issues/detail?id=48&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Fixed error message when parsing an array with trailing comma with speedups &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=46"&gt;http://code.google.com/p/simplejson/issues/detail?id=46&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Refactor decoder errors to raise JSONDecodeError instead of ValueError &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=45"&gt;http://code.google.com/p/simplejson/issues/detail?id=45&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     New ordered_pairs_hook feature in decoder which makes it possible to preserve key order. &lt;a href="http://bugs.python.org/issue5381"&gt;http://bugs.python.org/issue5381&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Fixed containerless unicode float decoding (same bug as 2.0.4, oops!) &lt;a href="http://code.google.com/p/simplejson/issues/detail?id=43"&gt;http://code.google.com/p/simplejson/issues/detail?id=43&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     Share PosInf definition between encoder and decoder
 &lt;/li&gt;

 &lt;li&gt;
     Minor reformatting to make it easier to backport simplejson changes to Python 2.7/3.1 json module
 &lt;/li&gt;
&lt;/ul&gt;</description>
      <pubDate>Thu, 11 Mar 2010 13:00:10 CST</pubDate>
      <guid isPermaLink="true">http://bob.pythonmac.org/archives/2010/03/10/simplejson-210/</guid>
      <dc:creator>Bob Ippolito</dc:creator>
    </item>
    <item>
      <title>Charter for Compassion [Flickr]</title>
      <link>http://www.therichwebexperience.com/blog/aaron_gustafson/2010/03/charter_for_compassion_flickr_?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/aarongustafson/"&gt;Aaron Gustafson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/aarongustafson/4424293463/" title="Charter for Compassion"&gt;&lt;img src="http://farm3.static.flickr.com/2536/4424293463_3e7324b61a_m.jpg" width="146" height="240" alt="Charter for Compassion" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ar.charterforcompassion.org/share/the-charter/" rel="nofollow"&gt;ar.charterforcompassion.org/share/the-charter/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EasyReader/~4/_JXbGCubApU" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 11 Mar 2010 11:00:11 CST</pubDate>
      <guid isPermaLink="true">tag:flickr.com,2005:/photo/4424293463</guid>
      <dc:creator>Aaron Gustafson</dc:creator>
    </item>
    <item>
      <title>PyCon 2010, Analysis: The Other Kind of Testing</title>
      <link>http://www.therichwebexperience.com/blog/bob_ippolito/2010/03/pycon_2010_analysis_the_other_kind_of_testing?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;I gave a talk at &lt;a href="http://us.pycon.org/2010/conference/"&gt;PyCon 2010&lt;/a&gt; in Atlanta last month called &lt;a href="http://bitbucket.org/etrepum/analysis_pycon_2010/"&gt;Analysis: The Other Kind of Testing&lt;/a&gt; (&lt;a href="http://blip.tv/file/3321657"&gt;video&lt;/a&gt;). It's a very simple overview of techniques such as split testing (AB testing) and a call to action to improve &lt;a href="http://bitbucket.org/akoha/django-lean/"&gt;django-lean&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Atlanta was a fantastic location for PyCon 2010, and I look forward to returning next year. Hopefully if I give another talk I'll be able to put a little more time into it :)
&lt;/p&gt;
&lt;p&gt;As per usual, I've been incredibly lazy about updating this blog, so you're much better off following &lt;a href="http://twitter.com/etrepum"&gt;@etrepum&lt;/a&gt; on &lt;a href="http://twitter.com/etrepum"&gt;Twitter&lt;/a&gt;.
&lt;/p&gt;</description>
      <pubDate>Thu, 11 Mar 2010 08:00:13 CST</pubDate>
      <guid isPermaLink="true">http://bob.pythonmac.org/archives/2010/03/10/pycon-2010-analysis-the-other-kind-of-testing/</guid>
      <dc:creator>Bob Ippolito</dc:creator>
    </item>
    <item>
      <title>The Community Manager</title>
      <link>http://www.therichwebexperience.com/blog/pete_muir/2010/03/the_community_manager?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description />
      <pubDate>Wed, 10 Mar 2010 16:00:09 CST</pubDate>
      <guid isPermaLink="true">http://in.relation.to/Bloggers/TheCommunityManager</guid>
      <dc:creator>Pete Muir</dc:creator>
    </item>
    <item>
      <title>Using BIRT and Actuate with JSF, RichFaces</title>
      <link>http://www.therichwebexperience.com/blog/max_katz/2010/03/using_birt_and_actuate_with_jsf_richfaces?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;a href="http://www.birt-exchange.org/blog/?author=33"&gt;Virgil Dodson&lt;/a&gt; from Actuate posted a great &lt;a href="http://www.birt-exchange.org/wiki/Using_BIRT_and_Actuate_with_JavaServer_Faces%28JSF%29/"&gt;tutorial&lt;/a&gt; on how to use BIRT and Actuate with JSF. RichFaces is used as well. The tutorial uses &lt;a href="http://exadel.com/web/portal/download/jsf4birt"&gt;jsf4birt&lt;/a&gt; library developed by Exadel. &lt;/p&gt;
&lt;p&gt;jsf4birt can be downloaded &lt;a href="http://exadel.com/web/portal/download/jsf4birt"&gt;here&lt;/a&gt;. &lt;/p&gt;</description>
      <pubDate>Wed, 10 Mar 2010 13:00:24 CST</pubDate>
      <guid isPermaLink="true">http://mkblog.exadel.com/?p=1365</guid>
      <dc:creator>Max Katz</dc:creator>
    </item>
    <item>
      <title>Actor style messaging and honey do lists</title>
      <link>http://www.therichwebexperience.com/blog/andrew_glover/2010/03/actor_style_messaging_and_honey_do_lists?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;p&gt;&lt;img style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 0.0em; PADDING-TOP: 0.0em; FLOAT: RIGHT; PADDING-BOTTOM: 0.0em" src="http://thediscoblog.com/images/2010/housewife.jpg" alt="free lunch" width="158" height="210"/&gt;As I previously mentioned in &amp;#8220;&lt;A HREF="http://thediscoblog.com/2010/03/03/free-lunches-mousetraps-and-the-actor-model/"&gt;Free lunches, mousetraps and the Actor model&lt;/A&gt;&amp;#8220;, Edward A. Lee wrote an interesting article entitled &amp;#8220;&lt;a href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf"&gt;The Problem with Threads&lt;/a&gt;&amp;#8221; in which he advocates leveraging the actor model in popular languages (such as in Java) as opposed to adopting an entire new paradigm (like &lt;a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/"&gt;Erlang&lt;/a&gt;). He states:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We should not replace established languages. We should instead build on them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It appears that more than a few hip people agree with his line of thinking. It turns out there are quite a few options available for leveraging the actor model in Java. That is, aside from alternative languages like &lt;a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/"&gt;Scala&lt;/a&gt;, which supports actors and &lt;A HREF="http://gpars.codehaus.org/"&gt;Groovy with GPars&lt;/A&gt;, there&amp;#8217;s framework&amp;#8217;s like &lt;A HREF="http://www.malhar.net/sriram/kilim/"&gt;Kilim&lt;/A&gt;, &lt;A HREF="http://osl.cs.uiuc.edu/af/"&gt;ActorFoundry&lt;/A&gt;, &lt;A HREF="http://actorsguildframework.org/"&gt;Actors Guild&lt;/A&gt;, and &lt;A HREF="http://code.google.com/p/jetlang/"&gt;jetlang&lt;/A&gt;.  &lt;/p&gt;
&lt;p&gt;I ended up employing Kilim at a client side over a year ago to replace a thread based computational model. At the time, GPars was in its early stages and I was specifically looking for a speed up in application performance. The multi-threaded application was taking roughly 5 hours to complete.  &lt;/p&gt;
&lt;p&gt;In the end, the speed up attributed to Kilim (or indirectly leveraging its actor model) was hardly noticeable (some aspects of &lt;A HREF="http://www.infoq.com/news/2008/06/kilim-message-passing-in-java"&gt;Kilim&lt;/A&gt; were noticeably faster though &amp;#8212; such as spawning a task was quite fast as opposed to spawning a normal threads) as the real performance gain was leveraged by reducing and improving database queries (as usual, performance issues were essentially IO bound); nevertheless, the prime benefit of Kilim, which at the time I had overlooked, was the notion of a &lt;I&gt;mailbox&lt;/I&gt;. That is, in the actor model, processes can &lt;I&gt;share data more safely&lt;/I&gt;. &lt;/p&gt;
&lt;p&gt;There are quite a few different implementations and ways to facilitate message passing in various languages and platforms, but to me, the actor model&amp;#8217;s mailbox notion is quite intuitive. In &lt;A HREF="http://java.dzone.com/articles/java-actors-with-kilim"&gt;Kilim&amp;#8217;s actor model&lt;/A&gt;, messages are passed between processes via a &lt;code&gt;Mailbox&lt;/code&gt; &amp;#8212; in many ways, you can think of it as a queue. Processes can put items into a mailbox and also pull items from a mailbox in both a blocking and non-blocking manner (blocking of the underlying process not a thread). &lt;/p&gt;
&lt;p&gt;As an example of leveraging mailboxes in Kilim, I wrote two actors (a &lt;code&gt;Husband&lt;/code&gt; and a &lt;code&gt;Wife&lt;/code&gt;) that extend from Kilim&amp;#8217;s &lt;code&gt;Task&lt;/code&gt; type. Previous versions of Kilim had an &lt;code&gt;Actor&lt;/code&gt; type; however, as of version 0.6, &lt;code&gt;Task&lt;/code&gt; is the way to go. &lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;

public class Husband extends Task {
 private Mailbox&amp;lt;Message&amp;gt; mailbox;

 public Husband(Mailbox&amp;lt;Message&amp;gt; mailbox) {
  super();
  this.mailbox = mailbox;
 }

 @Override
 public void execute() throws Pausable, Exception {
  while (true) {
   System.out.println(&amp;quot;Husband listening...&amp;quot;);
   Message msg = mailbox.get(); // blocks
   if (msg.getReceipient() == Message.HUSBAND) {
    System.out.println(&amp;quot;Husband hears: &amp;quot; + msg.getMessage());
    Message reply = new Message(Message.WIFE, &amp;quot;Yes, dear&amp;quot;);
    mailbox.putnb(reply);
   }
   Task.sleep(1000);
  }
 }
}
&lt;/pre&gt;
&lt;p&gt;Under the covers, Kilim works by weaving bytecode so as to control &lt;code&gt;Task&lt;/code&gt; types and facilitate their safe interaction &amp;#8212; specifically, Kilim&amp;#8217;s weaver is looking for methods that throw the &lt;code&gt;Pausable&lt;/code&gt; type (previous versions used the &lt;code&gt;@Pausable&lt;/code&gt; annotation). &lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;Husband&lt;/code&gt; class, a few things are going on &amp;#8212; first, the instance waits for a message from a shared mailbox. In this case, I used a blocking &lt;code&gt;get&lt;/code&gt; call (as in reality, a husband really doesn&amp;#8217;t do anything else but waits for orders (I mean requests) from his wife). When a message is picked up, the instance checks to see if it was intended for it (in many cases, wife instances can communicate with children types sending messages like &amp;#8220;clean your room&amp;#8221; or &amp;#8220;brush your hair&amp;#8221;). &lt;/p&gt;
&lt;p&gt;Once a &lt;code&gt;Message&lt;/code&gt; type (which, in this case, is not a Kilim type) is determined to be sent to a &lt;code&gt;Husband&lt;/code&gt; instance, the &lt;code&gt;Husband&lt;/code&gt; type replies appropriately by creating a &lt;code&gt;Message&lt;/code&gt; and placing it into the &lt;code&gt;mailbox&lt;/code&gt; instance. Finally, the &lt;code&gt;sleep&lt;/code&gt; call is just placed to facilitate reading console output. &lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Wife&lt;/code&gt; class is similar (expect that she doesn&amp;#8217;t wait to listen&amp;#8230;). Like the &lt;code&gt;Husband&lt;/code&gt; instance, this class creates a &lt;code&gt;Message&lt;/code&gt; (in the form of a Honey Do) and sends it off via the shared &lt;code&gt;MailBox&lt;/code&gt;; however, she doesn&amp;#8217;t wait around &amp;#8212; that is, the instance uses the &lt;code&gt;putnb&lt;/code&gt; call, which is non-blocking. What&amp;#8217;s more, she&amp;#8217;ll also attempt to see if anything is in the mailbox for her, but in her case, she also uses a non-blocking call (&lt;code&gt;getnb&lt;/code&gt;) like so:&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;

public class Wife extends Task {

 private Mailbox&amp;lt;Message&amp;gt; mailbox;

 public Wife(Mailbox&amp;lt;Message&amp;gt; mailbox) {
  super();
  this.mailbox = mailbox;
 }

 @Override
 public void execute() throws Pausable, Exception {
  while (true) {
   Message request = new Message(Message.HUSBAND,
    &amp;quot;Please do x, y, and z today, husband.&amp;quot;);

   mailbox.putnb(request);
   Task.sleep(1000);
   Message msg = mailbox.getnb(); // no block

   if (msg != null &amp;amp;&amp;amp; msg.getReceipient() == Message.WIFE) {
    System.out.println(&amp;quot;Wife hears: &amp;quot; + msg.getMessage());
   }
  }
 }
}
&lt;/pre&gt;
&lt;p&gt;As you can see, if there is a message waiting for her, she&amp;#8217;ll hear it, otherwise, she moves on and requests her husband to do something else.&lt;/p&gt;
&lt;p&gt;Lastly, everything is coordinated by a simple driver class containing a &lt;code&gt;main&lt;/code&gt; method like so:&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import kilim.Mailbox;
import kilim.Task;

public class HoneyDo {

 public static void main(String[] args) {

  Mailbox&amp;lt;Message&amp;gt; sharedMailbox = new Mailbox&amp;lt;Message&amp;gt;();

  Task wife = new Wife(sharedMailbox);
  Task husband = new Husband(sharedMailbox);

  husband.start();
  wife.start();
 }
}
&lt;/pre&gt;
&lt;p&gt;Note how a &lt;code&gt;Mailbox&lt;/code&gt; instance is created for my custom &lt;code&gt;Message&lt;/code&gt; type; what&amp;#8217;s more, the &lt;code&gt;sharedMailbox&lt;/code&gt; is then shared between both the &lt;code&gt;wife&lt;/code&gt; and &lt;code&gt;husband&lt;/code&gt; instances. Lastly, things are started via the &lt;code&gt;start&lt;/code&gt; method. &lt;/p&gt;
&lt;p&gt;Running this hip example yields the following output (remember, your exact output will most likely look different; however, the logic sequence of activities will line up. That is, the wife requests things be done and the husband responds with &amp;#8220;yes, dear&amp;#8221;, which the wife hears). &lt;/p&gt;
&lt;pre class="brush: plain;"&gt;
 Husband listening...
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Husband listening...
 Wife hears: Yes, dear
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Husband listening...
 Wife hears: Yes, dear
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Wife hears: Yes, dear
 Husband listening...
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Husband listening...
 Wife hears: Yes, dear
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
 Wife hears: Yes, dear
 Husband listening...
 Husband hears: Please do x, y, and z today, husband.
 Husband says: Yes, dear
&lt;/pre&gt;
&lt;p&gt;The actor model facilitates &lt;a href="http://thediscoblog.com/2008/10/19/poll-which-language-is-better-suited-for-jvm-concurrency/"&gt;concurrent programming&lt;/a&gt; by allowing a safer mechanism for message passing between processes (or actors). Implementations of this model vary between languages and frameworks &amp;#8212; I suggest checking out &lt;a href="http://thediscoblog.com/2008/10/19/book-review-programming-erlang/"&gt;Erlang&lt;/a&gt;&amp;#8217;s actors followed by &lt;a href="http://thediscoblog.com/2009/12/10/book-review-programming-scala/"&gt;Scala&lt;/a&gt;&amp;#8217;s as each implementation is quite neat given their respective syntax. &lt;/p&gt;
&lt;p&gt;In the end, if you want to leverage plain Jane Java &lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;actors&lt;/a&gt;, then have a look at &lt;a href="http://www.malhar.net/sriram/kilim/"&gt;Kilim&lt;/a&gt; (or one of the other frameworks available)  &amp;#8212; just make sure you&amp;#8217;ve finished your honey do list first, man.&lt;/p&gt;
                                 &lt;p&gt;&lt;center&gt;Looking to spin up Continuous Integration &lt;em&gt;quickly&lt;/em&gt;? Check out &lt;a href="http://www.ciinabox.com"&gt;www.ciinabox.com&lt;/a&gt;.&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 10 Mar 2010 11:00:27 CST</pubDate>
      <guid isPermaLink="true">http://thediscoblog.com/?p=1069</guid>
      <dc:creator>Andrew Glover</dc:creator>
    </item>
    <item>
      <title>Links for 2010-03-09 [del.icio.us]</title>
      <link>http://www.therichwebexperience.com/blog/aaron_gustafson/2010/03/links_for_2010_03_09_del_icio_us_?utm_source=blogitem&amp;utm_medium=rss&amp;utm_campaign=blogrss</link>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.theonion.com/content/news/google_responds_to_privacy"&gt;Google Responds To Privacy Concerns With Unsettlingly Specific Apology&lt;/a&gt;&lt;br/&gt;
The Onion... brilliant as always.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://justaddwater.dk/2009/03/09/using-git-for-svn-repositories-workflow/"&gt;Using Git for SVN Repositories Workflow&lt;/a&gt;&lt;br/&gt;
Great overview of using Git with standard SVN repository layouts.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/EasyReader/~4/E3A5V69Z1tg" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 10 Mar 2010 08:00:50 CST</pubDate>
      <guid isPermaLink="true">http://del.icio.us/aarongustafson#2010-03-09</guid>
      <dc:creator>Aaron Gustafson</dc:creator>
    </item>
  </channel>
</rss>

