<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Code, Coffee : weblog</title>
    <link>http://www.joshlong.com</link>
    <description>Full contact Java programming from the trenches.</description>
    <dc:creator>Josh Long</dc:creator>
    <item>
      <title>A Month's Gap And No Explanation</title>
      <link>http://www.joshlong.com:80/jl/blogPost/a_months_gap_and_no_explanation.html</link>
      <description>&lt;p&gt; Hello, world! I've been utterly and completely drowned in 
lake-busy these last few months. Updates may be a little slow for the 
next month, too. I've started working as an editor for &lt;a 
href="http://www.infoq.com/author/Josh-Long"&gt;Infoq.com's Java 
Queue&lt;/a&gt;. Work is progressing apace on my next Spring book, and some 
exciting things are happening in my personal life pretty soon. Plus, 
I'm working on an opensource side-project that'll unveil hopefully 
pretty soon here.  Anyway, check out my updates on Infoq.com if you 
want good old fashioned news, and on Twitter if you want commentary in 
140 character chunks.   Sorry I can't say more, but I will when I can! 
If you're going to &lt;a href="http://javasymposium.techtarget.com/"&gt;The 
Server SIde Java Symposium&lt;/a&gt; next month (March 17-19), don't forget 
to say hi, and &lt;a 
href="http://javasymposium.techtarget.com/html/speakers.html#JLong"&gt;attend 
my sessions!&lt;/a&gt; 
&lt;/p&gt;</description>
      <pubDate>Wed, 17 Feb 2010 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/a_months_gap_and_no_explanation.html</guid>
      <dc:date>2010-02-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A Very Interesting Technique For Cross-Domain AJAX Requests</title>
      <link>http://www.joshlong.com:80/jl/blogPost/a_very_interesting_technique_for_crossdomain_ajax_requests.html</link>
      <description>&lt;P&gt; 
I read a &lt;b&gt;very&lt;/b&gt; good article on breaking the crossdomain wall for 
Ajax requests. It's presented   &lt;span style ="font-size:larger;"&gt;&lt;a 
href="http://www.wait-till-i.com/2010/01/10/loading-external-content-with-ajax-using-jquery-and-yql/"&gt;here, 
as an entry on http://www.wait-till-i.com&lt;/a&gt;&lt;/span&gt;. In it, Chris 
Heilmann talks about using a Yahoo service and JSON-P requests with 
Ajax to load any site's contents. You should most certainly read his 
article - it's fantastic. 
I post here the most salient bit (for me) since it genuinely knocked 
my socks off. To re-use this in your own code, copy the parts I've 
highlighted in bold. You can use your own version of jQuery, 
naturally, as the most interesting aspect is the bits inside the 
&lt;code&gt;ajax&lt;/code&gt; function (which itself is pretty trivial. I created 
the wrapper function so that the code could be stashed away and 
re-used more readily). 
I demonstrate its use in the script fragment below that, where I load 
the HTML for this very site. 
&lt;PRE&gt; 
&lt;CODE&gt; 
&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"&amp;gt; 
&amp;lt;html&amp;gt; 
&amp;lt;head&amp;gt; 
  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt; 
  &amp;lt;title&amp;gt; ZOMG! &amp;lt;/title&amp;gt; 
  &amp;lt;link rel="stylesheet" href="styles.css" type="text/css"&amp;gt; 
&amp;lt;/head&amp;gt; 
&amp;lt;body&amp;gt; 
&lt;b&gt; 
&amp;lt;script src="http://code.jquery.com/jquery-latest.pack.js"&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;script language="javascript"&amp;gt; 
function ajax( url, cb){ 
 var yqlUrl =  "http://query.yahooapis.com/v1/public/yql?"+ 
            "q=select%20*%20from%20html%20where%20url%3D%22"+ 
              encodeURIComponent(url)+ 
            "%22&amp;format=xml'&amp;callback=?" ; 
 $.getJSON( yqlUrl,  cb ); 
} 
&amp;lt;/script&amp;gt; 
&lt;/b&gt; 
&amp;lt;script language="javascript"&amp;gt; 
$(document).ready(function(){ 
 ajax( 'http://www.joshlong.com', function(data){ 
  alert( data.results[0] +'' ) ; 
 }); 
}); 
&amp;lt;/script&amp;gt; 
&amp;lt;/body&amp;gt; 
&amp;lt;/html&amp;gt; 
&lt;/CODE&gt;&lt;/PRE&gt; 
&lt;/P&gt;</description>
      <pubDate>Wed, 13 Jan 2010 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/a_very_interesting_technique_for_crossdomain_ajax_requests.html</guid>
      <dc:date>2010-01-13T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Modeling</title>
      <link>http://www.joshlong.com:80/jl/blogPost/modeling.html</link>
      <description>&lt;p&gt; 
I can't tell you how powerful overcoming the leap-before-looking 
temptation is when building a system. Have an object model? 
&lt;b&gt;Model&lt;/b&gt; it using UML or ERD. Have a workflow? Draw a workflow 
diagram (an activity diagram). Have a webflow? Draw a webflow diagram 
(looks like a state diagram, or in more sophisticated scenarios, like 
an activity diagram). Have a site map? Map the site using a site 
planning tool like &lt;a 
href="http://dub.washington.edu:2007/denim/"&gt;Denim.&lt;/a&gt; All of these 
tools facilitate VISUAL feedback. They are cognitive, high level 
disciplines, and for good reason! Your mind interprets things visually 
differently than it does when coding from the left brain - it is able 
to "see" associations between related concepts when it's fed ideas 
through feedback that ends up in the right brain. 
&lt;/p&gt;&lt;p&gt; I've mentioned this before, I think, but check out Neal Ford's 
&lt;a href="http://library.theserverside.com/detail/RES/1242309506_447.html"&gt;On 
the Lam From The Software Police&lt;/a&gt; for more. 
&lt;/p&gt;&lt;p&gt;Even if you don't check it out, invest in trying the modeling 
tools associated with the task you're attempting to solve. 
 Even if you feel - after giving the technology a REALLY good-faith 
effort - that you've gained nothing, I'm willing to bet your product 
will still be more "consistent" than if you had developed it from 
scatch, unable to see the big picture. 
&lt;/p&gt;</description>
      <pubDate>Mon, 11 Jan 2010 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/modeling.html</guid>
      <dc:date>2010-01-11T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Spring BlazeDS and your RIA/Thick/Thin/Fat client</title>
      <link>http://www.joshlong.com:80/jl/blogPost/spring_blazeds_and_your_riathickthinfat_client.html</link>
      <description>&lt;p&gt;  How are you handling messaging in your thin client, thick client, 
fat client, RIA, or mobile client?  &lt;/p&gt;&lt;p&gt; &lt;a 
href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS"&gt;BlazeDS&lt;/a&gt; 
provides the ability to  proxy   messages from a JMS destination. Your 
AIR / Flex client can subscribe to it and provide a callback, very 
much like a Message Driven EJB or Spring's Message Driven POJOs. &lt;/p&gt; 
&lt;p&gt;Traditionally, reacting to an event on a bus in a client (which 
very well could exist outside the firewall) means polling some service 
or setting up a specialized proxy or perhaps having  separate DMZ-safe 
JMS destination where you forward client-bound messages. 
&lt;/p&gt;&lt;p&gt;Suffice it to say, all of this is tedious and imposes an 
unecessary burden on the architecture and the developers. When it 
comes to messaging and remoting based services, there is 
&lt;i&gt;definitely&lt;/i&gt; an extra burden on the developer of a RIA to secure 
or handle that requirement where this burden simply does not exist 
with traditional web applications. It is too frequently glossed over 
when architecting a system and then becomes a pain point. &lt;/p&gt;&lt;p&gt; 
There are &lt;i&gt;some&lt;/i&gt; tools... &lt;/p&gt;&lt;p&gt;If you are using AJAX for your 
RIA, then you will have mastered tools like comet for push-based 
messaging. Even here, though, the burden of connecting and configuring 
comet is on you, the developer. For example, &lt;a 
href="http://directwebremoting.org/dwr/index.html"&gt;DWR&lt;/a&gt; - which is 
fantastic - doesn't have a way of proxying a JMS destination that I 
know of. It &lt;i&gt;can&lt;/i&gt; be done, of course.&lt;/p&gt;&lt;p&gt;&lt;a 
href="http://www.dossot.net/"&gt;David Dossot&lt;/a&gt; showed me a very 
interersting, albeit specific, &lt;a 
href="http://docs.codehaus.org/display/JETTY/Integrating%20with%20ActiveMQ"&gt;solution&lt;/a&gt; 
that solves the problem for Ajax using ActiveMQ's JavaScript client. 
&lt;/p&gt; 
&lt;p&gt; So, back to the question at hand - how are you solving the 
problem? Do you just avoid building systems that have the problem? You 
truly can't think of at least one or two or a millino problems that 
would be better served by messaging? &lt;/p&gt; 
&lt;p&gt; To me, the most &lt;b&gt;complete&lt;/b&gt; solution appears to be Flex 
partnered with Spring and BlazeDS. If this post sounds like that of a 
gushing fan boy, you'll forgive me. It's true, unbounded enthusiasm. 
This technology is liberating, enabling! It reduces a real problem to 
a half hour of configuration - relegating the architectural burden 
back to the "gloss over" column, if you're using Flex. The Spring - 
BlazeDS integration is more than just a lot of "could"s. It provides 
out-of-the box support for connecting to JMS, and if you use the 
&lt;b&gt;excellent&lt;/b&gt; &lt;a 
href="http://www.springsource.org/spring-flex"&gt;Spring/BlazeDS&lt;/a&gt; 
solution, then you can do all of this with  aplomb, and you can  hook 
up any flex client to any channel on your Spring Integration bus with 
a minimum of fuss. 
  &lt;/p&gt; &lt;p&gt;Naturally, all of that will all be covered in &lt;a 
href="http://www.apress.com/book/view/1430224991"&gt;Spring Web 
Recipes&lt;/a&gt;, so stay tuned! &lt;/p&gt;&lt;p&gt; 
So: how are &lt;b&gt;you&lt;/b&gt; talking to your messaging middleware?  Remember 
- messaging is even MORE important in the wild Web 2.0 / cloud world 
than the client-server applications of yesteryear. Temporal decoupling 
brings scalability. 
&lt;/p&gt;</description>
      <pubDate>Wed, 06 Jan 2010 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/spring_blazeds_and_your_riathickthinfat_client.html</guid>
      <dc:date>2010-01-06T00:00:00Z</dc:date>
    </item>
    <item>
      <title>PostgreSQL 8.4 and Bitronix XA</title>
      <link>http://www.joshlong.com:80/jl/blogPost/postgresql_84_and_bitronix_xa.html</link>
      <description>&lt;p&gt;I use &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; 8.3 - 
highly recommended by the way - 
and I just updated an application to 8.4. 
The application is built principally using Spring, Hibernate, and JMS. 
Naturally, some level of 
cooperation among transactions is required, so I use an XA provider - 
&lt;a href="http://docs.codehaus.org/display/BTM/Home"&gt;Bitronix.&lt;/a&gt; 
Everything was working swimmingly 
with PostgreSQL 8.3, but the application buckled on startup with 
errors when I upgrade PostgreSQL to 8.4: 
&lt;/p&gt;&lt;PRE&gt;&lt;CODE&gt;Dec 30, 2009 11:25:50 PM 
bitronix.tm.twopc.AbstractPhaseEngine logFailedResources 
&lt;b&gt;SEVERE: resource xasql failed on a Bitronix XID [737072696E672D62746D2D- 
73656E64657200000125E3A04B9900000038 : 737072696E672D62746D2D73656E6465720- 
0000125E3A04BA40000003A] 
org.postgresql.xa.PGXAException: Error preparing transaction&lt;/b&gt; 
at org.postgresql.xa.PGXAConnection.prepare(PGXAConnection.java:254) 
at bitronix.tm.twopc.Preparer$PrepareJob.run(Preparer.java:134) 
at bitronix.tm.twopc.executor.SyncExecutor.submit(SyncExecutor.java:12) 
at bitronix.tm.twopc.AbstractPhaseEngine.runJobsForPosition(AbstractPhaseEngine.java:109) 
at bitronix.tm.twopc.AbstractPhaseEngine.executePhase(AbstractPhaseEngine.java:71) 
at bitronix.tm.twopc.Preparer.prepare(Preparer.java:68) 
at bitronix.tm.BitronixTransaction.commit(BitronixTransaction.java:176) 
at bitronix.tm.BitronixTransactionManager.commit(BitronixTransactionManager.java:95) 
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1009) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
... 
&lt;b&gt;Caused by: org.postgresql.util.PSQLException: ERROR: prepared 
transactions are disabled&lt;/b&gt; 
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451 
&lt;/CODE&gt;&lt;/PRE&gt; 
&lt;P&gt; 
If you're in my situation, the immediate cure is to uncomment and set 
the &lt;code&gt;max_prepared_transactions&lt;/code&gt; 
attribute in &lt;code&gt;data/postgresql.conf&lt;/code&gt;. A safe value seems to 
be 10, though your mileage may vary. 
There must be a reason they've disabled this in 8.4, so further 
investigation is required. In the meantime, though, everything seems 
performant and works as it did before. 
&lt;/P&gt;</description>
      <pubDate>Thu, 31 Dec 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/postgresql_84_and_bitronix_xa.html</guid>
      <dc:date>2009-12-31T00:00:00Z</dc:date>
    </item>
    <item>
      <title>So Much to Do, So Little Time!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/so_much_to_do_so_little_time.html</link>
      <description>&lt;p&gt;&lt;a href="http://www.springsource.org/about"&gt;Spring 3.0's out (you 
didn't get the memo?),&lt;/a&gt; and there's a &lt;i&gt;lot&lt;/i&gt; of interesting 
stuff. 
This release has been long in coming due in no small part to the 
specifications it tracks and to the intense furvor and emphasis placed 
on quality assurance and testing. One target platform - JEE6 (and with 
it the final versions of JSR330) - also just recently went final, and 
you'll find support for these technologies, as well, where 
appropriate. 
Now that it's out, you can start certifying applications in production 
on it. I've found that - aside from dealing with the new Maven 
imports - the upgrade process has been flawless. I've taken complex 
applications and merely fixed the jars and they continue to work. You 
will find, however, that there are a lot of reasons to go through and 
start selectively enabling new features, and namespaces. 
&lt;/p&gt;&lt;p&gt; In our book &lt;a href= 
"http://www.apress.com/book/view/1430224975"&gt;Spring Enterprise 
Recipes&lt;/a&gt;, my co-author Gary Mak and I discuss a lot of the new, 
exciting Spring 3.0 features. Spring 3.0 debuts slightly more 
streamlined scheduling / TaskExecutor / thread pool support. The idea 
is that you can more readily model asynchronous, repeating (at a 
scheduled time, rate, or both), and concurrent programming problems 
using these facilities and - in some cases - do so while leveraging 
more advanced facilities underlying a given target platform, like the 
WorkerJ implementations, the Java5 task executors, and thread pools 
and more. &lt;/p&gt; 
&lt;p&gt; I won't go into much of that here as the book ablely covers most 
of it, but one thing I did want to cover (which we couldn't cover in 
time in the book as the feature was not ready as the book went to 
press) was the very elegant &lt;code&gt;task&lt;/code&gt; namespace. 
&lt;h2&gt;Background &lt;/h2&gt;&lt;p&gt; It should be noted that these features are 
not, exactly, novel. Spring has shipped with a Quartz scheduling 
framework integration for years. Among many other niceties included 
therein was (and still is, for what it's worth) a &lt;a 
href="http://static.springsource.org/spring/docs/1.2.x/reference/scheduling.html"&gt;MethodInvokingJobDetailFactoryBean&lt;/a&gt; 
that allowed you to schedule future executions of a method on a Java 
bean using Quartz. &lt;/P&gt;&lt;P&gt; A few years later, EJB 3 debuted support 
for a limited form of scheduling using the &lt;code&gt;Timer&lt;/code&gt; 
mechanism. One major limitation was the lack of support for CRON-like 
expressions and for asynchronous methods. Naturally, you could use JMS 
to acheive the same effect, in a way...&lt;/P&gt;&lt;P&gt;The JBoss gang debuted 
JBoss Seam support for &lt;a 
href="http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html_single/#d0e21502"&gt;scheduled 
and asynchronous method execution on a Seam component&lt;/a&gt; as well as a 
proprietary mechanism to &lt;a 
href="http://www.jboss.org/file-access/default/members/jbossejb3/freezone/docs/tutorial/1.0.7/html/Asynchronous_Invocations.html"&gt;do 
the same with EJB 3.&lt;/a&gt; In Seam, using these features was simply a 
matter of adding the appropriate configuration (as we do in Spring) to 
enable the executor (they have a few, including one based on the EJB3 
Timer and one based Quartz.) The usage here is familiar to what has 
recently been debuted in Spring 3.0. &lt;/p&gt;&lt;p&gt; Clearly, the need for 
such features is common enough that they've both been fully 
incorporated &lt;a 
href="http://docs.sun.com/app/docs/doc/820-7627/bnbpe?a=view"&gt;into 
JEE6 and EJB3.1.&lt;/a&gt; There, you can specify CRON expressions as well 
as defer the invocation of a method using the 
&lt;code&gt;@Asynchronous&lt;/code&gt; or &lt;code&gt;@Schedule&lt;/code&gt; annotations. A 
simple example looks like: 
&lt;/p&gt;&lt;P&gt;&lt;PRE&gt;&lt;CODE&gt;package com.joshlong.ejb.timer ; 
import java.util.Date; 
import java.util.logging.Logger; 
import javax.annotation.Resource; 
import javax.ejb.Schedule; 
import javax.ejb.Asynchronous; 
import javax.ejb.Stateless; 
import javax.ejb.Timeout; 
import javax.ejb.Timer; 
import javax.ejb.TimerService; 
@Singleton 
public class PeriodicGreeter { 
 // you could use this to schedule things manually 
 @Resource TimerService timerService; 
 // or use the annotations to do so automatically 
 @Schedule(minute="*/3", hour="*") 
 public void sayHelloPeriodically() { 
   System.out.println( String.format( "Hello, world, at %s" , new 
Date()) ) ; 
 } 
 @Asynchronous 
 public Future&amp;lt;String&amp;gt; sayHelloAsynchronously() { 
   System.out.println( String.format( "Hello, world, at %s" , new 
Date()) ) ; 
   // ... 
 } 
}&lt;/CODE&gt;&lt;/PRE&gt; 
&lt;/p&gt; 
&lt;h2&gt; Spring 3.0 Implementation &lt;/h2&gt; 
&lt;p&gt; 
The &lt;code&gt;task&lt;/code&gt; namespace let's you declaratively configure a 
&lt;code&gt;TaskScheduler&lt;/code&gt; and a &lt;code&gt;TaskExecutor&lt;/code&gt; instance 
using XML. From here, you can configure beans that have scheduled, or 
asynchronous, executions using the XML or - my personal favorite if 
you can get access to the code - via Java annotations. &lt;/p&gt; &lt;p&gt;Here's 
an example Spring application context featuring this namespace and 
configuring a scheduler and executor with default-ish settings:&lt;/p&gt; 
&lt;P&gt;&lt;PRE&gt;&lt;CODE&gt; 
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt; 
&amp;lt;beans xmlns="http://www.springframework.org/schema/beans" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:task="http://www.springframework.org/schema/task" 
   xmlns:context="http://www.springframework.org/schema/context" 
   xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/lang 
       http://www.springframework.org/schema/lang/spring-lang-3.0.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd 
       &lt;b&gt;http://www.springframework.org/schema/task 
       http://www.springframework.org/schema/task/spring-task-3.0.xsd&lt;/b&gt;"&amp;gt; 
 &amp;lt;context:annotation-config/&amp;gt; 
 &amp;lt;context:component-scan annotation-config="true" 
       base-package="com.yourbasepackage.scheduling" /&amp;gt; 
&lt;B&gt; 
 &amp;lt;task:scheduler id="scheduler" pool-size="10"/&amp;gt; 
 &amp;lt;task:executor id="executor" pool-size="10"/&amp;gt; 
 &amp;lt;task:annotation-driven scheduler="scheduler" executor = "executor" /&amp;gt; 
&lt;/B&gt; 
&amp;lt;/beans&amp;gt; 
&lt;/CODE&gt;&lt;/PRE&gt;&lt;/P&gt; 
&lt;P&gt; What you do from here is up to you. You could simply start 
defining tasks inline with your XML. 
That approach certainly has its redeeming qualities, not the least of 
which is that your code is more readily "documented" and 
&lt;i&gt;conceivably&lt;/i&gt; 
adjustable at runtime with some refresh trickery... sure.. you 
&lt;i&gt;could.&lt;/i&gt;&lt;/p&gt; 
&lt;CODE&gt;&lt;PRE&gt; 
&amp;lt;task:scheduled-tasks scheduler="myScheduler"&amp;gt; 
 &amp;lt;task:scheduled ref="greeter" method="sayHello" fixed-delay="5000"/&amp;gt; 
 &amp;lt;task:scheduled ref="greeter" method="sayHello" fixed-rate="5000"/&amp;gt; 
 &amp;lt;task:scheduled ref="greeter" method="sayHello" cron="*/5 * * * 
* MON-FRI"/&amp;gt; 
&amp;lt;task:scheduled-tasks/&amp;gt; 
&lt;/PRE&gt;&lt;/CODE&gt; 
&lt;p&gt;...In practice, however, the annotation approach just &lt;i&gt;FEELS&lt;/i&gt; 
soo much better! So, here is how you might write a scheduled or 
asynchronous bean in Spring. 
&lt;/p&gt; 
&lt;PRE&gt;&lt;CODE&gt;package com.joshlong.spring.timer ; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 
import javax.annotation.PostConstruct; 
import javax.annotation.Resource; 
import java.util.Date; 
@Component 
public class SpringPeriodicGreeter { 
 // you can do everything you normally would using Spring, obviously 
 @Autowired CustomerService customerService ; 
 // this runs once every 5 minutes 
 @Scheduled(fixedRate = 1000 * 60 * 5) 
 public void sayHelloEveryFiveMinutes() { 
   System.out.println( String.format( "Hello, world, at %s" , new 
Date()) ) ; 
 } 
 @Scheduled(cron="*/5 * * * * MON-FRI") 
 public void sayHelloOnlyOneWeekdays() { 
   System.out.println( String.format( "Hello, world, at %s" , 
new Date()) ) ; 
 } 
 @Async 
 public void doSomething(String s) { 
  // this will be executed asynchronously 
 } 
 @Async 
 public Future&amp;lt;String&amp;gt; returnSomething(int i) { 
   // this will be executed asynchronously, but you can get the 
   // result by blocking on &lt;code&gt;Future.get&lt;/code&gt; 
 } 
} 
&lt;/CODE&gt;&lt;/PRE&gt; 
&lt;p&gt; Thus, this is nothing too strange - very simialar in fact to 
what's in JEE6. Obviously, I've not mentioned &lt;i&gt;every&lt;/i&gt; permutation 
of the features from the various technologies, but hopefully this gets 
you past the initial cognitive "hump" of adapting a new technology. 
It helps that - at least in the Spring case - it's dead simple to 
start using it if you're already using Spring. 
I wonder if there will be support for working with 
the JEE6 annotations that describe the same things? The major 
takeaways are that you can get this simply by updating your version of 
Spring, which should be painless if you're not tied to Java 1.4. You 
can get the JEE6 functionality by updating your version of the 
platform and server, if the platform/server are ready (Glassfish is!). 
&lt;/p&gt; 
&lt;h2&gt;Use&lt;/h2&gt; 
&lt;P&gt; Now, as to &lt;i&gt;where&lt;/i&gt; this stuff might be used, well, I can only 
think of a few &lt;i&gt;thousand&lt;/i&gt; things... &lt;/p&gt; 
&lt;OL&gt;&lt;LI&gt; Quartz is probably still more powerful, but the 
implementation and usage are hackneyed - this new approach will feel 
much more elegant. You could probably get away with removing the old 
Quartz code and using this for most of your implementation needs. 
&lt;/LI&gt; 
&lt;LI&gt;Because Spring's implementations are swappable, you could back 
this functionality with varying TaskExecutors/TaskSchedulers of your 
own implementation, if you wanted.&lt;/LI&gt;&lt;LI&gt;The obvious use case is 
that you can now remove &lt;b&gt;CRON&lt;/b&gt;, &lt;b&gt;Autosys,&lt;/b&gt; &lt;b&gt;Flux&lt;/b&gt; and 
any number of other third-party, dedicated middleware schedulers from 
your architecture (if you're only using them to run Java 
services.)&lt;/LI&gt; 
&lt;LI&gt;As with Spring itself, this abstraction is useful because you can 
deploy it inside of a web applicatior or any other place you can 
imagine Spring running, so you don't need to install a scheduler if 
you just want something run periodically inside your web container 
&lt;/LI&gt; 
&lt;li&gt;If you have a Spring Batch job, this might be an ideal way to kick 
the jobs off periodically. You need to start processing the billing 
batch every night at 2am, but only on weekdays? This is a match made 
in heaven! How you get a Batch job to start running is left mainly as 
an exercise to the user. I recommend using an ESB (like Spring 
Integration) to react to events, or using a scheduler like this 
&lt;code&gt;task&lt;/code&gt; namespace (or Quartz) to kick the jobs off. &lt;/li&gt; 
&lt;li&gt;Spring Integration has a gateway mechanism that lets you front 
what is essentially a send (and/or) recieve operation on a channel 
(think: JMS queue/topic) with a method on an interface. I &lt;i&gt;love&lt;/i&gt; 
this feature and use it a lot because I don't want to surface JMS 
queues / topics to the client (that's a little &lt;i&gt;too&lt;/i&gt; loose and 
decoupled an API!). I also use it because it allows me to model 
fire-n-forget messaging using Java interfaces, which is exactly what 
the &lt;code&gt;@Async&lt;/code&gt; annotation does. The other benefit of the 
Spring Integration feature is that the processing leaves the VM and 
goes somewhere to finish (ostensibly, wherever the consumer for the 
topic/queue lives) the job and then return the result. This provides 
scalability benefits to both the client &lt;i&gt;and&lt;/i&gt; the server, whereas 
the &lt;code&gt;@Async&lt;/code&gt; annotation would only increase the thoroughput 
of the client, in this case: processing still takes place on the node 
with the &lt;code&gt;@Async&lt;/code&gt; annotation, it's simply deferred... 
Deferment &lt;i&gt;is &lt;/i&gt; a valid way to increase capacity while decreasing 
thoroughput.&lt;/li&gt; 
&lt;/ol&gt;</description>
      <pubDate>Mon, 28 Dec 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/so_much_to_do_so_little_time.html</guid>
      <dc:date>2009-12-28T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My Tweet Cloud</title>
      <link>http://www.joshlong.com:80/jl/blogPost/my_tweet_cloud.html</link>
      <description>&lt;p&gt;Waiting for a long running process to finish up. Started screwing 
around on the internet and found a useful little application called &lt;a 
href="http://tweetcloud.icodeforlove.com"&gt;TweetCloud.&lt;/a&gt; It generates 
a neat looking image-based cloud of your tweets. Here's my &lt;a 
href="http://tweetcloud.icodeforlove.com/starbuxman/13025"&gt;tweet 
cloud&lt;/a&gt;. I'm &lt;a 
href="http://www.twitter.com/starbuxman"&gt;@starbuxman&lt;/a&gt;, if you're on 
that busy network and wanna chat.&lt;/p&gt; 
&lt;p&gt;&lt;img src="__8887_0__" 
width ="400" /&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 29 Nov 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/my_tweet_cloud.html</guid>
      <dc:date>2009-11-29T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Spring Batch's MultiResourceItemWriter</title>
      <link>http://www.joshlong.com:80/jl/blogPost/spring_batchs_multiresourceitemwriter.html</link>
      <description>&lt;p&gt;If you've ever had to do batch processing, then you know how 
tedious it can be to write all the infrastructure code surrounding 
retries and error recovery and usefully handling long running 
processing and &lt;i&gt;all&lt;/i&gt; the other tedium that surrounds a typical 
batch application. For these types of applications, I use &lt;a 
href="http://static.springsource.org/spring-batch/"&gt;Spring Batch&lt;/a&gt;, 
a batch processing framework from Dave Syer and the fine people at 
SpringSource. 
 &lt;/p&gt; 
&lt;p&gt;The basic idea is that you setup &lt;code&gt;job&lt;/code&gt;s that have 
&lt;code&gt;step&lt;/code&gt;s, that have &lt;code&gt;tasklet&lt;/code&gt;s. This the normal 
use case, but by no means the only one. You use jobs and steps to 
string together  sequences of processing input and writing to output 
via a &lt;code&gt;reader&lt;/code&gt; and a &lt;code&gt;writer&lt;/code&gt;. 
Spring Batch has implementations for both reading and writing that 
will likely meet most of your needs: XML, files, streams, databases, 
etc. There's so much interesting stuff here, so of course I humbly 
recommend you take a crack at the documentation or read my book, &lt;i&gt;&lt;a 
href="http://www.apress.com/book/view/9781430224976"&gt;Spring Enterprise 
Recipes&lt;/a&gt;&lt;/i&gt;. 
&lt;/p&gt; 
&lt;p&gt; That said all said, there's no obvious way to read from an input 
source and then write to multiple files. The use case here, in my 
case, is &lt;a href="http://www.google.com/webmasters/tools/"&gt;Google's 
Sitemaps.&lt;/a&gt; These are XML files that describe the pages on your 
site. You list every URL possible. If you have more than 50,000 links, 
then you must create many files and list those files in a Sitemap 
index file. 
 So, I wanted to read from a database and derive all the URLs possible 
for content, and then write those to sitemap XML files, where each 
sitemap could not exceed 50,000 entries. Spring Batch ships with an 
adapter writer that serves exactly this purpose. It's called 
&lt;code&gt;org.springframework.batch.item.file.MultiResourceItemWriter&lt;/code&gt;. 
You define it just like you might any other writer, except that you 
wrap another writer with it. 
&lt;/p&gt; 
&lt;p&gt; Here's the salient bits from my configuration. Most of this is 
boilerplate. I don't include the configuration of the Spring Batch 
environment, or the configuration of the reader, because those are 
pretty typical. Note that here we configure the &lt;code&gt;writer&lt;/code&gt; 
for the &lt;code&gt;job&lt;/code&gt; and in turn configure its 
&lt;code&gt;delegate&lt;/code&gt; property, where we have the real writer 
implementation. In this case, there's no need to configure the 
delegate writer's &lt;code&gt;resource&lt;/code&gt; property.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; 
&amp;lt;beans:beans xmlns="http://www.springframework.org/schema/batch" 
             xmlns:beans="http://www.springframework.org/schema/beans" 
             xmlns:aop="http://www.springframework.org/schema/aop" 
             xmlns:tx="http://www.springframework.org/schema/tx" 
             xmlns:p="http://www.springframework.org/schema/p" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
http://www.springframework.org/schema/batch 
http://www.springframework.org/schema/batch/spring-batch-2.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"&amp;gt; 
    &amp;lt;beans:import resource="batch.xml"/&amp;gt; 
    &amp;lt;job id="batchForCreatingSitemaps"&amp;gt; 
        &amp;lt;step id="sitemap"&amp;gt; 
            &amp;lt;tasklet&amp;gt; 
                &amp;lt;chunk reader="reader" writer="writer" 
commit-interval="${job.commit.interval}"/&amp;gt; 
            &amp;lt;/tasklet&amp;gt; 
        &amp;lt;/step&amp;gt; 
    &amp;lt;/job&amp;gt; 
    &amp;lt;beans:bean id="siteMapLineAggregator" 
class="com...sitemapscreator.SiteMapLineAggregator"&amp;gt; 
        &amp;lt;beans:property name="domain" value="${sitemaps-domain}"/&amp;gt; 
    &amp;lt;/beans:bean&amp;gt; 
    &amp;lt;beans:bean 
class="com...sitemapscreator2.ResourceSuffixCreator" 
id="resourceSuffixCreator"/&amp;gt; 
    &amp;lt;beans:bean id="writer" scope="step" 
class="&lt;b&gt;org.springframework.batch.item.file.MultiResourceItemWriter&lt;/b&gt;"&amp;gt; 
        &amp;lt;beans:property name="resource" 
value="file:#{jobParameters[outputResourcePrefix]}"/&amp;gt; 
        &amp;lt;beans:property name="resourceSuffixCreator" 
ref="resourceSuffixCreator"/&amp;gt; 
        &amp;lt;beans:property name="saveState" value="true"/&amp;gt; 
        &amp;lt;beans:property name="itemCountLimitPerResource" value="50000"/&amp;gt; 
        &amp;lt;beans:property name="&lt;b&gt;delegate&lt;/b&gt;"&amp;gt; 
&lt;b&gt; 
            &amp;lt;beans:bean 
class="org.springframework.batch.item.file.FlatFileItemWriter"&amp;gt; 
                &amp;lt;beans:property name="encoding" value="UTF-8"/&amp;gt; 
                &amp;lt;beans:property name="shouldDeleteIfExists" value="true"/&amp;gt; 
                &amp;lt;beans:property name="lineAggregator" 
ref="siteMapLineAggregator"/&amp;gt; 
            &amp;lt;/beans:bean&amp;gt; 
&lt;/b&gt; 
        &amp;lt;/beans:property&amp;gt; 
    &amp;lt;/beans:bean&amp;gt; 
    &amp;lt;beans:bean id="siteMapUrlRowMapper" 
class="com...sitemapscreator.SiteMapUrlRowMapper"/&amp;gt; 
    ... 
&amp;lt;/beans:beans&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Sat, 28 Nov 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/spring_batchs_multiresourceitemwriter.html</guid>
      <dc:date>2009-11-28T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Thanksgiving</title>
      <link>http://www.joshlong.com:80/jl/blogPost/thanksgiving.html</link>
      <description>&lt;p&gt;I have a lot to be thankful for. This year saw my wife and I move 
to Los Angeles, where we've been well received in new jobs and by 
family. I've experienced  success speaking at various conferences, and 
this year saw the publication of my first book, Apress' "Spring 
Enterprise Recipes." Recently, I was in a pretty bad accident (a 
big-rig rear-ended me) and I emerged alive. I have a wonderful wife 
who has always supported me, and  I have made good friends. I am 
thankful for the readers of my blogs.  I am thankful for my  loving 
friends and family.&lt;/p&gt;&lt;p&gt;I hope you have a long list of things for 
which you're thankful, too. Happy Thanksgiving!&lt;/p&gt;</description>
      <pubDate>Thu, 26 Nov 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/thanksgiving.html</guid>
      <dc:date>2009-11-26T00:00:00Z</dc:date>
    </item>
    <item>
      <title>'Spring Enterprise Recipes,' from Apress</title>
      <link>http://www.joshlong.com:80/jl/blogPost/spring_enterprise_recipes_from_apress.html</link>
      <description>&lt;p&gt; &lt;img style ="float:left;" 
src="__8704_0__" /&gt; 
&lt;span style = "font-size:larger;"&gt;Warning: Shameless Plug&lt;/span&gt; &lt;br/&gt; 
&lt;br/&gt; I am pleased to announce that, after a long time and a lot of 
work, my first book &lt;b&gt;&lt;i&gt;Spring Enterprise Recipes&lt;/i&gt;&lt;/b&gt; (which I 
co-authored with the indefatigable, epic and extraordinary Mr. Gary 
Mak, author of - among many other things, Apress' &lt;i&gt;Spring 
Recipes&lt;/i&gt;) has been released and is now purchasable.  It should be 
hitting book stores soon, but in the meantime, you can &lt;a 
href="http://www.apress.com/book/view/9781430224976"&gt;buy  the e-book 
at Apress.com&lt;/a&gt;, or you can pre-order it &lt;a 
href="http://www.amazon.com/Spring-Enterprise-Recipes-Problem-Solution-Approach/dp/1430224975"&gt;on 
Amazon.com&lt;/a&gt;. &lt;/p&gt;&lt;p&gt; The book discusses Spring 3, but also accounts 
for the many "modules" surrounding Spring with an eye towards building 
elegant, scalable systems with a minimum of fuss.  Many of these 
modules have come from SpringSource, and some are independent third 
party projects that integrate well with Spring.  &lt;i&gt;Spring Enterprise 
Recipes&lt;/i&gt; introduces concepts like business process management 
(BPM), enterprise application integration (EAI), distributed computing 
and messaging and then grounds these introductions with real-world 
examples using Spring and lead open source frameworks. 
 &lt;/p&gt; 
&lt;p&gt;This book discusses both the &lt;i&gt;why&lt;/i&gt; and the &lt;i&gt;how&lt;/i&gt;. It 
starts with  a discussion of the usual suspects, exploring the 
quintessential tools in any developer's toolbox: RPC (RMI, Hessian, 
Burlap, Web Services, HTTP/Invoker, EJB 2 and 3, and more), messaging 
(via JMS), database access (JdbcTemplate, and a few of Spring's 
numerous supported ORM abstractions), transactions (e.g., various 
transaction abstractions supported by Spring), and numerous services 
like e-mail, JMX, worker pools, and  scheduling infrastructure.&lt;/p&gt; 
&lt;p&gt;Then, we progress into more advanced solutions. This book includes 
the first-in-print or most updated coverage of a lot of technologies, 
including Spring Integration (a lightweight ESB-like integration 
framework for EAI),   Spring and jBPM 4 for business process 
management, GridGain for grid computing,  Terracotta for clustered 
state managment, Spring Batch for batch-processing solutions and OSGi 
to bring modularity to your application. 
&lt;/p&gt; 
 &lt;p&gt; In the large, this book is a gentle, but comprehensive 
introduction to the best-of-breed solutions for tomorrow's 
architecture using Spring and other lightweight, powerful tools. 
Having said all that, I hope you'll consider it for your next purchase 
and that it helps you solve some interesting problems and build even 
more interesting solutions! 
&lt;/p&gt;</description>
      <pubDate>Sat, 21 Nov 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/spring_enterprise_recipes_from_apress.html</guid>
      <dc:date>2009-11-21T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Understanding Go</title>
      <link>http://www.joshlong.com:80/jl/blogPost/understanding_go.html</link>
      <description>&lt;p&gt; &lt;a href="http://www.golang.org"&gt;Go,&lt;/a&gt; a new language from 
Google, has created quite a stir. It has a great pedigree, owing to 
renowned experts like Rob Pike (a member of the Unix team, and a 
creator of the Plan 9 OS from Bell Labs.) The language is a procedural 
language (like C, or Python) which offers a strongly typed, but 
flexible type system (not centered around object-oriented facilities 
as we know them from languages like Java and Ruby). The syntax is a 
strange mix of C and Python. Honestly, it feels like C when you read 
it, but it writes more like Python - lots of features in the syntax 
that are designed to be consistent, predictable. &lt;/p&gt; &lt;p&gt; &lt;a 
href="http://www.cowlark.com/2009-11-15-go/"&gt;One blog entry&lt;/a&gt; 
prompted a very lively discussion of the language: it made the 
comparison that Go seemed awfully similar to Algol 68, a language 40 
years past irrelevance. The blog entry said that while Algol 68 was a 
nice language, Go might be considered an efficient language. It 
claimed that efficient languages are the ones that - ultimately - 
propagate. Witness COBOL, C, C++, and Java, for example. Go, thus, may 
very well be a very &lt;i&gt; efficient&lt;/i&gt; language, but it's not even 
close to a &lt;i&gt;nice&lt;/i&gt; language. It's a lost opportunity. &lt;/p&gt; &lt;p&gt; 
Programming languages tend to come and go, but they all advance basing 
their innovation in some small part on their predecessors. Programming 
languages &lt;i&gt;have&lt;/i&gt; to evolve slowly.  Languages do not exist in a 
vacuum. They must respect the work that's preceded them, while 
innovating. They must strike a careful balance, never alienating the 
existing community, the legacy base, and always advancing the state of 
the art. Doing so incorrectly can be the biggest sin a language can 
make. Kowtowing to the legacy of C crippled the evolution of C++, 
leaving it  a confusing mix of phantom requirements and artificial 
features. Conversely, Java achieved meteoric propagation because it 
looked and felt like C++ without many of the warts. This made the 
transition to Java easy. Compatibility is a double edged sword. &lt;/p&gt; 
&lt;p&gt; Most recent languages look and feel like C/C++. They've innovated 
ever so slightly, inducting into the syntax features  formerly handled 
by libraries. Or, the language is flexible enough to support 
requirement-specific DSLs. You can see this with Scala and Groovy, 
Ruby and C#. They're all fairly familiar, but offer advantages in 
their grammar over their predecessors. C#, for example, introduced 
LINQ, while Scala surfaced its concurrency facilities as an Actors 
DSL. The idea of a language syntax as a differentiators is even more 
relevant of late. The .NET runtime popularized the idea of a 
multi-language run time. It meant that choosing a language did not 
mean forsaking libraries. The JVM has matured, and there are many 
languages implemented atop it, as well. Other infrastructure VM 
projects have emerged, like the LLVM. &lt;/p&gt; &lt;p&gt; So, I don't blame Go 
for looking so much like its predecessors. That's the cost of doing 
business. It's intended to be a general purpose language, after all. 
It does have a few unique features surfaced as language constructs, 
like intrinsic concurrency facilities, which it calls 
&lt;i&gt;gorountines&lt;/i&gt;. &lt;/p&gt; &lt;p&gt; I don't understand why they have built 
another virtual machine. If Go is going to innovate, it will be in its 
Virtual Machine. Why not the CLI, JVM, or LLVM? The language has 
strong support for interop - easily wrapping native code much like you 
might using C++. The .NET CLI supports this sort of thing, though. I 
understand the language needed to run on Unix (at the moment, you 
&lt;i&gt;can't&lt;/i&gt; run it on Windows!), and perhaps Mono wasn't sufficiently 
advanced. Why not the JVM? Would building that kind of infrastructure 
be that hard? What about the LLVM? It seems well suited to working on 
Unix and to handling interop. Perhaps interop is not the only concern. 
The implementation of the &lt;i&gt;goroutines&lt;/i&gt; seems to have been a 
priority. The language does not yet have assertions or exceptions 
specifically because doing so would be awkward with goroutines. This 
language, as Mr. Pike explained it, was created for Google to build 
servers. Cheap, and efficient threading was priority #1. This piques 
my curiosity. Why could the JVM - which hosts Scala and Clojure - not 
be used to build goroutines. Is there some fundamental flaw that makes 
 concurrency on the JVM a non starter? I don't understand. &lt;/p&gt; &lt;p&gt; I 
would agree that the language is not particularly novel. What I don't 
understand is why the VM is novel. Clearly there are requirements I 
don't understand, and this is why I think Go will be worth paying 
attention to, in much the same way Erlang is. &lt;/P&gt; &lt;p&gt; There is also 
something refreshing about a genuinely new language. New platform, new 
libraries, new syntax. Programs written in a language like that 
represent advances. Shortly after the debut of the language, a &lt;a 
href="http://codingrobots.org/p/gotweet/doc/tip/www/index.wiki"&gt;command 
line Twitter client emerged&lt;/a&gt;. The example is promising - by 
definition the implementation was from-scratch. It was quick, and the 
result is imminently readable. &lt;/p&gt; &lt;p&gt; Perhaps I'm over thinking 
this. Perhaps the language will be successful &lt;i&gt;because&lt;/i&gt; it's 
simple, and efficient. Perhaps the VM is some how unique and better 
served by a custom implementation. Only time will tell. &lt;/p&gt;</description>
      <pubDate>Tue, 17 Nov 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/understanding_go.html</guid>
      <dc:date>2009-11-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>The Last 2 Crazy Months</title>
      <link>http://www.joshlong.com:80/jl/blogPost/the_last_2_crazy_months.html</link>
      <description>&lt;p&gt;What a busy couple of months!   &lt;/p&gt;&lt;p&gt;I started last month (from 
October 2nd to the 11th) at the &lt;a 
href="http://www.java2days.com"&gt;Java2Days&lt;/a&gt; conference in Sofia, 
Bulgaria. I gave three talks on Spring and JSF, Spring and jBPM, and 
Spring Integration (the Spring ESB-like framework). I think the slides 
will be available there in shortly. Meanwhile, here are some photos of 
the event below, though you're encouraged to log in to Facebook and 
check out the full galeries &lt;a 
href="http://www.facebook.com/pages/Sofia-Bulgaria/Java2Days/169979265960"&gt;there.&lt;/a&gt;&lt;/p&gt; 
&lt;table border="0" cellpadding="0" width="400"&gt;&lt;tr&gt;&lt;td&gt;&lt;img width = 
"400"  src="__8434_1__" 
/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;i style = "caption"&gt;The name of the gentleman 
on the far left escapes me, but that's John Lewis, Emo, and yours 
truly on the right &lt;/i&gt;&lt;/p&gt; 
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img width ="400"  src 
="__8434_0__" 
/&gt; 
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;i style = "caption"&gt;From left to right: Ivo 
Penev, Gisele Consoline, Rob Harrop, yours truly, John Willis, and 
Heath Kesler &lt;/i&gt;&lt;/p&gt; 
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt; I had a great time at the conference.  The 
audience was great the discussions great, too. The drinking was good, 
too! :-) 
 &lt;/p&gt;&lt;p&gt; At some point, I got some sort of stomach bug (perhaps in 
Greece?) and when I returned home, I was severely dehyrdated. I spent 
a little time hooked up to an IV and then spent the subsequent week 
pounding antibiotics, gatorade, and soup. There's a   thousand ways to 
get sick, only one way to get better!  &lt;/p&gt;&lt;p&gt;After that, I got deep 
into the final edits for my book  "&lt;a 
href="http://www.amazon.com/Spring-Enterprise-Recipes-Problem-Solution-Approach/dp/1430224975"&gt;Spring&lt;/a&gt; 
&lt;a href="http://www.apress.com/book/view/9781430224976"&gt;Enterprise&lt;/a&gt; 
&lt;a href="http://search.barnesandnoble.com/Spring-Enterprise-Recipes/Gary-Mak/e/9781430224976"&gt;Recipes&lt;/a&gt;." 
Really enjoyed that process - it's fascinating to see what goes into 
writing a book. Trust me, the book is far better for the effort of the 
amazing editors at Apress! :-)  &lt;/p&gt; &lt;p&gt; I spoke at the &lt;a 
href="http://www.pasadenajug.org/2009/10/spring-in-fall.html"&gt;Pasadena 
Java User Group&lt;/a&gt; on using Spring Integration - that crowd was very 
cool and the discussion that ensued was also good. &lt;/p&gt;&lt;p&gt;  Recently, 
my sister got married. I wish her, and her husband, many happy days 
together. &lt;/p&gt;&lt;p&gt; I think that wraps up the highlights. I'll start 
chiming in more frequently. A lot has happened of late, including the 
debut of Google's &lt;a href="http://www.golang.org"&gt;Go programming 
language&lt;/a&gt;, The &lt;a 
href="http://www.motorola.com/Consumers/US-EN/Consumer-Product-and-Services/Mobile-Phones/Motorola-DROID-US-EN"&gt;Motorola 
Droid&lt;/a&gt;, the continued standoff between Sun/Oracle and the European 
Union over objections to Oracle's accquisition of MySQL, and more. 
Exciting times... 
&lt;/p&gt;</description>
      <pubDate>Thu, 12 Nov 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/the_last_2_crazy_months.html</guid>
      <dc:date>2009-11-12T00:00:00Z</dc:date>
    </item>
    <item>
      <title>CRUD's Not The Answer</title>
      <link>http://www.joshlong.com:80/jl/blogPost/cruds_not_the_answer.html</link>
      <description>&lt;p&gt; I was really glad to see  &lt;a 
href="http://www.udidahan.com/2009/09/01/dont-delete-just-dont/"&gt;Udi 
Dahan's, "Don't Delete. Just Don't."&lt;/a&gt; I wholely agree with the main 
premise - that deletion is rarely, if ever, a valid business state and 
that care should be taken in dealing with it. He cites various 
examples, saying, "The real world doesn't cascade." His example is of 
a marketing department that deletes an item from the catalog. Should 
all orders containing that item then be unlinked? Should they redo the 
company's profit and loss statments? &lt;/p&gt; &lt;p&gt; His example's a  perfect 
illustration of a valid case where care needs to be taken both in 
modeling the case and dealing with it in code. I fear a lot of people 
have gotten hooked on instant-models or CRUD "frameworks." The idea 
that you can annotate a few entity classes and suddenly you have a 
model and business logic all taken care. A lot of this became popular 
with Ruby on Rails and has only gotten worse in the JEE world. It's 
now common to expose &lt;code&gt;EntityManager&lt;/code&gt;s to the web tier (both 
the Seam and Spring Web Flow examples, not to mentino the Open Session 
in View pattern itself, speak to this) and to let web frameworks 
handle the lifecycle of entities and  committing transactions on that 
EntityManager to persist those entities. We now think of record 
creation and managment as so mundane that we've automated it and 
surrounded it in scaffolding. &lt;/p&gt; &lt;p&gt; Unfortuntately, this misses the 
true value. Objects in a system have state that has dependencies. Just 
because an entity has a (required) no-args constructor, it doesn't 
mean that you should not write a constructor with dependencies. A lot 
of this stems from the "active objects" or "naked objects" pattern, 
where objects are open books whose state can be mutated on the UI tier 
directly and those changes propagated directly. We tell ourselves that 
we can apply Hibernate validations (or validations in any other ORM 
framework) and that we'll guarantee valid business constraints thus, 
but it rarely works out that way. Prescribing the valid creation and 
destruction of an object is critical. &lt;/p&gt; &lt;p&gt; The most insidious part 
of this abuse is that it  rarely ever occurs in the first iterations 
of a project, only in maintenance.  People "forget" how an object is 
created, or destroyed. They forget details. Consistancy with other 
parts of the system is forsaken because, after all, how much could 
there be to it? This happens more often than you'd expect: new people 
come on to the team and are assigned to rework an existing feature and 
screen in a system. Institutional knowledge is important but it's not 
always easily transferred, so safe-guards need to be taken. &lt;/p&gt; &lt;p&gt; 
Plus, as business evolves, object creation is often only part and 
parcel with a larger process. If a new customer is added to a 
database, and nobody does anything with it, did it really get added? 
Put another way: if a new customer gets added to a database, there's 
an implied lifecycle that customer must follow. Perhaps a trial period 
window and then a follow up email? Perhaps a monthly subscriptio fee? 
Who knows, but the act of instantiating a &lt;code&gt;Customer&lt;/code&gt; object 
and then issuing &lt;code&gt;entityManager.persist( customer ) &lt;/code&gt; will 
rarely, if ever, be enough. &lt;/p&gt; &lt;p&gt; Indeed, I've seen  many projects 
build their models using only a &lt;code&gt;GenericDao&amp;lt;T&amp;gt;&lt;/code&gt; 
variant.  This is dangerous.  Transitions from one state to another 
for an entity can often cost money.  &lt;/p&gt; &lt;p&gt;Do things the old 
fashioned way, building services that handle the business operations, 
not merely &lt;b&gt;C&lt;/b&gt;reate, &lt;b&gt;R&lt;/b&gt;ead,&lt;b&gt;U&lt;/b&gt;pdate and &lt;b&gt;D&lt;/b&gt;elete 
objects.  Using Dao's in a view tier is almost as ghastly a sin as 
making JDBC calls from the view, and encourages the same kind of 
copy-n-paste code reuse we prided ourselves on having moved away from. 
&lt;/p&gt; &lt;p&gt; While the services approach isn't exactly code-generation 
friendly, it can pay off in the long run. As soon as you decide to use 
your services in a phsically separated tier, you'll be glad.  It's 
easier to build services that express every dependency as a method 
parameter. There are several reasons why this works out. While web 
service support is getting better, object marshalling is still the 
number one headache. Most toolkits make interoping with primitives a 
brease, though. It may seem like your losing ground by not taking 
advantage of the POJO you have floating around in the view tier, but 
in point of fact it's rarely that big a burden to unmarshal the 
relevant fields and use those instead. On the services side, reloading 
the relevant record is painless because the entity's usually cached 
and thus refetching it is cheap. &lt;/p&gt; &lt;p&gt; Take for example the idea of 
a shopping cart which surfaces methods for adding line items to 
orders, orders to shopping carts and shopping carts to customers.  A 
clean version of this might look like: &lt;pre&gt;&lt;code&gt; 
 public interface ShoppingCartService { 
     ShoppingCart createShoppingCartForCustomer( long customerId, 
                                                 Date 
whenShoppingSessionStarted ) ; 
     Order createOrderForShoppingCart( long shoppingCart ) ; 
     LineItem createLineItemForOrder( long orderId, long productId, 
int quantity) ; 
     void removeLineItemFromOrder( long orderId, long lineItem ) ; 
     void startOrderFulfillment( long orderId ) ; 
     /*  other methods for loading and removing the various 
         objects, as appropriate 
     */ 
  } 
&lt;/code&gt;&lt;/pre&gt; &lt;/p&gt; &lt;p&gt; In these methods, you can do sanity checks, 
care for business cases, handle the state of the various objects and 
not worry about having a transactional resource like an &lt;code&gt; 
EntityManager&lt;/code&gt; or Hibernate Session open in the client thread. 
In this example, you might imagine the &lt;code&gt; Order&lt;/code&gt; won't 
officially be fulfilled until it's paid for, at which point it'll move 
to the &lt;code&gt;PAID&lt;/code&gt; state.  Simialarly, adding a 
&lt;code&gt;LineItem&lt;/code&gt; might require a check to an inventory, 
decrementing how many of those &lt;code&gt;Product&lt;/code&gt;s are in stock. The 
same is true of the inverse operation: 
&lt;code&gt;removeLineItemFromOrder&lt;/code&gt; should appropriately restore the 
inventory count and update the &lt;code&gt;totalPrice&lt;/code&gt; field on the 
&lt;code&gt;Order&lt;/code&gt;.&lt;/p&gt; This requires one interface method 
declaration's work more than if you had simply obtained the 
&lt;code&gt;EntityManager&lt;/code&gt; from your Seam backing bean and executed 
the logic there, &lt;i&gt;except&lt;/i&gt; now the logic's codified and reusable. 
&lt;/p&gt;</description>
      <pubDate>Thu, 10 Sep 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/cruds_not_the_answer.html</guid>
      <dc:date>2009-09-10T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Setting Up jBPM 4's XSD File In Eclipse</title>
      <link>http://www.joshlong.com:80/jl/blogPost/setting_up_jbpm_4s_xsd_file_in_eclipse.html</link>
      <description>&lt;P&gt; I've recently been playing with jBPM 4.1 and, while I haven't 
quite gotten into it, I did manage to break an Eclipse setup of my 
"old" jBPM 4.0 code. This is definitely a user error. So, trying to 
ensure I have a reproduciable baseline,  I start setting everything up 
again (I don't have the jBPM plugins or anything installed -- I keep 
it mean and lean, if possible. ) &lt;/p&gt; &lt;p&gt; I got  to the point where 
everything was running fine again from the IDE, but I noticed I no 
longer had code   completion for my jBPM &lt;code&gt;.XSD&lt;/code&gt; file. I'm 
not sure if I ever did, or if I did, then I've forgotten how. So, I 
stumbled through getting it working with the Eclipse Resource Catalog. 
Here are the steps to reproducing it if you have the same issue. &lt;/p&gt; 
 &lt;ol&gt; &lt;lI&gt;  You'll need a copy of the &lt;code&gt;.XSD&lt;/code&gt; itself. For 
me, the simplest option was to just download the source 
&lt;code&gt;jar&lt;/code&gt; and use the &lt;code&gt;XSD&lt;/code&gt; file therein. 
&lt;code&gt;&lt;pre&gt;mkdir ~/xsds; cd ~/xsds ; 
wget http://repository.jboss.com/maven2/org/jbpm/jbpm4/jbpm-api/4.0/jbpm-api-4.0-sources.jar 
; 
jar xvf jbpm-api-4.0-sources.jar ; 
&lt;/pre&gt;&lt;/code&gt; &lt;/li&gt; &lt;li&gt; In Eclipse, go to Window &gt; Preferences 
&lt;/li&gt;&lt;li&gt;Search for "XML Catalog," under the "XML" node.    &lt;/li&gt; &lt;li&gt; 
Click "Add..." &lt;/li&gt; &lt;li&gt; &lt;li&gt; Fill out the dialog, using the values 
below. &lt;br/&gt; &lt;img src = 
"__7964_0__" 
/&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; I hope this spares somebody some pain. Once you've 
got it working, go check out the awesome &lt;a 
href="http://jboss.org/jbossjbpm/"&gt;new jBPM 4.1&lt;/a&gt;! &lt;/p&gt;</description>
      <pubDate>Thu, 03 Sep 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/setting_up_jbpm_4s_xsd_file_in_eclipse.html</guid>
      <dc:date>2009-09-03T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My Christmas Wish, OR How the JVM Will Outlive the  Cockroach, and .NET</title>
      <link>http://www.joshlong.com:80/jl/blogPost/my_christmas_wish_or_how_the_jvm_will_outlive_the_cockroach_and_net.html</link>
      <description>&lt;p&gt; It started with a Tweet from &lt;a 
href="http://twitter.com/migueldeicaza/status/3627322220"&gt;Miguel De 
Icaza&lt;/a&gt;. Miguel's the leader of the Mono project, whose goal's to 
bring .NET to Linux. He's also the former leader of the Gnome project. 
Generally, he's whip smart and not usually prone to flame baits. So, I 
tend to read his words carefully, as it usually pays off. He said: 
&lt;cite&gt;"I wish Java tried to compete with .NET, but they seemed to have 
given up a long time ago: &lt;a 
href="http://tinyurl.com/mfxmqm"&gt;http://tinyurl.com/mfxmqm&lt;/a&gt;"&lt;/cite&gt; 
&lt;/p&gt; &lt;p&gt;At this point I wanted to write him a terse letter stating 
my point of view, stating how he had clearly missed the obvious. I 
resisted, hugged the wife, cried a little, sat on the beach with 
candles, attended a book club meeting, found Jesus, and then came back 
and reconciled that I was just sad because he was right. He was also 
pointing out the obvious. (There, at least I can say that! &lt;span style 
= "font-size:smaller"&gt;in the anonymity of my blog, &lt;span style = 
"font-size:smaller;"&gt;far, far away from where he might see 
it...&lt;/span&gt;&lt;/span&gt;) &lt;/p&gt;&lt;p&gt; The link points to integrations in &lt;a 
href="http://openjdk.java.net/projects/coin/"&gt;Project Coin,&lt;/a&gt; a 
project that's taken the JDK and aggressivey evolved the language 
to try certain features out in an isolated fork. In general, I'm 
supportive of the movement, but it's a sad truth that any final 
edition of JDK 7 is already late, and will likely not incorporate many 
of those integrations in Project Coin, or even many of the originally 
announced - big ticket changes coming straight from Sun. JDK7 is the 
Windows Vista/&lt;i&gt;Longhorn&lt;/i&gt; of the JDKs.&lt;/p&gt;&lt;p&gt; You remember 
Longhorn, right? It was the code name for Windows Vista for a few 
years. If I recall, there was talk of integrating 4 pillars or waves 
of technology into the then-hyped next generation of Windows, 
including &lt;i&gt;WinFS&lt;/i&gt; (Am I wrong in thinking that it was called 
something else, then? Avalon? Or am I thinking of the now-defunct Java 
DI container?) &lt;i&gt;Indigo&lt;/i&gt;, and a slew of others. As the roadmap 
slipped further and further, more things were dropped. In fairness, in 
2009, some of those pillars have subsequently shipped, sort of, as 
parts of .NET 3.0-3.5x. Some are lost to the annals of history. &lt;/p&gt; 
&lt;p&gt;With a heavy heart I proceeded to code, ignoring what he said. I'm 
tougher than that. I can handle having the rug yanked out from under 
me. "Why would he say that about my precious Java??" I thought, typing 
as I thought it. "I wish I could come up with something to refute his 
claims!", I moaned. Something elegant, quick, crazy fast, and future 
proof. Something's got the best of C#, F#, Python, JavaScript and 
more. I tend to ignore skills I've built up over years of use and 
revert to primitive, conveniently blog-friendly samples from tutorials 
when I'm stressed (don't you?). And &lt;i&gt;boy&lt;/i&gt; was I stressed! I 
looked at my screen. I was really in a tizzy at this point, 
thrashing away at the keyboard! (Like in those movies where they 
feature somebody running their hands along the home row and suddenly 
they've infiltrated the FBI's secret-most files.) &lt;/p&gt;&lt;p&gt;Here's what I 
had typed: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;object Maps { 
 val colors = Map("red" -&gt; 0xFF0000, 
 "turquoise" -&gt; 0x00FFFF, 
 "black" -&gt; 0x000000, 
 "orange" -&gt; 0xFF8040, 
 "brown" -&gt; 0x804000) 
 def main(args: Array[String]) { 
 for (name &lt;- args) println( 
 colors.get(name) match { 
 case Some(code) =&gt; 
 name + " has code: " + code 
 case None =&gt; 
 "Unknown color: " + name 
 } 
 ) 
 } 
} 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt; It was a Christmas miracle! A language on the JVM 
that already had most of the proposed changes in Project Coin and 
great deal otherwise &lt;i&gt;and&lt;/i&gt; was very fast &lt;i&gt;and&lt;/i&gt; that worked 
on all platforms, &lt;strike&gt;just like Mono!&lt;/strike&gt; Errr... that is, 
just like Java! &lt;/p&gt; &lt;p&gt;This language, &lt;a 
href="http://www.scala-lang.org/"&gt;Scala,&lt;/a&gt; has gained a great deal 
of traction in the Java community and even people you'd expect to 
offer otherwise have endorsed it. People like James Strachan, creator 
of Groovy, and James Gosling, creator of Java. &lt;/p&gt; &lt;p&gt;I just hope 
that other people can find out about this wonderful language. Why, 
wouldn't it be nice if -for Java 8 (will we ever get to have a Java X? 
How cool would that be??) - we just shipped Scala? &lt;/p&gt; 
&lt;p&gt;And that, boys and girls, is how Java outlived the cockroach, in 
our hearts.&lt;/p&gt; &lt;P&gt;&lt;i&gt;The End!&lt;/i&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 29 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/my_christmas_wish_or_how_the_jvm_will_outlive_the_cockroach_and_net.html</guid>
      <dc:date>2009-08-29T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A Survival Guide to Maven, OR, Why Maven's Still Cool</title>
      <link>http://www.joshlong.com:80/jl/blogPost/a_survival_guide_to_maven_or_why_mavens_still_cool.html</link>
      <description>&lt;h2&gt;The Problem: Confusion&lt;/h2&gt; &lt;P&gt; I've had a lot of small 
discussions recently with people where they were just absolutely not 
interested in using Maven. Has it somehow gotten a bad reputation when 
I wasn't looking? Am I missing something? When did I suddenly become 
the guy using a tool that was too slow, or not agile enough for 
everybody? I can still sing and dance and jump like you guys, too! 
Even if I do use Maven... &lt;/P&gt;&lt;P&gt;So, let old Josh tell you a little 
bit about Maven. Maybe we're not all talking about the same thing. 
Consider this a survival guide to Maven. &lt;/P&gt;&lt;P&gt; Maven, like this 
guide, assumes you're trying to solve the 80% cases effectively. 
Already, we have a point of confusion! &lt;/P&gt;&lt;P&gt; I'm pretty confident 
that your first thoughts on that last sentence were to what Maven 
considers "80%," and you're probably wondering what you might 
reasonably call Ant's "80%" cases. I would argue that Maven's "80%" 
is 80% of a much, much bigger pie. &lt;/P&gt;&lt;P&gt; I haven't met an Ant build 
yet that couldn't be cut down in complexity by using Maven. Sure, 
sometimes the resulting Maven &lt;code&gt;pom.xml&lt;/code&gt; was more verbose 
(though, that doesn't happen all that often in practice, either), but 
that's not the same as complexity. Intrinsic complexity is one thing. 
Surface complexity is another. I define intrinsic complexity as the 
concepts required to effectively deal with a problem in a problem 
space. I define apparent complexity as the busy work a process 
presents you with to obtain a goal. &lt;/P&gt;&lt;P&gt; I'm pretty convinced Ant 
suffers from both of those kinds of complexities. I wasn't going to 
start any bar fights about it, but I was pretty sure. Then, Ruby On 
Rails debuted and made code generation popular again. It brought 
"convention over configuration" to the mainstream. Then, I knew I was 
on to something with Maven. &lt;/P&gt;&lt;P&gt; I might argue that when you 
download Ant and decide to keep it in your tool chain, you think of it 
as providing a solution, assuming you've configured it, to: 
&lt;/P&gt;&lt;OL&gt;&lt;LI&gt; compiling Java source files into classes &lt;/LI&gt;&lt;LI&gt; 
copying resources to the right place, such as .XML files, .properties 
files, etc. &lt;/LI&gt;&lt;LI&gt; generating .jar or .war artifacts from the 
aforementioned classes. &lt;/LI&gt;&lt;LI&gt; generating JavaDocs. I'm adding this 
one as a "maybe." Does anybody still do this and actually keep 
JavaDocs floating around? Is the Eclipse or IntelliJ support for 
rendering in-popup the contents of the JavaDoc not enough? &lt;/LI&gt;&lt;/OL&gt; 
&lt;P&gt;The enlightened Ant user will also, maybe, add dependency 
management with Ivy to Ant's 80% cases. I mention this to be fair, 
though I highly doubt it's that common. I suspect that a lot of Ant 
users  would still relegate that to the fringe 20% cases. &lt;/P&gt; &lt;p&gt; 
Alright, so we have our 80%. Most people have a sample ant build.xml 
that they've lugged around and, when it's time to seed a new project, 
they plop it into place and it's got some variables that need to be 
replaced and then it does most of the things above. Except JavaDocs 
and Ivy. I'd be surprised, anyway. &lt;/p&gt;&lt;p&gt; Maven's got all of those 
features - right out of the box - in 5 lines of XML and a standard 
directory structure. This is where it stops being a fair fight. 
   No matter how much you tug or pull against that list above, chances 
are you're &lt;i&gt;at least&lt;/i&gt; going to use Ant to compile. No way around 
it. Even the simplest Ant configuration requires more exertion to 
acheive that than Maven does. This point, and this point alone, is why 
I'm just not convinced people are taking a look at this and 
understanding it. If the goal is simplicity, then there's nothing 
simpler than &lt;i&gt;nothing&lt;/i&gt;.  If you've had to put even a moment's 
care into that list above, than you've already wasted time and could 
have been using Maven. 
&lt;/p&gt; &lt;p&gt; Now that I've gotten the soap-box speech out of the way, 
read on to understand a little bit about it, including how to set it 
up to do all the things in that list (and hundreds of other things) 
with a few directories and a 5-6 line XML file (the 5-6 lines comes 
from my formatting. It could easily be 3 lines of XML, if we're 
honest. &lt;/p&gt;&lt;h2&gt;Things To Know&lt;/h2&gt; &lt;p&gt; &lt;b&gt; Where Can I get Maven? 
&lt;/b&gt; Maven is freely available, just like Ant, &lt;a 
href="http://maven.apache.org/"&gt;from Apache&lt;/a&gt;. Alternatively, many 
distributions have it in their repositories. For Ubuntu, it's 
&lt;pre&gt;&lt;code&gt;sudo apt-get install maven2&lt;/code&gt;&lt;/pre&gt; This version, as 
with all repository packages, is slightly out of date. But, at least 
you're off and running.&lt;/p&gt; 
&lt;p&gt; &lt;b&gt; How Do I Install Maven?&lt;/b&gt; The simplest way is, like Ant, to 
unzip it, and add the &lt;code&gt;bin&lt;/code&gt; folder of the directory to your 
system's &lt;code&gt;PATH&lt;/code&gt; variable. Alternatively, skip to the next 
question and simply use your operating system's repository to install 
it, if possible. &lt;/p&gt; 
&lt;p&gt; &lt;b&gt; How Do I Build a Maven Project&lt;/b&gt; Building a Maven project 
is easy, as the command never changes. &lt;pre&gt;&lt;code&gt;mvn 
install&lt;/code&gt;&lt;/pre&gt; 
This is true whether it's your project or somebody elses. It's 
predictable, and consistant. 
To use it, ascend to the highest directory in the directory tree that 
contains a &lt;code&gt;pom.xml&lt;/code&gt; file. That's usually the parent 
project. Usually, Maven projects cascade downwards, so you might try 
issuing:&lt;pre&gt;&lt;code&gt;mvn install&lt;/code&gt;&lt;/pre&gt; This will generate a 
&lt;code&gt;target&lt;/code&gt; directory in each project (if there are any). 
Inspect the &lt;code&gt;target&lt;/code&gt; directory for your &lt;code&gt;.jar&lt;/code&gt; 
or &lt;code&gt;.war&lt;/code&gt;, or whatever you're expecting. 
If for some reason there's no &lt;code&gt;target&lt;/code&gt; directory in the 
directory that contains the source code you're trying to build, 
descend into it to the point where you're adjacent to the 
&lt;code&gt;pom.xml&lt;/code&gt;. Then, issue again: &lt;pre&gt;&lt;code&gt;mvn 
install&lt;/code&gt;&lt;/pre&gt; 
&lt;/p&gt; 
&lt;p&gt;&lt;b&gt;How Do I Bootstrap a New Maven Project &lt;/b&gt; The simplest setup 
requires the creation of directories as well as one XML file. But, 
you'd likely create these directories and at least one XML file with 
Ant, too. 
&lt;/p&gt;&lt;p&gt;Run the following on the command line. NB: I haven't translated 
for Windows. I'm sure it's easy enough, there, too. 
&lt;PRE&gt;&lt;code&gt;mkdir -p 
&lt;b&gt;myproject&lt;/b&gt;/src/{main,test}/{java,resources}&lt;/code&gt;&lt;/PRE&gt; 
You can change &lt;b&gt;myproject&lt;/b&gt; to whatever you want. 
This will create a directory structure like the following: 
&lt;PRE&gt;&lt;CODE&gt;jlong@studio:~/Desktop/myproject$ find . 
. 
./src 
./src/main 
./src/main/resources 
./src/main/java 
./src/test 
./src/test/resources 
./src/test/java 
&lt;/CODE&gt;&lt;/PRE&gt; 
If you're just getting started and aren't test-driven, then you can 
ignore &lt;code&gt;src/test/*&lt;/code&gt;. 
That leaves you with &lt;code&gt;src/main/{resources,java}&lt;/code&gt;. 
Java code goes in &lt;code&gt;src/main/java&lt;/code&gt;. Things you'd like on the 
classpath of the same artifact, such as Spring application contexts, 
go in &lt;code&gt;src/main/resources.&lt;/code&gt; 
&lt;/p&gt; 
&lt;p&gt; Finally, you're going to need an XML POM file. POM standards for 
"Project Object Model," I think. 
It's the sole center for configuration related to your project. No 
need to do includes, or externalized configuration or anything. 
The simplest &lt;code&gt;pom.xml&lt;/code&gt; looks like: 
&lt;pre&gt;&lt;code&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt; 
 &amp;lt;modelVersion&gt;4.0.0&amp;lt;/modelVersion&amp;gt; 
 &amp;lt;groupId&gt;com.yourproject.crm&amp;lt;/groupId&amp;gt; 
 &amp;lt;artifactId&gt;utilities&amp;lt;/artifactId&amp;gt; 
 &amp;lt;version&gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; 
&amp;lt;/project&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;You can copy and paste that into a file called 
&lt;code&gt;pom.xml&lt;/code&gt;, at the root of the &lt;code&gt;myproject&lt;/code&gt; folder 
created above. You're done. 
&lt;/p&gt;&lt;p&gt;From here, so long as you're just planning on using the JDK, 
etc, then this will work fine.  &lt;/p&gt; 
&lt;p&gt;&lt;b&gt;What do those directories and 5 lines of XML buy me?&lt;/b&gt; 
Think of that as being equivalent to hundreds of Ant targets. The 
project already has enough information to, among other things: 
&lt;ol&gt;&lt;li&gt;Generate javadocs: &lt;code&gt;mvn javadoc:javadoc&lt;/code&gt;&lt;/li&gt; 
&lt;li&gt;Compile classes: &lt;code&gt;mvn compile &lt;/code&gt;&lt;/li&gt; 
&lt;li&gt;Compile and generate an artifact (a &lt;code&gt;.jar&lt;/code&gt;, in this 
case): &lt;code&gt;mvn install &lt;/code&gt;&lt;/li&gt; 
&lt;li&gt;Generate a Checkstyle report: &lt;code&gt;mvn 
checkstyle:checkstyle&lt;/code&gt;&lt;/li&gt; 
&lt;li&gt;Or, in the alternative (and perhaps a complement): generate a PMD 
report: &lt;code&gt;mvn pmd:pmd&lt;/code&gt;&lt;/li&gt; 
&lt;li&gt;Build a web site with documentation on the structure of the 
project (anemic thing that it is): &lt;code&gt;mvn site&lt;/code&gt;&lt;/li&gt; 
&lt;li&gt;Build a cross reference of the project's sources: &lt;code&gt;mvn 
jxr:jxr&lt;/code&gt; &lt;/li&gt; 
&lt;li&gt;Setup project files for your favorite IDEs: &lt;code&gt;mvn 
eclipse:eclipse&lt;/code&gt;, or &lt;code&gt;mvn idea:idea&lt;/code&gt; (&lt;b&gt;NB:&lt;/b&gt; if 
you're using &lt;a href="http://www.intellij.com/"&gt;IntelliJ IDEA&lt;/a&gt; 7 or 
later, or &lt;a href="http://m2eclipse.sonatype.org/"&gt;Eclipse with the 
fabulous m2Eclipse plugin&lt;/a&gt;, then you don't need these plugins. You 
can simply 'open' the project as you would any project by importing or 
opening the &lt;code&gt;pom.xml&lt;/code&gt;. &lt;a 
href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt; also has incredible 
support for opening Maven projects directly. &lt;/li&gt; &lt;/ol&gt; 
&lt;/p&gt;&lt;p&gt; &lt;b&gt;How Do I Add JARs to the ClassPath? &lt;/b&gt; Short answer: you 
don't. You let Maven handle it for you. 
If you need a &lt;code&gt;.jar&lt;/code&gt;, more than likely, it's already 
available in some repository, in the same way that a package might be 
provisioned by an operating system (such as Windows Update on Windows, 
&lt;code&gt;apt&lt;/code&gt; on Debian distributions, &lt;code&gt;rpm&lt;/code&gt; on RedHat 
distributions, &lt;code&gt;port&lt;/code&gt; on OSX, etc..). For Maven, using a 
depdendency is as simple as identifying it and adding the metadata to 
the &lt;code&gt;pom.xml&lt;/code&gt;. &lt;/p&gt;&lt;p&gt; There are many ways to "find" a 
&lt;code&gt;.jar&lt;/code&gt;. The simplest is to start browsing &lt;a 
href="http://mirrors.ibiblio.org/pub/mirrors/maven2/"&gt;a central 
repository&lt;/a&gt; and opening the &lt;code&gt;pom.xml&lt;/code&gt; files. To add a 
dependency, you need it's &lt;code&gt;&amp;lt;artifactId&amp;gt;&lt;/code&gt;, its 
&lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt;, and its &lt;code&gt;&amp;lt;groupId&amp;gt;&lt;/code&gt;. 
These elements are usually at the top of all &lt;code&gt;pom.xml&lt;/code&gt;s. To 
add a dependency on the &lt;a 
href="http://commons.apache.org/lang/"&gt;Apache Commons Lang&lt;/a&gt; library 
to our project above, add the following lines to your 
&lt;code&gt;pom.xml&lt;/code&gt;, right before the closing &amp;lt;project&amp;gt; 
element: 
&lt;pre&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt; &amp;lt;!-- plenty of room to add 
dependencies --&amp;gt;&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
Inside the &lt;code&gt;dependencies&lt;/code&gt; section, you will add all your 
dependency information. The information you enter could be that for a 
third party &lt;code&gt;.jar&lt;/code&gt;, or a &lt;code&gt;.jar&lt;/code&gt; in your own 
project. Perhaps one team's project depends on another's. If Maven 
can't find the cached version of the &lt;code&gt;.jar&lt;/code&gt;, it'll download 
it for you. 
&lt;pre&gt;&lt;code&gt; &amp;lt;dependency&amp;gt;&amp;lt;groupId&amp;gt;&lt;b&gt;commons-lang&lt;/b&gt;&amp;lt;/groupId&amp;gt;&amp;lt;artifactId&amp;gt;&lt;b&gt;commons-lang&lt;/b&gt;&amp;lt;/artifactId&amp;gt;&amp;lt;version&amp;gt;&lt;b&gt;2.4&lt;/b&gt;&amp;lt;/version&amp;gt;&amp;lt;/dependency&amp;gt; 
&lt;/code&gt;&lt;/pre&gt; 
&lt;/p&gt; &lt;p&gt; To test, simply rebuild it as before: &lt;code&gt;mvn 
install&lt;/code&gt;. Most of the IDE integrations will have suport for 
updating the project configuration in the IDE (i.e., the classpath) 
according to what's in Maven's configuration. If you'd rather not 
spelunk through the &lt;code&gt;ibiblio&lt;/code&gt; repository site, you can 
always use one of the many Maven repository indexes. A good one is &lt;a 
href="http://search.mvnsearch.org"&gt;Maven Search&lt;/a&gt;. Type in a 
fragment of what you're looking for and it'll provide you with 
matches. Thus: I entered "commons-lang" and it found &lt;a 
href="http://search.mvnsearch.org/query.action?cat=jar&amp;q=commons-lang"&gt;results&lt;/a&gt;. 
Additionally, most of the IDE's will have support for some form of 
repository browsing.&lt;/p&gt; 
&lt;p&gt;&lt;b&gt;I'm Test Driven!&lt;/b&gt; 
This one's easy. If you &lt;i&gt;do&lt;/i&gt; want to use JUnit (or TestNG), then 
fret not - that's Maven's default M.O.! By default, any JUnit classes 
put into the &lt;code&gt;src/test/java&lt;/code&gt; folder will be compiled and 
run before proceeding with the build. 
&lt;/p&gt;&lt;h2&gt; The Tour's Over, What Did You Think?&lt;/h2&gt;&lt;p&gt; In this guide, 
I've given a walk through to the questions I can imagine thinking 
about when setting up a project with Ant. The result is that you can 
get a LONG ways with nothing (the minimal &lt;code&gt;pom.xml&lt;/code&gt;). 
&lt;/p&gt;&lt;p&gt; The balance of a given effort is the 20% stuff. As they say, 
the 20% cases can take 80% of the time. I can't speak to whether this 
is true or not as Maven's never delayed me, for any particular length, 
except when I was pushing it to do stuff that nothing else, including 
Ant, could have done. 
Even so, if you hit the 20% cases, you can rest easy in the knowledge 
that Maven is built to be flexible and extendable. It's whole model is 
exposed as a lifecycle. If you want to inject custom logic at a custom 
point, doing so is easy. It's also insanely interoperable. In fact, 
even if you don't want to use Maven but wan't to get a very high 
quality build script, setup the project using Maven and then use 
&lt;code&gt;mvn ant:ant&lt;/code&gt;. It'll generate an ant script that'll handle 
most things you'd want to do. Finally, if you decide you absolutely 
can't live without, or translate effectively, an Ant script, there's 
good support for running Ant scriptlets inside of Maven. 
&lt;/p&gt;&lt;p&gt; Go ahead and give it a try if you haven't tried it before or 
if you were put off. It's truly powerful. The most visible testament 
to this are the ideas (like Ivy) that are inspired by it in Ant. 
&lt;/p&gt;</description>
      <pubDate>Thu, 27 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/a_survival_guide_to_maven_or_why_mavens_still_cool.html</guid>
      <dc:date>2009-08-27T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Building Servlets With Spring</title>
      <link>http://www.joshlong.com:80/jl/blogPost/building_servlets_with_spring.html</link>
      <description>&lt;h2&gt;The Problem&lt;/h2&gt; &lt;p&gt; &lt;a 
href="http://www.joshlong.com/jl/blogPost/quick_update_to_rss.html"&gt;Earlier&lt;/a&gt;, 
I wrote about having to build a solution using servlets to write out 
the contents of the RSS feed for my blog. I am using JSF on this site. 
There are solutions - like Pretty Faces - that work and provide a 
lot of flexibility for mouting JSF logic at a given URL. So, 
initially, my RSS and Atom feeds were being handled by a backing bean 
in JSF. Being JSF, this necessitated the need for a session cookie 
(even though, clearly, the RSS / Atom feeds are stateless.) &lt;/p&gt; &lt;p&gt; 
The cookie wouldn't have been so bad, except that - I think as a 
consequence - RSS readers consuming the blog were being constantly 
refreshed for the entire contents of the feed, because to them the 
resultant blog requested was "different" than the previous version. 
&lt;/p&gt; &lt;h2&gt;The Solution &lt;/h2&gt; &lt;p&gt;So, I planned to write a servlet that 
handled the requests and I expose that in my JSF application.  This 
would be a clear differentiator between the new Spring + JSF version 
of the software running my blog and the old Spring MVC version: it's 
uselessly difficult to support stateless endpoints with JSF, where as 
it's as natural a goal as anything in Spring MVC. &lt;/p&gt;&lt;p&gt; Using a 
servlet meant I'd lose two advantages I'd had in the JSF application 
with Pretty Faces: bookmarkable URLs, and the convenient programming 
environment that Spring Faces afforded me, namely, configuration, 
dependency injection, etc. &lt;/p&gt; &lt;h2&gt;Refinements&lt;/h2&gt; &lt;p&gt; I decided to 
use &lt;a href="http://tuckey.org/urlrewrite/"&gt;URLRewrite&lt;/a&gt; to solve 
the boomkarkable URLs (yes, that means this site is hosting not one, 
but &lt;i&gt;two&lt;/i&gt; solutions for bookmarkable URLs in the same 
&lt;code&gt;.war&lt;/code&gt;!) and Spring's under appreciated 
&lt;code&gt;HttpRequestHandler&lt;/code&gt;. &lt;/p&gt; &lt;p&gt; 
&lt;code&gt;HttpRequestHandler&lt;/code&gt; is an interface that, when 
implemented, becomes serviceable by a Spring framework servlet. The 
interface looks like: 
&lt;pre&gt;&lt;code&gt; 
package org.springframework.web; 
&lt;br/&gt; 
public interface HttpRequestHandler {&lt;br/&gt; 
   void handleRequest(HttpServletRequest request, 
HttpServletResponse response)            throws 
ServletException, IOException;&lt;br/&gt; 
} 
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;You then configure a Spring framework class 
(&lt;code&gt;org.springframework.web.context.support.HttpRequestHandlerServlet&lt;/code&gt;) 
in your web.xml and name the servlet  the same as the bean that 
implements the &lt;code&gt;HttpRequestHandler&lt;/code&gt; interface is named in 
your Spring application context. By virtue of the fact that your 
&lt;code&gt;HttpRequestHandler&lt;/code&gt; bean is a Spring component, you get 
all the advantages of using Spring or Spring MVC, without having to 
load an entire framework. 
&lt;/p&gt;&lt;p&gt; For my code, the implementation looks something like the following: 
&lt;PRE&gt;&lt;CODE&gt;package com.joshlong.blawg.site.view.servlets; 
&lt;br/&gt; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 
&lt;br/&gt; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
&lt;br/&gt; 
import org.apache.commons.lang.StringUtils; 
import org.apache.commons.lang.exception.ExceptionUtils; 
&lt;br/&gt; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.web.HttpRequestHandler; 
&lt;br/&gt; 
import com.joshlong.blawg.BlogService; 
import com.joshlong.blawg.model.Blog; 
import com.joshlong.blawg.site.view.util.RssFeedCreationUtils; 
import com.joshlong.blawg.utils.LoggingUtils; 
&lt;br/&gt; 
import com.sun.syndication.feed.synd.SyndEntry; 
import com.sun.syndication.feed.synd.SyndFeed; 
import com.sun.syndication.io.SyndFeedOutput; 
&lt;br/&gt; 
@Component("feed") 
public class BlogFeedServlet implements HttpRequestHandler { 
   static private String FEED_TYPE_VARIABLE = "feedType"; 
   static private int START_FEED = 0, STOP_FEED = 500; 
&lt;br/&gt; 
   @Autowired 
   private RssFeedCreationUtils rssFeedCreationUtils; 
&lt;br/&gt; 
   @Autowired 
   private BlogService blogService; 
&lt;br/&gt; 
   @Autowired 
   private LoggingUtils loggingUtils; 
&lt;br/&gt; 
   private SyndFeed buildEntryList(HttpServletRequest req, 
HttpServletResponse res, String type, int start, int length) { 
       SyndFeed feed = ... // build up the SyndFeed however you want 
       return feed; 
   } 
&lt;br/&gt; 
   private void showAllAtomBlogs(HttpServletRequest request, 
HttpServletResponse response) throws Throwable { 
       SyndFeed feed = buildEntryList(request, response, "atom_0.3", 
START_FEED, STOP_FEED); 
       response.setContentType("text/xml"); 
       SyndFeedOutput syndFeedOutput = new SyndFeedOutput(); 
       syndFeedOutput.output(feed, response.getWriter()); 
   } 
&lt;br/&gt; 
   private void showAllRssBlogs(HttpServletRequest request, 
HttpServletResponse response) throws Throwable { 
       SyndFeed feed = buildEntryList(request, response, "rss_2.0", 
START_FEED, STOP_FEED); 
       response.setContentType("text/xml"); 
       SyndFeedOutput syndFeedOutput = new SyndFeedOutput(); 
       syndFeedOutput.output(feed, response.getWriter()); 
   }&lt;br/&gt; 
   public void handleRequest(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException { 
       try { 
           String feedType = 
StringUtils.defaultString(request.getParameter(FEED_TYPE_VARIABLE)); 
           if (StringUtils.isEmpty(feedType)) 
               feedType = "rss"; 
           if (feedType.equalsIgnoreCase("rss")) 
               showAllRssBlogs(request, response); 
           else 
               showAllAtomBlogs(request, response); 
       } catch (Throwable th) { 
           loggingUtils.log(ExceptionUtils.getFullStackTrace(th)); 
       } 
   } 
} 
&lt;/CODE&gt;&lt;/PRE&gt; 
&lt;/p&gt; 
&lt;p&gt; Thus, it's simpler than a standard Spring MVC controller or a 
struts controller (though admittedly lacking a lot of the frills - 
this happens to be a simple use case.&lt;/p&gt; &lt;p&gt; I then configured the 
web.xml for all of this: &lt;code&gt;&lt;pre&gt; 
   &amp;lt;servlet&amp;gt; 
       &amp;lt;servlet-name&amp;gt;feed&amp;lt;/servlet-name&amp;gt; 
       &lt;b&gt;&amp;lt;servlet-class&amp;gt;org.springframework.web.context.support.HttpRequestHandlerServlet&amp;lt;/servlet-class&amp;gt;&lt;/b&gt; 
   &amp;lt;/servlet&amp;gt;&lt;br/&gt; 
   &amp;lt;servlet-mapping&amp;gt; 
       &amp;lt;servlet-name&amp;gt;feed&amp;lt;/servlet-name&amp;gt; 
       &amp;lt;url-pattern&amp;gt;/urlPatternForFeedServlet&amp;lt;/url-pattern&amp;gt; 
   &amp;lt;/servlet-mapping&amp;gt; 
&lt;/pre&gt;&lt;/code&gt; 
&lt;/p&gt; 
&lt;p&gt;Note that we've used the name fo the bean (configured using bean 
classpath scanning, so the name is in the &lt;code&gt;@Component&lt;/code&gt; 
stereotype at the top of the class - &lt;code&gt;"feed"&lt;/code&gt;.) for the 
servlet name. Sure, it smells a bit like engineered coincadence, but 
it works well. &lt;/p&gt; &lt;p&gt;From here, all that remained was configuring a 
URLRewrite rule to map the servlet to the endpoints visible on the 
site right now (&lt;code&gt;"/jl/entries/blog.atom"&lt;/code&gt;, and 
&lt;code&gt;"/jl/entries/blog.rss"&lt;/code&gt;)&lt;/p&gt;&lt;p&gt; Hope this helps 
somebody... &lt;/p&gt;</description>
      <pubDate>Mon, 24 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/building_servlets_with_spring.html</guid>
      <dc:date>2009-08-24T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Quick Update to RSS</title>
      <link>http://www.joshlong.com:80/jl/blogPost/quick_update_to_rss.html</link>
      <description>&lt;p&gt; I just published a change to the code that should hopefully&#xD;
prevent readers (like &lt;a href="http://www.google.com/reader"&gt;Google&#xD;
Reader&lt;/a&gt;) from constantly requeuing all my old blog entries as&#xD;
"unread." ?I don't know if it'll work (I've never had to debug this&#xD;
particular web client!), but we'll see. &lt;/p&gt;&lt;p&gt;I suspect the issue is&#xD;
something like the following: the spider hits the page which in turn&#xD;
causes it to get a cookie from Java Server Faces, which makes the blog&#xD;
feed look "new." I've checked the last modified dates and so on using&#xD;
&lt;a href="http://livehttpheaders.mozdev.org/"&gt;Http Live Headers&lt;/a&gt; and&#xD;
the Last-Modified dates and everything look alright. Anyway, I'll post&#xD;
back with results once they manifest (or, hopefully, don't manifest!)&#xD;
&lt;/p&gt; &lt;p&gt;Succinctly, the change involved creating a servlet (sort of)&#xD;
and using that to write/render (I wanted to say "feed") the feed.&lt;/p&gt;</description>
      <pubDate>Sat, 22 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/quick_update_to_rss.html</guid>
      <dc:date>2009-08-22T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Component Oriented Architectures</title>
      <link>http://www.joshlong.com:80/jl/blogPost/component_oriented_architectures.html</link>
      <description>&lt;p&gt;Warning, this blog entry is as much a rant as a blog, and tends on&#xD;
the somewhat lengthy side. You've been warned. I'm looking for the&#xD;
secret of life, as always, and failing it, I'll settle for the secrets&#xD;
of software. This is a blog I don't know how to write, but have wanted&#xD;
to, for a long time. I suspect getting it out on paper will let me&#xD;
revisit with more clarity later. &lt;/p&gt; &lt;p&gt; Prompted by &lt;a&#xD;
href="http://twitter.com/bsbodden"&gt;Brian Sam-Bodden's&lt;/a&gt; musing on&#xD;
the subject a week or so ago on Twitter, I've been ruminating on the&#xD;
notion of a "component."   I think that the evolutions of modern day&#xD;
software development are embodied in the notion of a component, not a&#xD;
"service," or a "bean," or anything else. Those words don't convey&#xD;
enough. &lt;/p&gt;&lt;p&gt; Thinking about it, a "component" can be broadly&#xD;
defined as a thing which integrates readily into a bigger thing  -&#xD;
that is, it's adapted to the thing that uses it, and any other such&#xD;
thing could be made to follow suit, with the same adaptations. The&#xD;
container is composed of components. &lt;/p&gt;&lt;p&gt; Getting more specific, we&#xD;
think about a component in &lt;i&gt;software&lt;/i&gt; as a thing that is&#xD;
integrated into a &lt;i&gt;container&lt;/i&gt; and that can only  function as a&#xD;
subordinate entity to the container. In practice, this vague&#xD;
description manifests itself as class that implements an well-known&#xD;
interface. Sometimes, being a component means is simply a matter of&#xD;
letting the container control when the component starts working and&#xD;
when it is stopped. Here, you might not even need to implement an&#xD;
interface since object creation and destruction or (&lt;i&gt;typically!&lt;/i&gt;)&#xD;
built into the language itself, and thus there's no need to codify it&#xD;
further. &lt;/p&gt;&lt;p&gt; This ends up quite often being too much of an&#xD;
abstraction. Something that is everything is also nothing. So, again,&#xD;
in practice it's a matter of establishing a common interface. In&#xD;
recent years, the "interface" for a component has evolved beyond the&#xD;
literal notion of a language interface and can be any number of things&#xD;
now. After all, all the interface does is distinguish an object as&#xD;
being a &lt;i&gt;component&lt;/i&gt; in a sea of non-components. Such a&#xD;
distinction can otherwise be made, as with annotations or attributes&#xD;
in the Java and .NET platforms, respectively.  &lt;/p&gt;&lt;p&gt; So, a component&#xD;
is something that belongs to a container and that so marks itself as&#xD;
usable in that container with an interface or some other&#xD;
distinguishing feature. &lt;/p&gt;&lt;p&gt; Now, when the component is deployed,&#xD;
it sustains some sort of behavior, perhaps over a period of time.&#xD;
There is often a setup phase and a destruction phase.  This implies a&#xD;
lifecycle, to setup state to begin servicing requests and to stop&#xD;
servicing requests. This lifecycle might provide hooks tot he&#xD;
component unique the containing environment. &lt;/p&gt;&lt;p&gt; Because the&#xD;
component exists inside of a container, collisions are apt to occur.&#xD;
Language features like assemblies or packages help isolate a&#xD;
component, but often the container will provide addressing to further&#xD;
isolate a component from its siblings. &lt;/p&gt;&lt;p&gt; At this point, I think,&#xD;
the nuances are what qualify the application of a component. If we&#xD;
agree on the previous points applying to most components, then surely&#xD;
we agree that following aspects apply only to some components. The&#xD;
specification is where the term component is starts being prefixed,&#xD;
i.e., "web component," "service component," etc. &lt;/p&gt;&lt;p&gt; Analyzing&#xD;
these definitions, a HUGE number of things could be consider a&#xD;
component. &lt;/p&gt; &lt;ol&gt; &lt;/li&gt;&lt;li&gt; the now-defunct Avalon framework had&#xD;
"components" &lt;/li&gt;&lt;li&gt; Spring has a @Component stereotype that marks&#xD;
beans as "components" &lt;/li&gt;&lt;li&gt; JCDI  - the pending DI component model&#xD;
in JEE6 describes "components" &lt;/li&gt;&lt;li&gt; Indeed, EJB's original&#xD;
documentation spoke of EJB "beans," which you might argue was Sun's&#xD;
jargon for "component." &lt;/li&gt;&lt;li&gt; The web frameworks Tapestry, Wicket,&#xD;
Echo, etc, provide components for the user.  &lt;/li&gt;&lt;li&gt; The Java UI&#xD;
model, Swing, provides components &lt;/li&gt;&lt;li&gt; The J2ME and Android&#xD;
mobile phone platforms provide "components" &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; The list&#xD;
goes on and on, but you can see plainly that the idea of a "component"&#xD;
is not new. A component by any other name... &lt;/p&gt;&lt;p&gt; These various&#xD;
notions of a component - though not all of them - share several more&#xD;
concepts which we might describe as key to any description of a&#xD;
component. &lt;/p&gt;&lt;p&gt; Most of them provide some way to export state. In&#xD;
Tapestry, Seam and JCDI, you can "outject" values, effectively binding&#xD;
an internal value to a client's state, so that the internal state is&#xD;
reflected in the external variable when state inside the component&#xD;
changes. This is often called just "binding," and is -usually -an&#xD;
abbreviated way of responding to some event and then synchronizing&#xD;
client state with the state of the component manually. JavaBeans&#xD;
themselves, a core tenant of the Java platform, provides this notion&#xD;
of properties, which are nothing more than accessor/mutator pairs by&#xD;
which state may be shared in a generic fashion. The Dojo JavaScript&#xD;
framework, Wicket, Echo, and Spring, ASP.NET, and Swing all provide&#xD;
support for broadcasting state changes as events. This tends to be&#xD;
very effective as it decouples the listeners from the component&#xD;
itself. &lt;/p&gt;&lt;p&gt; In this discussion I've lumped both events and&#xD;
properties as goals by which to achieve the same thing, and though&#xD;
these concepts are not present everywhere, they're key for good&#xD;
components in this author's experience. &lt;/p&gt;&lt;p&gt; In this respect,&#xD;
Delphi, C# and Scala and other languages that embrace these concepts&#xD;
and codify events and properties have the edge. Software development&#xD;
can't be about  being able to bundle state and functionality, it has&#xD;
to be about components that play nicely with each other, not in a box&#xD;
but in an ocean. Promoting the ideas behind a component promotes&#xD;
decoupled, and well behaved, software. &lt;/p&gt;&lt;p&gt; Indeed, the trends in&#xD;
software development themselves beg for components. Grids, with many&#xD;
concurrences and actors at play, are very well suited to components&#xD;
-services exposed behind a publish/subscribe mechanism. Services so&#xD;
exposed publish functionality that other actors in the system can&#xD;
consume if they can address them. This sort of dynamism is already&#xD;
alive and well in things like Jini or GridGain. The components&#xD;
themselves comply with a life-cycle for their respective containers.&#xD;
&lt;/p&gt; &lt;p&gt; The very idea of a component - things out of which something&#xD;
bigger is composed - implies composition. The biggest thing to come&#xD;
out of SOA is the push towards service reuse and composition, which&#xD;
components encourage.  &lt;/p&gt; &lt;p&gt; Clearly, I'm thinking this through as&#xD;
I write it, and so any input's appreciated (good, bad, or&#xD;
indifferent.) &lt;/p&gt;&lt;p&gt; The addressability part is key. Brian mentions&#xD;
the notion of a REST-ful component. In the specific, he was talking&#xD;
about a component on a page amight be addressable, but the question is&#xD;
equally well put to how to expose distributed components uniformally.&#xD;
&lt;/p&gt; &lt;p&gt; Is there an ideal way to build components and to model these&#xD;
concepts  - what's the next generation of software going to bring us?&#xD;
Clearly, functional languages are here to stay, but they don't&#xD;
preclude the idea of a component, in fact I imagine it might work for&#xD;
it.  &lt;/p&gt; &lt;p&gt; What do you think? What's the most succinct way to model&#xD;
software? Is your architecture composed of objects and services? Of&#xD;
global variables and functions? Or of components? What will the&#xD;
architectures of tomorrow look like?&lt;/p&gt;</description>
      <pubDate>Thu, 20 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/component_oriented_architectures.html</guid>
      <dc:date>2009-08-20T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Ooops!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/ooops.html</link>
      <description>&lt;p&gt;Today started off nice enough...&#xD;
I went to &lt;a href="http://www.malibuseafood.com/"&gt;Malibu Seafood&lt;/a&gt;&#xD;
today and enjoyed a lovely day on the beach and came back to check my&#xD;
blogs and, &lt;b&gt;blam!&lt;/b&gt; mistake-in-the-face! &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;In my last blog I discussed that I'd updated the software powering&#xD;
this blog, and that there might be some bugs to work out. &lt;/p&gt;&lt;p&gt;Boy,&#xD;
am was I on the money on that one! Turns out, I updated the logic used&#xD;
to implement my RSS feed and Atom feed (eh, mainly, the switch - I'm&#xD;
embarrassed to admit - was to actually use the token that ROME expects&#xD;
to generate an Atom feed instead of the RSS 2.0 type of feed.)&#xD;
Bluntly: if you subscribed to my Atom feed, you only got an RSS feed,&#xD;
because I fat fingered the &lt;code&gt;'feedType'&lt;/code&gt; parameter on that&#xD;
one!&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; Apologies to all those were spammed this morning with 'duplicate'&#xD;
(essentially) blog entries! Everything except this and the one before&#xD;
it are old and can be marked as read... thanks. &lt;/p&gt;</description>
      <pubDate>Mon, 17 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/ooops.html</guid>
      <dc:date>2009-08-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>You're looking at a work in progress..</title>
      <link>http://www.joshlong.com:80/jl/blogPost/youre_looking_at_a_work_in_progress.html</link>
      <description>&lt;h2&gt;Man at work&lt;/h2&gt;&#xD;
 &lt;p&gt; You're looking at a work in progress. &lt;/p&gt;&#xD;
 &lt;p&gt; The software that runs this site - joshlong.com - is home-brew. I&#xD;
built it myself, not because I feel like I'm going to do an inherently&#xD;
better job than any of the numerous pre-built options - furthest thing&#xD;
from it, actually.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
 I built it myself to be able to eat my own dog food. If I had to&#xD;
learn at the same pace I take on a new job and get exposed to a new&#xD;
skill set by force, I'd know much less. Practice is the only thing&#xD;
that can be usefully attributed to improved skills.&#xD;
The previous version of this site was written in Spring MVC so I could&#xD;
refine my understanding of the @MVC model and truly get a feeling for&#xD;
how it works (very nicely, I should add).&#xD;
I've long been a fan of Tapestry and have built numerous sites with&#xD;
it. I figured, with all the new work going on in the JSF world that it&#xD;
was time for me to refresh myself on that platform, especially as JSF&#xD;
2.0 creeps ever closer.&#xD;
 &lt;/p&gt;&#xD;
&lt;p&gt; JSF has seen major "upgrades" (in lieu of &lt;i&gt;actual&lt;/i&gt; upgrades&#xD;
from the specification) from JBoss, with Seam, and with the Spring&#xD;
Faces support from SpringSource. Additionally, RichFaces and numerous&#xD;
other projects have evolved their component frameworks so much that&#xD;
result is rarely portable, but usually very nice. In effect these&#xD;
component libraries are their own sort of framework and often carry&#xD;
their own specialized support for core framework concepts like&#xD;
component development, JavaScript, rendering (i.e., view templates),&#xD;
Ajax and internationalization. These frameworks can make JSF very&#xD;
pleasant.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Except... when it isn't. It turns out that JSF's many weaknesses  -&#xD;
while in some places well addressed by some of these 3rd party&#xD;
solutions - are not completely surmountable, and in some cases you're&#xD;
forced to simply "grin and bear it."&#xD;
 This includes things like statelessness (you'll be greeted with a&#xD;
&lt;code&gt;JESSIONID&lt;/code&gt; on your first request, for example), binary&#xD;
responses, and SEO-friendly URLs. I've talked about solutions for some&#xD;
of these problems in Spring MVC before, but they were to augment a&#xD;
capability that was already there. Here, the solutions and the&#xD;
home-brew components I had to put together were to avail myself of&#xD;
these capabilities in the first place.&#xD;
&#xD;
&lt;/p&gt;&lt;p&gt; For SEO-friendly URLs, I found an incredible library called &lt;a&#xD;
href="http://ocpsoft.com/prettyfaces/"&gt;Pretty faces&lt;/a&gt;. I'm still&#xD;
using &lt;a href="https://jawr.dev.java.net/"&gt;JAWR&lt;/a&gt;, as before, but&#xD;
because I'm also using RichFaces - which has its own CSS/JS&#xD;
compression mechanism, the solution's not quite as effective as I&#xD;
would have liked. Still, 2 heavily compressed, minified JS files and&#xD;
CSS files (one from JAWR, one from RichFaces) still beats 10+ HTTP&#xD;
requests on non-minified/non-gzip compressed resources required&#xD;
otherwise!)&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; The blog software itself has many components, only about 20% of&#xD;
which is the UI layer. Thus, porting to a new UI framework's pretty&#xD;
easy because the back end and most of the processing are divorced from&#xD;
the UI layer.&#xD;
 &lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;But... Why?&lt;/h2&gt;&#xD;
 &lt;p&gt;No good reason, really. I know what you're thinking - "what could&#xD;
possibly be more 'website site babysitting a database' than a blog?".&#xD;
Since I'm trying to experiment with things, I've hit a few different&#xD;
places where it's paid to invest in exploiting temporal decoupling,&#xD;
and thus in investing other technologies.&#xD;
&#xD;
Most of these features are part of the creation of blogs, thus, not&#xD;
something you'll ever notice.&#xD;
  There are two ways to create blogs on this site. An administration&#xD;
section in which I can log in and post blogs and save drafts is the&#xD;
sort of first-blush approach. It works well enough, but it's not&#xD;
nearly as full featured as the equivalent functionality inside GMail&#xD;
for composing an email. So, I create a Spring Integration integration&#xD;
that polls an email and posts that. It's got a white-list on incoming&#xD;
e-mail addresses, of course, and I've had to do a few unconventional&#xD;
things to make it work, but it's actually the most fluid way to deal&#xD;
with my blog. Not surprisingly, this feature's available in other&#xD;
blogging software, too.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
Once I do send in a blog, processing occurs on the blog entry itself.&#xD;
The act of creating the blog triggers a jBPM process that prepares the&#xD;
blog for final publication. The jBPM process is handled  in a separate&#xD;
VM, with JMS serving as the transactional queue that pops tasks off of&#xD;
the queue and handles the work.&#xD;
 This is useful because it lets longer running tasks happen with no&#xD;
apparent delay to the readers of the site.&lt;/p&gt;&lt;p&gt;Any externally&#xD;
referenced images  in the blog are parsed and their URLs used to&#xD;
asynchronously download the image, which gets stored in managed file&#xD;
system. Then, in the published blog, you see a URL pointing to that&#xD;
managed image, not the original, which means if the original&#xD;
disappears, my blog will still look correct.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; Another part of the process involves submitting pings to the&#xD;
various syndicates for a blog to let them know they should update&#xD;
their listing.  This too is something that a lot of other blog&#xD;
software will do, but it can take a while which is why in my software&#xD;
it's modeled asynchronously.&lt;/p&gt;&#xD;
&lt;p&gt; The number one reason for building my own blogging solution is,&#xD;
simply, that I can say I did. Because the domain model and services&#xD;
tier are familiar, it's easy to gauge progress with a UI framework by&#xD;
how quickly I'm able to build for it. &lt;/p&gt;&#xD;
 &lt;p&gt; Naturally, there are many  (seemingly endless) reasons not to do&#xD;
what I've done. However, they all focus on practicality with respect&#xD;
to setting up a blogging solution. They fail as means by which to&#xD;
practice my craft. &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; Having said that, please excuse any inconsistency in this blog as&#xD;
I'm still tweaking things (as I tend to do every 6 months or so.&#xD;
 The software's more or less at parity with where it was in Spring&#xD;
MVC, having ported the UI layer over. Missing are keywords and&#xD;
descriptions in the meta tags, a working version of the admin section&#xD;
(though, as I indicated, I use the e-mail integration more frequently&#xD;
and that still works since it has nothing to do with JSF or servlets),&#xD;
working titles (ie, each post's title should appear between the&#xD;
&amp;lt;title&amp;gt; tags in the browser window,  and I'm sure there's more.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; There are many fixes in this new software, too, but ideally,&#xD;
you'll never notice them :-) &lt;/p&gt;&#xD;
&#xD;
 &lt;p&gt;If you notice anything I'm missing or you think might be worth&#xD;
experimenting with adding in a reasonably malleable blogging platform,&#xD;
leave a comment. Thanks!&lt;/p&gt;</description>
      <pubDate>Sun, 16 Aug 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/youre_looking_at_a_work_in_progress.html</guid>
      <dc:date>2009-08-16T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Composite components in JSF 1.2.x</title>
      <link>http://www.joshlong.com:80/jl/blogPost/composite_components_in_jsf_12x.html</link>
      <description>&lt;p&gt;&#xD;
  I'm trying to build a component in JSF that in turn has several drop downs that, with the magic of RichFaces, updates the server on the state via Ajax and rerenders the components "downstream" of the component whose state has changed. &#xD;
 This is the classical idiom of a drop down has options depend on the previous selections made. &#xD;
The component's used in several places on the system and it would be magnificent if we could blackbox its internals. &#xD;
&#xD;
 &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; With Tapestry, you could build a component that does its work and then "outjects" or writes a value to a property upon completion. Imagine, for example, a login form. The login form has two text fields (email, password, or anything like that) and a backing class. As the login form component is rendered, you might have preconditions to establish, so you use the Tapestry component life cycle to setup state on the fields before rendering. Finally the text fields are rendered. When the form is submitted the fields values are updated and you have a chance to read the values and perhaps do something with them. For example, if the credentials are correct, you might do a query and create a valid &lt;code&gt;User&lt;/code&gt; object. The &lt;code&gt;User&lt;/code&gt; object is then set on a property and that property can be bound to a  property of the client of the component. If you use the same component 10 times on the same page, they all have their own internal copy of the property and they can all update the same one or they could update 10 individual properties. That is, the "backing bean" is scoped to the component, not the page.  &#xD;
&#xD;
 &#xD;
&lt;/p&gt;&lt;p&gt; &#xD;
 The difference with JSF is that for any kind of composite components you have to do soething like building the tree or using Facelets. These components will in turn require some place to store the values they submit. For the above example of the login form, the user name and the password need some place to be stored. Since facelet &lt;code&gt;ui:components&lt;/code&gt; don't have their own backing bean, you need to provide the backing bean for the values. Thus, it's up to the client of the component to provide storage for internal state of the component. Not very component oriented. And, more to the point, it quickly becomes untenable if you want to use the component more than one time in the scope the backing bean lives. That is, you can only use the component once per request or once per session (without creating new backing beans, at least).&#xD;
&#xD;
 &lt;/p&gt; &#xD;
&#xD;
&lt;p&gt; I know that JSF 2.0 will feature better support for composite components, but I need this to work on JSF 1.2, and have not managed to find many good resources / examples on how to build a sophisticated &lt;code&gt;UIComponent&lt;/code&gt; subclass so it can handle its own storage. &lt;/p&gt; &#xD;
&#xD;
&lt;p&gt; Anybody have any   ideas? &lt;/p&gt;</description>
      <pubDate>Wed, 22 Jul 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/composite_components_in_jsf_12x.html</guid>
      <dc:date>2009-07-22T00:00:00Z</dc:date>
    </item>
    <item>
      <title>JoshLong.com on EC2</title>
      <link>http://www.joshlong.com:80/jl/blogPost/joshlongcom_on_ec2.html</link>
      <description>&lt;p&gt; This is my first working version of the system being posted from the EC2 cloud. Performance seems alright. I'll update as I dig more into the capabilities. So far getting things up and running has been relatively painless. &#xD;
 There's something inherently awesome about being able to login and setup your own server without having to beg for certain extra capabilities.  &#xD;
&#xD;
&lt;/p&gt;&lt;p&gt; I like most that this could eventually grow with a minimum of fuss.  &lt;/p&gt;</description>
      <pubDate>Sun, 19 Jul 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/joshlongcom_on_ec2.html</guid>
      <dc:date>2009-07-19T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My talk on Spring Integration At TheServerSide.com '09</title>
      <link>http://www.joshlong.com:80/jl/blogPost/my_talk_on_spring_integration_at_theserversidecom_09.html</link>
      <description>&lt;p&gt; I did a talk &lt;i&gt;waaay&lt;/i&gt; back in March on Spring Integration for TheServerSide Symposium. If you're into Spring and want an hours worth of good wholesome ESB fun, may I humbly suggest you check out &lt;a href="http://library.theserverside.com/detail/RES/1242310424_817.html?asrc=vcatssc_sitepost_05_14_09"&gt;the talk.&lt;/a&gt; I'd love to know what you think so please feel free to leave a comment! &#xD;
&lt;/p&gt;</description>
      <pubDate>Mon, 15 Jun 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/my_talk_on_spring_integration_at_theserversidecom_09.html</guid>
      <dc:date>2009-06-15T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Tapestry 5.1</title>
      <link>http://www.joshlong.com:80/jl/blogPost/tapestry_51.html</link>
      <description>&lt;P&gt; Recently, I've been playing with Tapestry 5. The experience has been extremely satisfying. Although there are issues that could be worked on, on the whole this is the most pleasant development environment I've ever use for Java Web development. Frankly, it started as just a way to keep my mind away from a main project I'm working on. I figured I'd give it the five minute test. Actually, this is the third time I 've given it the five minute test, and this time it took. What did it was release 5.1, which sports a few features that indicate that Tapestry 5 is becoming a very "practical" choice, not just the right one.&lt;/p&gt;&lt;p&gt; Tapestries 5.1 sports the ability to gzip compress, as well as consolidate, JavaScript files. It does other things with images and css, too. It's not just yet on par with JAWR - which, honestly, I love -  because there's something freeing about knowing that if your page needs libraries x, and y, that there's a component out there that's doing everything possible to make the impact of inclusion of that library acceptable. CSS and JavaScript are to the web what "jars" are to the JVM: an encapsulated packaging of externalized, reusable functionality. Being able to optimize loading them, then, is crucial. &lt;/p&gt;&lt;p&gt; Knowing this, I decided to give it a look. I got into it, just a little. I used the Maven Tapestry archetype and created a separate project. Downloaded Tomcat 6 and even loaded Eclipse 3.4. I imported the Maven project using the m2eclipse plug-in, setup a Tomcat 6 server instance, and deployed my application to the instance. I configured Tomcat to "serve modules without publishing," and disable auto publishing. Then I crossed my fingers and hoped for the best. I loaded the browser and hit the front page. The site that's generated is pretty, but boring. It does, however, prove inviting. I returned to Eclipse, associated the HTML editor to &lt;code&gt;*.TML &lt;/code&gt; files, and then started hacking. I started with a change to a &lt;code&gt;.TML &lt;/code&gt; file. &lt;code&gt;&amp;lt;h1&amp;gt;Hello, world!&amp;lt;/h1&amp;gt;&lt;/code&gt;, placed in the middle of the &lt;code&gt;Index.tml &lt;/code&gt; file. I refreshed. It worked...! I went to the Index class itself, and added &lt;/p&gt;&#xD;
 &lt;pre&gt;&lt;code&gt;&#xD;
 public String getMyMessage(){&#xD;
        return "Hello, moto.";&#xD;
 } &lt;/code&gt;&lt;/pre&gt;&#xD;
 &lt;p&gt;&#xD;
&lt;p&gt; Then, on the Index.tml file, I added &lt;code&gt;${myMessage}&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;Again, I just refreshed the browser, and it worked! In comparison to Tapestry 3 and 4, this was great. But I've blogged about &lt;a href="http://www.joshlong.com/jl/blogPost/getting_started_with_zero_turnarounds_javarebel.html"&gt;Zero Turnaround's JavaRebel&lt;/a&gt; product and I've certainly seen Tomcat do some neat things with regular Struts projects or Spring MVC projects. I wasn't.. aghast, just yet. Finally, I started getting into it. &lt;/p&gt; &lt;p&gt; I have used the various versions of Tapestry before, so I knew  - essentially - what components to expect and essentially what to imagine possible. I had programmer courage. So I was a little more ambitious and decided I'd tackle something  a little more ambitious. I started with a component to provide a panel. The panel would have a parameter for a ValidationTracker, which is the object that keeps track of what validations have occurred on a &lt;code&gt;@Form &lt;/code&gt; component (very much like &lt;code&gt;ActionErrors&lt;/code&gt;/&lt;code&gt;ActionMessages &lt;/code&gt; in Struts. The panel would turn red if there were errors in the form it contained. This was a hard thing to do before because Tapestry had issues with the order of the layout of the components. &lt;/P&gt; &lt;P&gt; Suffice it to say, it worked. It was also blissfully simple. No interfaces, not even annotations if I didn't want them. I was able to parameterize the title of the panel using a &lt;code&gt;@Block &lt;/code&gt; (like a facet in JSF). In a package adjacent to my test page, I added a simple POJO, with a few accessor / mutators (a &lt;code&gt;Customer &lt;/code&gt; class, with the usual sort of properties..). I declared an instance of it on my test page's class and added a &lt;code&gt;@Property &lt;/code&gt; annotation to it - I didn't have to even create a java bean style accesor! I added a Form and a few TextField components to the class, too. &lt;/p&gt;&#xD;
&lt;PRE&gt;&lt;CODE&gt;&#xD;
@Component(parameters={"value=customer.email"}) private TextField email ;&#xD;
@Component(parameters={"value=customer.password"})  private TextField password ;&#xD;
@Component private Form form ;&#xD;
&lt;/CODE&gt;&lt;/PRE&gt;&#xD;
&lt;p&gt;On my page, the I had:&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;code&gt;&#xD;
&amp;lt;form t:id="form"&amp;gt;&#xD;
 &amp;lt;t:label for="email" /&amp;gt; &amp;lt;input t:id="email" /&amp;gt; &amp;lt;br/&amp;gt;&#xD;
 &amp;lt;t:label for="password" /&amp;gt; &amp;lt;input t:id="password" /&amp;gt; &amp;lt;br/&amp;gt;&#xD;
 &amp;lt;input t:id="signup" type="submit" /&amp;gt;&#xD;
&amp;lt;/form&amp;gt;&#xD;
&lt;/code&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt; This seemed like enough, so I hit refresh and .. unsurprisingly, it worked!&#xD;
 Naturally, this doesn't do anything. I wanted to make the &lt;code&gt;Form&lt;/code&gt; component do something on successful submission.&#xD;
 I looked around, and the simplest way to do that was to name a method as though I was descrbing it in English:&#xD;
&#xD;
  &lt;pre&gt;&lt;code&gt;&#xD;
  void onSuccessFromForm()  {&#xD;
    System.out.println( new ReflectionToStringBuilder( this.customer).toString()) ;&#xD;
  }&#xD;
  &lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;And of course, &lt;i&gt;that&lt;/i&gt; worked!&#xD;
 It's worth mentioning that during all of this - method additions, field additions, component adjustments, etc, I've not redeployed or published or even waited for more than a split second even once.&#xD;
The 5 minutes had become an hour. The reason I write this blog is because I'm now well into hour 7, and I'm thoroughly impressed. It's actually &lt;i&gt;fun&lt;/i&gt; to work in.&#xD;
&#xD;
 If you've ever had that &lt;i&gt;wow!&lt;/i&gt; moment in a dynamic language where you just can't beleive how nice it is to hit refresh and work, then you'll appreciate Tapestry.&#xD;
 I can't usefully compare it to another Java framework because there's nothing like it. It's liberating. Check out Neal Ford's amazing &lt;a href="http://library.theserverside.com/detail/RES/1242309506_447.html?asrc=vcatssc_sitepost_05_14_09"&gt;"On the Lame From The Furniture Police"&lt;/a&gt;&#xD;
  to watch a discussion on keeping focus, flow while working. In it, he basically discusses just how damaging a minute idle time is when developing an application.&#xD;
  Tapestry breaks that cycle for you. No more flow stoppages. I've become impatient with the browser's ability to repaint, actually!&#xD;
&lt;/p&gt;&lt;P&gt;I wholely recommend you take a look at &lt;a href="http://tapestry.apache.org"&gt;Apache Tapestry 5.1&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Sun, 07 Jun 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/tapestry_51.html</guid>
      <dc:date>2009-06-07T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My Los Angeles Musings, Seam, Tapestry 5, JavaOne, Spring Workflow, Spring Python and more</title>
      <link>http://www.joshlong.com:80/jl/blogPost/my_los_angeles_musings_seam_tapestry_5_javaone_spring_workflow_spring_python_and_more.html</link>
      <description>&lt;h1&gt;Hello, world. &lt;/h1&gt; &lt;p&gt;My life has been utterly and completely busy for the last several months. I don't know about you, but I love it when that happens, even if it does take me aay from priority things like maintaining this blog. I'll take this post to sort of stretch my blog legs out again, and then try to establish a blog with more frequency.  &lt;/p&gt; &lt;p&gt; &lt;a href="http://joshlong.com/jl/blogPost/moving_to_los_angeles.html"&gt;When last I wrote&lt;/a&gt;, I mentioned that I had moved from Phoenix, AZ to Los Angeles, CA. I started work on April 1 (cool company, nice people, interesting software, moving on...). I worked pretty consistently and started looking for a place to stay as I was at that point lodging with my mom. My wife came from Phoenix, AZ a month later, May 1. She stayed back while I sort of scouted ahead and started work. We've found a nice apartment in Canyon Country, CA, which is, honestly, very pleasant. It's far away from Los Angeles proper that the prices seem acceptable, but close enough that I can make my 20 mile commute in about 24 minutes, which I appreciate. I've also enjoyed (surprise surprise) the weather, which has been beautiful of late. As an example, as I write this it's very, very early in the morning, just after midnight, on Friday, June 5. The temperature is 88F in Phoenix, AZ right now, and 59F here in Los Angeles, CA. Couldn't be happier. Nothing like being able to program with the air conditioning off in the winter. Frankly, I've really just sort of enjoyed the little things.  &lt;/p&gt; &lt;p&gt;I don't mean to gloat, but it's amazing what you take for granted when you live here. It doesn't hurt that the economy's so bad  it's sort of leveled out the prices, making parts of Los Angeles very approachable for somebody who's used to Phoenix prices.  I'm a fan of AT&amp;ampT's Uverse ISP here in Los Angeles. I had COX cable in Phoenix, AZ. I paid about $130 a month to get two DVRs, cable internet with very limited storage and no ability to share among the bedrooms and almost no channels. Not to mention, I couldn't get a static IP (the shame, the humanity!) without a business account, which given how little I liked them was out of the question as it would've compelled me to accept a year long contract. Needless to say, all of that's been improved, and I pay less, and I have a much wider channel selection, to boot!  &lt;/p&gt;&lt;h2&gt;Of Web Frameworks&lt;/h2&gt; &lt;p&gt;I've had the chance to play with some very cool technologies in depth of late, one of which is Jboss Seam. I've had issues with Java Server Faces in the past, and have even spoken to some of the issues I've had, but nonetheless it works and, when taken together with something like Tomahawk, Facelets and the various Spring integrations, you can be productive using it. Naturally, JSF has it its battlegrounds, and really scalable, stateless applications with Google indexability is not one of them. Knowing that, you can get it to work. Seam rectifies some of this and worsens it, as well. I've had an amazing time sort of rethinking through problems, learning how to approach things the Seam way. If you let your mind wander, it seems like it's very easy to produce terrible code. Essentially, this stems from certain assumptions JSF, and Seam on top of it, make for you.  &lt;/p&gt; &lt;p&gt;One of them is that the HTTP Session is infinite. Seam addresses some of these issues by providing a very cool concept called a "conversation" - which I'm sure we've all seen before, but which really is quite refreshing in its application inside of Seam - which models the idea that you have a unit of work that is greater than a single request but smaller than a session. This is fine as it allows you to keep state around and use it as required and then trust that, when the conversation's finished, Seam will reap all that session memory back. Additionally, because Seam components are basically stateful session beans (unless you're using Seam POJOs, in which case they're basically stateful session beans that you can't use on another framework or EJB3 stack..) there's very little clear separation of tiers. You need to find an entity inside of a JSF action listener? Grab an entity manager and issue a query, and then add JSF validation messages if you can't find it! It almost seems like a step back, honestly.  This extra state, I find, has required me to whip out a debugger more times than I care to admit. In complex interactions it becomes very difficult to keep track of preconditions and postconditions for a given interaction.  &lt;/p&gt;&lt;p&gt;The real shame to me as a person who is very fond of &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=jBPMandSpring"&gt;jBPM&lt;/a&gt;,  Seam doesn't force the concept of conversational state far enough down the throat of the users. JBPM is definitely well integrated, but it's not required. It's also very possible to eschew altogether jPDL based Seam navigation, which makes for an application that has complex continuations and state without rail guards within which to advance. Anyway, giving it credit where credit is due, it's definitely better than raw JSF. I've also come to very much like Ajax4JSF and RichFaces. Part of me cringes when I realize that even simple Ajax requests are basically re rendering the whole page (or, rather, most of the body and several additional script tags), and in the process making the net burden of a given interaction with the server for certain pages on the order of several megabytes of un-cacheable Ajax JavaScript and HTML. The other part of me is utterly stunned with the richness of the results. It does, really, work. Taken together with some of the awesome features Seam itself provides (why couldn't they have just chosen Tapestry? Such apparently talented people working on JSF seems like a crime...) &lt;/p&gt;&lt;p&gt;I can't help but feel, sometimes, that we're heading down the path of ASP.net with JSF. ASP.net is a component based framework, and component based frameworks like Wicket, JSF, and Tapestry all fundamentally are familiar to somebody who knows ASP.net. ASP.net has a slew of components that you can use and which rammed a lot of state down the clients throat to keep the illusion that the programmer was dealing with a Windows Form application. This worked well until, one day, you wanted to override a style attribute on some component that had inline the CSS and no assigned ID. Now, you were fighting with the framework to restore your will. In this way, I feel like JSF is very similar. When I use Ajax4JSF, RichFaces, and Seam in general I am able to easily forget that I'm working n top of a statless protocol where every request has absolutely no idea what happened just one request before it but for the graces of a cookie or a state field in the request. This is why ASP.net MVC was birthed, to provide an approach for those that wanted more fine grained control. In this way, the .NET community has sort of reversed our evolution in the Java community, going from the action-oriented Strutses and Webworks and even Spring MVC, to the componented oriented JSF, Wicket, Tapestry and GWTs of the world.   &lt;/p&gt;&lt;p&gt;Using JSF/Seam,  I even forget about the cost of state a little bit. State's what it's all about. The Seam proponents will insist that storing state on the HTTP session is far more efficient than in the database, which is inherently less scalable. In theory, I agree with this. However, Seam still hits the database for non cached data (if you have that setup!), and you're still not excused from reconciling optimistic lock exceptions using Seam, and it leaves you with an HTTP Session brimming with state and a HTML that can easily grow to be several megabytes for midly complex UI interactions and their components.  &lt;/p&gt;&lt;p&gt;I have met people who were under the illusion that servlets (raw servlets) had a session by default, that it was to be taken for granted. I've spent a long time building applications where the goal was to avoid the session at all costs, until absolutely necessary (make your Struts beans request scope, turn of JSP sessions, and if you're going to do redirect after post, either encode the state in the redirect request or be darned sure you use what's now being called "flash" scope, session persistance in the service of just two HTTP requests. &lt;/p&gt;&lt;p&gt;Anyway, having invested so much in understanding and learning Seam, I decided I might as well give &lt;a href="http://tapestry.apache.org/tapestry5/"&gt;Tapestry 5.1&lt;/a&gt; a chance, as it's been a few years since I had a chance to work with Tapestry, and that was Tapestry 4. I always had a personal fondness for Tapestry. It's always been session friendly by default and to be efficient as a component oriented framework. This has led to some gimmicky approaches (the render/rewind cycle, and lack of support for dynamic (read: programmatic) component creation and attachment) &lt;/p&gt;&lt;p&gt;I spent a little time getting used to it. I have to tell you, given my experience with ZeroTurnaround's JavaRebel javagent for Java class reloading, I really appreciated the intrinsic support for class/component reloading in Tapestry. As a development environment goes, I haven't had this much fun since Python on a web application. Truly amazing. I was somewhat disappointed to see that Tapestry has slackened it's feverish refusal to use the session, and made everything redirect after post unless specified otherwise. The implication here is that there's some session. It's still very efficient, and I've not caught it trying to store an entire backing bean (page or component) in the session yet! If you have a chance, I wholely and completely recommend it. It's lacking support for the things JAWR (a JavaScript/CSS) compression filter) provides - though there seems to be at least some effort aimed at adding it at no additional technical cost to the developer. It just works.  &lt;/p&gt;&lt;h2&gt; The World At Large &lt;/h2&gt;&lt;p&gt;I sat, jaw agape, as the rumor milled tossed around the notion that IBM would buy Sun, and wondered what would become of some of the interesting technologies inside Sun. Imagine my surprise when I woke to find the rumors quashed and Sun bought, by Oracle of all things! I couldn't believe it. &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=54827"&gt;Larry Ellision&lt;/a&gt; took the stage at JavaOne and reaffirmed interest in JavaFX. JavaFx is one of the few decent options we have in the Java client landscape, and even if I never write an application in JavaFx itself (I once tripped and learned ActionScript 3 and Flex programming, and I don't think I could see the value in switching now..), the work done to support JavaFX has been a boon for the JVM/JDK. Hopefully, this innovation will continue.  &lt;/p&gt;&lt;p&gt;SpringSource has been doing a lot of great things of late. &lt;a href="http://www.springsource.org/roo"&gt;Spring Roo&lt;/a&gt; is a promsing mechanism by which useful prototype applications can be created on the fly, a sort of Spring-y version of Rail's application generarots. Spring IDE being released for free, which is a boon as somebody who's used OSGi without good tooling, and - most interesting to me - I discovered Spring Workflow, which looks very promising indeed. I am a huge fan of a good BPM engine, and it's something fundamentally hard to do correctly. Enterprise BPM engines are even harder. Hopefully, &lt;a href="http://www.springsource.org/extensions/se-workflow"&gt;Spring Workflow&lt;/a&gt; will remedy some of this. Finally, I couldn't help but note the amazing progress of &lt;a href="http://www.springsource.org/node/1482"&gt;Spring Python.&lt;/a&gt;  I &lt;i&gt;adore&lt;/i&gt; Python, and have used it &lt;i&gt;in anger&lt;/i&gt; many, many times over the last decade. It's never failed me. I'm pleased to see Spring's offerning not merely being a Java-Spring that happens to be written in Python. This framework seems to be geared towards the Python way, even going so far as to remind people  in the (incredible) documentation that if nothing else, the libraries Spring Python provides can, and very well may be, used independant of any XML format! &lt;/p&gt; &lt;/p&gt;&lt;p&gt;Additionally, May saw the debut of Google Wave, which seems to be an incredibly cool platform on which to build. I'll be very interested to see what comes of this.  &lt;/p&gt;&lt;p&gt;I wonder what the next month will bring. I'll do my best to keep this blog up to date. I've heads down on a lot of work, and a few cool surprises I'll share when appropriate.  By the by, I encourage you to follow me on Twitter at &lt;a href="http://twitter.com/starbuxman"&gt;http://twitter.com/starbuxman&lt;/a&gt;.  &lt;/p&gt;</description>
      <pubDate>Fri, 05 Jun 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/my_los_angeles_musings_seam_tapestry_5_javaone_spring_workflow_spring_python_and_more.html</guid>
      <dc:date>2009-06-05T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Moving to Los Angeles.</title>
      <link>http://www.joshlong.com:80/jl/blogPost/moving_to_los_angeles.html</link>
      <description>&lt;p&gt; What a month! &#xD;
&#xD;
 I know this is a little late, but boy has it been a crazy month! April's shaping up to be no less crazy, too. &lt;/p&gt;&#xD;
&#xD;
 &lt;p&gt;  First, there was much ado about nothing early in the month when the court in Tempe, Arizona scheduled me for jury duty only to relieve me of it the day-of.  &#xD;
&#xD;
 &lt;/P&gt;&#xD;
&lt;p&gt; Then, on March 17th, I drove to Las Vegas for &lt;i&gt;the conference&lt;/i&gt;  -  my first big speech  - &lt;a href="http://javasymposium.techtarget.com/html/architecture.html#JLongEAI"&gt;at the The ServerSide Java Symposium&lt;/a&gt; in Las Vegas (which reminds me, I need to remove that banner on the right side of the page... ) which went off fine enough. More usefully, I have  some very interesting new friends.   I was especially happy to have had a chance to see the   &lt;a href="http://www.mandalaybay.com/entertainment/sharkreef.aspx"&gt;Mandalay Bay Aquarium,&lt;/a&gt; which was amazing. &#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; From Las Vegas, I drove to Los Angeles, CA to meet my friend Srinivas who I'd invited to join me for a weekend there. We drove 500 miles in 2 days just inside of Los Angeles, and another 400 when we shared the drive home to Phoenix, Arizona. We went to the Laugh Factory and were delighted to find that Dane Cook was a special, secret guest-of-honor. Awesome! &lt;/p&gt; &#xD;
&#xD;
&lt;p&gt; &#xD;
Then, I came home. I had given notice at my job at Wells Fargo and so the last week of March I spent closing up shop there and preparing for the next step. March 31st was my last, very sad day at Wells Fargo. I said good bye to everyone -- good people I should like very much to keep in contact with -- and packed up a few computers and books (and clothing, I suppose.) and drove to Los Angeles (again!) to start a new job there April 1. My wife and I are moving here, but the first step is getting out here and finding a place to live and so on. At the moment, I'm staying with family and my wife will join me soon. &lt;/p&gt; &lt;p&gt;These last few days have all about getting into the new job - interesting people there, too - and reuniting with some old friends. &lt;/p&gt;&lt;p&gt;Boy, am I glad to be back!&lt;/p&gt;</description>
      <pubDate>Mon, 06 Apr 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/moving_to_los_angeles.html</guid>
      <dc:date>2009-04-06T00:00:00Z</dc:date>
    </item>
    <item>
      <title>The Times, They Are A Changing</title>
      <link>http://www.joshlong.com:80/jl/blogPost/the_times_they_are_a_changing.html</link>
      <description>&lt;p&gt; Not to cheapen such an awesome Bob Dylan song, but I felt it was a propos... &#xD;
 Things are really going to be busy pretty soon. &#xD;
&lt;/p&gt; &lt;p&gt; Lot's of things are happening in my life right now. It's going to be a pretty turmultuous two months.&#xD;
 &lt;/p&gt;    &lt;P&gt;For someone who's adamant about encouraging change, and reacting gracefully to change in the software development lifecycle, I'm about to be put to the test.&#xD;
 My wife and I are moving to Los Angeles, CA, where I'm from.&#xD;
&#xD;
 This will put us closer to family.&#xD;
 	As I move forward and start speaking and doing more open source in my career, I don't want my vacation time to be spent just going to see family if I can instead spend it going to more conferences and being involved in the software world. &lt;/P&gt;&lt;P&gt;It's a very interesting time to be in software: I haven't felt like this since the late 90s.&#xD;
 &lt;/p&gt;&lt;p&gt;&#xD;
  		I've resigned my current position at my job and am looking forward to the next opportunity.&#xD;
&#xD;
  		I expect I'll be challenged, and hopefully given a chance to&#xD;
  		institute oositive change.Getting to that opportunity, could be ... tedious, however. State or continental moves are always challenging.   &lt;/p&gt;&#xD;
&#xD;
&lt;P&gt; In the more immediate short term I'm looking forward to The Server Side Symposium in Vegas this week! &lt;a href="http://javasymposium.techtarget.com/html/speakers.html#JLong"&gt;I'm speaking&lt;/a&gt; on EAI and &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration&lt;/a&gt;, in particular. It's a very promising new technology and I hope to encuourage people to check it out. If you're coming and you want to read some more on it, there's always the site I just linked to, as well as an article I wrote about it a little while ago, &lt;a href="http://www.infoq.com/articles/Spring-Integration-Joshua-Long"&gt;"Getting Started With Spring Integration,"&lt;/a&gt; on Infoq.com. I definitely encourage you to check those out.&#xD;
&lt;/P&gt;&#xD;
&lt;p&gt; By the by, anybody know of what parties / events are happening after the event?&#xD;
	I'd love to meet and greet any of you who are going to be there.&#xD;
&lt;/P&gt;&#xD;
&#xD;
&lt;p&gt; After that, it's off to Los Angeles, where I'll be advance scouting for a place to stay. If anybody wants to grab a beer while I'm there, let me know. I can be reached at josh 'at' my domain name. Or, contact me on &lt;a href="http://www.twitter.com/starbuxman"&gt;Twitter&lt;/a&gt;.&#xD;
&lt;/P&gt;</description>
      <pubDate>Sun, 15 Mar 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/the_times_they_are_a_changing.html</guid>
      <dc:date>2009-03-15T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Embedding The Apache Mina FTP Server</title>
      <link>http://www.joshlong.com:80/jl/blogPost/embedding_the_apache_mina_ftp_server.html</link>
      <description>&lt;p&gt;I had the requirement to provision users of a system with an FTP solution. I wanted something lightweight and very configurable. I chose to embed &lt;a href="http://mina.apache.org/ftpserver/downloads.html"&gt;The Apache Mina FTP Server&lt;/a&gt; since it's flexible, imminently hackable,  (it's written in Java and is deployed using Maven and Spring) and embeddable. This entry is about that process.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; Essentially, I didn't want to have to wrap it in a layer of abstraction just to support adding and removing users and configuration options like their home directory. It also had to be flexible, as there may be different requirements down the line oriented towards security. &lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
My use case is simple: I want to build  a processing pipeline for images (who doesn't?). I want users of the system to be able to login to an FTP with their same credentials and upload media. On the server, &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration&lt;/a&gt; will watch for uploads and send off a message to the message queue which is where the BPM engine sits, and is waiting to begin image processing on inbound images.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; What could be simpler? In this blog entry, I will only discuss addressing the first requirement: provisioning system users with accounts on an FTP server.&#xD;
&lt;/p&gt;&#xD;
&#xD;
 &lt;p&gt; I did look at some other alternatives, namely HermesFTP and AxlRadius, which seemed both to be interesting projects. I really have no opinions  for  - or against - them, Apache just has the backing foundry's name and more sophisticated documentation.&lt;/p&gt;&#xD;
&#xD;
&#xD;
&lt;P&gt;To test, I suggest using  &lt;a href="http://filezilla-project.org/"&gt;FileZilla&lt;/a&gt;, because it's powerful, free and features  a no-pain installation for the big 3 operating systems,  &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
&#xD;
 You can run the application as a stand alone server, but I'm running it as process that piggybacks the web application. In this blog, I'll simply introduce using it a   simple &lt;code&gt;public static void main(String [] args)&lt;/code&gt; context.&#xD;
&#xD;
&lt;/p&gt;&#xD;
&lt;h2&gt;Installation&lt;/h2&gt;&#xD;
&lt;p&gt; Getting the server is easy, as I'm using Maven. Below are the dependency elements to add to a POM if you don't already have them. Note the strangeness with &lt;code&gt;slf4j&lt;/code&gt;. I don't know if you'll encounter any issues with it in your configuration. My setup was riddled with ClassNotFound exceptions, and the configuration resolved them. You may very well be able to remove the exclusion from the &lt;code&gt;org.apache.ftpserver&lt;/code&gt; dependency as well as the two explicit  dependencies on &lt;code&gt;slf4j&lt;/code&gt; at the top.&#xD;
          I don't include the Spring framework dependencies here, but I do make use of Spring 2.5.x, though I suspect this would run just fine with Spring 2.0. Your mileage may vary.&#xD;
&lt;PRE&gt;&lt;code&gt;&#xD;
        &amp;lt;dependency&amp;gt;&#xD;
            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&#xD;
            &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&#xD;
            &amp;lt;version&amp;gt;1.5.3&amp;lt;/version&amp;gt;&#xD;
        &amp;lt;/dependency&amp;gt;&#xD;
        &amp;lt;dependency&amp;gt;&#xD;
            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&#xD;
            &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&#xD;
            &amp;lt;version&amp;gt;1.5.3&amp;lt;/version&amp;gt;&#xD;
        &amp;lt;/dependency&amp;gt;&#xD;
        &amp;lt;dependency&amp;gt;&#xD;
            &amp;lt;groupId&amp;gt;org.apache.ftpserver&amp;lt;/groupId&amp;gt;&#xD;
            &amp;lt;artifactId&amp;gt;ftpserver-core&amp;lt;/artifactId&amp;gt;&#xD;
            &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&#xD;
            &amp;lt;exclusions&amp;gt;&#xD;
                &amp;lt;exclusion&amp;gt;&#xD;
                    &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&#xD;
                    &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&#xD;
                &amp;lt;/exclusion&amp;gt;&#xD;
            &amp;lt;/exclusions&amp;gt;&#xD;
        &amp;lt;/dependency&amp;gt;&#xD;
&#xD;
&lt;/code&gt;&lt;/pRE&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Code&lt;/h2&gt;&#xD;
&lt;p&gt; Now that the JARs are in place, you need some a Java class to launch it and some configuration.&#xD;
&#xD;
The java code is below. It loads the Spring application context and punts the chore of configuring the server to it and the Spring XML file I've setup, &lt;code&gt;ftp-server.xml&lt;/code&gt;. Once a freshly obtained instance of the server is obtained, the server is started.&#xD;
&lt;pre&gt;&lt;code&gt;&#xD;
package com.foo.integrations.ftp;&#xD;
&#xD;
import org.apache.ftpserver.FtpServer;&#xD;
import org.springframework.context.ApplicationContext;&#xD;
import org.springframework.context.support.ClassPathXmlApplicationContext;&#xD;
&#xD;
public class Main {&#xD;
    public static void main(String[] args) throws Throwable {&#xD;
        ApplicationContext classPathXmlApplicationContext =&#xD;
           new ClassPathXmlApplicationContext("ftp-server.xml");&#xD;
        FtpServer ftpServer = (FtpServer)&#xD;
           classPathXmlApplicationContext.getBean("server");&#xD;
        ftpServer.start();&#xD;
    }&#xD;
}&#xD;
&lt;/code&gt;&lt;/pre&gt;.&#xD;
&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Configuration&lt;/h2&gt; &lt;P&gt; The configuration's the most involved bit, but should be pretty self explanatory shortly. It's included below. The FTP server exposes configuration using a Spring XML Schema, which acts as something of a DSL in this case.&#xD;
The XML configures the server instance, tells it to defer authentication to a database. It seems like the component provide is expecting data to be available in a table called ftp_user. In this case I modeled a table called ftp_user and created columns in it for testing. The final solution will either be a view on top of existing data that vends the table and columns expected by the component, or a series of triggers that keep a real &lt;code&gt;ftp_user&lt;/code&gt; table in sync with the canonical user/password and status data in other tables.&#xD;
I'm not sure which is more performant, and will address that later. It should be evident how that might work, I hope. In the code below you can see we're giving the database authentication component the SQL queries to use. I'm not sure I want to keep the delete/update functionality in place there. I don't think it's accessible from the FTP protocol, but instead there are APIs that Mina ships with, and I think use of those APIs delegates to these queries.&#xD;
&lt;/p&gt; &lt;p&gt;  The &lt;code&gt;dataSource&lt;/code&gt; is just like any other dataSource inside of Spring. I'm not using the Apache Commons Connection Pool class here because I didn't want to require more jars for you, dear reader, to try this example out. But use your judgment. If your application server requires something else, then use that.  &lt;/p&gt;&#xD;
&#xD;
&lt;P&gt;Finally,&#xD;
a word about directories. Below, in the &lt;code&gt;&amp;lt;select-user&amp;gt;&lt;/code&gt; configuration, I return a result set that contains a column &lt;code&gt;homedirectory&lt;/code&gt;. The home directory in this case is not an Operating System home directory (~, for example), but instead the directory the logged in user should be dropped. Here I'm using ficticious UNIX path and suffixing it with the user's ID. The user ID and the path are then returned as the home directory when the user tries to login. As it's configured now, if the user's folder doesn't exist on login then Mina FTP server will create it. This behavior is controllable  by setting the &lt;code&gt;create-home&lt;/code&gt;  attribute on the &lt;code&gt;native-filesystem&lt;/code&gt; element below.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
I tested this code on Unix and Windows. I set it to run on port 2121, so that I wouldn't have to get access to the privileged port 21 on Unix. The configuration for that is on the &lt;code&gt;nio-listener&lt;/code&gt; element. The other interesting behavior which only became evident to me when, surprisingy, it still worked on Windows, is that the path &lt;code&gt;/folder/to/store.. &lt;/code&gt; resolved under Windows! Now, I'm not sure if &lt;code&gt;java.io.File&lt;/code&gt; has some intrinsic support for POSIX-style paths, or there's some handler registered by cygwin on my particular system, or what, but I tried opening up a grails console and verifying the absolute path of a &lt;code&gt;java.io.File&lt;/code&gt; object for "/" and sure enough it returned "C:". So, don't worry if you want to test this on either operating system, I guess!&#xD;
&#xD;
&lt;/p&gt;&#xD;
 &lt;PRE&gt;&lt;CODE&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&#xD;
&amp;lt;beans:beans xmlns="http://mina.apache.org/ftpserver/spring/v1"&#xD;
             xmlns:beans="http://www.springframework.org/schema/beans"&#xD;
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&#xD;
             xmlns:tx="http://www.springframework.org/schema/tx"&#xD;
             xmlns:aop="http://www.springframework.org/schema/aop"&#xD;
             xsi:schemaLocation=" http://www.springframework.org/schema/beans&#xD;
             http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&#xD;
             http://www.springframework.org/schema/tx&#xD;
             http://www.springframework.org/schema/tx/spring-tx-2.0.xsd&#xD;
             http://www.springframework.org/schema/aop&#xD;
             http://www.springframework.org/schema/aop/spring-aop-2.0.xsd&#xD;
             http://www.springframework.org/schema/lang&#xD;
             http://www.springframework.org/schema/lang/spring-lang-2.0.xsd&#xD;
             http://mina.apache.org/ftpserver/spring/v1&#xD;
             http://mina.apache.org/ftpserver/ftpserver-1.0.xsd "&amp;gt;&#xD;
    &amp;lt;beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&amp;gt;&#xD;
        &amp;lt;beans:property name="driverClassName" value="JDBC_DRIVER"/&amp;gt;&#xD;
        &amp;lt;beans:property name="url" value="JDBC_URL"/&amp;gt;&#xD;
        &amp;lt;beans:property name="username" value="YOUR_USER"/&amp;gt;&#xD;
        &amp;lt;beans:property name="password" value="YOUR_PASSWORD"/&amp;gt;&#xD;
    &amp;lt;/beans:bean&amp;gt;&#xD;
    &amp;lt;server id="server"&amp;gt;&#xD;
        &amp;lt;listeners&amp;gt;&#xD;
            &amp;lt;nio-listener name="default" port="2121"&amp;gt;&amp;lt;/nio-listener&amp;gt;&#xD;
        &amp;lt;/listeners&amp;gt;&#xD;
        &amp;lt;db-user-manager encrypt-passwords="clear"&amp;gt;&#xD;
            &amp;lt;data-source&amp;gt;                &amp;lt;beans:ref bean="dataSource"/&amp;gt;&#xD;
            &amp;lt;/data-source&amp;gt;&#xD;
            &amp;lt;insert-user&amp;gt;INSERT INTO FTP_USER ( user_id, user_password, home_directory,&#xD;
                enable_flag, write_permission,&#xD;
                idle_time, upload_rate, download_rate ) VALUES ('{userid}', '{userpassword}', '{homedirectory}',&#xD;
                '{enableflag}', '{writepermission}', {idletime}, {uploadrate}, {downloadrate})&#xD;
            &amp;lt;/insert-user&amp;gt;&#xD;
            &amp;lt;update-user&amp;gt;UPDATE FTP_USER SET user_password&#xD;
                ='{userpassword}',home_directory='{homedirectory}',enable_flag={enableflag},&#xD;
                write_permission={writepermission},idle_time={idletime},&#xD;
                upload_rate={uploadrate},download_rate={downloadrate}&#xD;
                WHERE user_id='{userid}'&#xD;
            &amp;lt;/update-user&amp;gt;&#xD;
            &amp;lt;delete-user&amp;gt;DELETE FROM FTP_USER WHERE user_id = '{userid}'&amp;lt;/delete-user&amp;gt;&#xD;
            &amp;lt;select-user&amp;gt;SELECT user_id as userid, 100000 as maxloginperip ,&#xD;
                100000 as maxloginnumber , user_password as&#xD;
                userpassword, '/folder/to/store/files/uploads/'|| user_id as homedirectory, true as&#xD;
                enableflag, true as writepermission, true as readpermission, 100000 as idletime, 100000 as uploadrate,&#xD;
                100000 as downloadrate FROM FTP_USER WHERE user_id = '{userid}'&#xD;
            &amp;lt;/select-user&amp;gt;&#xD;
            &amp;lt;select-all-users&amp;gt;SELECT user_id FROM FTP_USER ORDER BY user_id&amp;lt;/select-all-users&amp;gt;&#xD;
            &amp;lt;is-admin&amp;gt;SELECT user_id as userid FROM FTP_USER WHERE user_id='{userid}' AND user_id='admin'&amp;lt;/is-admin&amp;gt;&#xD;
            &amp;lt;authenticate&amp;gt;SELECT user_password as userpassword from FTP_USER WHERE user_id='{userid}'&amp;lt;/authenticate&amp;gt;&#xD;
        &amp;lt;/db-user-manager&amp;gt;&#xD;
        &amp;lt;native-filesystem case-insensitive="false" create-home="true"/&amp;gt;&#xD;
    &amp;lt;/server&amp;gt;&#xD;
&amp;lt;/beans:beans&amp;gt;&lt;/CODE&gt;&lt;/PRE&gt;&#xD;
&#xD;
&lt;p&gt;All in all, I'd say using the FTP Server's been pleasant - except for the ugliness concerning &lt;code&gt;slf4j&lt;/code&gt; - and I hope it works for you. I am well aware of the availability of other FTP servers that support database backends, but I really was looking for something lightweight and embeddable, and ideally something I could unit test in Java. This worked out well. It's interesting to see how much of our own dogfood we Java developers manage to get away with using. I used Apache's James email server several years ago. It was very powerful and not a little bit complicated, but it worked, and it was all Java. It scaled and was also very robust, and even with it's wharts was still easier to get working than &lt;code&gt;sendmail.&lt;/code&gt; So: I use a Java editor, Java web /application server, Java middleware, Java build tools, Java FTP servers and even a Java text editor. I should really start looking into H2 or Derby and see if I can't close the gap on a completely Java infrastructure stack! It'd be freaking sweet if I could &lt;code&gt;mvn clean install&lt;/code&gt; an entire environment (which, for that matter doesn't care which host operating system it's on...)&#xD;
&#xD;
 &lt;/p&gt; &lt;p&gt; Now to begin the count down to having a completely Groovy based stack! &lt;/p&gt;</description>
      <pubDate>Sun, 08 Mar 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/embedding_the_apache_mina_ftp_server.html</guid>
      <dc:date>2009-03-08T00:00:00Z</dc:date>
    </item>
    <item>
      <title>The West Wing, House MD, and MythBusters</title>
      <link>http://www.joshlong.com:80/jl/blogPost/the_west_wing_house_md_and_mythbusters.html</link>
      <description>&lt;P&gt;&lt;img style = "float:left;padding-right:10px;" width  = "200" src = "__4676_0__"/&gt; My favorite show on television used to be &lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/The_West_Wing"&gt;The West Wing&lt;/a&gt;&lt;/i&gt;. The show was witty, and featured arcane, blissfully self contained plots and narrative.. dialogue... banter that would tickle Shakespeare. It was amazing. It was an ideal view of the White House and the men and women inside the executive branch. There were, with rare exceptions, no ludity, no over-the-top romances, no digressions into the characters' personal lives. Except, of course, where these digressions served the episode's plot. The plot - the challenges these characters faced in day-to-day governance - was the only thing respected. &lt;/p&gt; &lt;p&gt; It appealed to me in the same way that &lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Watchmen"&gt;The Watchmen&lt;/a&gt;&lt;/i&gt; (which, btw, I'm going to see tomorrow, days ahead of the US premiere!) appealed to me. It was layered, multi faceted. Each episode featured many continuations that - while they often dovetailed nicely one with another by the end of an episode - didn't always have anything to do with each other in substance. Every show was like an essay. The series took the art of narrative to a new form, and entire episodes were often just very ornate interjections into an argument or discussion. People walking, and talking.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; My new favorite TV series is with no qualifications &lt;a href="http://en.wikipedia.org/wiki/House_(TV_series)"&gt;&lt;i&gt;House&lt;/i&gt;&lt;/a&gt;. I noticed that a lot of other nerds/engineer types like this show, as well. Follow any sampling of the programming world on twitter and you'll see people speaking to their fondness for the show in 140 character exclamations. It's riveting for a problem solver. Dr. Gregory House is a diagnostician in  at the ficticious Princeton Plainsboro Teaching Hospital where he and his team tackle medical mysteries deemed otherwise unsolvable. House's character is &lt;i&gt;brisk&lt;/i&gt;, lacking all tact. He doesn't suffer fools, hates wishy-washy ideas founded on expressions of feeling. He is a scientist to the last, often refusing to even see his patients and instead letting the symptoms - the facts - stand on their own.&#xD;
 &lt;/p&gt;&lt;p&gt; He would make  a very fine programmer. He is the quintessential "debugger."&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; The Wikipedia page I linked you to elaborates on some of the parallels between House's character, a doctor, and Sherlock Holmes, a detective. Their staunch adherence to the facts, their disinterests in what people say or think, and their abilities of deduction.&#xD;
Apparently, Sherlock Holmes himself was based on a doctor, so it's something of a full circle.&#xD;
&lt;/p&gt; &lt;p&gt; Now, I'm wondering what other shows are popular among nerds. I appreciate shows that can pull off the art of satire, of deadpan, well. I also love shows with strong "whodunnit" plots. I appreciate shows aimed at resolution of issues. I love MythBusters. I appreciate shows dripping in irony, and really like a lot of the programs on the BBC, because a lot of that sort of humor is unavailable here in the states.&lt;/p&gt;&lt;p&gt;What do other people watch? What kind of show is interesting to a nerd?&lt;/p&gt;</description>
      <pubDate>Tue, 03 Mar 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/the_west_wing_house_md_and_mythbusters.html</guid>
      <dc:date>2009-03-03T00:00:00Z</dc:date>
    </item>
    <item>
      <title>And... we're back!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/and_were_back.html</link>
      <description>&lt;p&gt; A lengthy upgrade process caused my blog to die, but it's back! &lt;/P&gt; &#xD;
&#xD;
&lt;p&gt;  Usually when I upgrade the software it's not so big a deal, but this version introduced  a few new components into the architecture, which complicated things.  I really ought to open-source this sucker. &#xD;
&#xD;
&lt;/p&gt; &lt;p&gt;Anyway, there's very little that you - dear reader - would likely see in the new software. But stick around, that's to come! &lt;/p&gt;</description>
      <pubDate>Thu, 26 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/and_were_back.html</guid>
      <dc:date>2009-02-26T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Obsolescence of Skills</title>
      <link>http://www.joshlong.com:80/jl/blogPost/obsolescence_of_skills.html</link>
      <description>&lt;h1&gt;&#xD;
&#xD;
&lt;/h1&gt;&#xD;
&lt;p&gt;In my last post I talked about habits geared towards acquisition of&#xD;
skills. It does sometimes happen the other way ā where you need to&#xD;
unlearn something, or re-frame an existing skill in a different way in&#xD;
order to advance with it. This is a natural part o moving forward in&#xD;
life, of adapting. I like to think that I do an acceptable job of&#xD;
keeping current, of adapting.&#xD;
&lt;/p&gt;&lt;p&gt;The proof is in the pudding: how many skills do I have the have&#xD;
been obsolesced*? I hadn't counted, honestly. I'm still not going to&#xD;
count (not that you will see, anyway!) but you might try taking a look&#xD;
at the &lt;a href="http://www.obsoleteskills.com/skills/skills"&gt;Obsolete&#xD;
Skills Wiki&lt;/a&gt; to see if anything you've learned has become&#xD;
irrelevant, and whether you've successfully crossed that chasm.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Don't freak out if you see something you swore was still relevant ā&#xD;
some of the entries are on the site, but are disputed! &lt;/p&gt;&lt;p&gt;&#xD;
Some are pretty dead on, or scary. &lt;a&#xD;
href="http://www.obsoleteskills.com/skills/countingbackchange"&gt;"Counting&#xD;
back change"&lt;/a&gt; is - saddeningly - appropriate. How many merchants do&#xD;
you know that employee people who can count back change? How many&#xD;
people do the math to leave a 20% tip?  &lt;/p&gt;&lt;p&gt;&#xD;
How many things do you know that have become irrelevant?  &lt;/p&gt;&#xD;
&#xD;
&#xD;
&lt;hr /&gt;&#xD;
 &lt;p&gt;&lt;i&gt;obsolesce &lt;/I&gt;- become obsolete, fall into disuse; "This word&#xD;
has not obsolesced, although it is rarely used"&lt;/p&gt;&#xD;
 &lt;p&gt; Has the word "obsolesce" ... obsolesced?&lt;/p&gt;</description>
      <pubDate>Tue, 24 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/obsolescence_of_skills.html</guid>
      <dc:date>2009-02-24T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A Weekend With the Voices</title>
      <link>http://www.joshlong.com:80/jl/blogPost/a_weekend_with_the_voices.html</link>
      <description>&lt;p&gt; My lovely and charming wife is out of town for 5 days, helping my mother out. They're going to go to Philadelphia, and my wife'll get a chance to see some of New York City, as well. &#xD;
 I'm excited for her, and happy that my mom invited her, but I'm most looking forward to the chance to get some code done unabated by distractions of living with somebody: synchronized meals, activities, favorite TV shows, etc. No disractions. &#xD;
 Not if I can help it. &#xD;
 &lt;/p&gt; &#xD;
 &lt;p&gt; Often, I will run across an idea or concept that I'd like to explore but don't have the time to immediately pursue. I acrrue these ideas in an email thread sent to myself.  I call it my "negative resume" - a listing of all the things I don't have any experience and can't claim to know. &#xD;
 &lt;/p&gt;&#xD;
  &#xD;
 &lt;p&gt;When that list gets too long (for me that's about 10 items), I start popping things off the queue, attacking each entry. The items on the list are usually innocuous. Occasionally I'll add significant changes / ideas that involve starting in on a rapidly new technology. In this case I make sure to either qualify a very specific, obtainable success scenario, or I diminish the other suggestions and move them to another list. &#xD;
  In a way, the process is very much like updating a bug tracker. &lt;/p&gt;&#xD;
  &#xD;
  &lt;p&gt; I'm tracking bugs in my knowledge. Deciding which bug to remedy first requires prioritization. &#xD;
  &#xD;
  &#xD;
 &lt;/p&gt; &#xD;
 &lt;p&gt;You can imagine how complicated this process was before I added, "learn basics of Project Managment" to a list!&lt;/p&gt;&#xD;
 &lt;p&gt;The last list  included the following: "try out H2 database",  "See if you can get Seam Framework 2.0 working under Maven," "check out  Hibernate Search," "Read a few chapters from Manning's &lt;i&gt;iPhone In Action&lt;/i&gt;," and so on. I don't like to let more than 10 things accrue because then there's no chance I could get it push through all of them in a weekend - even with intense focus (which I am not usually blessed with on weekends, above and beyond my day-job hours. )&lt;/p&gt;  &#xD;
 &#xD;
 &lt;p&gt; The sentiment behind these bursts of learning is simple. As my dad always said (I'm sure he still does, he's just no had reason to recite of late...): "It's a sinch by the inch, hard by yard." &#xD;
 &#xD;
  &lt;/p&gt; &#xD;
  &#xD;
  &lt;p&gt; This weekend I've got another such list. I'm looking forward to address some of the items on this list with no direction or instinct besides the chorus of prioritizing voices in my head.  &lt;/p&gt; &lt;p&gt; What do you want to learn?&lt;/p&gt;</description>
      <pubDate>Sat, 21 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/a_weekend_with_the_voices.html</guid>
      <dc:date>2009-02-21T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Mobile News Recap</title>
      <link>http://www.joshlong.com:80/jl/blogPost/mobile_news_recap.html</link>
      <description>&lt;p&gt;&#xD;
As I like to do every now and then I'm checking into the world of mobile. Theres been a flurry of activity in this space recently, so it's high time I recap, lest I forget. Among the headlines: Adobe announces massive Flash Mobile deployments: iPhone not accounted for, WebKit's just about the official  mobile platform browser of choice, though irrelevant for mobile platform development, and finally JavaFX Mobile announced (surprisingly) amidst questions of relevance. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Let's tackle each of these one by one. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, Adobe's FlashPlayer 10 for SmartPhones debuts. Adobe has also unveiled eBook and PDF Mobile support. Palm's joining the OpenScreen project ā Adobe's initiative to bring Flash to the handset as a platform (announced later last year) and finally Flash 10 itself will ship on the Palm Pre, which lends big name brawn to Flash's platform claims. This, and a lot more, is &lt;a href="http://scobleizer.com/2009/02/15/did-adobe-snub-apple-with-flashplayer-10-and-development-fund-announcements/"&gt;recapped here on Scoble's site.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
All of this brings to the foreground just how prevalent the WebKit platform is. WebKit's now the main browser agent on Apple's iPhone in the form of Safari. It's the browser on Google's Android platform, as Chrome. It's the WebOS on Palm. Nokia's Series 60's using it, and a lot more. This means that a consistant browsing experience can be had on many of the new smartphones. Missing from that lineup, curiously, is the Storm. I expect that it'll catch up, eventually, though in the meantime I think there are other issues more prominent in deterring users of the &lt;a href="http://www.msnbc.msn.com/id/28158098"&gt;"Flopberry"&lt;/a&gt;. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Having said all of this, don't get too excited. The presence of this browser doesn't mean what it would if a browser shared that level of prominence on the desktop specifically because a browser simply isn't rich enough to model typical mobile application development scenarios. Things like backgrounding ā the ability of a client to "pause" during a phone call - and "actions" or "intents" are simply something that must be modeled at a lower level closer to the firmware. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The only thing potentially helpful is that your investment in languages that terminate statements with ";" is safe! Today, the modern development environment ā with the glaring exception of the iPhone ā is Java (though not the JME platform!) or JavaScript. The iPhone of course requires Objective C.&lt;/p&gt;&lt;p&gt; &#xD;
&#xD;
Adding another Java platform to the roster, JavaFX 1.1 was just announced and with it news of release and adaptation plans for JavaFX Mobile. Information on the main site (http://www.javafx.com) is sparse, but the list of &lt;a href="http://www.javafx.com/partners"&gt;partners is interesting&lt;/a&gt;: LG, Sony Ericsson, among them. It'll be interesting to see what traction this platform gets especially in light of Flash Mobile and the iPhone. &#xD;
&#xD;
&lt;/p&gt;</description>
      <pubDate>Wed, 18 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/mobile_news_recap.html</guid>
      <dc:date>2009-02-18T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Getting Started With Zero Turnaround's JavaRebel</title>
      <link>http://www.joshlong.com:80/jl/blogPost/getting_started_with_zero_turnarounds_javarebel.html</link>
      <description>&lt;p&gt;&#xD;
I go out of my way to make the development experience quick. I'm still a java developer and not, say, a Python developer, but I loathe the iteration time. It's the number one thing I wish we could do better in Java. Sure, during development I go out of my way to make iteration less painful. One aspect of this is using Maven's Jetty plugin, which lets me edit HTML, JSP(X), CSS, JS files without undo redeploys. However, it's not enough.  I keep my model and services tier in a separate VM for testing, so that the code isn't collocated by default. This has the effect of making the occasional redeploy of a web application much more bearable.  However, even thoere, sometmes you find yourself fidgeting with things inside of an Action or a Spring MVC controller that aren't broad strokes but really sort of fine granularity changes. Each time you redeploy you lose your session and it's just generally an unnerving mental interference, even if it is only a few seconds.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Recently, I was trying to show this application to a friend (one of those PHP people I keep hearing about...) and he complained that the redeploys on changes to the Java class were annoying. I know he was just trying to spread some religion. That's alright. In this case, he was right. If you use a scripting language and are used to the instant feedback cycle, then Java's a hard sell (even in light of the less and less meaningful, "well, it scales," or "it has a broad library" arguments).&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
This next paragraph reads something like a sales pitch. I'm in no way affiliated with JavaRebel. You may, however, skip the next paragraph if you want.&#xD;
&lt;/p&gt;&lt;p&gt; &lt;a href="http://www.zeroturnaround.com"&gt;&lt;img border = "0" src = "__3601_0__" style = "float:left; margin-right :10px; " /&gt;&lt;/a&gt;&#xD;
I'd heard of, and even experimented with, JavaRebel before when it came out, so I knew of the solution. My main reservation was that it was proprietary. There's a US $99.00 personal license fee to pay in its use. However, the license wasn't a license for deployment, it was a license for development, in much the same way you can deploy a million instances of software written using one license for IntelliJ IDEA, the same applies here. Additionally, the jar doesn't need to be deployed in the production artifact. You carry it with you and use it on any development. As tools go for engineers - it's really cheap. I already spend on (or win! Thank you &lt;a href="http://www.phxjug.org"&gt;Phoenix Java User Group!&lt;/a&gt; ) copies of IntelliJ because as a craftsman I demand the best tools. An extra US $99.00 for hassle-free development seemed a great compromise. More to the point, there's a proven productivity gain had in zero turnaround development iteration from other languages, so this would only be a win-win for any projects I worked under. I might even be able to pitch it to a boss one day and get them to spring for it!&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
At this point I decided I'd need to walk the walk if I want to talk the talk. I set about integrating it. My setup's pretty plain:&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&lt;ul&gt; &lt;LI&gt;&#xD;
Maven 2.0.8&lt;/li&gt;&lt;li&gt;&#xD;
IntelliJ IDEA 8.1 for edits (by the by, have you tried the new &lt;a href="http://www.intellij.com"&gt;IntelliJ&lt;/a&gt;? Markedly faster, in some cases especially related to large projects.)&#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Java 5 &lt;/li&gt;&lt;li&gt;&#xD;
Spring MVC 2.5&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
My definition of success would be to be able to update a Controller, compile that one class, and then refresh the page and have those changes reflected. This meant that all code relying on Spring itself should also work. For example&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
You can declare variables to be injected into you controller via annotations.&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;code&gt;&lt;pre&gt;@Autowired private IServiceInterface service;&lt;/pre&gt;&lt;/code&gt;&#xD;
&lt;p&gt;&#xD;
And, similarly, you can add new configurations for Spring MVC requests inside a Controller with no problem, thus:&#xD;
&lt;/p&gt; &lt;code&gt;&lt;pre&gt;&#xD;
@RequestMapping("foo.do")&#xD;
public String handleRequestForFooDo( Model model) {&#xD;
  model.addAttribute( "message", "Hello, World!" ) ;&#xD;
 return "foo" ;&#xD;
 }&#xD;
 &lt;/pre&gt;&lt;/code&gt;&#xD;
 &lt;p&gt;Both of these code snippets should just do the right thing and work when I refresh the page.  &lt;/p&gt;&#xD;
 &lt;p&gt;&#xD;
&#xD;
So, the first part of the solution was getting JavaRebel installed for development at all.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
This was relatively straight forward. Go to zeroturnaround.com and &lt;a href="http://www.zeroturnaround.com/download"&gt;download the Jar for the trial.&lt;/a&gt; Unzip it and put the &lt;code&gt;javarebel.jar&lt;/code&gt; someplace you can find it.  I created a folder called javarebel in my home directory and put the jar in there. You will put the license in the same folder if you buy the product.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The next trick is to make sure it's available to your Java server's process as a boot agent. Since I'm using Maven's Jetty plugin, my configuration was simply to update &lt;code&gt;MAVEN_OPTS&lt;/code&gt;, before running Maven, thus:&#xD;
&lt;/p&gt; &lt;code&gt;&lt;pre&gt;&#xD;
export MAVEN_OPTS="-noverify -Drebel.log=true -javaagent:~/javarebel/javarebel.jar "     ;&#xD;
mvn jetty:run ;&#xD;
&lt;/pre&gt;&lt;/code&gt;&#xD;
&lt;p&gt;&#xD;
This is already an improvement.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
I did one more thing, which was to disable Intellij's urge to build a .war itself each time I compiled anything. Do this by right clicking on the web application in Intellij, File &gt; Project Structure, clicking on the Web component of your web project (it's a blue icon.), then clicking on Java EE Build Settings. I unchecked both "Create web facet war file", and "Web Facet Exploded Directory."&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
At this point, if I modify a class in IntelliJ (say I have a controller open and I change a method body) the change will be manifest if I reload the controller in the browser. However, if I add any new fields, or change any method signiatures, it won't be reflected in the reloaded class because Spring won't have had a chance to "refresh" the class. Any annotations for Spring injections will be there, but the Spring runtime won't have had the chance to react to them.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
So the next piece is to ensure you give Spring a chance to react to the new class. This is done using a plugin. The plugin's free open source software, which you can download readily from &lt;a href="http://www.zeroturnaround.com/javarebel/plugins"&gt;here&lt;/a&gt;. You can add the plugin however you like. I'm using Maven. While I know that ZeroTurnaround has a repository, I found that the jar didn't work. So, I just downloaded that one and deployed it to my own repository and dependended on that .jar, which has worked just fine. At this point, I can now edit a controller in Intellij, including addding methods, etc, without more than a compile (&lt;code&gt;ctrl + shift + F9&lt;/code&gt;) - it's tantamount to the time it'd take to save a class in Eclipse) and a page refresh.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Hope this helps somebody else looking for information on how to get started. This is really quite powerful.&#xD;
&lt;/p&gt;</description>
      <pubDate>Sat, 14 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/getting_started_with_zero_turnarounds_javarebel.html</guid>
      <dc:date>2009-02-14T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Revised Spring Integration Maven &lt;code&gt;pom.xml&lt;/code&gt; Example</title>
      <link>http://www.joshlong.com:80/jl/blogPost/revised_spring_integration_maven_codepomxmlcode_example.html</link>
      <description>&lt;p&gt; I published an article on &lt;a href="http://www.infoq.com/articles/Spring-Integration-Joshua-Long"&gt;Infoq.com recently&lt;/a&gt;.&#xD;
The code was sound but it used the cock-a-many OSGi friendly&#xD;
 Maven jar dependencies that were being provided off the Spring Source Maven repository.&#xD;
 	The problem was that these jars were custom to SpringSource's build of the product. If you had&#xD;
 	an existing Spring application and then you introduced the Spring Integration jars it would&#xD;
 	bring down a different set of jars -- possibily conflicting with your existing jars' classes.&#xD;
&#xD;
It wasn't addressable using Maven's &lt;code&gt;dependencyManagement&lt;/code&gt; element either, as the &lt;code&gt;artifactId&lt;/code&gt;s were different.&#xD;
&#xD;
A bug was &lt;a href="http://jira.springframework.org/browse/INT-245"&gt;filed&lt;/a&gt;. Finally - and regretfully after the article was beyond my editorial control  - the correct&#xD;
 jars are in the public Maven repository using the correct for the Spring Framework proper.&#xD;
 &lt;/p&gt; &lt;p&gt;What follows is my sample POM for another project. Use it at your discretion. Please note that in this case &lt;code&gt;&amp;lt;spring.version&amp;gt;&lt;/code&gt; is &lt;code&gt;2.5.6&lt;/code&gt; and &lt;code&gt;&amp;lt;spring.integration.version&amp;gt;&lt;/code&gt; is &lt;code&gt;&lt;b&gt;1.0.1.RELEASE&lt;/b&gt;&lt;/code&gt;. That updated version is the release that contains the corrected revisions. Upgrade time!&#xD;
&lt;pre&gt;&#xD;
    &amp;lt;dependencies&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;1.2.14&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;!-- COMMONS STUFF --&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;commons-lang&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;commons-lang&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;commons-collections&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;commons-collections&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;3.2&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;commons-beanutils&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;commons-beanutils&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;1.7.0&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;!-- SPRING FRAMEWORK --&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;spring-context-support&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;spring-aop&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
             &amp;lt;dependency&amp;gt;&#xD;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&#xD;
                 &amp;lt;artifactId&amp;gt;spring-aspects&amp;lt;/artifactId&amp;gt;&#xD;
                 &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;&#xD;
             &amp;lt;/dependency&amp;gt;&#xD;
 	  		&amp;lt;dependency&amp;gt;&#xD;
 				&amp;lt;groupId&amp;gt;org.springframework.integration&amp;lt;/groupId&amp;gt;&#xD;
 				&amp;lt;artifactId&amp;gt;spring-integration-core&amp;lt;/artifactId&amp;gt;&#xD;
 				&amp;lt;version&amp;gt;${spring.integration.version}&amp;lt;/version&amp;gt;&#xD;
 			&amp;lt;/dependency&amp;gt;&#xD;
 			&amp;lt;dependency&amp;gt;&#xD;
 				&amp;lt;groupId&amp;gt;org.springframework.integration&amp;lt;/groupId&amp;gt;&#xD;
 				&amp;lt;artifactId&amp;gt;spring-integration-httpinvoker&amp;lt;/artifactId&amp;gt;&#xD;
 				&amp;lt;version&amp;gt;${spring.integration.version}&amp;lt;/version&amp;gt;&#xD;
 			&amp;lt;/dependency&amp;gt;&#xD;
 			&amp;lt;dependency&amp;gt;&#xD;
 				&amp;lt;groupId&amp;gt;org.springframework.integration&amp;lt;/groupId&amp;gt;&#xD;
 				&amp;lt;artifactId&amp;gt;spring-integration-file&amp;lt;/artifactId&amp;gt;&#xD;
 				&amp;lt;version&amp;gt;${spring.integration.version}&amp;lt;/version&amp;gt;&#xD;
 			&amp;lt;/dependency&amp;gt;&#xD;
 			&amp;lt;dependency&amp;gt;&#xD;
 				&amp;lt;groupId&amp;gt;org.springframework.integration&amp;lt;/groupId&amp;gt;&#xD;
 				&amp;lt;artifactId&amp;gt;spring-integration-jms&amp;lt;/artifactId&amp;gt;&#xD;
 				&amp;lt;version&amp;gt;${spring.integration.version}&amp;lt;/version&amp;gt;&#xD;
 			&amp;lt;/dependency&amp;gt;&#xD;
 			&amp;lt;dependency&amp;gt;&#xD;
 				&amp;lt;groupId&amp;gt;org.springframework.integration&amp;lt;/groupId&amp;gt;&#xD;
 				&amp;lt;artifactId&amp;gt;spring-integration-adapter&amp;lt;/artifactId&amp;gt;&#xD;
 				&amp;lt;version&amp;gt;${spring.integration.version}&amp;lt;/version&amp;gt;&#xD;
 			&amp;lt;/dependency&amp;gt;&#xD;
        &amp;lt;/dependencies&amp;gt;&#xD;
        &lt;/pre&gt;</description>
      <pubDate>Wed, 04 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/revised_spring_integration_maven_codepomxmlcode_example.html</guid>
      <dc:date>2009-02-04T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Dust</title>
      <link>http://www.joshlong.com:80/jl/blogPost/dust.html</link>
      <description>&lt;p&gt;Sometimes people tell me, "Josh, you're an idiot!" Then I have myself a good cry and walk it off.&#xD;
&lt;/p&gt; &lt;p&gt;&#xD;
 Then people ask me about the 7-node grid I keep in my home office. &lt;/p&gt; &lt;p&gt;They wonder why I would keep that many computers in so small a space. They wonder, "why?"&#xD;
 Besides providing something of an electric heater (the room's consistently 10F warmer than the rest of the place!), the computers let me test algorithms/concepts in scale. Frameworks like &lt;a href="http://terracotta.org/"&gt;Teracotta&lt;/a&gt; don't test very consistently on a single node, after all. And, of course, there's nothing like having 2TB of space exposed as one giant mount.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;Finally, people ask me if there are any disadvantages. They ask if the electric bill's high. It isn't, but that's a side effect of living in Arizona, where my air conditioner's on 24/7 and so an extra few computers doesn't really make a difference.&#xD;
&#xD;
 They ask if I spend my time maintaining them.I tell them I run &lt;a href="http://en.wikipedia.org/wiki/Ubuntu"&gt;Ubuntu&lt;/a&gt;, so I never get viruses. If a PC malfunctions then I simply repair it and reimage the node.&#xD;
&#xD;
 They press me. Surely there's &lt;i&gt;something&lt;/i&gt; disadvantageous to running so many computers. I tell them the honest truth. It's the &lt;a href="http://en.wikipedia.org/wiki/Dust"&gt;dust&lt;/a&gt;. The dust alone is the reason I want to just invest in EC2. And of course, I'm an asthmatic &lt;b&gt;and&lt;/b&gt; a green fiend. So I can't use the aerosol canisters to dispel the dust. Nor can I use the Ozone-friendly canisters -- they both trigger my asthma or offend my green sensibilities. So, I have to clean them with a rag on occasion (once every couple of weeks).&#xD;
&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Next time I get a home office, I'm going to get it with tile. Remember, if you're going to setup a grid, the biggest challenge you face may not be technical.&#xD;
&lt;/p&gt;</description>
      <pubDate>Wed, 04 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/dust.html</guid>
      <dc:date>2009-02-04T00:00:00Z</dc:date>
    </item>
    <item>
      <title>"Scalability Is Not An Architectural "Capabity" Anymore," on Artima.com</title>
      <link>http://www.joshlong.com:80/jl/blogPost/scalability_is_not_an_architectural_capabity_anymore_on_artimacom.html</link>
      <description>I've just posted a new blog entry on my Artima.com blog: &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=248983"&gt;"Scalability Is Not An Architectural "Capabity" Anymore"&lt;/a&gt;. Any input's appreciated.</description>
      <pubDate>Mon, 02 Feb 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/scalability_is_not_an_architectural_capabity_anymore_on_artimacom.html</guid>
      <dc:date>2009-02-02T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My Favorite Month</title>
      <link>http://www.joshlong.com:80/jl/blogPost/my_favorite_month.html</link>
      <description>&lt;p&gt;&#xD;
&lt;img alt ="This is Pancit. I'm vegetarian, so there's no Shrimp or sausage in the variety I eat. But still: yummy!" style = "float:left; margin-right:10px;" width ="300" src="__3226_0__"/&gt;Today - the 31st of January  - is my birthday. I celebrated it by sharing a wonderful meal of Pancit (http://en.wikipedia.org/wiki/Pancit ) with my amazing wife last night, and then finally going to see &lt;a href="http://en.wikipedia.org/wiki/Russell_Peters"&gt;Russel Peters&lt;/a&gt;  last night at the Improv at the invitation of my good friend Venkatesh. That was probably the hardest I've laughed in a month. My brother from another mother Mario took me out drinking last night afterwards, and the fact that I don't remember much of it attests to how well we did!&#xD;
&lt;/p&gt;&lt;p&gt;January 31st's also my dad's birthday! Yes, that's right, I was an awkward birthday gift :-) He's 71, now. Astonishing. I'm very surprised that a man's years can so belie a man's youth. I hope everybody gets to be as interesting, and wonderful a man as he is - even once in there lives. I love my dad very much, and owe a large debt of gratitude to him. I wouldn't be the man I am without his unique contributions. I'll be going to Los Angeles next Friday to see him. I can't wait.&#xD;
&lt;/p&gt;&lt;p&gt;January in recent years has become more involved because there are two new special occasions to celebrate.&#xD;
&lt;/p&gt;&lt;p&gt;My buddy's daughter Makani - a light in dark, boring times - joined the eternal conversation of life on January 26th, 2007. She's one year old now. Long may she live, and smile.  I don't normally like babies. It's not that I dislike them - I just don't know what to do with them. This one's different. She's humbling. She inspires. I can't believe it's been one year, and I can't believe she's come as far as she has. She's been 100 different Makanis over the last year - constantly, and manifestly, evolving and growing. Part of that is biological imperative. Part of that is... something else altogether miraculous.&#xD;
&lt;/p&gt;&lt;p&gt;Finally, my wonderful, beautiful wife and I married 2 years ago, January 13th, 2007. I'm excited, exhilarated, by how fast time flies when I'm with her. She's indulgent and patient. It's like she read &lt;a href="http://www.randsinrepose.com/archives/2007/11/11/the_nerd_handbook.html"&gt;The Nerd Handbook&lt;/a&gt; and understood it, perfectly. Frankly, it's more amazing than that: I know she &lt;i&gt;hasn't&lt;/i&gt; read that particular bit of HTML. She just gets it. Thank you.&#xD;
&lt;/p&gt;&lt;p&gt;&lt;b&gt;Here's to January&lt;/b&gt;.&lt;/p&gt;</description>
      <pubDate>Sat, 31 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/my_favorite_month.html</guid>
      <dc:date>2009-01-31T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Thinking About Meebo's Enterprise Service Bus</title>
      <link>http://www.joshlong.com:80/jl/blogPost/thinking_about_meebo_s_enterprise.html</link>
      <description>&lt;P&gt;I don't know if they're using an ESB, but they should be.&#xD;
&lt;/P&gt;&lt;P&gt;Meebo.com's a very novel little Ajax-oriented IM client. It's acheived some stunning success, all very well deserved. Recently (a few weeks ago), I noticed Meebo.com has added support for talking to Facebook as well as MySpace users via their presence-aware messaging feature ("Instant Messaging"). This means that they're exposing connectivity with services provided by the platform. They built their previou lot of IM connectivity/functionality using a concurrency-friendly version of libpurple (&lt;a href="http://en.wikipedia.org/wiki/Meebo"&gt;This article on Meebo on WikiPedia metnions that&lt;/a&gt;, and so does &lt;a href="http://blog.meebo.com/?p=126"&gt;these&lt;/a&gt; &lt;a href="http://blog.meebo.com/?p=428"&gt;two&lt;/a&gt; from Meebo's Blog). &lt;code&gt;libpurple&lt;/code&gt; is the library behind the ubiquitous F/OSS &lt;a href="http://www.pidgin.im/"&gt;Pidgin (formerly, GAIM)&lt;/a&gt;. Essentially, it knows how to speak/receive messages from all sorts of IM protocols/platforms.  &#xD;
&#xD;
&lt;/p&gt;  &#xD;
&lt;P&gt; I want to take this opportunity to imagine their architecture a little bit, and explore it as an ideal  candidate for an ESB-based solution. Architecting an application like that requires some of the features that an ESB best provides: messaging, routing, transformation. &lt;/p&gt;&lt;p&gt; The &lt;b&gt;messaging&lt;/b&gt; quality I attribute to their natural requirement to send and receive messages. Their application has endpoints that know how to "receive" messages and endpoints that know how to "send" messages. That these endpoints are written on top of &lt;code&gt;libpurple&lt;/code&gt; or on top of the &lt;a href="http://developers.facebook.com"&gt;Facebook Chat&lt;/a&gt; and &lt;a href="http://developer.myspace.com/community"&gt;MySpace IM API's&lt;/a&gt; is irrelevant.&#xD;
  &lt;/p&gt;  &lt;p&gt;Naturally, Meebo needs to provide &lt;b&gt;routing&lt;/b&gt;. It wouldn't be kosher if you sent a message to &lt;i&gt;Fred&lt;/I&gt;, and a complete stranger &lt;i&gt;Wilma&lt;/I&gt; got it!&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; Finally, Meebo must provide support for &lt;b&gt;transformation&lt;/b&gt; - I can only imagine - if for no other reason than that's a requirement in the &lt;a href="http://www.eaipatterns.com/CanonicalDataModel.html"&gt;Canonical Data Model Pattern&lt;/a&gt;, which describes integration across many disparate endpoints made possible by reducing the permuations of connective channels. This is feasible by having all endpoints "adapted" into a normalized message format. All channels to and from those endpoints undertand this format. This makes adding a new endpoint as simple as adding an adapter from its format to the normalized system format. Thus, for Meebo, it is imperative that for any messages being passed from point to point, the message model itself is normalized and then pased on to a channel bound for an adapter. This avoids "&lt;i&gt;architectural spaghetti!&lt;/I&gt;"&lt;/P&gt;&#xD;
&lt;p&gt;&#xD;
    Finally, their architecture must make use of certain design patterns, for example a &lt;a href="http://www.eaipatterns.com/CorrelationIdentifier.html"&gt;correlation ID&lt;/a&gt; would be invaluable in a cloud application where anybody can send messages at any time but they must consistantly show up in a normalized sequence for all clients of the discussion involved.  &#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
  I don't know what Meebo's made of, though I am happy to speculate. Plenty of people have tried to build solutions, like &lt;a href="http://soashable.sourceforge.net"&gt;SOAShable&lt;/a&gt;, for example, which has since stopped functioning. But, it's a good start at the project, and is worth a look. There are other explanations of some of the hard core nitty gritty behind Meebo. One such article, &lt;a href="http://news.oreilly.com/2008/07/how-comet-brings-instant-messa.html"&gt;How Comet Brings Instant Messaging To Meebo&lt;/a&gt;, is a good read. Finally, to see how some of this might be implemented it's worth noting that there's already support for some of this functionality in a few different ESBs. &lt;a href="http://ankiewsky.blogspot.com/2008/12/integrating-xmpp-into-jboss-esb.html"&gt;Here's an example using XMPP and JBoss ESB&lt;/a&gt;. &lt;a href="http://www.google.com/url?sa=U&amp;start=2&amp;q=http://www.mulesource.org/display/MULE2USER/XMPP%2BTransport&amp;ei=86F_SbDsKpmRmQeanp2tBA&amp;sig2=iKUf0hUSAa17G9xPbd9ebw&amp;usg=AFQjCNEjeFLNFj1KDsIpcdSFVI4qRNcUwQ"&gt;This example  provides XMPP support for the popular Mule ESB&lt;/a&gt;.  Who knows, perhaps with a little work and some C I'm sure you could get a server-ready, concurrency friendly version of &lt;code&gt;libpurple&lt;/code&gt; running yourself!  &#xD;
&lt;/p&gt; &lt;p&gt; Just food for thought.. &lt;/p&gt;</description>
      <pubDate>Tue, 27 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/thinking_about_meebo_s_enterprise.html</guid>
      <dc:date>2009-01-27T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Whatever is Ray Ozzie Going To Do?</title>
      <link>http://www.joshlong.com:80/jl/blogPost/whatever_is_ray_ozzie_going.html</link>
      <description>&lt;p&gt;&#xD;
I'm catching up on some of my reading (more on that later). I was reading the&#xD;
December issue of&#xD;
&lt;a href=http://www.wired.com/techbiz/people/magazine/16-12/ff_ozzie?currentPage=all id=lvmq title=WIRED&gt;WIRED&lt;/a&gt;.&#xD;
I don't envy Ray Ozzie his situation. He's the new chief software architect at&#xD;
Microsoft (taking over Bill's job). Questions need to be asked about whether&#xD;
Microsoft's viability is certain. Ozzie is himself a wunderkind that Bill Gates&#xD;
hs called the "one of the top five programmers in the universe". Certainly,the&#xD;
proof is in the pudding. He invented Lotus Notes based on the research and&#xD;
learning environment Plato (see this&#xD;
&lt;a href=http://thinkofit.com/plato/dwplato.htm id=b4ro title="good article"&gt;good&#xD;
article&lt;/a&gt; ), which he tinkered with during his college years. As an aside, I&#xD;
note that the WIRED article attributes&#xD;
&lt;a href=http://www.pwc.com/ id=hah: title="Price Waterhouse"&gt;Price&#xD;
Waterhouse&lt;/a&gt;'s purchase of Notes as a turning point for Ozzie and his work one&#xD;
that eventually made it attractive to IBM, which then bought Lotus two years&#xD;
later. My mother worked at Price Waterhouse during that time, and I remember her&#xD;
having this incredible workgroup software on her laptop. It was only later that&#xD;
I'd understand how powerful it was. Now, Ozzie isn't just changing the face of&#xD;
office workgroups, he's chaning the landscape of the computer desktop in&#xD;
general, and he's got to do it through Windows and Office.&lt;/p&gt;  &lt;p&gt;&#xD;
He's come on strong. In 2005 he wrote, and with Bill Gates, sent a memo to high&#xD;
level executives at Microsoft whose purpose was two-fold: evaluate the current&#xD;
situation and landscape and map out what the future holds. He was writing on he&#xD;
money in describing the next computing platform as a cloud based paradigm. The&#xD;
latest and greatest out of Redmond confirms this. A lot of the stuff that was&#xD;
supposed to be in Vista, including a cohesive service-oriented platform, seems&#xD;
to be present in this new version of Windows,&#xD;
&lt;a href=http://www.microsoft.com/azure/default.mspx id=g3j9 title="Windows Azure"&gt;Windows&#xD;
Azure&lt;/a&gt;. It seeks to make the internet as much a fiber of the next generation&#xD;
of applications as an operating system's kernel is today.&lt;/p&gt;  &lt;p&gt;&#xD;
He's also previewed the cloud-friendly version of Office. For a good review,&#xD;
check out this&#xD;
&lt;a href=http://channel9.msdn.com/posts/PDCNews/First-Look-Office-14-for-Web/ id=a1s1 title="MSDN webcast"&gt;MSDN&#xD;
webcast&lt;/a&gt;. The cloud-friendly Office -- honestly, Linux and Java zealot that I&#xD;
am -- looks really cool. The idea is that you can drift between the web, the&#xD;
web, and the mobile version of the client. Finally, communal workflows are&#xD;
supported natively -- they're showcasing examples where somebody makes a change&#xD;
in a thick client and that change is propogated instantly to the ajax version of&#xD;
a document. I'd love to see how that particular ESB's being secured. I wonder if&#xD;
it's channeled centrally through Microsoft's servers, or if it's installable on&#xD;
the client's servers? I know they mentioned Sharepoint, but I genuinely hope&#xD;
they don't compel users to buy that whole boondoggle of a stack just to get the&#xD;
integration features. 'Sides, what am I griping about? And, really, perhaps I'm&#xD;
not their customer anyway. I'm using&#xD;
&lt;a href=http://extensions.services.openoffice.org/project/ooo2gd id=xyqd title="OpenOffice and Google Docs to write this"&gt;OpenOffice&#xD;
and Google Docs to write this&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&#xD;
But the question is -- is it too late?&#xD;
&lt;a href=http://docs.google.com id=ftau title="Google Docs"&gt;Google Docs&lt;/a&gt; is&#xD;
already thoroughly entrenched, and even Apple's&#xD;
&lt;a href=http://www.apple.com/iwork/ id=c3g5 title=iWork&gt;iWork&lt;/a&gt;&#xD;
/&lt;a href=http://www.apple.com/ilife/ id=p5_8 title=iLife&gt;iLife&lt;/a&gt; suite are in&#xD;
the cloud already.&#xD;
&lt;a href=http://www.iTunes.com id=uulm title=iTunes&gt;iTunes&lt;/a&gt;, the number one&#xD;
music application and service by far, has been a thick-client/cloud hybrid since&#xD;
day one, and has been doing it successfully. Even infrastructure has&#xD;
successfully, and comercially, been made available through services like&#xD;
&lt;a href=http://code.google.com/appengine/ id=ybg_ title="Google's App Engine"&gt;Google's&#xD;
App Engine&lt;/a&gt; and&#xD;
&lt;a href=http://aws.amazon.com/ec2/ id=v66t title="Amazon EC2"&gt;Amazon EC2&lt;/a&gt;.&#xD;
The list goes on and on (photo albums, email, etc.) for all the things Microsoft&#xD;
might do that it doesn't do. It seems like the only thing they have left,&#xD;
realistically, is the operating system itself. And in this respect, perhaps&#xD;
Windows Azure is viabe. After all, I haven't yet heard about a cloud-oriented&#xD;
version of OS X or Linux, though I'm not sure what makes Azure cloud-friendly in&#xD;
the first place.&lt;/p&gt; &lt;p&gt; Perhaps he can turn the ship around. So far, I'm impressed with what I've seen. &#xD;
 What, exaclty, does "success" look like for Microsoft, though? &#xD;
&lt;/p&gt;</description>
      <pubDate>Mon, 26 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/whatever_is_ray_ozzie_going.html</guid>
      <dc:date>2009-01-26T00:00:00Z</dc:date>
    </item>
    <item>
      <title>If You Build It, They Will Come: Communally Crazy</title>
      <link>http://www.joshlong.com:80/jl/blogPost/if_you_build_it_they.html</link>
      <description>&lt;p&gt; Do the web 2.0 communities remind any one else of the glory days of the wild dot-com boom (and bust?) of the early 2000s? &lt;/p&gt;&#xD;
&lt;P&gt; The communal web (isn't that redundant?) has inspired so many different applications that one wonders why any startup would want for  a business model. Upstart and favorite Twitter just raised &lt;A HREF="http://www.techcrunch.com/2009/01/24/twitter-raising-new-cash-at-250-million-valuation"&gt;250 million US&lt;/A&gt;   through an unknown VC. Meebo &lt;A HREF="http://techland.blogs.fortune.cnn.com/2008/04/30/meebo-snags-25-million"&gt; went through similar&lt;/A&gt;  rounds of funding a year ago. At the time, it was unclear what the business model behind the then naked/unadorned Ajax-powered IM client would be. Twitter, with a similarly large proliferation, faces the same question: what is the business model? Meebo.com solved the problem by adding advertising to its property, which works well because the property is what the users interact with. Twitter, I imagine, is something that people use from their cell phones, from desktop rich clients like Spaz and Twitterific, and so on. Twitter is the network, not the home page. I don't know - short of suffixing every 140 character update with an ad on all outbound messages ? how they can monetize it. &lt;/P&gt;&#xD;
&lt;P&gt;  &#xD;
But, as we've seen time and time again, if you build it, they will come. Or, they will build it on top of what you built. Or something. Twitter is valuable as it's become the standard bearer for any type of "status" requirement. &lt;A HREF="http://www.facebook.com/apps/application.php?id=2231777543"&gt;Facebook&lt;/A&gt;,  &lt;A HREF="http://www.plaxo.com"&gt;Plaxo.com&lt;/A&gt;, etc, all incorporate it. You can embed a Twitter status on your home page, should you like. It's become an platform for an essential part of a community: presence. &lt;/P&gt;&#xD;
&lt;P&gt;  &#xD;
In the same vein, Facebook has become so menacing a threat to established giant MySpace by encouraging development on top of its platform, where MySpace had done everything possible to thwart it. MySpace failed to provide an API and a marketplace for such improvements. There were ambitious ?hacks? that tried to integrate with the site, but were ceremonially squashed through MySpace's various ?security? enhancements. This is the same tact that Microsoft took with Windows in its early growth: it made development on top of Windows a very cheap proposition and promised an entrenched market for those applications. &#xD;
Now a days it seems like Facebook integration's de rigueur, an absolute must for any application wishing to get off the ground and into the hands of a large audience quickly. There's also a cross pollination between larger apps, such as the one between the various applications on the Facebook platform itself and other standalone services, like Yelp.com, or the new &lt;A HREF="http://losangeles.beta.citysearch.com/listings?geoId=56050&amp;what=restaurants&amp;where=los+angeles,+ca"&gt;Citysearch beta&lt;/A&gt;. &lt;/P&gt;&#xD;
&lt;P&gt;  &#xD;
There's no way to monetize these integrations in of themselves except that they broaden the applicability of the application.  &lt;/P&gt;&#xD;
&lt;P&gt;  &#xD;
The iPhone has had a simialar effect; it's marketplace has birthed many different applications that have been carried to exorbitant levels of profitability simply by being accessible to the audience that the iPhone application marketplace carries with it. Witness: the &lt;A HREF="http://blog.wired.com/gadgets/2008/12/iphone-fart-app.html "&gt;iFart application&lt;/A&gt;.&lt;/p&gt;&lt;P&gt; &#xD;
This all makes me wonder: are we seeing another dot-com boom? Do these new folksonomy-based applications rely on a quality that isn't by itself profitable and achieve profitability solely through VC investment? &lt;/P&gt;</description>
      <pubDate>Sun, 25 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/if_you_build_it_they.html</guid>
      <dc:date>2009-01-25T00:00:00Z</dc:date>
    </item>
    <item>
      <title>New article on Infoq.com</title>
      <link>http://www.joshlong.com:80/jl/blogPost/new_article_on_infoq_com.html</link>
      <description>&lt;p&gt; I wrote an article about getting started with Spring Integration, available at &lt;a href="http://www.infoq.com/news/2009/01/Spring-Integration-Joshua-Long"&gt;Infoq.com&lt;/a&gt;. If you get a chance, please check it out. &lt;/p&gt;</description>
      <pubDate>Tue, 20 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/new_article_on_infoq_com.html</guid>
      <dc:date>2009-01-20T00:00:00Z</dc:date>
    </item>
    <item>
      <title>New Entry on Artima.com: "Modeling to Avoid Hacking Your Model in ORM Mapping Format"</title>
      <link>http://www.joshlong.com:80/jl/blogPost/new_entry_on_artima_com.html</link>
      <description>I just posted another blog entry on Artima.com, called "Modeling to Avoid Hacking Your Model in ORM Mapping Format," and naturally would appreciate any feedback. The entry is available &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=247671"&gt;here.&lt;/a&gt; The entry is a discussion on modeling, and its advantages, using either UML or ER. A solution using Maven is provided to provide a work flow using ER modeling.</description>
      <pubDate>Sat, 17 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/new_entry_on_artima_com.html</guid>
      <dc:date>2009-01-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Web Framework Utility Llibraries: URLRewrite, JAWR, DWR, and HeaderFilter</title>
      <link>http://www.joshlong.com:80/jl/blogPost/web_framework_utility_llibraries_urlrewrite.html</link>
      <description>&lt;p&gt;
I've had the dubious pleasure of doing some web programming in the last week (actually, 4 days) and I've had quite a few different requirements which, frankly, I was surprised to find weren't eally me by the framework I was using (Spring MVC). Instead, I came upon a sle of single-focused, quality components out there that I think ever Java web developer should have in his or her arsenal. These component usually work across frameworks and are Servlet agnostic. They seem to be reasonably well documented. While I promise I will go into great depth about them in a future post, I want to at least list them here right now i the hopes that they save some people some trouble.  &lt;/p&gt;

&lt;H3&gt;Url Rewriting For Servlets&lt;/H3&gt;
&lt;p&gt;
I've had to do some URL rewriting to support search engine optimization. SEO is something of a black art, I admit, but there' still something to be said for building your web application wit search engine navigability in mind.  Naturally, this means man things, not the least of which exposing your pages on friendly book markable URLs. Spring MVC supports accessing low level servle configuration, but what is most appropriate for this sort o requirement is mod_rewrite. Mod_rewrite let's you map URLs coming into the server and transform them into other types of URLs, which then are used to access HTTP resources on your application. I didn't have - and didn't want to commit to ? a full installation of Apache HTTPD or anything like that. Instead, I wanted something inside the servlet container. I stumbled upon &lt;a href="http://tuckey.org/urlrewrite/"&gt;UrlRewriteFilter&lt;/a&gt;. It's fairly well documented and definitely powerful enough for 80% of your usecases. It can even match against request variables. It's got support for wildcard syntax as well as regular expressions. My regex-fu was strong enough that it just made sense to use that from the get-go. &lt;/p&gt;

&lt;h3&gt;JavaScript, CSS Minification and GZIP Compression  &lt;/h3&gt;
&lt;p&gt;
I had to deploy quite a bit of CSS and JavaScript, but wanted to take advantage of the compression savings of gzip, css and JavaScript minification and of the enormous HTTP latency reduction had by consolidating my JavaScript and css into one file. Lacking the discipline and time, I turned to &lt;a href="https://jawr.dev.java.net"&gt;JAWR&lt;/a&gt;, which does all of the above an plays nicely with your choice of frameworks. It's got smarts enough that you won't have to have to deploy/build yourself, like knowing whic revision of IE 6 should not be served gzip content. I wrote about this &lt;a href="http://www.joshlong.com/jl/entry/20080412"&gt;filter before&lt;/a&gt;.  &lt;/p&gt; &lt;h3&gt;Ajax&lt;/h3&gt; &lt;p&gt;The following are pretty commonly known, but they bear repeating.
I needed to do Ajax and talk to a simple Spring bean I was exposing as a client facade from the servlet. I used a package called &lt;a href="http://directwebremoting.org"&gt;DWR&lt;/a&gt;, which stands for "Direct Web Remoting." This package has been well documented and covered elsewhere. Suffice it to say that it allows you to invoke methods on a JavaScript object from your web page and it takes care of marshaling that to the server and invoking methods on a server-side bean. It's got all sorts of options and definitely merits some investigation of your own.  &lt;/p&gt; 
 &lt;h3&gt;Performance With YSlow and &lt;code&gt;Expire Headers&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;

I wanted to make sure that any page elements I use were reasonably performant and in line with good standards like what the &lt;a href="http://developer.yahoo.com/yslow"&gt;Yslow&lt;/a&gt;  plugin from Yahoo! Recommends.  One of the main improvements was  sending &lt;code&gt;Expire Headers &lt;/code&gt; for  &lt;code&gt;*.jpgs&lt;/code&gt;, &lt;code&gt;*.gifs&lt;/code&gt;, &lt;code&gt;*.css&lt;/code&gt; and &lt;code&gt;*.js&lt;/code&gt; resources. I did this using &lt;a href="http://juliusdev.blogspot.com/2008/06/tomcat-add-expires-header.html"&gt;a very powerful filter by "Julius, A simple dev", to add headers to requests&lt;/a&gt; whose code is similar in spirit to this &lt;a href="http://www.onjava.com/pub/a/onjava/2004/03/03/filters.html"&gt;oldie but goodie by Jason Falkner&lt;/a&gt;. Either is powerful enough to do the job. 
 &lt;/p&gt;  
&lt;h3&gt;Synergies of the Solutions &lt;/h3&gt; 
&lt;p&gt; The synergy between JAWR and DWR is wonderful. DWR tends to expose your beans as JavaScript, which it dynamically writes for you. The onus is on you to include that JavaScript file in your page. So, if you have 10 server side beans and you want to talk to all of them on the client, then you'd end up with 10 different HTTP requests and JavaScript &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags. JAWR, however, sports an integration option with DWR and will treat your dynamic DWR URLs exactly as if they were standard JavaScript using special configuration elements.&lt;/p&gt;
&lt;p&gt; The synergy between JAWR and the HeaderFilter's been wonderful. JAWR's gzip compressing and minifying content. It servers content on random URLs based on a hash of the content itself. So, if content changes it gets a new URL, which is immune to the cache issue, if you need to upgrade your application. Otherwise, the existing content is cached for a long time. Beautiful! 
&lt;/p&gt;
 &lt;p&gt;What a week! I had a fascinating time building this solution. Because of all the techniques I've used, the application is now very SEO friendly, very performant (it has a grade 'B' on the YSlow plugin, which Yahoo.com itself does, as well. I wouldn't want to have had to do all that manually, though. Thanks again to the creators of those many brilliant utilities!&lt;/p&gt; 

&lt;/p&gt;</description>
      <pubDate>Fri, 09 Jan 2009 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/web_framework_utility_llibraries_urlrewrite.html</guid>
      <dc:date>2009-01-09T00:00:00Z</dc:date>
    </item>
    <item>
      <title>My other blog on Artima.com, and my first post, "The New Old"</title>
      <link>http://www.joshlong.com:80/jl/blogPost/my_other_blog_on_artima.html</link>
      <description>&lt;p&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=245528"&gt;The
New Old&lt;/a&gt;, my first post on Artima.com&lt;/a&gt;. Check it out. Let's
talk.
&lt;/p&gt;</description>
      <pubDate>Thu, 18 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/my_other_blog_on_artima.html</guid>
      <dc:date>2008-12-18T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Anyone else noticing the extreme slowness of Java applications on Ubuntu 8.10?</title>
      <link>http://www.joshlong.com:80/jl/blogPost/anyone_else_noticing_the_extreme.html</link>
      <description>&lt;p&gt; Anyone else noticing the extreme slowness of Java applications on&#xD;
Ubuntu 8.10?  I upgraded and was expecting that the seminal Java 6u10&#xD;
(strike that!&lt;b&gt; 11! &lt;/b&gt;)  would do better than this.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt; I was expecting draggable applets and for the performance of my&#xD;
Java applications to not deteriorate. I was disappointed on both&#xD;
fronts.&#xD;
&#xD;
If you're having issues with IntelliJ crawling, a lot of people have&#xD;
downgraded to 8.04 Ubuntu. &lt;/p&gt;</description>
      <pubDate>Wed, 17 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/anyone_else_noticing_the_extreme.html</guid>
      <dc:date>2008-12-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Apple News, Mobile and Otherwise</title>
      <link>http://www.joshlong.com:80/jl/blogPost/apple_news_mobile_and_otherwise.html</link>
      <description>&lt;P&gt;&lt;img STYLE = "float:left; padding-right:10px;" width = "100"&#xD;
src="__1761_0__"/&gt;&#xD;
 &lt;a href="http://livelabs.com/seadragon-mobile/" target =&#xD;
"_blank"&gt;SeaDragon&lt;/a&gt;, an application from Microsoft that extracts&#xD;
the "Deep Zoom" component from Silver Light and enables it on an&#xD;
iPhone, has been released to the Apple Application Store (Wonders&#xD;
never cease!) because the Apple iPhone has a fantastic GPU.&#xD;
 &lt;/p&gt; &lt;p&gt;What's very interesting to me about this feature is not the&#xD;
mobile component, but &lt;a href="http://livelabs.com/seadragon-ajax/"&#xD;
target = "_blank"&gt;the ajax one&lt;/a&gt;.&#xD;
&#xD;
&#xD;
 &lt;p&gt; &lt;a href="http://www.internetnews.com/bus-news/article.php/3791651/MacPainful+Apple+Bows+Out+of+Macworld+Expo.htm"&#xD;
target="_blank"&gt;Apple, Steve Jobs, bow out of MacWorld Expo.&lt;/a&gt;&#xD;
 This fuels the usual debate on Steve Jobs' health, as usual, and&#xD;
rumors run rampant. What do you think? Sick? Disincentivized?&#xD;
 &lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
       PLUS: My new favorite iPhone Application: &lt;a&#xD;
href="http://www.techcrunch.com/2008/12/16/taxi-magic-hail-a-cab-from-your-iphone-at-the-push-of-a-button/"&gt;Taxi&#xD;
Magic&lt;/a&gt;. Seriously -- how slick is that? When do you usually need a&#xD;
Taxi? When you're most impaired, likely, say perhaps after drinking?&#xD;
One button. Finally, technology for fun and profit.&#xD;
&lt;/p&gt;</description>
      <pubDate>Wed, 17 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/apple_news_mobile_and_otherwise.html</guid>
      <dc:date>2008-12-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A Quick Guide to Posting To (A Few) Blogs with Java</title>
      <link>http://www.joshlong.com:80/jl/blogPost/a_quick_guide_to_posting.html</link>
      <description>First, How to Post to Any API that supports the (admittedly) outdated&#xD;
MetaWeblog API.&#xD;
&lt;p&gt;&#xD;
&lt;b&gt;How to Publish A Blog Entry For Roller 4.0 Software&lt;/b&gt;&#xD;
&#xD;
I found very little in the way of a solid API in Java on top of this&#xD;
XMLRPC API. However, I did find quite a bit using just good old Apache&#xD;
XMLRPC 3.0. Here's how that solution looks:&#xD;
&#xD;
&lt;pre&gt;&lt;code&gt;&#xD;
 /**&#xD;
 * @param serverUrl if youve unpacked a stock Roller 4.0 url, it's&#xD;
likely going to be http://www.YOURHOST.com/roller-services/xmlrpc&#xD;
 * @param user the user you have configured on Roller itself&#xD;
 * @param the password for the user name&#xD;
 * @param blogId the id of the blog. When you log into the Admin&#xD;
screen most pages will mention it.&#xD;
 * @param title the title of the post&#xD;
 * @param content the content of the post (can be in HTML)&#xD;
*/&#xD;
  public String createPost( String serverUrl, String user, String&#xD;
pass, String blogID, String title, String content) throws IOException&#xD;
{&#xD;
        String ret = null;&#xD;
        try {&#xD;
            XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();&#xD;
            config.setServerURL(new URL(serverUrl));&#xD;
            XmlRpcClient client = new XmlRpcClient();&#xD;
            client.setConfig(config);&#xD;
            Map&lt;String, Object&gt; m = new HashMap&lt;String, Object&gt;();&#xD;
            m.put("title", title);&#xD;
            m.put("description", content);&#xD;
            m.put("dateCreated", new Date());&#xD;
            m.put("category", "Java");&#xD;
            Object[] params = new Object[]{blogID, user, pass, m, true};&#xD;
            ret = (String) client.execute("metaWeblog.newPost", params);&#xD;
        } catch (Throwable th) {&#xD;
            System.out.println( "blam!") ;&#xD;
        }&#xD;
        return ret;   // a unique ID generated by Roller&#xD;
    }&#xD;
&#xD;
&lt;/code&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;/p&gt;&#xD;
&#xD;
&#xD;
&lt;P&gt;&#xD;
&lt;b&gt;How to do the same thing with Blogger Usign Google's GData.&lt;/b&gt;&#xD;
 &lt;pre&gt;&lt;code&gt;&#xD;
 GoogleService service = new GoogleService("blogger", "");&#xD;
        service.setUserCredentials(user, pass);&#xD;
        Entry myEntry = new Entry();&#xD;
        myEntry.setTitle(new PlainTextConstruct(title));&#xD;
        myEntry.setContent(new PlainTextConstruct(content));&#xD;
        Person author = new&#xD;
Person(StringUtils.defaultString(authorName), null, null);&#xD;
        if (!StringUtils.isEmpty(authorName)) myEntry.getAuthors().add(author);&#xD;
&#xD;
        URL postUrl = new URL("http://www.blogger.com/feeds/" + blogID&#xD;
+ "/posts/default");&#xD;
        return service.insert(postUrl, myEntry);&#xD;
&lt;/code&gt;&lt;/pre&gt;&#xD;
 &lt;/P&gt;&#xD;
&#xD;
&lt;p&gt; The Google Data stuff was using the Java Google Data APIs. The&#xD;
XMLRPC library is quite formidable. I'd not recommend using Apache XMLRPC&#xD;
3.1.1 from Maven, as it didn't seem to be a valid artifact. &lt;/p&gt;</description>
      <pubDate>Wed, 17 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/a_quick_guide_to_posting.html</guid>
      <dc:date>2008-12-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A journey of a thousand miles begins with a single step: ?Programming Collective Intelligence?, by O'Reilly</title>
      <link>http://www.joshlong.com:80/jl/blogPost/a_journey_of_a_thousand.html</link>
      <description>&lt;p&gt; Working through my reading list. You might infer that I'm a bit
behind because this review is about a book published in September of
2007.&lt;/p&gt;
&lt;p&gt;You'd be correct.&lt;/p&gt;

&lt;p&gt;"Programming Collective Intelligence" is astonishingly clear and
concise in the examples, and a brilliant introduction to the
foundations of a lot of fields of study. A well presented discussion
on many of the key items in the AI/algorithm world. Why is this so
worth repeating? Because these concepts ? genetic algorithms/ AI /
optimization, etc, are NOT common nor are they simple. Anybody who
manages to make them appear so is worth of praise. The examples are
further interesting because they're written in Python, which is as
simple as a language can get. (Digression: Python 3.0's out! How come
I didn't see a flurry of news? How come there was no ball drop in
Times Square? I'm excited, and proportionately confused by some
people's reactions, &lt;a href=
"http://www.mooseyard.com/Jens/2008/12/python-30-whats-the-point/"&gt;like
this one&lt;/a&gt;. Get your &lt;a
href="http://python.org/download/releases/3.0"&gt;copy while it's
hot!&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
The book is sort of the first rung of knowledge on a whole gamut of
complex topics, but that's OK because these topics become approachable
only once you've gotten the introductory tour. Finding that "tour",
the source for the inevitable epiphany, is what's so hard about these
concepts. It's even further difficult because it's not like there's a
lot of mainstream thinking going on here and these concepts just
represent a slight tangent on what you're already dealing with.
Anything but. People who know why they want to use something like
JBoss Rules already knew it. You'll notice there's no good "sales"
rhetoric on the JBoss website. It's the chicken and egg problem.
Understanding the concepts in this book is key to caring about, and
eventually understanding, things like JBoss Rules.
&lt;/p&gt; &lt;p&gt; All in all, a very worthy read. If nothing else, it's a good
refresher.   &lt;/p&gt;</description>
      <pubDate>Wed, 17 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/a_journey_of_a_thousand.html</guid>
      <dc:date>2008-12-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>How to Ride Spring Integration Head</title>
      <link>http://www.joshlong.com:80/jl/blogPost/how_to_ride_spring_integration.html</link>
      <description>&lt;p&gt;How to build Spring Integration (for Maven) locally... &#xD;
Posting this for my own reference as much as anyone else.&lt;/p&gt; &#xD;
&lt;p&gt;&#xD;
&lt;code&gt;svn co  https://src.springframework.org/svn/spring-integration/trunk/build-spring-integration &lt;br/&gt;&#xD;
cd trunk/build-spring-integration &lt;br /&gt;&#xD;
ant clean jar package publish-maven-local  &lt;br/&gt;&#xD;
&lt;/code&gt;&#xD;
&lt;/p&gt;</description>
      <pubDate>Sat, 13 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/how_to_ride_spring_integration.html</guid>
      <dc:date>2008-12-13T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Maven 2.0.9, Andromda 3.[2,3]</title>
      <link>http://www.joshlong.com:80/jl/blogPost/maven_2_0_9_andromda.html</link>
      <description>&lt;P&gt; I was building a project I have that's using the &lt;a href="http://galaxy.andromda.org/docs-3.3"&gt;Maven Andromda plugin&lt;/a&gt; to cross compile UML class diagrams into Java EJB3 entity classes. The plugin's worked flawlessly for a long time now, but this time it failed. It complained that it couldn't find the UML file that was referenced in the configuration file. It's no wonder: the file path it was looking for was doubled up, that is, it was equivalent to &lt;code&gt;/myfolders/foo/uml.uml2/myfolders/foo/uml.uml2&lt;/code&gt;. I did some research and &lt;a href="http://galaxy.andromda.org/forum/viewtopic.php?t=5862&amp;sid=0d9daa204dea84e3141a98af9c57ea3d"&gt;found this bug report&lt;/a&gt;. This proves that it wasn't my Andromda installation, but the Maven installation. This makes sense as I'd just recently upgraded from &lt;u&gt;Ubuntu Hardy Heron (8.04)&lt;/u&gt; to &lt;u&gt;Ubuntu Intrepid Ibex&lt;/u&gt; (what's an Ibex?; 8.10) and the package I was using (&lt;code&gt;maven2&lt;/code&gt;) had been updated to 2.0.9. So, the moral of the story here is: &lt;b&gt;make sure your Maven package didn't change under your nose.&lt;/b&gt;&#xD;
&lt;/p&gt;</description>
      <pubDate>Sat, 06 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/maven_2_0_9_andromda.html</guid>
      <dc:date>2008-12-06T00:00:00Z</dc:date>
    </item>
    <item>
      <title>JavaFX 1.0 Released</title>
      <link>http://www.joshlong.com:80/jl/blogPost/javafx_1_0_released.html</link>
      <description>&lt;p&gt;Finally, &lt;a href="http://www.javafx.com"&gt;JavaFX 1.0&lt;/a&gt; ? it's been 2 long years, but I'm glad to see this thing get going. Even if it shares the same fate as Silverlight and becomes a clumsier Flash, it's still a MUCH more agile Java. As the libraries enabled via JavaFX are all just Java code, you can still leverage them in standard Java. You needn't use JavaFX, for example. This means that the amazing integration with video and audio is yours for the taking. &#xD;
 &lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
It is unfortunate that they haven't released the Linux bits, yet. But that will change, and in the meantime, 1.0 is chock full of goodies. The blogosphere's been abuzz with information leading up tot the 1.0 release. People are interested in graphics on the Java platform (again?)! I've seen everything from information on using &lt;a href="http://blogs.sun.com/mobility_techtips/entry/how_to_develop_and_run"&gt;Java Webstart with JavaFX&lt;/a&gt; (do you remember Java Webstart? That was something I always wished had taken off), information on using the toolkit &lt;a href="http://m2-javafxc.sourceforge.net "&gt;with Maven&lt;/a&gt;, information on using it &lt;a href="http://www.weiqigao.com/blog/2008/12/04/using_javafx_1_0_on_linux.html"&gt;on Linux&lt;/a&gt; (why does every neat graphical platform have to support Linux last? Flash: I don't understand why Flex took so long to get there. Silverlight... well, I'm pleased it ran on more than one version of Windows, so no complaints, I suppose as I should've known. But Java?) and &lt;a href="http://java.dzone.com/articles/javafx-10-this-could-be-someth"&gt;more&lt;/a&gt;. &#xD;
 &lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
I have some questions: what's the video streaming solution look like on this platform? On the Flash platform you typically use something like LightHTTPD or Nginx and use Flash Video (or, now, H264). I understand that On2 is going to be providing a format for video (similar to FLV?) just as they did for the Flash platform. Do the same rules apply with respect to security and performance? What about remoting? My understanding is that JavaFx will have considerable support for this (which should come as no surprise given the incredible wealth of remoting toolkits on the Java platform) and will even respect the crossdomain.xml file (which comes from the Flash platform). &#xD;
 &lt;/p&gt;&#xD;
 &lt;p&gt; All in all, this is exciting and I can't wait to see where the platform goes from here. The other redeeming value about JavaFX is the unification of the paradigms: working in J2ME meant learning one set of APIs (CLDC, Midlets, J2ME Polish, and more recently, LWUIT), working on Java on the desktop meant SWT, or Swing (which meant... clawing your eyes out using a toothbrush), and working on the server meant using a web framework that didn't have any rich client functionality. Now, it's JavaFX for the desktop, the client, the mobile clients and soon, the TV. This is very promising. &lt;/p&gt;</description>
      <pubDate>Thu, 04 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/javafx_1_0_released.html</guid>
      <dc:date>2008-12-04T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Spring Integration 1.0 Released</title>
      <link>http://www.joshlong.com:80/jl/blogPost/spring_integration_1_0_released.html</link>
      <description>&lt;p&gt;Spring Integration is almost ready (&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=52095"&gt;website updates notwithstanding!&lt;/a&gt;) &lt;/p&gt;&lt;p&gt;  &#xD;
Spring Integration is an API for building integration solutions using Spring. It works, conceptually, very much like Axway Integrator or Mule or ServiceMix or Petals or, well, you get the idea: it provides functionality to respond to messaging / interactions in a system and route / transform the message to an endpoint. These messages could be JMS, FTP submission, a file suddenly appearing, etc. Spring Integration is an API that provides ESB like functionality. Usually, the ESB is a server to which application integrations are deployed. This API flips that idiom on its head and lets your application become the endpoint by which integration is achieved. &lt;/p&gt;&lt;p&gt;Spring Integration itself is significant because it codifies in a Spring API  the whole field of knowledge surrounding ESBs, which itself can be said to stem from &lt;a href="http://www.amazon.com/Enterprise-Integration-Patterns-Designing-Addison-W&#xD;
esley/dp/0321200683"&gt;Enterprise Integration Patterns&lt;/a&gt;: this has the boon of making it a commodity. And of course, there are the usual reasons: it works better for the things it does, it's well tested, easy-to-test, etc. But you knew about those already.   &lt;/p&gt;&lt;p&gt;&#xD;
&#xD;
I'm waiting with baited breath for the Maven releases :-) &#xD;
   &lt;/p&gt;&lt;p&gt;&#xD;
Congratulations to the Spring Integration team! Wonderful tool and I look forward to being able to recommend it moving forward. &lt;a href="http://www.springsource.com/download/community?project=Spring%20Integration"&gt;Get the bits!&lt;/a&gt;   &lt;/p&gt; &#xD;
&#xD;
&lt;P&gt;&lt;B&gt;Update&lt;/B&gt;: The old way still works and they've updated those bits already if you're &lt;a href="http://forum.springframework.org/showpost.php?p=194665&amp;postcount=6"&gt;looking to get the Maven jars&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&#xD;
&lt;P&gt;&lt;B&gt;Update&lt;/B&gt;:I linked to the wrong book and gave the wrong title, despite having the correct book sitting on a computer tower right next to me. Now &lt;i&gt;that's&lt;/i&gt; impressive! Thanks to Mark Fisher (lead on the Spring Integration project!) for the correction.  &lt;/p&gt;</description>
      <pubDate>Wed, 03 Dec 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/spring_integration_1_0_released.html</guid>
      <dc:date>2008-12-03T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Intellij 8.0</title>
      <link>http://www.joshlong.com:80/jl/blogPost/intellij_8_0.html</link>
      <description>&lt;p&gt;&lt;a href = "http://www.intellij.com"&gt;IntelliJ&lt;/a&gt; &lt;a href="http://www.jetbrains.com/idea/features/newfeatures80.html"&gt;8.0's&lt;/a&gt; &lt;a href="http://www.jetbrains.com/idea/features/25-can.html"&gt;a large&lt;/a&gt; step forward (and none back!)&lt;/p&gt;&#xD;
&lt;p&gt;I just downloaded the latest and greatest revision of Jetbrain's flagship product, Intellij IDEA 8.0.  It is, in a word, pretty awesome. This is due in large part to the refactoring of the core that has occurred between 7 and 8 to improve the application of the IDE for different languages. Support includes, but is not limited to, Groovy, Scala, Ruby, and Java (wherein you also have a dozen different DSLs with which IDEA contends admirably). &lt;/p&gt;&#xD;
&lt;p&gt;What seems to happen with Intellij is that they include  feature and support for a feature that's, shall we say, half baked. Don't get me wrong: a half baked Intellij feature's usually worth 2 or 3 fully baked Eclipse features. Compared to the usual level of quality, some times things slip through that don't meet expectations but that do ? nonetheless ? work. Where 7.0 of the IDE was pretty revolutionary, version 8.0 seems evolutionary (at least in terms of features.) &lt;/p&gt;&#xD;
&lt;p&gt;Instead, things are better polished, faster. Maven support was good when it was introduced in 7.0. Now, it's remarkably well thought and configurable. Intellij has supported displaying test coverage data when unit tests are running. Now it's possible to jump from a class to a test case. Ever wanted to be able to ride the data flow analysis and see where values in the system come from? Now you can. The support for Subversion and Subversion 1.5 is pretty stellar, and includes the ability to see which version of a change have already been integrated into a branch. Actually, the Subversion support is one of the things I've long liked from Intellij. Eclipse hasn't until version 3.4 officially supported Subversion at all. Eclipse 3.4 includes part of the functionality for accessing Subversion, but due to licensing issues you're on your own to install the remaining bits yourself. Intellij already had support for Flex (and the best JavaScript integration I've ever seen), but not much more than support for referencing and coding ActionScript. Now, you can almost effectively remove Flex Builder from your life if you're not planning on doing anything graphical. &lt;/p&gt;&#xD;
&lt;p&gt;And of course, there are new features, too. Support for Seam, better support for Jruby (which was already being called the best in the industry, and is now the extracted core of Intellij's RubyMine product), 20+ new intelligent refactoring capabilities, the ability to assign and swatch of text a ?language? so that Intellij can enable proper editing for it, and the UML capabilities round out the features. One of my favorite new features is the ability to... remove... features. Intellij has a LOT of features. While they're not obtrusive or glaringly present like an overloaded Eclipse instance can be, they are there when you launch the application and they consume RAM.  I loaded IntelliJ and it gave me a Plugin configuration wizard by which I could &lt;I&gt;disable&lt;/I&gt; plug ins. I'm not likely going to be using the Perforce SCM integration, and nor am I likely going to be using the FreeMarker and Struts configuration tools. So, why not disable them?  The speed boost at both runtime and startup is marked. &#xD;
&lt;/p&gt;&#xD;
&lt;P&gt;&#xD;
There are many more new features to like in this tool as well as the coder-friendly editor itself, which is just as tight a fit now as it's ever been. IntelliJ has always taken refactoring to a new plateau hiterto unmatched by Eclipse or Visual Studio, and this release is now exception. &lt;/p&gt;&lt;P&gt;&#xD;
What I didn't like: the tool had some JSP validation errors because of a URL that needs to be downloaded to resolve. In previous versions a little intelligent tooltip would prompt you to let IntelliJ download the file. Not so much in this case. Instead, I was prompted by IntelliLang's tool tip, asking me if I wanted to declare the URL to be a fragment of .. insert your favorite schema/dialect/language/grammar here. &#xD;
&#xD;
Annoying. I still don't know how to get the old functionality to return. Thankfully, in this case, the code was one "old" style JSP and the rest of the site consists of JSP Documents, which all displayed and edited perfectly. And quickly! IntelliJ is pretty quick, anyway, but it seems like the price you pay for invalid HTML is more pronounced in the IDE than, say, with DreamWeaver. )&#xD;
 &lt;/P&gt; &lt;p&gt;All in all, a worthy upgrade and I wholeheartedly recommend it.&lt;/p&gt;</description>
      <pubDate>Tue, 11 Nov 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/intellij_8_0.html</guid>
      <dc:date>2008-11-11T00:00:00Z</dc:date>
    </item>
    <item>
      <title>How to get your twitter results visible on your site</title>
      <link>http://www.joshlong.com:80/jl/blogPost/how_to_get_your_twitter.html</link>
      <description>Matt Raible added &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; updates to his blog. (&lt;a href="http://www.raibledesigns.com"&gt;Exhibit A&lt;/a&gt;). I decided to the do same. First, you'll need the twitter.js JavaScript. This can be found &lt;a href="http://twitterjs.googlecode.com/"&gt;here&lt;/a&gt;. I would download &lt;a href="http://twitterjs.googlecode.com/files/twitter-1.11.2.min.js"&gt;this one&lt;/a&gt;.  Install that script onto your site, ie:&lt;br/&gt;&#xD;
&lt;code&gt;&#xD;
 &lt;pre&gt; &amp;lt;script type = "text/javascript" src="/js/twitter-1.11.2.min.js" &amp;gt;&amp;lt;/script&amp;gt; &#xD;
&lt;/pre&gt; &lt;/code&gt;&#xD;
&#xD;
&lt;p&gt; Finally, add the code on your page to configure and use it.  &lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
This looks something like this:  &lt;br/&gt;&#xD;
&#xD;
&lt;code&gt;&lt;pre&gt;&#xD;
&amp;lt;script type = "text/javascript"  &amp;gt; &#xD;
     getTwitters('twitter_box', {&#xD;
        id: 'YOUR_TWITTER_ID', &#xD;
        prefix: '', &#xD;
        clearContents: false, // leave the original message in place&#xD;
        count: 3, &#xD;
        withFriends: true,&#xD;
        ignoreReplies: false&#xD;
    });&#xD;
&amp;lt;/script&amp;gt; &#xD;
  &lt;/pre&gt;&lt;/code&gt;&#xD;
&#xD;
&lt;p&gt; This javascript tells the script to load the latest 3 updates (&lt;code&gt;count&lt;/code&gt;) in the HTML element (in my case, a regular old DIV element) having ID "twitter_box". It tells the script that, if there's already something inside that DIV element, it should merely append to it, not overwrite it. &lt;/p&gt; &#xD;
&#xD;
&lt;p&gt;The &lt;code&gt;prefix&lt;/code&gt; attribute let's you specify what code you want to have inserted above and beyond the link and status text. This javascript has its own little macro substitution routine! You can dynamically insert variables like the url of your tweet ("&lt;i&gt;tweet&lt;/i&gt; being what a single status update on twitter is called.) into the prefix string and it'll get replaced at runtime. &lt;/p&gt; &#xD;
&#xD;
&lt;p&gt;Finally, make sure to insert the HTML element where you want the Twitter updates to display somewhere on your page. &#xD;
&lt;/p&gt;&lt;p&gt;The html is easy, and could be as simple as &lt;br/&gt;&#xD;
&lt;code&gt; &lt;PRE&gt; &amp;lt;div id = "twitter_box"&amp;gt; My &amp;lt;a href="http://www.twitter.com"&amp;gt;Twitter.com&amp;lt;/a&amp;gt;. &amp;lt;div&amp;gt;  &lt;/PRE&gt;&lt;/code&gt; &#xD;
 &lt;/p&gt;&#xD;
&lt;p&gt; Thanks, Matt!&lt;/p&gt;</description>
      <pubDate>Sat, 08 Nov 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/how_to_get_your_twitter.html</guid>
      <dc:date>2008-11-08T00:00:00Z</dc:date>
    </item>
    <item>
      <title>And now for something completely different, OR, The code That Almost Toppled Microsoft. Almost.</title>
      <link>http://www.joshlong.com:80/jl/blogPost/the_code_that_almost_toppled.html</link>
      <description>&lt;p&gt;&#xD;
I just visited the Phillipines. While there, my-brother-in-law gave me a hard disk with 60GBs of photographs. I wanted them on Flickr. Complicating matters further were the photos that my wife and I took. Her photos - every blessed one of them -- were perfect. Mine, on the other hand, were an affront to  color, tone, lighting and God. Nothing short of a week in front of GIMP and Flickr could save them.  &lt;/p&gt; &#xD;
&lt;p&gt;&#xD;
Nothing, that is, except perhaps some automation. I devised a plan: auto color correct the images using ImageMagic (You know how Photoshop has the "Auto Levels" command that transforms images from Warhol's to Monet's?), correct some of the EXIF issues I had, and then upload all 65GBs of photos to Flickr.  &lt;/p&gt;&#xD;
&#xD;
 &lt;h2&gt;Approach &lt;/h2&gt; &#xD;
&lt;P&gt;&#xD;
I chose Ruby for the solution because I've worked with some of these APIs before. I know how I would approach this problem from Java: &lt;a href="http://jmagick.wiki.sourceforge.net"&gt;JMagick&lt;/a&gt; for ImageMagick access,  &lt;a href="http://flickrj.sourceforge.net/"&gt;FlickrJ&lt;/a&gt; for Flickr, and I'd probably just shell out to &lt;code&gt; &#xD;
&lt;a href="http://www.sno.phy.queensu.ca/~phil/exiftool"&gt;exiftool&lt;/a&gt;&lt;/code&gt;, which is a command line tool on Linux. I've disabused myself of the notion that this script going on to become the 100 lines of code that topples Microsoft, and thus I don't care if it just works on Linux. &lt;/p&gt; &#xD;
&lt;P&gt;&#xD;
I chose not to use Java because, frankly, I'm really picky about how I build my Java applications. Picky, to the point that sometimes it hinders me when I'm just trying to express an application. Unless it's for the most trivial of applications (where "trivial" most certainly does NOT include assimilating 3 different libraries and performing image processing for 2 days) I can't help but introduce elements from my war chest. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
My war chest is derived from years of doing this singular task, from programming in Java. Years of experience have taught me to readily employ, for example: Maven, unit testing, persistence (so that I can keep track of what's been processed, for example) and with all of that, why not Spring? After all, I was going to write to interfaces anyway. My years of experience have taught me that I should plan the application out a little bit before I take to coding. After all, by the time I've integrated all those APIs, change will be slower going, and it's easier to refactor UML than DDL. My years of experience have made me slow for the small applications and fast for the big applications. &lt;/p&gt; &#xD;
&lt;p&gt;&#xD;
I chose not to use Python because I didn't know the APIs for Flickr that well in Python. Simple enough. I always use Python. It's the language I write my one-offs in. It's the language I go to when I want to express a solution without UML. It would have been perfect for this job. It's most redemptive quality is, in fact, how frequently I find myself thinking it would be perfect for a job. It inspires hope. But again, I don't know the API very well, no need to get lost in the weeds of Ruby offers a paved road.  &lt;/P&gt; &#xD;
&lt;h2&gt;Prerequisites &lt;/h2&gt;&#xD;
&lt;p&gt;&#xD;
The players having been selected, I wrote a small checklist of what I'll need. &lt;/p&gt; &#xD;
 &lt;OL&gt;&lt;LI&gt;&lt;a href="http://www.flickr.com/services/api/keys/apply/"&gt;Flickr API License key&lt;/a&gt; Make sure you choose the non professional version. &lt;/li&gt; &#xD;
 &lt;li&gt; Photos &lt;/LI&gt;  &#xD;
&lt;LI&gt;&#xD;
Ruby compiler. And the gem command, definitely don't forget those. You'll need some packages to get this running. I installed the packges using my Operating Systems package manager. I'm using Ubuntu Hardy Heron. The script I used to reproduce the solution on another machine (and thus to whose viability I can speak) is: &lt;br/&gt;&lt;CODE&gt;&lt;PRE&gt;&#xD;
sudo apt-get install libimage-exiftool-perl &#xD;
sudo apt-get install libfreetype6-dev libfreetype6  &#xD;
sudo apt-get install libwmf0.2-7 ghostscript libjpeg62 &#xD;
sudo apt-get install libpng3 libpng3-dev  &#xD;
sudo apt-get install imagemagick  &#xD;
sudo apt-get install make gcc autoconf ruby rubygems ruby1.8-dev libmagick9-dev  &#xD;
 &#xD;
sudo gem install rflickr &#xD;
sudo gem install rmagick &#xD;
sudo gem install mini_exiftool &#xD;
sudo gem install openwferu-extras &#xD;
&lt;/CODE&gt; &lt;/li&gt;&#xD;
&lt;/oL&gt;&lt;h2&gt;&#xD;
Code!  &lt;/h2&gt; &lt;P&gt;&#xD;
I took large swatches of this from loadr.rb script that ships with the Flickr library's source code. The application is anything if not fragile, and perhaps not even very efficient, but it does work, and that's what mattered here. &#xD;
 &lt;/p&gt;  &#xD;
&lt;CODE&gt;&lt;PRE&gt;&#xD;
#!/usr/bin/ruby&#xD;
&#xD;
require 'rubygems'&#xD;
require 'pp'&#xD;
require 'find'&#xD;
require 'RMagick'&#xD;
require 'fileutils'&#xD;
require 'mini_exiftool'&#xD;
require 'flickr'&#xD;
&#xD;
&lt;B&gt;#you will get these values when you sign up with Flickr. Make sure you choose the non professional version. &lt;/b&gt;&#xD;
$flickr_email = 'YOUR_YAHOO_EMAIL'&#xD;
$api_key = 'YOUR_YAHOO_FLICKR_API_KEY'&#xD;
$shared_secret =   'YOUR_YAHOO_SHARED_SECRET'&#xD;
$flickr = Flickr.new("/tmp/flickr.cache", $api_key, $shared_secret) &lt;B&gt;# change the path as you like &lt;/b&gt;&#xD;
setname = 'the_set_to_which_I_want_to_upload_these_photos'&#xD;
&#xD;
def filename_to_title(filename)&#xD;
    arr = filename.split(File::SEPARATOR).last.split('.')&#xD;
    arr.pop&#xD;
    my_title = arr.join('.')&#xD;
end&#xD;
&#xD;
&lt;B&gt;# this will run each time. The first time it runs &#xD;
# it will cause Flickr to display a screen prompting you&#xD;
# to give permission to the application, which you will do.&#xD;
 &lt;/B&gt;&#xD;
def auth_rflickr(api, secret)&#xD;
    unless $flickr.auth.token&#xD;
        $flickr.clear_cache&#xD;
        $flickr.auth.getFrob&#xD;
        url = $flickr.auth.login_link&#xD;
        `firefox '#{url}'`&#xD;
        puts "A browser is being opened to bring you to:\n#{url}. When you are done authorizing this application, hit enter."&#xD;
        gets&#xD;
        $flickr.auth.getToken&#xD;
    end&#xD;
end&#xD;
&#xD;
&lt;b&gt;# change the paths as you like &lt;/b&gt;&#xD;
dir_for_output =Dir.new( FileUtils.mkdir_p("../output"))&#xD;
dir_for_input = Dir.new "/home/yourUser/Desktop/photos/" &#xD;
&#xD;
&lt;b&gt;# here we run through the input folder and examine &#xD;
#the contents, building up the array of files to upload.&lt;/b&gt;&#xD;
files= []&#xD;
Find.find(dir_for_input.path) do |path|&#xD;
    if !FileTest.directory?(path)&#xD;
        tags = File.dirname(path )[dir_for_input.path.length .. -1]&#xD;
        if tags[-1]== '/' or tags[0] == '/'&#xD;
            tags = tags[1 .. -1]&#xD;
        end&#xD;
        if  ['.jpg', '.tiff', '.tif'].include? File.extname(path).downcase &lt;b&gt;#only include images&lt;/b&gt;&#xD;
            files &lt;&lt; path&#xD;
        end&#xD;
    end&#xD;
end&#xD;
&#xD;
&#xD;
auth_rflickr($api_key, $shared_secret) unless $flickr.auth.token&#xD;
&#xD;
&lt;b&gt;# clean up the existing tmp folder&lt;/b&gt;&#xD;
if File.exists?(dir_for_output.path )&#xD;
    FileUtils.rm_rf(dir_for_output.path )&#xD;
end&#xD;
&#xD;
if not File.exists?(dir_for_output.path )&#xD;
    if not Dir.mkdir(dir_for_output.path )&#xD;
        raise "Can't create the directory!"&#xD;
    end&#xD;
end&#xD;
&#xD;
sets = $flickr.photosets.getList&#xD;
set = sets.find{|s| s.title == setname}  &#xD;
set &amp;&amp;= set.fetch&#xD;
&#xD;
eligible = (set ? set.fetch : [])&#xD;
to_upload = []&#xD;
uploaded = []&#xD;
&#xD;
files.each do |filename|&#xD;
    my_title = filename_to_title(filename)&#xD;
    photo = eligible.find{|photo| photo.title==my_title}&#xD;
    if photo&#xD;
        uploaded &lt;&lt; photo&#xD;
    else&#xD;
        to_upload &lt;&lt; filename&#xD;
    end&#xD;
end&#xD;
&#xD;
tix = []&#xD;
to_upload.each { |fn|&#xD;
   &lt;b&gt; # here's where the most interestig work is done. &lt;/b&gt;&#xD;
    ifile= File.new fn&lt;b&gt;  # output file&lt;/b&gt;&#xD;
    ofile =   File.join( dir_for_output.path, File.basename(fn))&lt;b&gt;  # input file &lt;/b&gt;&#xD;
    before = Magick::Image.read( ifile.path ).first&lt;b&gt; # read in an image using ImageMagick &lt;/b&gt;&#xD;
    after = before.normalize &#xD;
    after.write( ofile )&#xD;
    exif_out = MiniExiftool.new ofile&#xD;
    &lt;b&gt; # open the file with MiniExiftool, which wraps exif  &#xD;
    #tool, and perform operations on the exif metadata.&lt;/b&gt;&#xD;
    exif_in = MiniExiftool.new ifile.path&#xD;
    exif_out['Orientation'] = exif_in ['Orientation']&#xD;
    puts 'couldnt save exif data!' if !exif_out.save&#xD;
    tags = File.dirname(fn )[dir_for_input.path.length .. -1] &#xD;
    if tags[0]== '/'&#xD;
        tags = tags[1 .. -1]&#xD;
    end&#xD;
    if tags[-1] == '/'&#xD;
        tags = tags.chomp&#xD;
    end&#xD;
    tags = tags.strip.split('/')&#xD;
    tix &lt;&lt;  $flickr.photos.upload.upload_file_async( ofile, filename_to_title(ofile), &#xD;
       nil, 'tag1 tag2 tag3'.split(' ')+tags) &#xD;
&lt;b&gt;# change these tags as you need to. They will be used to categorize the images on Flickr.  &lt;/b&gt;&#xD;
}&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
tix = $flickr.photos.upload.checkTickets(tix)&#xD;
while (tix.find_all{|t| t.complete==:incomplete }.length &gt; 0)&#xD;
    sleep 2&#xD;
    puts "Checking on the following tickets: "+&#xD;
            tix.map{|t| "#{t.id} (#{t.complete})"}.join(', ')&#xD;
    tix = $flickr.photos.upload.checkTickets(tix)&#xD;
end&#xD;
&#xD;
failed = tix.find_all{|t| t.complete == :failed}&#xD;
failed.each { |f|  puts "Failed to upload #{to_upload[tix.index(f)]}." }&#xD;
0.upto(tix.length - 1) { |n| puts "#{to_upload[n]}\t#{tix[n].photoid}" }&#xD;
&#xD;
uploaded += tix.find_all{|t| t.complete == :completed}.map do |ticket|&#xD;
    $flickr.photos.getInfo(ticket.photoid)&#xD;
end&#xD;
uploaded.each do |photo|&#xD;
    if set&#xD;
        set &lt;&lt; photo unless set.find{|ph| ph.id == photo.id}&#xD;
    else&#xD;
        set = $flickr.photosets.create(setname, photo, 'DESCRIPTION_HERE')&#xD;
        set = set.fetch&#xD;
        puts "creating set #{setname}"&#xD;
    end&#xD;
end&#xD;
&#xD;
&lt;/PRE&gt;&lt;/CODE&gt;</description>
      <pubDate>Thu, 06 Nov 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/the_code_that_almost_toppled.html</guid>
      <dc:date>2008-11-06T00:00:00Z</dc:date>
    </item>
    <item>
      <title>TestNG, Spring TestContext, and Maven</title>
      <link>http://www.joshlong.com:80/jl/blogPost/testng_spring_testcontext_and_maven.html</link>
      <description>&lt;p&gt;If you've ever used the testing support in prior versions of Spring you know that it was essentially JUnit 3.x, oriented. There were ways to make those scaffolding classes work for (my personal favorite) TestNG or even Junit 4, but they largely were engineering hacks, not real solutions. For example, with the TestNG case you could override the setUp method and annotate it such that TestNG would call that method for setup, while also complying with Junit's interface requirements. Now there's a better way. Here's how I got it workiung with Maven and Surefire and TestNG 5.7. &#xD;
First, I added support for TestNG 5.7 (which is current as of this writing.):  &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;lt;dependency&amp;gt;  &amp;lt;artifactId&amp;gt;testng&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;org.testng&amp;lt;/groupId&amp;gt; &amp;lt;version&amp;gt;5.7&amp;lt;/version&amp;gt; &amp;lt;classifier&amp;gt;jdk15&amp;lt;/classifier&amp;gt; &amp;lt;/dependency&amp;gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Then I added support for SureFire to the Maven POM: &lt;/p&gt;&#xD;
&lt;pre&gt;  &amp;lt;plugins&amp;gt; &lt;br /&gt;               &amp;lt;plugin&amp;gt; &lt;br /&gt;                   &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &lt;br /&gt;                    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt; &amp;gt;&lt;br /&gt;                     &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt; &lt;br /&gt;                  &amp;lt;configuration&amp;gt; &lt;br /&gt;                       &amp;lt;suiteXmlFiles&amp;gt; &lt;br /&gt;                           &lt;br /&gt;&amp;lt;suiteXmlFile&amp;gt;${basedir}/src/test/resources/testng.xml&amp;lt;/suiteXmlFile&amp;gt; &lt;br /&gt;                        &amp;lt;/suiteXmlFiles&amp;gt; &lt;br /&gt;           &amp;lt;/configuration&amp;gt; &lt;br /&gt; &lt;br /&gt;     &amp;lt;/plugin&amp;gt;          &lt;br /&gt; &lt;br /&gt;       &amp;lt;/plugins&amp;gt;&lt;/pre&gt; &#xD;
&lt;p&gt;Finally, it comes time to write the test. Maven has a structure that's realized using the following command:&lt;/p&gt;&#xD;
&lt;code&gt;mkdir -p src/{test,main}/{java,resources}; &lt;/code&gt;&#xD;
&lt;p&gt;Your unit test code goes into &lt;code&gt;src/test/java&lt;/code&gt; and your &lt;code&gt;testng.xml&lt;/code&gt; goes into &lt;code&gt;src/test/resources&lt;/code&gt;. &lt;/p&gt;&#xD;
&lt;p&gt;Here's an example of the testng.xml:&lt;/p&gt;&#xD;
&lt;pre&gt;&amp;lt;!DOCTYPE suite SYSTEM &amp;quot;http://testng.org/testng-1.0.dtd&amp;quot;&lt;br /&gt;&amp;gt; &amp;lt;suite name=&amp;quot;myProject&amp;quot; verbose=&amp;quot;5&amp;quot;&amp;gt; &lt;br /&gt;  &amp;lt;test name=&amp;quot;serviceTests&amp;quot;&amp;gt; &lt;br /&gt;        &amp;lt;packages&amp;gt; &lt;br /&gt;           &amp;lt;package&lt;br /&gt;name=&amp;quot;com.joshlong.myProject.test.services&amp;quot;/&amp;gt; &lt;br /&gt;        &amp;lt;/packages&amp;gt; &lt;br /&gt;   &amp;lt;/test&amp;gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;/suite&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;And, finally, here's an example of a test class that works:&lt;/p&gt; &#xD;
&lt;pre&gt;package com.joshlong.myProject.tests.services;&lt;br /&gt;import com.joshlong.myProject.utils.LoggingUtils;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.test.annotation.DirtiesContext;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests; &lt;br /&gt;// THIS ONE's IMPORTANT! There are one of these for each of the 3 frameworks you're likely to want to use. &lt;br /&gt;import static org.testng.Assert.assertTrue;&lt;br /&gt;import org.testng.annotations.BeforeMethod;&lt;br /&gt;import org.testng.annotations.Test;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author Josh Long&lt;br /&gt; */&lt;br /&gt;@ContextConfiguration(locations = {&amp;quot;classpath:service-context.xml&amp;quot;, &amp;quot;classpath:test-context.xml&amp;quot;})&lt;br /&gt;public class MyProjectTest extends AbstractTransactionalTestNGSpringContextTests {&lt;br /&gt;&lt;br /&gt;    @BeforeMethod public void announceClass() throws Throwable {&lt;br /&gt;        loggingUtils.log(&amp;quot;Inside of MyProjectTest!&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;    @Autowired&lt;br /&gt;    private LoggingUtils loggingUtils;  // this gets automatically injected from one of the contexts listed in the @ContextConfiguration annotations.&lt;br /&gt; &lt;br /&gt;    @Test&lt;br /&gt;    public void testBasicMath() throws Throwable {&lt;br /&gt;        loggingUtils.log(&amp;quot;foo()&amp;quot;);        &lt;br /&gt;        assertTrue( 1 &amp;lt; 2, &amp;quot;1 &amp;lt; 2 -- pray that this is correct and that this test never does fail!&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;</description>
      <pubDate>Tue, 07 Oct 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/testng_spring_testcontext_and_maven.html</guid>
      <dc:date>2008-10-07T00:00:00Z</dc:date>
    </item>
    <item>
      <title>GWT Continues to Produce Beautiful Sites</title>
      <link>http://www.joshlong.com:80/jl/blogPost/gwt_continues_to_produce_beautiful.html</link>
      <description>&lt;p&gt;I stumbled upon the samples site from &lt;a href="http://phpgwt.com"&gt;phpgwt.com&lt;/a&gt; ? which features this &lt;a href="http://samples.gwtphp.com/pax4/merchants/index.php"&gt;application.&lt;/a&gt; The application seems to perform and work reasonably well in all browsers, although the transparent .pngs that are prevalent on the site don't seem to work well in Internet Explorer 6. Naturally, your mileage my vary, but I tested it against Firefox 3.0, Chrome, and Internet Explorer. Gorgeous. Similarly, look at the sample applications coming from &lt;a href="http://extjs.com/products/gxt"&gt;ExtJS &lt;/a&gt;OR &lt;a href="http://www.gwt-ext.com/demo"&gt;GWT-EXT&lt;/a&gt;. The first one's not quite as impressive as the second one, however, the second one may be at a dead end due to a licensing spat (&lt;a href="http://www.gwtsite.com/ext-gwt-gwt-ext-what-now/"&gt;as detailed here&lt;/a&gt;). &lt;/p&gt;&lt;p&gt;I should have a tutorial detailing how to get started with some of these technologies pretty soon.&lt;/p&gt;</description>
      <pubDate>Sat, 04 Oct 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/gwt_continues_to_produce_beautiful.html</guid>
      <dc:date>2008-10-04T00:00:00Z</dc:date>
    </item>
    <item>
      <title>http://code.google.com/p/java-libcdrip/</title>
      <link>http://www.joshlong.com:80/jl/blogPost/http_code_google_com_p.html</link>
      <description>I've just &lt;a href="http://code.google.com/p/java-libcdrip"&gt;open sourced and released&lt;/a&gt; on Google code an Open API for interacting with CDDA data from Java. Right now the API does basics, only: &#xD;
&#xD;
&lt;ul&gt;&lt;li&gt; Eject a disc from a drive&lt;/li&gt;&lt;li&gt; Provide information about whether a CD is loaded&lt;/li&gt;&lt;li&gt;List the devices on the system (though this seems to be a little flaky at the moment, so we'll have to implement a strict policy of no refunds! &amp;lt;grin&amp;gt;&lt;/li&gt;&lt;li&gt;Enumerate how many tracks there&lt;/li&gt;&lt;li&gt;Rip tracks to a .WAV &lt;code&gt;java.io.File&lt;/code&gt; object.&lt;/li&gt;&lt;li&gt;Derive the DISCID from the CD, which in turn can be used to get CDDB data&lt;/li&gt;&lt;/ul&gt; &#xD;
&#xD;
&lt;p&gt;Naturally, there are many things &lt;a href="http://code.google.com/p/java-libcdrip/issues/list"&gt;to do be done&lt;/a&gt;, and the list is constantly growing.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The code itself is JNI code that exposes native code that I've built using two &lt;strong&gt;amazing&lt;/strong&gt; open source projects.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt; On Linux, I'm using &lt;code&gt;grip&lt;/code&gt;, &lt;code&gt;cdio&lt;/code&gt;, and more, not to mention the GNU toolchain. On Windows, I'm using &lt;code&gt;&lt;a href="http://cdexos.sourceforge.net/"&gt;CDex&lt;/a&gt;&lt;/code&gt;. &#xD;
&lt;/p&gt; &#xD;
&#xD;
&lt;p&gt; Since the layer of code that is actually mine is very thin (just enough to normalize the two APIs so that I could get them to conform the JNI-vended header files), it would not be very much use working on this project (unless you &lt;strong&gt;REALLY&lt;/strong&gt; want to&lt;strong&gt;!&lt;/strong&gt;) Instead, support those projects directly. &lt;/p&gt;&#xD;
&lt;p&gt;Any feedback on the project is helpful. The C/C++ code is sort of slapdash and isn't necessarily the easiest to build unless you've had time with &lt;a href="http://www.eclipse.org/cdt/"&gt;Eclipse CDT&lt;/a&gt; or Visual Studio .NET 2008, which is why there are prebuilt binaries in the &lt;code&gt;lib&lt;/code&gt; directory in subversion.</description>
      <pubDate>Thu, 02 Oct 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/http_code_google_com_p.html</guid>
      <dc:date>2008-10-02T00:00:00Z</dc:date>
    </item>
    <item>
      <title>J2ME and Android consitancy</title>
      <link>http://www.joshlong.com:80/jl/blogPost/j2me_and_android_consitancy.html</link>
      <description>Why is it that the basic 'optional' components on J2ME are pretty much the optional components on Android? What am I missing here? If you get a relatively new phone you're likely to get the same minimum requirements that you'll get from an Android phone ? the things that are really interesting and attractive are optional, just as they're optional on J2ME. This applies, for example, to the GPS support, the ability to play MP3s, access the camera, etc. One thing I expect is that, because it's Google, that once you develop for Android and the phone "supports" the feature, then it won't be that hard to go from emulator to deployment on the handset with the same features. In the J2ME world, it's not easy to get an application that works identically once deployed without multi-hundred dollar certificates and so on. And of course, you still are better are programming to a common denominator if you want the application work across a lot of phones. Additionally, there are features that some phone supported that aren't supported in any one emulator, which means that testing j2ME is fine using the Wireless Toolkit but difficult if you're trying to access features from a Samsung A900 without then using Sprint's SDK. The Gphone is almost here, perhaps we'll start to get a feel for what that entails.</description>
      <pubDate>Thu, 02 Oct 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/j2me_and_android_consitancy.html</guid>
      <dc:date>2008-10-02T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Getting Started with jBPM and Spring</title>
      <link>http://www.joshlong.com:80/jl/blogPost/getting_started_with_jbpm_and.html</link>
      <description>&lt;p&gt;My first article for &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=jBPMandSpring"&gt;TheServerSide.com&lt;/a&gt;. I am very excited to have this finally happen, and am frankly really looking forward to doing some more. The article is a discussion on setting up an architecture using worklists that depends on jBPM and Spring. &#xD;
&lt;/p&gt;&lt;p&gt; &#xD;
Any ideas? Suggestion? Leave a comment! &lt;/p&gt;</description>
      <pubDate>Mon, 22 Sep 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/getting_started_with_jbpm_and.html</guid>
      <dc:date>2008-09-22T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Oracle  Enterprise Pack for Eclipse</title>
      <link>http://www.joshlong.com:80/jl/blogPost/oracle_enterprise_pack_for_eclipse.html</link>
      <description>&lt;p&gt;Dear Oracle,&lt;/p&gt;&#xD;
&lt;p&gt;You recently released  &#xD;
&lt;strong&gt;&lt;a href="http://www.oracle.com/tools/enterprise-eclipse-pack.html"&gt;Oracle Enterprise Pack for Eclipse&lt;/a&gt;&lt;/strong&gt;, which  is a release of either Eclipse 3.3 (Europa) or Eclipse 3.4 (Ganymede) that supports using Weblogic as a server. This is nice because, up until now, the only way that I knew  of to use WebLogic was to either use the Workshop product - which is an increasingly bad option  as it's based on the equivalent of Eclipse 3.1 - or to use something like MyEclipse, which has a sort of half-hearted integration with Weblogic that misses the mark.  I wanted to applaud your release. This isn't some cranked up Eclipse distro like Workshop and it's not some tightly-wound monster like JDeveloper. It's a simple solution to a simple requirement.  Honestly, I'm surprised it happened after BEA got accquired! I would have thought Oracle would &lt;em&gt;discontinued&lt;/em&gt; something like this! &#xD;
&lt;/p&gt;&lt;p&gt; I know that Oracle Enterprise Pack includes other niceties besides the integraion with Weblogic, but they are uninteresting to me, as Ganymede is a very compelling upgrade on its own strength. &lt;/p&gt; &lt;p&gt;&#xD;
Thank you, Oracle, for making development in the Enterprise a little easier.   &lt;br /&gt;&lt;br/&gt;Josh Long&lt;/p&gt;</description>
      <pubDate>Wed, 17 Sep 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/oracle_enterprise_pack_for_eclipse.html</guid>
      <dc:date>2008-09-17T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Google Chrome, beta</title>
      <link>http://www.joshlong.com:80/jl/blogPost/google_chrome_beta.html</link>
      <description>&lt;p&gt;Alright, so I was really caught off guard by the announcement of Google Chrome (&lt;a href="http://www.google.com/chrome"&gt;http://www.google.com/chrome&lt;/a&gt;). I?m REALLY impressed. It has every little key command I ever wanted: Ctrl+tab / ctrl + shift + tab moves you back and forward in your tabs. Ctrl + t create a new tab. Ctrl +L places the cursor in the location bar (and the location bar does double duty as your search bar, too! Nice! Even nicer: you can choose Microsoft as your search and they didn?t have to ask to get it that way!), etc. It even has the ability to drag tabs from the browser and 'attach' them, or detach them, at will. Again, very nice touch. It has every shortcut except one: F11. F11 (at least on IE, Firefox and Konqueror. Not Safari on Windows, I note!) maximizes the window and removes all the chrome. The reason for this should be stunningly obvious: it?s already as bare-minimal as you can get. But still, it?d be nice to have some way to go full screen. After all, how are the kiosk-esque apps supposed to work? What could be cooler than an entire application, full screen mode, written using GWT and the Google Gears extension library for GWT, deployed on Google Chrome, say at the library, or the airport? Who'd need the apple store? Imagine getting the Flash support up to snuff and deploying that on this crazy fast browser!&lt;/p&gt;&lt;p&gt;As a development tool, it?s definitely a solid third. Firefox + Firebug + Web Developer are the reigning champions, of course, then Safari and the hidden 'Developer' menu, then Chrome?s available but Spartan JavaScript debugger/ process monitor (a freaking process monitor! Awesome: Shift + Escape. Genius.)&lt;/p&gt;&lt;p&gt;Unlike Safari on Windows, the Chrome?s UI chrome seems to be rock solid. Of course, given the name it?d be ironic if that were anything less. If you manipulate Safari quick enough, it?ll stop painting itself and the grey brushed metal look will disappear to reveal standard blue + gray Windows 2000 chrome (you know, the minimize, maximize buttons, the title bar), but not so with Chrome. This could be because it?s very fast and I just haven?t found a way to get it to slow/falter. &lt;/p&gt;&#xD;
&lt;p&gt;I did have some issues with it, however. Flash flickers a bit for me ? watching the video explaining Chrome, the faces would every so often flicker. I wonder if this is why they did &lt;a href="http://www.google.com/googlebooks/chrome" target="_blank"&gt;a comic strip&lt;/a&gt;) It?s built using Webkit as the renderer, so most things work just fine, and it?s built using their own proprietary JavaScript VM, called V8. V8 is very interesting in that it means could potentially advance the state of the art with JavaScript. Or foul it up completely and introduce a 4&lt;sup&gt;th&lt;/sup&gt; incompatible JS variant into the market. I tested a lot of different applications, however, and it seems to be working just fine. Great, in fact. I tried the usual suspects: Gmail, YouTube, Meebo, Flickr, Google Calendar and they all seemed to work fine. I use Roller for my blog and it in turn uses a widget for rich text editing. That rich text editor barked that it didn't support Mozilla &amp;lt; 1.3 when I tried to write this entry, but then insisted that it would try to materialize everything. It went ahead and sure enough everything works perfectly, even if the widget doesn't know it yet! Obviously the HTML heavy sites like &lt;a href="http://www.slashdot.org" target="_blank" title="Slashdot"&gt;Slashdot.org &lt;/a&gt;or &lt;a href="http://amazon.com/" target="_blank"&gt;Amazon.com&lt;/a&gt; worked just fine too, given the WebKit heritage. &lt;/p&gt;&lt;p&gt;I?m a little annoyed by the lack of Linux support (both from Google, and from Apple and their Safari product) given that WebKit was born of Konqueror?s source code. There does seem to be hope, though: the &lt;a href="http://dev.chromium.org/"&gt;developer site&lt;/a&gt; at least has a doc explaining that Chrome doesn?t yet build/do anything useful on OS X / Linux. But at least they?re not pretending no one?s going to be looking for those builds!&lt;/p&gt;&lt;p&gt;All in all, bravo Google!&lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;strong&gt;Update (08/03/2008)&lt;/strong&gt; So, I wanted to install this sucker at work. I tried runninig it and sure enough it failed, bitten by the corporate firewall. Good for firewall, bad for me. I googled and with a little luck I chanced upon &lt;a href="http://mandriva.blogspot.com/2008/09/google-chrome-installer-error-solved.html"&gt;this revealing blog by Guru Prasath&lt;/a&gt;. I tried it and it works! &lt;/p&gt;</description>
      <pubDate>Tue, 02 Sep 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/google_chrome_beta.html</guid>
      <dc:date>2008-09-02T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Continous Integration Conundrum</title>
      <link>http://www.joshlong.com:80/jl/blogPost/continous_integration_conundrum.html</link>
      <description>&lt;p&gt;I'm not feeling so hot so I'm sleeping irratically and so I'm productive when I least expect it. &lt;/p&gt;&lt;p&gt;I've been looking at the various continous integration server's out there for possible employment in a project I'm working on. We have in-house experience with &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;Cruise Control&lt;/a&gt;, the defacto standard, so that's definitely got one value point. Plus, it's open source, which helps in the &amp;quot;can-we-trust-it?&amp;quot; category. &#xD;
 We are hopefully going to be working with Maven 2, so there's definitely value in being able to talk to the build system, which I know &lt;a href="http://continuum.apache.org/"&gt;Continuum&lt;/a&gt; (because, after all, they're the makers of &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;) can do easily. In terms of what I've heard about -- as in from direct contact with other people -- I know Hudson has a pretty good reputation, and so do the Atlassian products, namely &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Bamboo&lt;/a&gt;. Actually, now that I think of it, I attended a JUG wherein the Atlassian folks demo'ed the Bamboo product, and it was pretty impressive, if you go for the pie charts. Which I suspect will be true of the people looking at the project I'm working on. So check off that one for Bamboo.&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
Most of these servers have some kind of integration with the tooling, but of course, it's not strictly necessary that they do, is it? After all, isn't the idea that you're going to remove the onus of constantly testing the build from the shoulder's of the developers? Even still,  &lt;a href="http://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt; , from IntelliJ (makers of &lt;a href="http://www.jetbrains.com/intellij/"&gt;IntelliJ IDEA&lt;/a&gt;) is indicative of where the market is heading.. part of the ALM market craze that caused Borland to switch course a few years back. I wonder what their integration is... &lt;a href="http://www.borland.com/us/products/silk/gauntlet/index.html"&gt;Apparently it's something called Gauntlet.&lt;/a&gt; I wonder why I haven't heard more from them about this.  &#xD;
 &lt;/p&gt;&lt;p&gt;&#xD;
I write this down now so I have something to mind map tomorrow when I'm more lucid.&#xD;
&lt;/p&gt;</description>
      <pubDate>Tue, 19 Aug 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/continous_integration_conundrum.html</guid>
      <dc:date>2008-08-19T00:00:00Z</dc:date>
    </item>
    <item>
      <title>mvn archetype:generate</title>
      <link>http://www.joshlong.com:80/jl/blogPost/mvn_archetype_generate.html</link>
      <description>Did you know that &lt;code&gt;mvn archetype:generate&lt;/code&gt;, by itself, on the command line, yeilds a listing of all the archetypes you have available? I just stumbled upon this today - great trick!</description>
      <pubDate>Thu, 14 Aug 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/mvn_archetype_generate.html</guid>
      <dc:date>2008-08-14T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Keith Donald speaking on Spring Web MVC 2.5 and Beyond at this week's Phoenix Java User Group</title>
      <link>http://www.joshlong.com:80/jl/blogPost/keith_donald_speaking_on_spring.html</link>
      <description>&lt;p&gt;
Keith Donald's going to be at this week's &lt;a href="http://www.phxjug.org/"&gt;Phoenix Java User Group&lt;/a&gt; talking about Spring MVC and Spring WebFlow 2.5/2.0, respectively! I am bringing at least 3 friends, I suggest if you can make it, you should try and go. I had a weird month last month so I missed it, but I can't wait for this one! 

&lt;/p&gt;</description>
      <pubDate>Sun, 10 Aug 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/keith_donald_speaking_on_spring.html</guid>
      <dc:date>2008-08-10T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Subversion 1.5, IntelliJ IDEA, and you</title>
      <link>http://www.joshlong.com:80/jl/blogPost/subversion_1_5_intellij_idea.html</link>
      <description>&lt;p&gt; I recently had to upgrade a project to Subversion 1.5 which caused IntelliJ's Subversion support to lose its mind. It would paint the files blue as though it realized the file was &amp;quot;dirty&amp;quot; but then when I hit ctrl + k to submit the changes to Subversion, it would respond, &amp;quot;No Changes found&amp;quot;.  I did some sleuthing: &lt;a href="http://www.jetbrains.net/confluence/display/IDEADEV/Selena+EAP"&gt;IntelliJ IDEA build 7938&lt;/a&gt; fixes the issue.&#xD;
&lt;/p&gt;&lt;p&gt;I installed the new version and opened up a project and everything was in error. It was almost as thought it didn't have a JDK set, so I tried to point it at a JDK but that didn't work. Finally, I removed my IntelliJ metadata folder (a desperate move, but I had little time and nothing to lose) which is where IntelliJ stores user specific metadata (&lt;code&gt;/home/jlong/.IntelliJIdea70&lt;/code&gt;). &lt;b&gt;That&lt;/b&gt; worked! &#xD;
&lt;/p&gt; &lt;p&gt; In all, I lose 20 minutes of time. By far, one of the longest periods that IntelliJ itself (where it wasn't genuine user error!) has delayed me... now, Eclipse on the other hand...  &lt;/p&gt;</description>
      <pubDate>Sun, 10 Aug 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/subversion_1_5_intellij_idea.html</guid>
      <dc:date>2008-08-10T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Installng PostGIS and the TIGER Geocoder</title>
      <link>http://www.joshlong.com:80/jl/blogPost/installng_postgis_and_the_tiger.html</link>
      <description>&lt;p&gt;Note this is an incomplete document. I have yet to confirm that this works 100%, but here are the things I noted while installing PostGIS' TIGER Geocoder. First and foremost, the source code is available via &lt;code&gt;svn co http://svn.refractions.net/postgis/trunk/extras/tiger_geocoder&lt;/code&gt;. A lot of this information is an incomplete copy of what's available from : &lt;a href="http://postgis.refractions.net/support/wiki/index.php?PostgisOnUbuntu"&gt;http://postgis.refractions.net/support/wiki/index.php?PostgisOnUbuntu&lt;/a&gt; &lt;/p&gt;&lt;p&gt;What follows are the instructions as present in the source code. I'll interpolate the bits that were a little unclear and required assistance for me so you can benefit from them.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Install postgresql-8.2-postgis (For various GIS bits). For Ubuntu Hardy users, this was a mere &lt;code&gt;sudo apt-get install postgresql-8.3 postgresql-contrib-8.3 postgresql-8.3-postgis&lt;/code&gt;. Invariably, you'll need some extra tool support so: &lt;code&gt;sudo apt-get install gdal-bin python2.5-gdal &lt;/code&gt; (Obviously, you should have Python installed, too.). Interestingly, my installation has thus far been a failure since I chose to use Postgres 8.3. If you're on Gutsy or prior, you may have better luck (in fact, I'm almost 100% sure you will) with Postgres 8.2, against which the geocoder code seems to have been tested. I can't guaranteee these instructions are the same, however. They should be.. I can't imagine any of these dependencies not existing in the version of the distro that's just 6 months old :-), but the versions may be different. Anyway: take away is that you should install 8.2 but be cautious. The rest of these instructions are referencing my 8.3 installation, so please change them as necessary. &lt;/li&gt; &lt;li&gt; Install PostGIS functions and spatial ref definitions. This enables PostGIS itself on your database. &lt;br /&gt; &lt;code&gt; \i /usr/share/postgresql-8.3-postgis/lwpostgis.sql \i /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql &lt;/code&gt; &lt;/li&gt; &lt;li&gt; Install postgresql-contrib-8.3 for soundex (from fuzzystrmatch)&lt;code&gt;This looks something like: &lt;/code&gt; psql -U postgres your_database_name &amp;lt; /usr/share/postgresql/8.3/contrib/fuzzystrmatch.sql . There's all sorts of worthy things in the contrib modules, so take your time and do some research and install anything you think useful. &lt;/li&gt; &lt;li&gt; Obtain the TIGER data from the Census site. I used &lt;code&gt;wget -r http://www2.census.gov/geo/tiger/tiger2006se&lt;/code&gt; &lt;/li&gt; &lt;li&gt; You need to modify, and then run, &lt;code&gt;import/load_tiger.sh. &lt;/code&gt;. What this will do is load all the TIGER data from http://www2.census.gov/geo/tiger/tiger2006se/ into the database in a sort of raw unfettered way so that the processing to setup the Geocoder works. Here are the modifications I made before running it:&lt;br /&gt; &lt;code&gt;&lt;/code&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;FIRST=&amp;quot;&amp;quot;&lt;br /&gt;for file in /home/jlong/Desktop/gis/www2.census.gov/geo/tiger/tiger2006se/*/*.ZIP; do&lt;br /&gt; ./tigerimport.sh append MYDATABASE $file $FIRST&lt;br /&gt; if [ -z &amp;quot;$FIRST&amp;quot; ]; then&lt;br /&gt; FIRST=&amp;quot;-a&amp;quot;&lt;br /&gt; fi&lt;br /&gt;done&lt;/pre&gt; You see? All I change was the value for MYDATABASE and the value for pointing tot he directory where I had downloaded all the data fromthe census site. Also, I modified tigerimport.sh itself. Whenever I saw lines starting with ogr2ogr, I modified the connection paramaters as appropriate: &lt;code&gt;ogr2ogr $PRE $OGROPTS $SRS &amp;quot;PG:dbname=$DATABASE user=MYUSEr password=MYPW host=127.0.0.1&amp;quot; $TIGER CompleteChain $POST&lt;/code&gt;. For my setup, I needed to specify the host. Which I guessed was done using a 'host=127.0.0.1' parameter. That seemed to work. Simialarly, before you start importing everything, you may run into encoding issues down the line after this step. You can 'undo' it afterwards. This was necessary as the client's talking to my database were trying to send non UTF8 data to my database which was UTF8. &lt;code&gt;ALTER DATABASE lemanger SET client_encoding=latin1; &lt;/code&gt;. Alright, finally, run the script above once you're confident everything's changed the way it needs to be! &lt;strong&gt;Warning&lt;/strong&gt; On my personal workstation with a 3GHz Pentium 4 (Not dual core, but still, no slouch) and 2 GB of RAM, this process took 28 hours and 30GBs or so of space. This is not a 'grab a cup of coffee' situation. This is, 'go visit the family ... in the next state... and stop all other concurrently running programs on the workstation for a day' situation. In total -- by the way -- so you don't get in over your head, I needed upwards of 100 GB of free space to complete this process. Some of that space is eventually recoverable, because it's temporary. But still, if you want to preflight this process with just one state, that may be advisable if you have a small hard disk. Another thing to note by the way is that a 'State', in this case, is a state of the United States and includes in its definition 59 entities that aren't from the 50 proper US 'States', including Puerto Rico, for example. Very cool. &lt;/li&gt; &lt;li&gt; Here's where I'm only a little sure of what to do and I could -- in fact -- be wrong. I did get pointed in the right direction (thank you Stephen Woodbridge!), so hopefully this is correct. The next step consists of creating tables that the geocoder will need from another set of data, the US Census Shape Boundry files. They are are at http://www.census.gov/geo/www/cob/bdy_files.html. You don't need them all, just a few. They organized according to a code, as described here: http://www.census.gov/geo/www/cob/filenames.html. Thus, each file is a data set, and some correspond to granularities smaller than 'national'. When you see some of the tables that you're expected to have installed, it's looking for 'national' data sets, and I couldn't find them for all of them. It needs tables of the following type: &lt;ul&gt; &lt;li&gt; cs99_d00 - &lt;a href="http://www.census.gov/geo/www/cob/cs2000.html"&gt; county subdivisions&lt;/a&gt; &lt;/li&gt;&lt;li&gt;pl99_d00 &lt;a href="http://www.census.gov/geo/www/cob/pl2000.html"&gt;places&lt;/a&gt; &lt;/li&gt;&lt;li&gt;co99_d00 &lt;a href="http://www.census.gov/geo/www/cob/co2000.html"&gt;counties&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; Mouse over the links to verify that data you're looking at has the code as the data you want. Since 99 means national, and 00 means year 2000, and the part in the begining is the abbreviation, then you know that cs99_d00 is probably county subdivisions from the year 2000 for the national level, which is http://www.census.gov/geo/www/cob/cs2000.html. Notice that there's no 99. And that there's no single set of data! in this case I think we're after &lt;em&gt;just&lt;/em&gt; the .SHP files. For me, it was easier to download those listing pages to my local disk somewehre and then extract the URLs and then download them from that list. Here's I did that.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;cat cs_listing.html |grep -i shp |grep geo|cut -f2 -d\&amp;quot;| while read url; &lt;br /&gt; do &lt;br /&gt; nurl=&amp;quot;http://www.census.gov$url&amp;quot; &lt;br /&gt; echo $nurl; &lt;br /&gt;done &amp;gt; base_of_zip_files.txt &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; That got me a listing of the zip files that I wanted. The next trick was to download those zip files: &lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;cat base_of_zip_files.txt | while read url; &lt;br /&gt; do &lt;br /&gt; nurl=&amp;quot;http://www.census.gov$url&amp;quot; &lt;br /&gt; echo $nurl; &lt;br /&gt; wget $nurl &lt;br /&gt;done &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; That will take a few minutes. I couldn't get the data all in one for anything but the counties dataset. So, I had to download all the data and forge from them one aggregate data. It helps to be meticulous and create a 'boundry' folder inside of which you create separate 'cs', 'co', and 'pl' folders for these datasets. &lt;/li&gt; &lt;li&gt; Once you've downloaded all the datasets, you'll need to install them. Here's my slightly modified version of the script from the installation instructions that come witht he Tiger geocoder. I created one for each dataset and ran it in the same folder as the particular dataset itself:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt; find . -iname &amp;quot;*ZIP&amp;quot;|while read l;&lt;br /&gt; do&lt;br /&gt; mkdir -p x; &lt;br /&gt; rm -rf x ;&lt;br /&gt; mkdir x ;&lt;br /&gt; cd x; &lt;br /&gt; unzip .$l; &lt;br /&gt;BASE=`echo *.shp | cut -f1 -d.` ;&lt;br /&gt;ogr2ogr -append -f PostgreSQL -a_srs EPSG:4269 &amp;quot;PG:dbname=DATABASE host=127.0.0.1 \&lt;/code&gt;&lt;br /&gt;&lt;code&gt; user=USER password=PASSWORD&amp;quot; $BASE.shp $BASE -nln &lt;em&gt;TABLE_NAME&lt;/em&gt; -lco DIM=2&lt;br /&gt; cd ..; &lt;br /&gt;&lt;br /&gt;done &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; Basically, TABLE_NAME is the name of the table (one of the three I mentioned above, dependant on which dataset you're dealing with.) and the rest is just the information needed to get into your database. By the way, if you didn't do the client encoding step I mentioned above, this is where it may bite you in the butt. &lt;/li&gt; &lt;li&gt; Create geometry indexes on all the tables using GiST, eg: &lt;pre&gt;&lt;code&gt; CREATE INDEX completechain_geom_idx ON completechain &lt;/code&gt;&lt;br /&gt;&lt;code&gt; USING GIST (wkb_geometry public.gist_geometry_ops);&lt;br /&gt;&lt;/code&gt; &lt;/pre&gt; &lt;br/&gt; Naturally, since this is operating on the 66 million record behemoth you created in the beginning, this will take many hours. Go watch a movie... or two. &lt;/li&gt; &lt;li&gt; NB: the following steps are pretty straight forward, if a bit tedious. In particular, one of them is &lt;strong&gt;REALLY&lt;/strong&gt; slow and another one is going to break if you're trying this on 8.3 due to cast errors, complaining of comparisons of integers to char/text/varchar data types. The errors are pretty self explanatory and will show you what needs to be fixed. Typically it's just a matter of changing the expression in question to what it was, plus &amp;quot;::text&amp;quot; to incur a cast. &lt;/li&gt; &lt;li&gt; Create lookup tables using &lt;code&gt;tables/lookup_tables.sql&lt;/code&gt;. &lt;/li&gt; &lt;li&gt; Create roads_local using &lt;code&gt;roads_local.sql &lt;/code&gt;. I think this one is the one that does a derivation from a dataset produced by a join on one of the bigger tables, and so it too takes an incredibly long time. 5 hours, or so. &lt;/li&gt; &lt;li&gt; Create 'tiger_geocode_roads' using &lt;code&gt;tiger_geocode_roads.sql&lt;/code&gt; &lt;/li&gt; &lt;li&gt;Run &lt;code&gt;create_geocode.sql&lt;/code&gt; to load the functions &lt;/li&gt; &lt;li&gt; Profit! &lt;/li&gt; &lt;/ol&gt;</description>
      <pubDate>Sun, 13 Jul 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/installng_postgis_and_the_tiger.html</guid>
      <dc:date>2008-07-13T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Digression: Setting Up Spring, Velocity, JavaMail, Multi Part MIME messages and Gmail</title>
      <link>http://www.joshlong.com:80/jl/blogPost/1.html</link>
      <description>This took quite a bit of Googling to get right, so here it is summarized to help prospective journey makers. Spring's integration is very good for the common cases, but lack of insight can prevent you from achieving more complex integrations. For example, I wanted to be able to authenticate against Gmail (this is a program I'm writing to scratch a personal itch, but nonetheless knowing how to authenticate against SSL is a very useful thing in the enterprise.). Then I wanted to be able to send email messages that rendered as HTML for the sophisticated email clients that supported it (I suspect that's the overwhelming majority at this point - it's been a while since &lt;a href="http://rfc.sunsite.dk/rfc/rfc822.html" target="_blank"&gt;RFC 822&lt;/a&gt; was relevant!)&amp;nbsp; and have the content fall back to plain text content otherwise. Finally, I wanted to integrate with Velocity so that I could parameterize my emails readily. This begat the following method, a few stanzas of Spring configuration, and a properties file. &lt;span style="FONT-WEIGHT: bold"&gt;NB&lt;/span&gt;: Replace the values in the properties file with your own information!&amp;nbsp; &lt;br /&gt;&#xD;
  &lt;p&gt;See the &lt;code&gt;public static void main(String[] args)&lt;/code&gt; method to see an example invocation of this code. &lt;br /&gt;&lt;/p&gt;&#xD;
  &lt;pre&gt;# utils.properties&lt;br /&gt;mail.smtp.host=smtp.gmail.com&lt;br /&gt;mail.username=USERNAME@gmail.com&lt;br /&gt;mail.password=PASSWORD &lt;br /&gt;mail.smtp.port=465 &lt;/pre&gt;&#xD;
  &lt;p&gt;The Spring configuration file is not as overwhelming as it looks - most of it is scaffolding.&lt;/p&gt;&#xD;
  &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot; &lt;br /&gt;    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot; &lt;br /&gt;      xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;       xsi:schemaLocation=&amp;quot;&lt;br /&gt;         http://www.springframework.org/schema/beans&lt;br /&gt;         http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;         http://www.springframework.org/schema/tx&lt;br /&gt;         http://www.springframework.org/schema/tx/spring-tx-2.0.xsd&lt;br /&gt;         http://www.springframework.org/schema/aop&lt;br /&gt;         http://www.springframework.org/schema/aop/spring-aop-2.0.xsd&lt;br /&gt;         http://www.springframework.org/schema/lang&lt;br /&gt;         http://www.springframework.org/schema/lang/spring-lang-2.0.xsd&lt;br /&gt;        &amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean id=&amp;quot;mailSender&amp;quot; class=&amp;quot;org.springframework.mail.javamail.JavaMailSenderImpl&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;host&amp;quot; value=&amp;quot;${mail.smtp.host}&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;port&amp;quot; value=&amp;quot;${mail.smtp.port}&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;username&amp;quot; value=&amp;quot;${mail.username}&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;password&amp;quot; value=&amp;quot;${mail.password}&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;javaMailProperties&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;props&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.host&amp;quot;&amp;gt;${mail.smtp.host}&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.port&amp;quot;&amp;gt;${mail.smtp.port}&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.auth&amp;quot;&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.starttls.enable&amp;quot;&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.debug&amp;quot;&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.socketFactory.port&amp;quot;&amp;gt;${mail.smtp.port}&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.socketFactory.class&amp;quot;&amp;gt;javax.net.ssl.SSLSocketFactory&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;prop key=&amp;quot;mail.smtp.socketFactory.fallback&amp;quot;&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt;            &amp;lt;/props&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean id=&amp;quot;emailUtils&amp;quot; class=&amp;quot;com.joshlong.example.util.EmailUtils&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;mailSender&amp;quot; ref=&amp;quot;mailSender&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean class=&amp;quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;location&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;utils.properties&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name=&amp;quot;ignoreUnresolvablePlaceholders&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/p&gt;&#xD;
  &lt;p&gt;And finally, the utility code itself. I have a Maven POM that's bringing in most of this stuff. You could probably get there by using Spring-All and making sure to add velocity, Apache Commons Lang, and the JavaMail/Activation jars. &lt;p&gt;&#xD;
  &lt;pre&gt;&lt;br /&gt;package com.joshlong.example.util;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.io.IOUtils;&lt;br /&gt;import org.apache.commons.lang.StringUtils;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.apache.velocity.VelocityContext;&lt;br /&gt;import org.apache.velocity.app.Velocity;&lt;br /&gt;import org.apache.velocity.tools.generic.DateTool;&lt;br /&gt;import org.springframework.context.ApplicationContext;&lt;br /&gt;import org.springframework.context.support.ClassPathXmlApplicationContext;&lt;br /&gt;import org.springframework.mail.MailException;&lt;br /&gt;import org.springframework.mail.javamail.JavaMailSenderImpl;&lt;br /&gt;&lt;br /&gt;import javax.mail.Message;&lt;br /&gt;import javax.mail.internet.InternetAddress;&lt;br /&gt;import javax.mail.internet.MimeBodyPart;&lt;br /&gt;import javax.mail.internet.MimeMessage;&lt;br /&gt;import javax.mail.internet.MimeMultipart;&lt;br /&gt;import java.io.StringWriter;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt; /** &lt;br /&gt;  *&lt;br /&gt;  * @author Josh Long&lt;br /&gt;  * &lt;br /&gt;  * This class is designed to support _easily_ sending out e-mails and parameterizing them. &lt;br /&gt;  * In approach, this is &amp;lt;i&amp;gt;almost&amp;lt;/i&amp;gt; as simple as PHP's send() function! Naturally, it's&lt;br /&gt;  * quite a bit more powerful for it's simplicity. &lt;br /&gt;  * &lt;br /&gt;  */&lt;br /&gt;public class EmailUtils {&lt;br /&gt;&lt;br /&gt;    private Logger log = Logger.getLogger(EmailUtils.class);&lt;br /&gt;    private JavaMailSenderImpl mailSender;&lt;br /&gt;&lt;br /&gt;    public JavaMailSenderImpl getMailSender() {&lt;br /&gt;        return mailSender;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setMailSender(JavaMailSenderImpl mailSender) {&lt;br /&gt;        this.mailSender = mailSender;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String a[]) throws Throwable {&lt;br /&gt;        ApplicationContext context = new ClassPathXmlApplicationContext(&amp;quot;utils.xml&amp;quot;);&lt;br /&gt;        EmailUtils utils = (EmailUtils) context.getBean(&amp;quot;emailUtils&amp;quot;);&lt;br /&gt;        Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;        params.put(&amp;quot;user&amp;quot;, &amp;quot;John Doe&amp;quot;);&lt;br /&gt;        utils.sendEmailMessage(&amp;quot;from@foobar.com&amp;quot;, new String[]{&amp;quot;towhoever@gmail.com&amp;quot;}, &lt;br /&gt;           &amp;quot;A Subject&amp;quot;, &amp;quot;Hello ${user} from plain text&amp;quot;,&lt;br /&gt;           &amp;nbsp;&amp;quot;&amp;lt;h1&amp;gt;Hello ${user} from High Fidelity HTML&amp;lt;/h1&amp;gt;&amp;quot;, params);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String mergeTemplate(String template, Map&amp;lt;String, Object&amp;gt; macros) throws Throwable {&lt;br /&gt;&lt;br /&gt;        if (StringUtils.isEmpty(template))&lt;br /&gt;            return StringUtils.EMPTY;&lt;br /&gt;&lt;br /&gt;        String answer = null;&lt;br /&gt;&lt;br /&gt;        VelocityContext context = new VelocityContext();&lt;br /&gt;&lt;br /&gt;        context.put(&amp;quot;dateTool&amp;quot;, new DateTool());&lt;br /&gt;&lt;br /&gt;        for (String key : macros.keySet())&lt;br /&gt;            context.put(key, macros.get(key));&lt;br /&gt;&lt;br /&gt;        StringWriter writer = new StringWriter();&lt;br /&gt;&lt;br /&gt;        Velocity.init();&lt;br /&gt;&lt;br /&gt;        if (Velocity.evaluate(context, writer, &amp;quot;LOG&amp;quot;, template)) {&lt;br /&gt;            IOUtils.closeQuietly(writer);&lt;br /&gt;            answer = writer.toString();&lt;br /&gt;        }&lt;br /&gt;        return answer;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void sendEmailMessage(String from, String[] to, String subject, String textBody, String htmlBody, Map&amp;lt;String, Object&amp;gt; params) throws Throwable {&lt;br /&gt;&lt;br /&gt;        MimeMessage msg = mailSender.createMimeMessage();&lt;br /&gt;&lt;br /&gt;        msg.setFrom(new InternetAddress(from));&lt;br /&gt;        msg.setSubject(subject);&lt;br /&gt;        msg.setRecipients(Message.RecipientType.TO, getInternetAddresses(to));&lt;br /&gt;&lt;br /&gt;        MimeMultipart content = new MimeMultipart(&amp;quot;alternative&amp;quot;);&lt;br /&gt;&lt;br /&gt;        if (!StringUtils.isEmpty(textBody)) {&lt;br /&gt;            MimeBodyPart text = new MimeBodyPart();&lt;br /&gt;            text.setText(mergeTemplate(textBody, params));&lt;br /&gt;            content.addBodyPart(text);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (!StringUtils.isEmpty(htmlBody)) {&lt;br /&gt;            MimeBodyPart html = new MimeBodyPart();&lt;br /&gt;            html.setContent(mergeTemplate(htmlBody, params), &amp;quot;text/html&amp;quot;);&lt;br /&gt;            content.addBodyPart(html);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        msg.setContent(content);&lt;br /&gt;        msg.saveChanges();&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            mailSender.send(msg);&lt;br /&gt;        } catch (MailException ex) {&lt;br /&gt;            log.info(&amp;quot;Issue with sending out mail having body &amp;quot; + StringUtils.defaultString(textBody) + &amp;quot;; params are:&amp;quot; + params, ex);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private InternetAddress[] getInternetAddresses(String... emails) throws Throwable {&lt;br /&gt;        List&amp;lt;InternetAddress&amp;gt; addys = new ArrayList&amp;lt;InternetAddress&amp;gt;();&lt;br /&gt;        for (String e : emails)&lt;br /&gt;            addys.add(new InternetAddress(e));&lt;br /&gt;        return addys.toArray(new InternetAddress[0]);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;</description>
      <pubDate>Sat, 14 Jun 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/1.html</guid>
      <dc:date>2008-06-14T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Modeling Conversations</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20080612.html</link>
      <description>&lt;p&gt;Most systems have context that lasts longer than the typical request/ response of the clients and servers involved in the system, but shorter than the lifetime of the business entities that define the domain model. This is called "conversational" state. The naļve way to handle conversational state is to clutter the domain model with "state" flags that mark benchmarks against some sort of process. &lt;/p&gt; &lt;p&gt;Typically, these state flags aren't useful data to the enterprise. Sometimes they do correspond with business events, in which case they perhaps deserve a flag. When they don't however, it is a grave mistake to enshrine these passing values in the data tier. Take for example the simple process of signing up a user. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="__971_0__"&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;The only real business data here is that the customer has signed up and is in a consistent state, or that she hasn't, in which case perhaps the inconsistent data should be expunged from the system. To model this, however, you would have to have some way to note whether or not the user is in the process of signing up, whether she's gotten a confirmation email, whether she's clicked on the confirmation link in the email and whether she's completed the sign up process. And that's for a very SIMPLE process with two "actors" (modeled as swimlanes ? the user and the services)! Imagine what something even mildly complex with concurrent processes would look like! &lt;/p&gt; &lt;p&gt;What you need is some way to divorce process state from the domain model entirely and keep it in a structure designed to measure state. In the case of something like Spring Web Flow or JBoss Seam's jPDL page flow language for the wizard interaction, that state is stored in the session and measures progress against mile-markers in a "flow". In the case of a true workflow / Business Process Management system like jBPM that state is typically stored in the database. Each milestone is called an activity. Because the structure keeps track of where any given process is relative to the whole process, you can derive metrics from these systems that are useful to the business. &lt;/p&gt; &lt;p&gt;So now you know how to model a conversation. Generally. What you need is some way to "code" an activity diagram. That's where a BPM system comes in play. &lt;/p&gt; &lt;p&gt;Next, we'll discuss actually using a BPM system, &lt;a href="http://www.jboss.com/products/jbpm" target="_blank"&gt;jBPM&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 12 Jun 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20080612.html</guid>
      <dc:date>2008-06-12T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Samuel Jackson for HTTP error codes!! Awesome.</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20080525.html</link>
      <description>&lt;a href="http://streaming.linux-magazin.de/events/apacheconfree/archive/rfielding/frames-java.htm" target="_blank"&gt;Roy Fieldings on Apache 3.0&lt;/a&gt; (well, sort of -- more of a series of hopeful hypotheticals than anything else...). It's brilliant: my favorite idea? Using &lt;a href="http://www.samuelljackson.com" target="_blank"&gt;Samuel Jackson&lt;/a&gt; pictures and quotes for all HTTP error codes!</description>
      <pubDate>Sun, 25 May 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20080525.html</guid>
      <dc:date>2008-05-25T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Webmonkey.com is back!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20080524.html</link>
      <description>Webmonkey.com is back! I just noticed this -- it's laid dormant for years and was -- in my humble opinion -- one of the coolest places to catch up on technology in its heyday. Go &lt;a href="http://www.webmonkey.com/" target="_blank"&gt;webmonkey.com&lt;/a&gt;!</description>
      <pubDate>Sat, 24 May 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20080524.html</guid>
      <dc:date>2008-05-24T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Spring Application Server</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20080430.html</link>
      <description>&lt;p&gt;Uh oh! I guess I was asleep at the wheel on this one! SpringSource (the company that was formerly called Interface21 and (obviously) which funded the development / growth of the Spring Framework) has announced a Java application server. I am more than a little leary about this, however. It's not based on Java EE (yet, though apparently that's not out of the picture with Java EE6's "profiles"), and is instead a sort of best-of-breed setup of Tomcat and a slew of components from the "Spring Portfolio."&amp;nbsp; (Think: Spring web flow, Spring web services, Spring LDAP.. is Spring batch in there?) &lt;/p&gt;&lt;p&gt;Could be interesting. Using OSGi to sidestep the whole kernel architecture issue was smart, and reflective of what everybody seems to be doing. OSGi seems to be the "next big thing." Super packages, a proposed feature set in Java 7, reflects this.&lt;/p&gt;&lt;p&gt;Do you remember when there was just a Spring IOC container, and then for a long time, a Spring IOC container, a web framework and a page flow framework? I suppose I should've seen this coming when the dependency injection container grew web-framework legs. &lt;/p&gt;&lt;p&gt;Anyway, the application server looks interesting (at this second I cant find any mention of it on either SpringFramework.org or SpringSource.com), but infoq.com has an interesting bit on it (http://www.infoq.com/news/2008/04/springsource-app-platform). They've taken Tomcat (which they contend - rightly so - is all the application server 80% of JEE users are using anyway) and loaded it up with the "Spring Portfolio" and - using OSGi - have provided a kernel to service the components deployed to the server. In short, it sounds like a full blown application server wherein the lookups have been removed. I am not sure if this is revolutionary or evolutionary. If they've merely provided an OSGi core and brought commodity libraries into the fold to provide an integrated solution, then I'm not sure how it'll help people who've already got a JBoss or a Glassfish working.&amp;nbsp; If however you're looking to craft a "lightweight" solution from scratch, maybe this is just what the doctor ordered.&lt;/p&gt;&lt;p&gt;I don't really like the tact SpringSource.com seems to be taking with their marketing: (from &lt;a href="http://www.springsource.com/web/guest/products/enterprise/edition"&gt;their marketing&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;"Spring Enterprise Edition is certified and warranted to be virus-free and has undergone rigorous testing to ensure that you receive the highest reliability. Indemnification is provided at the gold and platinum subscription levels. Indemnity provides organizations with additional peace of mind and the assurance that SpringSource promptly rectifies any potential intellectual property issues." &lt;/p&gt;&lt;p&gt;Is that really an issue? Viruses? Did they mean bugs? I don't know that I've ever had to run a virus scan on a Java assembly before I used it. &lt;/p&gt;&lt;p&gt; I love the Spring framework. I'm sorry to see such pandering. &amp;nbsp;I wonder what else the technology will yield. &lt;/p&gt;</description>
      <pubDate>Wed, 30 Apr 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20080430.html</guid>
      <dc:date>2008-04-30T00:00:00Z</dc:date>
    </item>
    <item>
      <title>JAWR: a JavaScript compression library</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20080412.html</link>
      <description>&lt;p&gt;With rich internet applications being all the buzz these days people are finding themselves pouring more and more interactivity onto their pages. Typically, this is if nothing else through a slew of external third party libraries, or as with Dojo and Scriptaculous and YUI, entire frameworks! Taken one at a time these various scripts ? used sparingly and perhaps compressed ? don't cause too much a burden on your server or the client during download. Right... &amp;nbsp;&lt;/p&gt;&lt;p&gt;So say you build up a complex layout / widget set for your site. Say that you're also consistently using prototype.js and rico.js and a few of the scriptaculous libraries and that you've also got a few other 'commodity' scripts that are used everywhere (company libraries, a widget built on prototype, etc, etc).&amp;nbsp; Anything. Now you've got 6 different .js files to include on every page, and you haven't even STARTED loading your code ? you remember that code, right? The code that actually does the line of business you set out to help with this application in the first place? All these HTTP requests are bad for the server, but they're also really bad for the client. Load enough scripts and eventually things to start to deteriorate, even crash, on the client. &lt;/p&gt;&lt;p&gt;So now you see the problem. Different half-solutions exist. The Dojo framework has done extensive work to provide a compressor that runs as an ant task and that even obfuscates your code. One version ? thanks to a donation by AOL - even does dead code path elimination! However this is a Dojo-only solution and, frankly, I found it a little fragile if you do anything cute in your JavaScript.&amp;nbsp; Another solution is the GWT route from Google. GWT takes lava code and &amp;quot;compiles&amp;quot; into JavaScript. The advantage of this is that the JavaScript is super-lean / optimized to work across browsers and mechanically, and utterly concise. The disadvantage of it is that ? like the Dojo solutions ? is inextricably tied to the GWT framework. &lt;/p&gt;&lt;p&gt;There are JavaScript compressors. http://www.brainjar.com/js/crunch/ has been around for the better part of a decade! There are others- - and the idea is the same: take JavaScript and regex your way into a more compact JavaScript file. Some of these solutions become unusable if you neglect to terminate your statements with a semicolon as they blindly wrap all the lines together, yielding non-runnable JavaScript code. Two other problems with this solution ? as with the others previously mentioned-- is that it's not automated. Each time you update your code, you need to re run it all through that program on the site. Similarly, it's only compressing the code itself, not the format in which its delivered to the client. G-Zip compression works great for JavaScript content, so long as it it's not served to browsers that don't support it. &lt;/p&gt;&lt;p&gt;My definition of an ideal solution would be something that knew how to combine multiple libraries into one, compact that code except where the resulting source code would be made un runnable ? and that conditionally served gzip content. &lt;/p&gt;&lt;p&gt;Enter JAWR, a library freely available from https://jawr.dev.java.net/ that does all of the above. It even can work its magic on .css files! It provides tag libraries (accessible from both JSP and now ?with the 2.0 release ? from Facelets). I'm sure if you were so inclined you could reverse engineer the tag library handlers and wrap it in a Tapestry component or a Wicket widget. &lt;/p&gt;&lt;p&gt;Below, I walk through setting up a simple example: &lt;/p&gt;&lt;p&gt;For my example, I'm using JSF and Maven. Set up the web application however you like. If you're using Maven, here is the dependency I'm using: &lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;code&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;net.jawr&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;jawr&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;[1.4,]&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;p&gt;Ensure that you have the following repository added to Maven: &lt;/p&gt;&lt;code&gt;&amp;nbsp;&amp;lt;repository&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;Java.net Repository for Maven&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://download.java.net/maven/2/&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;/code&gt;&lt;p&gt;I configured the JAWR servlet to handle my JavaScript files in my web.xml as follows:&lt;/p&gt;&lt;code&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;servlet-name&amp;gt;JavascriptServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;servlet-class&amp;gt;net.jawr.web.servlet.JawrServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;param-name&amp;gt;type&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;param-value&amp;gt;js&amp;lt;/param-value&amp;gt; &amp;lt;!-- this could be css --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;!-- Location in classpath of the config file --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;param-name&amp;gt;configLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;param-value&amp;gt;jawr.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/servlet&amp;gt; &amp;nbsp;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;servlet-name&amp;gt;JavascriptServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;url-pattern&amp;gt;*.js&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;p&gt;The above configuration requires the presence of a file named jawr.properties on the classpath. &lt;/p&gt;&lt;p&gt;Here's my &lt;code&gt;jawr.properties&lt;/code&gt;. &lt;/p&gt;&lt;code&gt; #https://jawr.dev.java.net/docs/descriptor_syntax.html&lt;br /&gt;# Common properties&lt;br /&gt;jawr.debug.on=false&lt;br /&gt;jawr.gzip.on=true&lt;br /&gt;jawr.gzip.ie6.on=false&lt;br /&gt;jawr.charset.name=UTF-8 # Javascript properties and mappings&lt;br /&gt;jawr.js.bundle.basedir=/lib/js&lt;br /&gt;jawr.js.commonURLPrefix=003&lt;br /&gt;jawr.js.bundle.names=appcore,railsjs# All files within /js/lib will be together in a bundle.&lt;br /&gt;# The remaining scripts will be served sepparately.jawr.js.bundle.effects.id=/bundles/effects.js&lt;br /&gt;jawr.js.bundle.effects.global=true&lt;br /&gt;jawr.js.bundle.effects.mappings=/lib/js/scriptaculous/**&lt;br /&gt;jawr.js.bundle.effects.prefix=effects&lt;/code&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;jawr.js.bundle.appcore.id=/bundles/appcore.js&lt;br /&gt;jawr.js.bundle.appcore.global=true&lt;br /&gt;jawr.js.bundle.appcore.mappings=/lib/js/appcore/**&lt;br /&gt;jawr.js.bundle.appcore.prefix=appcore &amp;nbsp;&amp;nbsp;&lt;p&gt;The configuration format is somewhat akin to editing a log4j.properties property file.&lt;/p&gt;&lt;p&gt;In the example above, I'm creating two &amp;quot;bundles&amp;quot; of JavaScript files. All JS in a set is compressed together and made available as one file. It also condenses the JavaScript within the file, condensing new lines. However, if you have JavaScript on two lines and didn't use a semi-colon to terminate the first one, it will leave the second line of JavaScript on a new line. &lt;/p&gt;&lt;code&gt;var a = 1&amp;nbsp; &lt;br /&gt;var b = 2&amp;nbsp; ; &lt;br /&gt;window.alert( 'a = ' + a + ' &amp;amp; b = ' + b ) ; &lt;br /&gt;&lt;/code&gt;&lt;p&gt;roughly becomes: &lt;/p&gt;&lt;code&gt;var a = 1&amp;nbsp; &lt;br /&gt;var b = 2&amp;nbsp; ; window.alert( 'a = ' + a + ' &amp;amp; b = ' + b ) ;&amp;nbsp; &lt;br /&gt;&lt;/code&gt;&lt;p&gt;Pretty cool, eh? &lt;/p&gt;&lt;p&gt;So, in the example above, I tell JAWR to create two &amp;quot;bundles&amp;quot;: &lt;/p&gt;&lt;p&gt;One bundle called &amp;quot;effects&amp;quot; takes together all the JavaScript files in the /lib/js folder and yields one single compressed JavaScript file. Accessing the JavaScript file is simple thanks to the tag libraries shipped with the framework. It's also smart: if you've enabled gzip compression and the client support its, an appropriate URL will be rendered, otherwise a non GZIP'ed but still &amp;quot;minified&amp;quot; JavaScript URL will be rendered. Nice!&lt;/p&gt;&lt;p&gt;Compiling the files at these URLs is time intensive, so by default when your application starts up JAWR caches the permutations of the files it'll deliver, so theres no overhead in request processing except for the tag library to render. If you are debugging in, say, Jetty and would like to make changes to your JavaScript and still benefit from immediate changes, you can enable debug mode and you can enable a periodic &amp;quot;refresh&amp;quot; of the cached bundles. This way, JAWR will write out the individual JavaScrpt files in the same way you were doing before the switch to JAWR. Flip the debug flag off and now it'll render the URL for the single cached / compressed JavaScript file.&lt;/p&gt;</description>
      <pubDate>Sat, 12 Apr 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20080412.html</guid>
      <dc:date>2008-04-12T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Adobe Media Player</title>
      <link>http://www.joshlong.com:80/jl/blogPost/200804121.html</link>
      <description>&lt;p&gt; Adobe's Finally Released Their Much Rumored Media Player: "Adobe Media&#xD;
Player"It's sweet. Built on AIR, it's a stand-alone "installable" Flash&#xD;
program that allows you to manage, search out, and watch FLV / H264&#xD;
content inside of Flash. It's beautiful to use but my big gripe is that&#xD;
because it runs on AIR, there's no Linux version.They seem to have&#xD;
lined up some pretty big content-producers, which should make the&#xD;
deployment easier. I wonder if they're fixing to be to digitial video /&#xD;
flash video what iTunes is to music. A one-stop video content shop /&#xD;
hub.. Absolutely stunning UI - and it's consistent with some of their&#xD;
more recent stuff, including Colour and Adobe Photoshop Express. I&#xD;
wonder where they'll take this - I wonder if there's a way to share&#xD;
video playlists etc? Integration with Youtube.com just like Apple TV&#xD;
did?&lt;/p&gt;</description>
      <pubDate>Sat, 12 Apr 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/200804121.html</guid>
      <dc:date>2008-04-12T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Hibernate and RMI and you.</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20080119.html</link>
      <description>Alright -- this one bugs me to no end. &lt;br&gt;&lt;br&gt;Have you ever worked with Hibernate, and some sort of Java remoting API on Java 1.6? That could apply to ALMOST anyone. EJB3 users &lt;span style="font-weight: bold;"&gt;(me!).&lt;/span&gt; Spring HttpInvoker/Hibernate3 &lt;span style="font-weight: bold;"&gt;(me!).&lt;/span&gt; RMI/Hibernate3 &lt;span style="font-weight: bold;"&gt;(me!).&lt;/span&gt; They all count. &lt;br&gt;&lt;br&gt;Did you get a bug whereby a remote client complains (err, blows chunks with a ClassCastException) about not being able to set a field on an entity/POJO that makes use of Hibernate's "lazy" initialization across the wire? You did? Were you going to tell me about it? I mean, come on. I thought we were friends.&lt;br&gt;&lt;br&gt;I upgraded Ubuntu and JBoss on my dev machine at home to be able to test. Amazingly bad things ensued. I spent a good hour finding a bug that I was sure must be afflicting other people. After all, it's essentially a bug in JBoss' EJB3. And Hibernate. And Java. And RMI. I don't know but it seemed rather hard to pin. &lt;br&gt;&lt;br&gt;It was a bug in Java 1.6. I don't know why, I don't know the details. &lt;a href="http://jira.jboss.org/jira/browse/JBAS-3952" target="_blank"&gt;This&lt;/a&gt; lone result (which eluded a lot of my google searches -- which means this was so minor an issue that even Google didn't find it!?) suggested a workaround and I - ears burning - jumped at the completely ridiculous, nonsensical solution. Because... it was just crazy enough to work. A few &lt;span style="font-weight: bold;"&gt;update-java-alternatives&lt;/span&gt; later, I was back on Java 1.5. I re-ran my tests. &lt;br&gt;&lt;br&gt;&lt;font size="2"&gt;IT WORKED WHY WOULD IT WORK? HOW WOULD THAT EVEN BEGIN TO BREAK?&lt;/font&gt;&lt;br&gt;&lt;br&gt;Everything's fine now! Hurrah. I can have my hour back, too?&amp;nbsp; No? &lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;MySQL got bought by Sun&lt;/span&gt;. &lt;span style="font-weight: bold;"&gt;Oracle bought BEA&lt;/span&gt;. I understand the BEA acquisition. Oracle's Application server sucks rocks. BEA is the gold standard and Oracle has cash to burn. Simple economics: don't innovate what you can accquire quicker.&lt;br&gt;&lt;br&gt;But why would Sun buy MySQL? Sun is pitching it as a rounding-out of its stack -- now they have the language (Java!), the database (JavaDB for embedded, MySQL for enterprise), the server (Glassfish) and the tool chain (javac, Netbeans, and the recently retired Sun Java Web creator, etc.).&lt;br&gt;&lt;br&gt;Does this put them in the line of sight of Oracle, which has a better database and a better application server? Why didn't they buy the company supportig Postgres, which is a better database (well, that is, I define "better" as being more readily deployed as a replacement for Oracle. Neither have particularly good clustering, enterprise features, but Postgres comes closer in terms of portability.)? Is Sun betting on the up-and-coming InnoDB database engine replacement (whose parent company Oracle owns, a propos) Falcon to make MySQL an Oracle killer? Even a Microsoft SQL Server killer? &lt;br&gt;&lt;br&gt;And of course, what does this mean for the PHP/Lamp community? MySQL's crossed over. It's got an air of "enterprise" to&amp;nbsp; it from Sun's purchase. More so than even their teamup with SAP. More so than MySQL's oft-public proliferation and succcess storeis. This database, which until recently didn't support constraints in a useful way, is now Sun's. Will they keep making releases available for free? Will they switch to the commercial model completely? Will this again jeopardize the MySQL /PHP extension's status? Heck, does this mean that the Java MySQL driver will get some love?&lt;br&gt;&lt;br&gt;I can't wait to hear more. &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
      <pubDate>Sat, 19 Jan 2008 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20080119.html</guid>
      <dc:date>2008-01-19T00:00:00Z</dc:date>
    </item>
    <item>
      <title>The world keeps spinning.. quickly.</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20071110.html</link>
      <description>This is sort of Java-related, but as it's used in some way by all of the major java web frameworks, it's worth noting that &lt;a href="http://dojotoolkit.org/" target="_blank"&gt;Dojo 1.0&lt;/a&gt; has been released! &lt;br&gt;&lt;br&gt;As for me -- I've been knee deep in amazingly cool code. I've not had a chance to take too deep a look at Spring 2.5, but it seems promising -- particularly the renewed support for alternative configuration patterns. Maybe Guice is stirring the pot? &lt;br&gt;&lt;br&gt;Also, I've noticed that the benefits of grids are increasingly popular. I'm very interested in grids -- they're useful for process intensive applications like search engines, and almost anything that can be represented as a directed edge graph. Microsoft's &lt;a href="http://www.youtube.com/watch?v=WPhE5JCP2Ak" target="_self"&gt;Dryad&amp;nbsp; &lt;/a&gt; seems to be a graph based implementation of a the grid computing paradigm from Google, 'MapReduce'. That is, where as MapReduce is just one type of algorithm distributed over a grid, Dryad is a way to express algorithms, distributed over a grid. Sounds amazing. &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
      <pubDate>Sat, 10 Nov 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20071110.html</guid>
      <dc:date>2007-11-10T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Quick Update, DIY Zoning, Mac/Ubuntu shock, and phantom key commands</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070722.html</link>
      <description>&lt;p&gt; It has been forever and a day since I've blogged, and not for want of trying!&lt;/p&gt;&lt;p&gt;It's been an amazing, wonderful month at my latest gig. &lt;/p&gt;&lt;p&gt;As I type this on my windows copy of MS Word, I find myself reaching for my Mac-imbued command keys and trying to use alt to do weird things. &lt;/p&gt;&lt;p&gt;I got introduced to Ubuntu Linux, the first Linux distro to ever, ever, completely work out of the box with the super-proprietary hardware on my old Sony VAIO laptop. Even my wireless card works, which was unthinkable! The wireless card never works on Linux without insane hacking on MadWifi (you know the whole ndiswrapper dance?) and some sort of sacrificial lamb? &lt;/p&gt;&lt;p&gt;I'm finding out a lot about the wide world of Cocoa and the utopian computing environment that was (and, to some extent continues to be in modern-day OS X) NeXT.&amp;nbsp; Objective C's turned out to be a lot of fun, and in particular, using Maven Oh yeah, I went to&amp;nbsp;&amp;nbsp; Oregon for the 4th of July weekend, and that was humbling. Absolutely beautiful. Lastly, the last Java User Group's topic was pretty cool, and well worth your time if you're interested in wielding tech and bettering your home : &amp;nbsp;&lt;a href="http://diy-zoning.sourceforge.net/"&gt;DIY zoning&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 22 Jul 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070722.html</guid>
      <dc:date>2007-07-22T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Moving On, Recap of The Phoenix Java User Group   Meeting on the 13th</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070616.html</link>
      <description>Yesterday (2 hours ago) was the last day at my job, and closes one chapter on my life. I?m thankful for the experience. I will begin the next - undoubtedly amazing -chapter of my life Monday, and am no less than gitty at the prospect. &lt;p&gt;Wednesday was the mensal Java User Group, and a particularly good one at that! I post a recap here because they say that you don?t remember anything you don?t use within 2 weeks, and the least I can do is regurgitate 2 day old knowledge towards that end. &lt;/p&gt; &lt;p&gt;Ted Neward was the speaker, giving two talks.&lt;/p&gt; &lt;p&gt;One was on the groovy language; the notes on this one are briefer, as the talk was lighter.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Groovy was started 3 years ago by James Strachan. &lt;/li&gt; &lt;li&gt; Goal: create something easier to work with than Java &lt;/li&gt; &lt;li&gt; Java (surprise!) isn?t the last word on languages &lt;/li&gt; &lt;li&gt; Sun?s attitude reminiscent of Grover Cleveland?s suggestion that they should close the patent office ? that?s to say, "what else could there possibly be?" &lt;/li&gt; &lt;li&gt;ACM tried to assess how productive somebody is. They determined that a young programmer writes about the same amount of useful bug free lines of code per day as an experienced programmer, except that the experienced programmer gets the code right the first time around. &lt;/li&gt; &lt;li&gt; ACM said that a language like C gets something like 4-6 assembly instructions per line. Java / C++ get 6-10. Lisp, amazingly, can get hundreds, maybe even thousands! A language can be inherently more powerful. It makes sense to get the most bang for those X lines of code you get a day. &lt;/li&gt; &lt;li&gt;For more, check out the groovy home page.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The other talk was about debugging ("Busy Java Developers Guide to Debugging"), which I found fascinating because Ted seems to really enjoy this.&lt;/p&gt; &lt;ul&gt;&lt;li&gt; What is a bug? Anything the customer doesn?t expect?&lt;/li&gt; &lt;li&gt; There are utilities, and JDK 5 and 6 introduced a raft of APIs/ tools, like JConsole, which is a service console shipped with JDK 6.&lt;/li&gt; &lt;li&gt; Management needs to display a commitment to quality&lt;/li&gt; &lt;li&gt; Schedule debugging into the project&lt;/li&gt; &lt;li&gt; "Bug chats" are the highest priority meeting that can be called in some environments that Ted has worked&lt;/li&gt; &lt;li&gt; Scott Davis (paraphrase): "Only 40% of projects use some form of unit tests" !&lt;/li&gt; &lt;li&gt; "Ship It!" good book on debugging (I can vouch for that?the book broaches all the stuff you do anyway (setting up a bug tracker, setting up a source code respository, and a heckuva lot of other basics, and makes them a coherent discipline.)&lt;/li&gt; &lt;li&gt; John Robbins, Microsoft SQL Server team, relays that developers used "teddy bear" debugging, talking through an issue with a stuffed animal. Talking through a problem forces the brain to enumerate it in a different manner and potentially will provoke a solution.&lt;/li&gt; &lt;li&gt; Simialarly, sometimes walking away from a problem and taking a walk is beneficial. Often, the solution will come just as you?ve left the office and on the drive home, or as you?re sleeping: "Aha! Eureka!" &lt;/li&gt; &lt;li&gt; JPDA is a general architecture for tooling support in Java. It?s comprised of: &lt;ul&gt; &lt;li&gt; JVMI ? agent inside the debugee?s VM &lt;/li&gt; &lt;li&gt; JDWP ? java debug wire protocol &lt;/li&gt; &lt;li&gt; JDI ? Java debug interface&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Other cool utilities: &lt;ul&gt; &lt;li&gt;jdb standard console debugger &lt;/li&gt; &lt;li&gt; extcheck: detects duplicate classes loaded via the $JDK/ext directory. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Experimental tools: &lt;ul&gt;&lt;li&gt; Jps, jstat, jstud, jinfo, jhat, jmap, jsadegd, jstart: cool experimental tools that aren?t guaranteed, and that are often written by Linux/Solaris people and may not run on Windows &amp;nbsp; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt; &lt;li&gt; How to approach a bug &lt;ul&gt;&lt;li&gt; "Duplicability" regenerates the bug once in 24 hours. &lt;/li&gt; &lt;li&gt; Throw unit tests at it (which you should be doing anyway!) &lt;/li&gt; &lt;li&gt; Track it in anyway shape or form. Enter it into the bug system for both the aforementioned enumeration which may itself be profitable and for the documentation to better aid the next guy. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Use the binary chop &lt;ul&gt; &lt;li&gt; Dive and conquer &lt;/li&gt; &lt;li&gt; Start at component boundaries and then work out. &lt;/li&gt; &lt;li&gt; Raise debug thresholds.&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt;&lt;p&gt; &amp;nbsp;Naturally, I whole heartedly you go out and see &lt;a href="http://www.tedneward.com"&gt;Ted Neward&lt;/a&gt;  speak (in particular he's pushing &lt;a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=9&amp;amp;section=blog"&gt;No Fluff, Just Stuff"&lt;/a&gt;) when you get a chance. He was obviously knowledgeable, a good speaker, very worth it.&amp;nbsp; &lt;/p&gt;</description>
      <pubDate>Sat, 16 Jun 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070616.html</guid>
      <dc:date>2007-06-16T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Safari For Windows! Huzzah!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070613.html</link>
      <description>Apple's got &lt;a href="http://www.apple.com/safari/" target="_self"&gt;Safari available for Windows&lt;/a&gt; (is this a surprise to anyone though?). &lt;br&gt;&lt;br&gt;The site wasn't as funny as when iTunes came out and the website had something to the effect of, "Hell's frozen over: iTunes for Windows." Good news, nonetheless!&lt;br&gt;</description>
      <pubDate>Wed, 13 Jun 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070613.html</guid>
      <dc:date>2007-06-13T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Java on the Client, Part 1</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070528.html</link>
      <description>&lt;p&gt;With all this hype about &lt;a href="http://www.google.com/search?q=java+fx&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:official&amp;amp;client=firefox-a"&gt;JavaFX&lt;/a&gt; (!) since JavaOne (so much came out of that conference and has been by and&amp;nbsp; large ignored because of JavaFX. This is most true with the prospect of &lt;a href="http://weblogs.java.net/blog/enicholas/archive/2007/05/java_kernel_unm.html"&gt;1-2&amp;nbsp; MB downloads for the JRE&lt;/a&gt;, the so called "Java Kernel"), I've decided to&amp;nbsp; take inventory of the Java desktop landscape again, and see what's changed/grown&amp;nbsp; since I've developed anything large with it. The desktop has languished behind&amp;nbsp; the server in Java, often to the chagrin of the desktop / client-side&amp;nbsp; developers who made the platform grow in the early, primordial java applet&amp;nbsp; days.&amp;nbsp; &lt;/p&gt;&lt;p&gt; First, I review the Rich Internet Application landscape in&amp;nbsp; general, as it will serve as a useful backdrop against which all this new stuff&amp;nbsp; makes sense.&lt;/p&gt; &lt;h2&gt;The RIA Landscape Thus Far &lt;/h2&gt; &lt;h3&gt;The Usual Contenders &lt;/h3&gt; &lt;p&gt;JavaScript, HTML/CSS, a healthy dose of basic HTTP and&amp;nbsp; SVG/VML combine to beautiful effect, as Google's Gmail, Maps, Reader, and more&amp;nbsp; can attest. This is the standard bearer: it's prevalent (enough), easily adopted&amp;nbsp; (standard technologies, free) and can be deployed incrementally. You don't&amp;nbsp; (necessarily) cede search engine index-ability and standard usability requirements&amp;nbsp; by using it. The other platforms have this now, too. &lt;/p&gt;&lt;p&gt; And a heck of a lot more.&lt;/p&gt; &lt;h3&gt;Microsoft's Silverlight&lt;/h3&gt; &lt;p&gt;Things are different now. Microsoft recently announced (or,&amp;nbsp; rather, formally debuted) their &lt;a href="http://www.microsoft.com/silverlight/default01.aspx"&gt;Silverlight&lt;/a&gt; offering, which is astonishingly good news in of itself. It presents the newly&amp;nbsp; solidified Adobe/Macromedia gelatin with a diluting agent.&amp;nbsp; It could also present the developer with a&amp;nbsp; cross - platform .NET engine. The Mono project has already announced that it&amp;nbsp; will support &lt;a href="http://www.mono-project.com/Moonlight"&gt;the plugin on&amp;nbsp; Linux&lt;/a&gt;. The plug-in itself will run on OS X and Windows.&amp;nbsp; Silverlight is a set of technologies, and is&amp;nbsp; deployed using a subset of .NET technologies. Microsoft's new Expression&amp;nbsp; tooling environments simplify development. It presents powerful opportunities&amp;nbsp; for rich media applications, including streaming video, and animation.&lt;/p&gt; &lt;h3&gt;Adobe's Flash and Flex &lt;/h3&gt; &lt;p&gt;Adobe's Flash is only part of the problem - it puts Flash in&amp;nbsp; place as a (superior) contender against, well, the multimedia capacity of&amp;nbsp; JavaScript and animated GIFs, for example. What's really at stake is the ability&amp;nbsp; to deploy "applications" on the internet, not just pretty pictures. Flex, and&amp;nbsp; in recent years, Flash, solve that, and do so better than Applets were able to&amp;nbsp; before them. Recently, Adobe &lt;a href="http://www.joshlong.com/jl/entry/20070425"&gt;open&amp;nbsp; sourced Flex&lt;/a&gt;, making the platform more accessible (and cheaper!) to the&amp;nbsp; masses.&amp;nbsp; The tooling (Flash CS3, for&amp;nbsp; example), of course, is still not free. (Big surprise? Adobe's a tooling&amp;nbsp; company.)&lt;/p&gt; &lt;h3&gt;Applets and Java Webstart&lt;/h3&gt; &lt;p&gt;Sun's Applets (naturally) predate any of these other items.&amp;nbsp; They were the first to market, but unfortunately are the worst. Java Webstart&amp;nbsp; is useful (very useful) where it's useful. Unfortunately, whereas you could see&amp;nbsp; using Flash for an ad (for example), you could never use Java.&amp;nbsp; First, it's too cumbersome to produce the same&amp;nbsp; thing as in Flash using Java. Second, loading the applet itself has&amp;nbsp; historically been wrought with issues: startup time, plug-in prevalence (and ease&amp;nbsp; of adaptation), etc.&lt;/p&gt; &lt;h2&gt;Java on the Desktop 2.0&lt;/h2&gt; &lt;h3&gt;What's in a name?&lt;/h3&gt; &lt;p&gt;See how I did that? "Web 2.0"? "Java on the Desktop 2.0"? We&amp;nbsp; need some sort of spiffy acronym here. "Java Desktop 2.0"! "JDeskto".. nah. "JD2".&amp;nbsp; Nah. "JD 2.0"? Pronounced, "JD two point ohhh"? Maybe Sun should just corner&amp;nbsp; the whole market and unveil something so hard to top that no one will even&amp;nbsp; bother, like, "RIA 2.0". Who could argue with "Rich 2.0"? The "internet is the&amp;nbsp; computer, 2.0". We could name it something to capitalize on the ridiculous&amp;nbsp; amount of traction that Flash FX, and Flex, have achieved. Something trendy.&amp;nbsp; Something with a "X" or two in it. It's got to be "Java". It's got to have that &lt;em&gt;je ne sais quoi.&lt;/em&gt; And "X"-y. It's got&amp;nbsp; to have an "X". None of this "E" business. That's gotten us in enough trouble.&amp;nbsp; I have it: "Java FX"! &lt;/p&gt;&lt;p&gt; What about, "Java FXE 2.0"?&lt;/p&gt;&lt;p&gt; I worry the JavaFX name will suffer the same bloat that the Java&amp;nbsp; and .NET names did.&amp;nbsp; JavaFX is actually a&amp;nbsp; set of technologies. It describes a scripting language (which doesn't&amp;nbsp; necessarily need to be used for pretty looking user interfaces), &lt;a href="http://weblogs.java.net/blog/chet/archive/2007/05/media_frenzy.html"&gt;elevated&amp;nbsp; multimedia support&lt;/a&gt;, and a mobile platform. It will benefit from the Java Kernel&amp;nbsp;&amp;nbsp; (I guarantee you the Java Kernel wasn't&amp;nbsp; developed so people could load .EARs quicker!) and from work being done in&amp;nbsp; general startup time decreases. It also describes a runtime environment on mobile&amp;nbsp; phones as well as the desktop. So when I say "JavaFX", I am more generally&amp;nbsp; talking about everything Sun is doing to regain prominence in producing pretty&amp;nbsp; user interfaces without HTML.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;h3&gt;Now Sun's playing catch-up. &lt;/h3&gt; &lt;p&gt;This is sickening because this was their market to lose,&amp;nbsp; originally. Their applets were poised to be the platform that Flash became.&amp;nbsp; They have been stalled by a general lack of attention from Sun on the desktop&amp;nbsp; market, and a lack of attention to lowly web developers, in particular.&amp;nbsp;&amp;nbsp; There&amp;nbsp; are many problems to solve which to some extent are already being addressed.&amp;nbsp; Others are there if you know where to look. &lt;/p&gt;&lt;p&gt; For example, the common developer isn't looking to build a Microsoft&amp;nbsp; Office, or a Photoshop, he's looking to build a forms intensive IS application.&amp;nbsp; This is why Visual Basic had(s?) such a strong footing in corporate America:&amp;nbsp; you could really quickly build some forms to babysit a database. That's also&amp;nbsp; the reason so many people flocked to the web when it became apparent you could&amp;nbsp; build forms to babysit the database. That's also why people are flocking to&amp;nbsp; Ruby on Rails, because they get that most people just want to build forms to&amp;nbsp; babysit databases, &lt;em&gt;easily.&lt;/em&gt; &lt;/p&gt;&lt;p&gt; That's why it's called "Windows Forms", and not -say - "Windows&amp;nbsp; UI". Naturally, the multimedia capabilities have arrived en masse for .NET, and &lt;a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;Windows&amp;nbsp; Presentation Foundation&lt;/a&gt; is a testament to its refined focus. However, at&amp;nbsp; the end of the day, it's a super set, and not the normative application of&amp;nbsp; Windows' UI facilities. &lt;/p&gt; &lt;h2&gt;Sun should build out the basics first. &lt;/h2&gt; &lt;p&gt;Have you tried building a basic Swing application to talk to&amp;nbsp; a database in recent years? It's still unpleasant. Put another way, using&amp;nbsp; Tapestry or Spring MVC, or even JSF to in turn use HTTP to &lt;em&gt;fake&lt;/em&gt; stateful, event driven, interactive forms is easier than using&amp;nbsp; Swing to produce stateful, event driven, interactive forms. &lt;/p&gt;&lt;p&gt; Don't get me wrong. It can be done. Through &lt;a href="http://www.swinglabs.org/"&gt;SwingLabs.org&lt;/a&gt;, &lt;a href="http://www.jgoodies.com/"&gt;JGoodies.com&lt;/a&gt;, &lt;a href="http://common.l2fprod.com/"&gt;L2FProd&lt;/a&gt;, and others, it can definitely be&amp;nbsp; hobbled together. It's not for the faint of heart though, and it requires a&amp;nbsp; body of knowledge most people don't have time for what is usually easily done&amp;nbsp; via a standard web application.&lt;/p&gt;&lt;p&gt; There is hope over the horizon, though. Sun's made some&amp;nbsp; positive strides with JSR 296 (the "Swing Application Framework": &lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;this&lt;/a&gt; ought to do you, but just&amp;nbsp; in case you might also try &lt;a href="http://www.artima.com/lejava/articles/swingframework.html"&gt;this one&lt;/a&gt;).&amp;nbsp; Thus far, the framework isn't final, but it is promising. Where JSR 296 falls short,&amp;nbsp; other JSRs for data binding and persistence (for example) will fill the gaps.&amp;nbsp; It addresses common infrastructure support,&amp;nbsp; like a more worldly action framework, i18n support, and so on. &lt;/p&gt;&lt;p&gt; There are very few cohesive opportunities available right&amp;nbsp; now, however. Oh, sure, you could ascend the mountain, your .zip of the &lt;a href="http://www.netbeans.org/products/platform/"&gt;Netbeans's&lt;/a&gt; or &lt;a href="http://www.eclipse.org/platform/"&gt;Eclipse RCP&lt;/a&gt; code in hand, and get&amp;nbsp; somewhere, eventually. But that's hardly "approachable." Few people build applications&amp;nbsp; as complex as your average IDE, it turns out. &lt;/p&gt;&lt;p&gt; A more substantive approach is &lt;a href="http://spring-rich-c.sourceforge.net/"&gt;Spring's Rich Client platform.&lt;/a&gt;&amp;nbsp; The platform suffers from poor&amp;nbsp; documentation, though that's mitigated more and more by the &lt;a href="http://opensource.atlassian.com/confluence/spring/display/RCP/Home"&gt;wiki&lt;/a&gt;.&amp;nbsp; Using it, you're able to get the husk of an application up and running in&amp;nbsp; literally minutes (assuming you've checked out the project and figured out how&amp;nbsp; to get it working). Once you launch, it has 90% of what you're likely to need:&amp;nbsp; dependency injection (it &lt;em&gt;is&lt;/em&gt; Spring,&amp;nbsp; after all), resource management (icons, labels, all internationalized and&amp;nbsp; extracted to resource files), action framework, data binding, validation, a "view"/&amp;nbsp; "page" schema, and even integration with "sexy" technologies where it wouldn't&amp;nbsp; be useful to develop it in-house. It also takes care of the corner cases, too.&amp;nbsp; It'll automatically launch a splash screen for you, for example. The splash screen&amp;nbsp; is automatically centered. It has integration with a few help systems. &lt;/p&gt;&lt;p&gt; I like Spring RCP (if that wasn't obvious). Within a weekend&amp;nbsp; I was able to build an application that talked to a SOAP service using POJOs&amp;nbsp; (that's Spring, of course) talking to my client application. The client&amp;nbsp; application knew how to do all the CRUD things you'd expect. I was able to take&amp;nbsp; advantage of some of the nicer tools and do things like integrate the&amp;nbsp; application into the system tray so that it was only visible when necessary,&amp;nbsp; integrate a video pane using JMF,&amp;nbsp; and of&amp;nbsp; course provide on-the-fly upgrades/installation using Webstart (that's mostly&amp;nbsp; true?), all because it was Swing. The mind boggles at what you could do with&amp;nbsp; JOGL, Java (2|3)D, JavaZoom,&amp;nbsp; and most&amp;nbsp; any application of a good look and feel! That took another weekend. Or two? I&amp;nbsp; don't want to talk about it. My therapist insists it's good for me, though. &lt;/p&gt;&lt;p&gt; The bulk of the application - the part that justifies&amp;nbsp; building the application - was mostly finished the first weekend, thanks&amp;nbsp; entirely to Spring RCP. Now, granted, that second weekend was only possible&amp;nbsp; because I've banged my head against those particular walls a few times before. Many&amp;nbsp; times before. &lt;/p&gt; &lt;h2&gt;Building on top of Java&lt;/h2&gt; &lt;p&gt;The Java FX announcement is good news, as it means that all&amp;nbsp; of desktop java will get some much needed attention. This is good news for java&amp;nbsp; developers as it's one more place where they'll get the job and not some other&amp;nbsp; programmer who's not using Ruby on top of a JVM. The pieces are all there. We&amp;nbsp; have a really rich API for components /user interfaces. We have the rumblings&amp;nbsp; of change in the framework space for Swing. Work's being done to evolve or&amp;nbsp; supplant missing multimedia support. We have the language, the framework plumbing,&amp;nbsp; the incredible depth of history with networked applications. All in all, Java's&amp;nbsp; got a strong hand. Now we have a unified voice behind JavaFX. The hurdles at&amp;nbsp; this point lay mostly in finding appropriate abstractions and spreading best practices.&amp;nbsp; These hurdles are easily dealt with as a community, however. Java has nothing&amp;nbsp; if not a community. All in all, I'd say it's a good time to be a Java developer.&lt;/p&gt;</description>
      <pubDate>Mon, 28 May 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070528.html</guid>
      <dc:date>2007-05-28T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Tapestry 4 Archetype Moved to the Tapestry Project at Apache</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070505.html</link>
      <description>&lt;div&gt;&lt;p&gt;This is a little outdated, at this point, but I?m posting it just to follow through with things. &lt;/p&gt;&lt;p&gt;The Tapestry archetype mentioned here on this site is now officially included in the Tapestry source code, &lt;a href="http://tapestry.apache.org/tapestry4.1/tapestry-archetype/index.html"&gt;available from Apache&lt;/a&gt;.&amp;nbsp; The documentation is all there, and is pretty much the same thing as I discussed here, however, the incantation has (naturally) changed to reflect its new home on Apache:&lt;/p&gt;&lt;code&gt;mvn archetype:create -DarchetypeGroupId=org.apache.tapestry -DarchetypeArtifactId=tapestry-archetype -DarchetypeVersion=4.1.2-SNAPSHOT -DgroupId=org.example -DartifactId=myapp -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository&lt;/code&gt;&lt;p&gt;Thanks to Jesse Kuhnert (lead Tapestry 4 developer, nice guy, &lt;a href="http://www.nabble.com/-announce--new-goodies-for-tapestry-4.1-p10246866.html"&gt;lots of support&lt;/a&gt;&amp;nbsp; during the process itself) and Howard (&lt;a href="http://tapestryjava.blogspot.com/2007/02/maven-archetype-for-tapestry-4.html"&gt;on his blog, for example&lt;/a&gt;) for their support!&lt;/p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;</description>
      <pubDate>Sat, 05 May 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070505.html</guid>
      <dc:date>2007-05-05T00:00:00Z</dc:date>
    </item>
    <item>
      <title>If I were a South Park character...</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070429.html</link>
      <description>If I were a South Park character ( &lt;a href="http://www.sp-studio.de/"&gt;South Park Studio&lt;/a&gt;), I would look like: &lt;br&gt;&lt;img src="__560_0__"&gt;</description>
      <pubDate>Sun, 29 Apr 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070429.html</guid>
      <dc:date>2007-04-29T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Flex is open sourced!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070425.html</link>
      <description>&lt;p class="MsoNormal"&gt;Fantastic news! Flex has been open sourced! &lt;/p&gt; &lt;p class="MsoNormal"&gt;Umm, what does this mean, in effect? It means that exposing a REALLY slim, sexy client has been possible for a long time, through a lot of different concoctions, not the least of which is OpenLazlo, and&amp;nbsp; Ajax, and thereabouts. But Flex is the nicest option for those willing to pay. It?s slick, it?s quick (VERY quick, compared to Ajax/JSON), it?s powerful (well, Java Applet powerful, not ActiveX powerful. No CD ROM drives will pop out!). And now, it?s open source. See &lt;a href="http://labs.adobe.com/wiki/index.php/Flex:Open_Source"&gt;Adobe Labs&lt;/a&gt; for more.&lt;/p&gt;&lt;p&gt;So &lt;i&gt;that's&lt;/i&gt; why James Ward &lt;a href="http://www.jamesward.org/wordpress/2007/04/25/open-source-flex-top-10-reasons-to-rejoice/"&gt;was cooking cookies!&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Congratulations, Adobe, on a very brave move.Every time a peice of mega tech emerges, my mind starts imagining what I could do with it. Each individual tool becomes "useful" and viable suddenly (isn't that atrocious? It takes it being open source for me to care?) Now, if I could only get a few dozen "open source" grids (eh, I know, I know, I'm not holding my breath), &lt;a href="http://www.atomikos.com/products.html#ate"&gt;Atomikos Transactions&lt;/a&gt;, &lt;a href="http://www.springframework.org"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.postgres.org"&gt;PostgresSQL&lt;/a&gt;, &lt;a href="http://terracottatech.com/"&gt;Teracotta&lt;/a&gt;, &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt;, and a neat idea (mmm.... ebaysoftspaceazon... com)...&lt;/p&gt;&lt;p&gt; All that aside, &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=193593"&gt;Bruce Eckel's recently taken the Flex jump&lt;/a&gt;, so maybe it's time to see why.&lt;/p&gt;</description>
      <pubDate>Wed, 25 Apr 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070425.html</guid>
      <dc:date>2007-04-25T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A J2ME Archetype Based On Pyx4me.com's work, Antenna</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070408.html</link>
      <description>&lt;p&gt; In recent posts, I've blogged about my ambition to get a J2ME archetype up and running, and finally, I can present the fruits of my ?quest! You thought I was going to say ?labor?, eh? The nice part about the world is there are so many other people better positioned to beat me (or you) to the finish line. Case in point: the &lt;a href="http://pyx4me.com/snapshot/pyx4me/" target="_blank"&gt;pyx4me project&lt;/a&gt; project has done an incredible job of wrapping &lt;a href="http://antenna.sourceforge.net/" target="_self"&gt;Antenna&lt;/a&gt;, providing a JSE-based emulator, providing framework classes and of providing a working support for different things and of providing useful examples. &lt;/p&gt;&lt;p&gt; I've taken their examples and orchestrated an archetype for getting started quickly with J2ME.&amp;nbsp; &lt;/p&gt;&lt;p&gt; Put another way, they've already done the work of getting started with J2ME. It just isn't (to me, a humble J2ME developer with a cause) apparent where to begin. So I made it apparent for my own purposes. Perhaps you'll find it useful, as well.&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt; To get it up and running, simply issue:&amp;nbsp; &lt;/p&gt;&lt;pre&gt;mvn archetype:create -DarchetypeGroupId=com.codecafe.archetypes \&lt;br&gt;-DarchetypeArtifactId=j2me-simple \&lt;br&gt;-DremoteRepositories=http://codecafe.dev-hda.com/repository \&lt;br&gt;-DarchetypeVersion=1.0-SNAPSHOT -DgroupId=org.example -DartifactId=myapp&lt;/pre&gt;&lt;p&gt; On my system, I have three system variables of importance. Here's the pseudocode for their organization:&amp;nbsp; &lt;/p&gt;&lt;pre&gt;WTK_HOME=installation of wireless toolkit ;&lt;br&gt;JAVA_HOME=installation of java development kit ;&lt;br&gt;PATH=WTK_HOME/bin;JAVA_HOME/bin ;&lt;/pre&gt;&lt;p&gt; So long as all that's setup, you need only cd into your ?myapp? directory and issue ?mvn clean install? and then double click on the resultant .jad file to open up the emulator and preview your application.&amp;nbsp; &lt;/p&gt; &lt;p&gt; Please see &lt;a href="http://pyx4me.com/snapshot/pyx4me"&gt; the Pyx4me project's home page&lt;/a&gt; for the overall project,&amp;nbsp;&amp;nbsp; &lt;a href="http://antenna.sourceforge.net"&gt;the antenna project&lt;/a&gt;, and, lastly &lt;a href="http://codecafe.dev-hda.com/sites/j2me_archetype/"&gt;my documentation&lt;/a&gt; for information on using the archetype, getting started on an application and coverage of a few common cases I ran into. If you find anything lacking or non intuitive, please drop me a comment and I'll try to address it.&lt;/p&gt;</description>
      <pubDate>Sun, 08 Apr 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070408.html</guid>
      <dc:date>2007-04-08T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Pain Points with Location APIs and Sprint</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070405.html</link>
      <description>&amp;nbsp;&lt;p&gt;The obvious: J2ME's suffered a lot of fragmentation (almost necessarily, given the ever broadening range of devices to which an application may be deployed) that have worked against the "write once, run anywhere" mantra. Particularly, Sun has proffered a multitude of JSRs that are considered "optional packages" that any vendor may (or may not) include in its platform/handset. There are so many JSRs (see, for example, &lt;a href="http://mobilezoo.biz/j2me.php"&gt;this&lt;/a&gt;) that there are occasionally wrapper JSRs that serve only to include other JSRs. Thus, a vendor that implements JSR-185 ("Java Technology for the Wireless Industry") is really mainly only guaranteeing the presence of other JSRs. Similarly, plenty of platforms have solutions that later were standardized into JSRs. Thus, using a technology is a manner of gambling, where you hope you wager your target platform implements the requisite base platform, technologies, and APIs (that is, you want the JSR version of a given API where available, but if you need it you'll use a proprietary API, right?) &lt;/p&gt;&lt;p&gt;Sooooo... I have a Sprint handset, the Samsung A900 (&lt;a href="http://developer.sprint.com/view_devices.do?device=77527"&gt;this one.&lt;/a&gt;) Nokia and Motorola are easily "hacked". Sprint tends to control their handsets, closely, alas. The same rules as with any other closely guarded platform apply: no hacking! It's not necessarily in a carrier's interest to expose these APIs to just anyone. They may want to recoup the cost of developing the technology. They may be only interested in bigger partners with a compelling, mass-appeal application that could be profitable to the carrier.&lt;/p&gt;&lt;p&gt;In this case, vendors had to implement GPS for the E911 laws (see &lt;a href="http://www.fcc.gov/911/enhanced/"&gt;this&lt;/a&gt; and &lt;a href="http://jeepx.blogspot.com/2006/02/paul-saffo-got-it.html"&gt;this&lt;/a&gt;), and so the functionality is already present on the phones. And just imagine the slew of applications that could be developed with GPS support-why wouldn't they want to expose it, right? &lt;/p&gt;&lt;p&gt;Slowly, JSR 172 is taking hold, and where it's not, you may find QJAE's Location APIs. QJAE is Qualcomm's Java Application Extensions which provide useful APIs. My particular handset has this API's Location Based Service API, and not JSR 172, but at least there is an API! &lt;/p&gt;&lt;p&gt;So, armed with this, I started looking for the compiled classes: they're nowhere to be found! I have the Spring SDK, and apparently (according to &lt;a href="http://www.shaftek.org/blog/archives/000139.html"&gt;this&lt;/a&gt; ancient article) the jars with the compiled API were at one point included in the Sprint SDK. It's not currently. Apparently, Sprint's stance is that you need to be a partner to access this functionality. Some people have had success reverse engineering the API from documentation and explicitly enumerating the values of the constants at runtime from the handset. Sprint's stance is that this is illegal.&amp;nbsp; &lt;/p&gt;&lt;p&gt;This also conflicts with my limited understanding of how Sprint limits access to other APIs. Other APIs (such as MMAPI) are accessible if and only if you sign it using a pricy Verisign certificate and obtain a partner account with Sprint (for deployment). For testing, everything seems accessible enough by simply "enabling" your handset on Sprint's developer site (see &lt;a href="http://developer.sprint.com/site/global/develop/activation_device/p_device_activation.jsp"&gt;this&#xD;
developer.sprint.com article&lt;/a&gt; for more) and using Sprint's toolkit to sign it (as outlined &lt;a href="http://developer.sprint.com/getDocument.do?docId=84465"&gt;here&lt;/a&gt;)). &lt;/p&gt;&lt;p&gt;That's enough for this post. Let's see what else I can scrounge up. I need more information.&lt;/p&gt;</description>
      <pubDate>Thu, 05 Apr 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070405.html</guid>
      <dc:date>2007-04-05T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Spring and GPS (JSR 179 --javax.microedition.location) support</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070401.html</link>
      <description>&lt;p&gt;April Fools Day is Here! &lt;/p&gt;&lt;p&gt;I suppose I'd forgotten the date. I read Google's proposed, &lt;a href="http://www.google.com/tisp/install.html" target="_self"&gt;free ISP plan&lt;/a&gt; with shock and horror. Then it hit me. Enjoy that one.&lt;/p&gt;&lt;p&gt;In other news, I'm playing with my Sprint A900 handset to use Location Based Services (LBS). It's frustrating, to say the least. Sprint's lackluster support of the developer community makes it all the more difficult. Googling the subject reveals post after post on bulletin board after bulletin of people bemoaning no support of LBS on Sprint handset since 2002.&lt;/p&gt;&lt;p&gt;Apparently, for all but a select few phones (the Blackberry among them), JSR 179 (the javax.microedition.location packages) isn't supported at all. In their stead is Qualcomm's proprietary JQAE API (probably because the GPS chipset is Qualcomm for a lot (if not all?) of their devices).&lt;/p&gt;&lt;p&gt;That's fine, I'm willing to use a proprietary API and do the god-awful "detection" dance I find is the norm in J2ME:&lt;/p&gt;&lt;code&gt;try {&lt;br&gt;&amp;nbsp; Class.forName( "javax.microedition.location.Coordinates") ; &amp;nbsp; &lt;br&gt;&amp;nbsp; // it has support&lt;br&gt;}catch (Throwable t){&amp;nbsp; &lt;br&gt;&amp;nbsp; // it doesn't. Try loading the Qualcomm API&lt;br&gt;}&lt;/code&gt;&lt;p&gt;See &lt;a href="http://www.sprintusers.com/forum/showthread.php?t=52772" target="__blank"&gt;this&lt;/a&gt; and/or &lt;a target="__blank" href="http://forum.mgmaps.com/viewtopic.php?printertopic=1&amp;amp;t=74&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=0&amp;amp;finish_rel=-10000"&gt;this&lt;/a&gt; for more information on that.&lt;/p&gt;&lt;p&gt;However, it turns out even there things aren't so easy. &lt;/p&gt;&lt;p&gt;Before you've tried anything in code, you need to enable your phone's developer root. Translated: they've restricted access to certain APIs (Among them: "LBS: Location Based Services", "JSR-135 Mobile Media 1.1 API", "JSR-120 Wireless Messaging 1.1 API" and "JSR-75 Personal information Management (PIM)). You can access them assuming you've signed your MIDP with Verisign's $500 certificate and that you've unlocked your specific handset's (up to 200)&amp;nbsp; privileges from the Sprint.com developer website. I haven't gone through the process, and so I don't know if this will work, but it's certainly frustrating. &lt;/p&gt;&lt;p&gt;And, from what I've been reading, you also need to be a Sprint business partner! I don't even know how you begin to procure that, nor do I care for the moment. It's as if they don't want people developing on their platform.&lt;/p&gt;&lt;p&gt;Nokia's phones are exponentially more approachable. &lt;/p&gt;&lt;p&gt;If I find anything, I'll report back on this.&lt;/p&gt;</description>
      <pubDate>Sun, 01 Apr 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070401.html</guid>
      <dc:date>2007-04-01T00:00:00Z</dc:date>
    </item>
    <item>
      <title>J# Post-Mortem</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070322.html</link>
      <description>&lt;p&gt;J# retired and I just now caught this! That's wonderful news! &lt;/p&gt;&lt;p&gt;From the announcement (http://msdn2.microsoft.com/en-us/vjsharp/default.aspx), the following:&lt;/p&gt;&lt;blockquote&gt;&lt;b&gt;Retirement of J# language and Java Language Conversion Assistant from future versions of Visual Studio&lt;/b&gt; Since customers have told us that the existing J# feature set largely meets their needs and usage of J# is declining, Microsoft is retiring the Visual J# product and Java Language Conversion Assistant tool to better allocate resources for other customer requirements. The J# language and JLCA tool will not be available in future versions of Visual Studio. To preserve existing customer investments in J#, Microsoft will continue to support the J# and JLCA technology that shipped with Visual Studio 2005 through to 2015 as per our product life-cycle strategy. For more information, see Expanded Microsoft Support Lifecycle Policy for Business &amp;amp; Development Products. &lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt; Now of course, there are some issues. Apparently they've&#xD;
introduced 64 bit support and that ends in 2017. So if nothing else, we&#xD;
have 2 (conflicting) dates: 2015, or 2017. &lt;/p&gt;&lt;p&gt; Bah. Either way, we'll be rid of it within a decade :-)&lt;br&gt;&lt;/p&gt;&lt;p&gt;To read the announcement, you'd think they're being burdened by it! Which is true. They are. As they are burdened by maintaining the VB6 to VB.NET migration pathways. And the C++ to managed C++ pathways. If .NET debuted with anything in particular as gospel, it was "forward thinking, backwards compatible." Now it seems like they're abandoning a lot of this for the pretense it was. I still don't quite understand what their pitch to the java world is though. The Petstore(s), I don't think, swayed any opinion. This is especially true given what was perceived to be botched politicking on Microsoft's part behind the first one.&amp;nbsp; Is there anyone who actually used Java and then preferred having Visual Studio wizard-away everything previously done in ant build file? That is, who would switch to get WYSIWYG-everything? &lt;/p&gt;&lt;p&gt; The main cause for defection in the Java camp is ease-of-use, but those concerns are (seemingly) better addressed by Ruby on Rails, or PHP. &lt;/p&gt;&lt;p&gt;Put another way: the reason J# is being retired is because it's never been the value proposition Microsoft imagined it would be. There aren't swarms of people looking to leave Java for .NET of all things. If anything,&amp;nbsp; people are retrofitting their client applications with JavaScript and building the more sophisticated stuff in Java and it's constantly expanding stacks. &lt;/p&gt;&lt;p&gt;Or, it could be I'm missing everything all together. &lt;/p&gt;</description>
      <pubDate>Thu, 22 Mar 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070322.html</guid>
      <dc:date>2007-03-22T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Developer Collaboration and Eclipse Jazz</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070310.html</link>
      <description>&lt;p&gt;The major leap forward seems to be project lifecycle management, and collaboration suites. It doesn't seem like too long ago that we had a compiler, an editor, and some sticky notes. &lt;/p&gt;&lt;p&gt;In the Microsoft camp, my lowly Visual C++ has evolved into &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/default.aspx"&gt;Visual Studio Team System/Team Foundation System/Orca/super maximized enterprise grid suite 2.0/whatever&lt;/a&gt;, which in turn is an editor on top of the compiler, a collaboration suite with groupware-features and a source versioning system&amp;nbsp; (and maybe that's an undersell?)!&lt;/p&gt;&lt;p&gt;And Borland, oh-don't-get-me-started! Borland's &lt;a href="http://www.borland.com/us/products/index.html"&gt;whole business&lt;/a&gt; is now centered on everything that happens before and after the work in JBuilder has been done: it's all about the lifecycle of the project. &lt;/p&gt;&lt;p&gt;JetBrains has their &lt;a href="http://www.jetbrains.com/teamcity/"&gt;TeamCity product&lt;/a&gt;, which - along with their TMate source control client - form a suite of collaboration tools above and beyond working in IntelliJ. Even IntelliJ now has the ability to "share" a coding session with someone. &amp;nbsp;&lt;/p&gt;&lt;p&gt;And, now, I just read about the Eclipse Foundation's (and tech-lead Erich Gamma's) push into collab-suites with Eclipse Jazz (eh, &lt;a href="http://redmonk.com/cote/2006/06/07/rational-jazz-soon-to-eat-more-of-its-own-dog-food-transparency/"&gt;here&lt;/a&gt;, and &lt;a href="http://www.theserverside.com/tt/talks/videos/ErichGammaText/interview.tss"&gt;here&lt;/a&gt;). Of course, (the former) Rational has always been about this sort of thing in a lot of ways, so it's no surprise the influence eventually found its way to Eclipse. Interesting, I say! &amp;nbsp;&lt;/p&gt;&lt;p&gt;Does this mean there's little more vendors can see doing for individual developers? &lt;a href="http://www.intellij.com"&gt;IntelliJ&amp;nbsp; IDEA&lt;/a&gt;) (mmm.. I love you) is good, but is it really the be-all-end-all of individual productivity? All without one patronizing Wizard? Really? Also, I'm a little unclear on how this new wave of software fits in with traditional tools. &lt;/p&gt;&lt;p&gt;Suppose I have a wiki and bug defect system (&lt;a href="http://trac.edgewall.org"&gt;Trac&lt;/a&gt;)), a source control system (&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;), an IDE (IntelliJ, emacs) and an email address/IM client, a project management tool (Microsoft Project?), and even a build system with a deficiency complex (&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; and &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Bamboo&lt;/a&gt;) what am I missing?&lt;/p&gt;</description>
      <pubDate>Sat, 10 Mar 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070310.html</guid>
      <dc:date>2007-03-10T00:00:00Z</dc:date>
    </item>
    <item>
      <title>New version of the Tapestry 4.1 archetype</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070305.html</link>
      <description>I just deployed a new version of the Tapestry 4.1 archetype. It's the same parameters as the archetype discussed &lt;a href="http://www.joshlong.com/jl/entry/20070227"&gt;previously&lt;/a&gt;. Essentially, the new version provides a few new features:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;an interesting use of an engine service (in this case to provide a working rounded corner generator, as with Google Groups' rounded corner generator URL) and a corresponding component to employ the service.&lt;/li&gt;&lt;li&gt;the rounded corner component mentioned above, which is pretty sophisticated in of itself (as introductory code goes, anyway!)&lt;/li&gt;&lt;li&gt;much better documentation (mvn site, and then peruse the resultant docs in the target directory.) &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;.&lt;br /&gt;</description>
      <pubDate>Mon, 05 Mar 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070305.html</guid>
      <dc:date>2007-03-05T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Halfsteps on the Tapestry Archetype; Gmail's Down!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070228.html</link>
      <description>&lt;p&gt;Gmail is down, and I?ve not been able to access it with any&#xD;
sort of consistency for hours. What am I missing? What?s wrong? This has happened to me before, but never for this duration...&amp;nbsp; &lt;/p&gt; &lt;a href="/jl/resource/gmail_down.jpg"  ="" target="_blank"&gt;&lt;img src="/jl/resource/gmail_down.jpg"  ="" width="400"&gt;&lt;/a&gt;&lt;p&gt; That aside, I've deployed updates to the Tapestry 4.1 Maven archetype,&#xD;
and partly updated the documentation. An order of magnitude better, to&#xD;
be sure, but there remains much more to be done...&lt;/p&gt;</description>
      <pubDate>Wed, 28 Feb 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070228.html</guid>
      <dc:date>2007-02-28T00:00:00Z</dc:date>
    </item>
    <item>
      <title>A Tapestry 4 Maven Archetype Based On The Tapestry 5 Archetype, Spring and samples included.</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070227.html</link>
      <description>I love working with Tapestry 4, but I figure that it's because it's already configured to do the cool tricks I want to do with it. It's not easy getting off the ground on a blank new project. (Nor is it easy getting off the ground in a Ruby On Rails project without using the project generator!). Maven offers a solution, but, seemingly, no good archetype for it exists. I want something that'll let me type mvn jetty6:run and pull up a page immediately after I've run the familiar "mvn archetype:create" incantation.&lt;br&gt;&lt;br&gt;I tried the (admittedly preliminary, at this stage in the game) Appfuse archetype,&amp;nbsp; and the one from Webtide. However, I wanted something that I could demo with really quickly. I imagine: 1.) I have the archetype. 2.) I mvn clean install it, and voilą, instant "hello world" application that could be aggressively/quickly modified. I took Howard Lewis Ship's Tapestry 5 Simple-Project archetype and expanded it/retrofitted it with a lot of Tapestry 4 scenarios. &lt;br&gt;&lt;br&gt;I also wanted something that eased some real-world concerns or, at least, hid them. Something that already had a working example of most common things (setting up an ASO, using Spring. Perhaps I'll add SEO friendly URLs configured by default (well, for the common ones, with the less-obvious options commented and explained.). &lt;br&gt;&lt;br&gt;Anyway, thanks again to Howard and the Tapestry for such a wonderful product. I'll evolve this version and clean it up. If there are any suggestions, I'd definitely appreciate it. &lt;br&gt;&lt;br&gt;It's deployed to my repostory. Run the following command, and you'll have the archetype installed and a project created. Then, merely cd into the wordking directory and run &lt;code&gt;mvn idea:idea&lt;/code&gt;, or &lt;code&gt;mvn eclipse:eclipse&lt;/code&gt;, and then run &lt;code&gt;mvn jetty6:run&lt;/code&gt; to get started. This will get your application running on port 8080. Simply bring up http://127.0.0.1:8080/ and you'll get a listing of all the contexts. You can modify the various configuration fles (save, of course, for web.xml), and HTML ad-infinitum without restarting. The second you compile a fresh class, Jetty will reload the context automatically. &lt;br&gt;&lt;br&gt;&lt;code&gt;mvn archetype:create -DarchetypeGroupId=com.codecafe.archetypes&#xD;
-DarchetypeArtifactId=tapestry-simple&#xD;
-DremoteRepositories=http://codecafe.dev-hda.com/repository&#xD;
-DarchetypeVersion=4.1.2-SNAPSHOT -DgroupId=c.b -DartifactId=view&lt;/code&gt;&lt;br&gt;&lt;br&gt;</description>
      <pubDate>Tue, 27 Feb 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070227.html</guid>
      <dc:date>2007-02-27T00:00:00Z</dc:date>
    </item>
    <item>
      <title>IntelliJ 6.0 and JDK 6.0 upgrade</title>
      <link>http://www.joshlong.com:80/jl/blogPost/200702241.html</link>
      <description>I'm about to upgrade to JDK6 on my Windows XP machine. I'm running IntelliJ 6, which I understand works well on the new JDK. Confusing is the lackluster availability of the JRE. I expect Java.com to yeld a JRE 6 build, but instead it's still pushing the old JRE 5, which is also still being bundled with various PC vendors by default. Why is this? At what point does Sun certify a release as being "good enough" for the developers AND the rest of the world? &amp;nbsp;&lt;br&gt;&lt;br&gt;The consensus seems to be that Java SE 6.0 offers the best out-of-the-box performance boost yet, by far.&lt;br&gt;&lt;br&gt;After a bit of searching, I finally got to &lt;a href="http://support.jetbrains.com/kb/entry.jspa?externalID=222&amp;amp;categoryID=4"&gt;this thread&lt;/a&gt;&amp;nbsp; which has the whole process spelled out for you. I went with the second choice enumerated on the page (deleting the jre, and replacing it with JDK1.6's JRE as I didn't want to have to use idea.bat. Using idea.bat causes the DOS console to stay open while you're in IntelliJ. I created a second .bat file whose job it was to load the first one (idea.bat) like so: start idea.bat, however, the trouble is that didn't seem to work. I didn't want to give it much more thought and simply pursued the second option. &lt;br&gt;&lt;br&gt;I wholely recommend the upgrade it's very quick. Loading IntellIJ would be one kind of speed increase, but loading a very big project quite another, and they both dramatically improved, to the point that IntelliJ no longer shows me "Tip Of The Day" when I'm doing these actions because it doesn't have to keep me entertained. &lt;br&gt;&amp;nbsp;&lt;br&gt;Completely worth it!&amp;nbsp;</description>
      <pubDate>Sat, 24 Feb 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/200702241.html</guid>
      <dc:date>2007-02-24T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Playing with Swing, JSR 296</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070224.html</link>
      <description>I just started playing with &lt;a href="http://jcp.org/en/jsr/detail?id=296" target="_blank"&gt;JSR 296&lt;/a&gt; as I've recently started building an application that's Swing based (albeit, as an applet, which I'd like to make Java Webstart-able). It's phenomenal! As it stands right now, you can easily databind, internationalize, easily layout GUIs, and build on a useful Action abstraction if you're willing (and able! And what rocket scientist isn't?? Oh, you're &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;a rocket scientist? well?. I see? Go sit in the corner.) to coordinate the tapestry of solutions out there. &lt;br&gt;&lt;br&gt;JSR 296 seeks to bring a lot of that flexibility to the developer right off the bat. With it you get internationalization, an action model, application lifecycle, persistence, etc. Pretty cool. Still missing is databinding and IOC and a layout mechanism. Fortunately, &lt;a href="http://spring-rich-c.sourceforge.net/index.html" target="_blank"&gt;SpringRich&lt;/a&gt;, and &lt;a href="https://jgoodies.dev.java.net/" target="_blank"&gt;JGoodies&lt;/a&gt; help alleviate those pain points, so I'm pretty stoked about the possibilities. &lt;br&gt;&lt;br&gt;Maybe one day we'll have a framework for the desktop user and it'll endeavor to bring "web-style programming" to the desktop.&lt;br&gt;&lt;br&gt;Which reminds me: all those frameworks endeavoring to bring Swing-style programming to the web (Wicket, JSF, Tapestry, Echo, whatever else I missed: this means you!) should change their attitude a little. It's telling that all of the things this framework brings to the table have been de rigueur in web frameworks for half a decade.&lt;br&gt;&lt;br&gt;Check out &lt;a href="https://appframework.dev.java.net/intro/index.html" target="_blank"&gt;the Swing Application Framework&lt;/a&gt; for more.&lt;br&gt;&lt;br&gt;I wonder what this will mean for so much of the way an application is built currently. Will I have to become very good at securing SOAP services again? Will an easy, useful desktop programming paradigm reverse the transition from Web Services to JSON? I deployed a custom XML-based (not XML-RPC, or SOAP, but my own protocol) service specifically to be able to achieve modest portability/thoroughput on a prototype J2ME application I built a year or so ago. This was so because the XML parsers are sketchy enough. SOAP stacks (while available, even as a standard) weren't prevalent enough.&amp;nbsp; I can see Spring earning it's keep here, again. Imagine what could be done with a useful databingn mechanism and a convenient way of exposing services (ą la Spring). Desktop applications could become the rich client king again. Maybe. &lt;br&gt;&lt;br&gt;Meanwhile Bruce Eckel &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=193593" target="_blank"&gt;seems to think rich clients are where it's at&lt;/a&gt;, as well. Of course, he's pitching Flash, and not Swing. &lt;br&gt;&lt;br&gt;Can't wait to see what's next. Windows Vista (Aero, WPF) is poised to make the rich client desktop commonplace. Maybe it'll heat up the landscape enough to drive a resurgence for the desktop developer.&amp;nbsp; Any one use any of these tools? Anything I should know?</description>
      <pubDate>Sat, 24 Feb 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070224.html</guid>
      <dc:date>2007-02-24T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Sun Java Wireless Toolkit 2.5 for CLDC (Formerly, &amp;#8220;WTK&amp;#8221;) (finally)</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070212.html</link>
      <description>&lt;p&gt;Aside from all the new APIs supported (and there are a LOT ? some only previously available through extensions. Notable among them: Java APIs for Bluetooth ( JSR 82), Wireless Messaging API (WMA, JSR 226), and J2ME Web Services Specification (JSR 172), and of course we can?t forget.. argh... just check out &lt;a href="http://java.sun.com/products/sjwtoolkit/download-2_5.html"&gt;Sun's page&lt;/a&gt; for the full scoop), the coolest thing for me has to be the standard support for the Location API?s. These APIs, of course have helped propel J2ME into orbit via Google?s "Google Mobile Maps" application (and the plethora of other maps / GPS applications out there helped, too, I suppose :-) )&lt;br&gt;&lt;br&gt;This is an impressive release and long-awaited. One gripe: where?s my Linux SDK? I?ll have to use the windows version for now, I suppose. I should count my blessings: there doesn?t seem to be any mention of a Mac version!&lt;/p&gt;</description>
      <pubDate>Mon, 12 Feb 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070212.html</guid>
      <dc:date>2007-02-12T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Salesforce.com's new language/platform pack: "Apex"</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070221.html</link>
      <description>&lt;p&gt;I just noticed Salesforce.com?s latest step towards platform domination: &lt;a href="http://developer.appexchange.com"&gt;Apex.&lt;/a&gt;&lt;br&gt;&lt;br&gt;I like the name.  Cool. Sounds like Apress, and Ajax. Half buzz, half hard-hitting tech done cheap, with just a twist of that  je ne sais quoi, that ?this could be a Windows codename? quality. Yeah! &lt;br&gt;&lt;br&gt;I like the possibilities. The market for middle ware integration is astonishing. The application that?s readily customized is the application that more readily adapts, and is adapted. This should go a long way towards removing all the edge cases defying Salesforce.com?s proliferation. Apparently, they have a little less than 30,000 customers. I don?t know if that?s individual users or entities, or what. It?s not nothing. Interesting: the inclusion of  LINQ-style sql objects:&lt;br&gt;&lt;code&gt;&lt;br&gt;Account acc = [select Id from account where name = 'xxx'];&lt;br&gt;Account[] accs = new Account[]{acc};&lt;br&gt;System.assert(accs[acc.id] != null);&lt;br&gt;&lt;/code&gt;&lt;br&gt;It?s a typed SQL query, embedded inline with your java. Not like those opaque String queries I keep hearing about? &lt;br&gt;&lt;br&gt;I got the hint on all of this from eWeek magazine, in a small blurb about Apex of the January 22 issue. To my chagrin I get to the salesforce.com site, and start looking around right there, not too deeply linked,  is &lt;a href="http://blog.sforce.com/sforce/2007/01/apex_and_pure_v.html"&gt;Peter Coffee&lt;/a&gt;, formerly  a columnist of 18 years at eWeek. He?s just switched jobs! Good luck, Peter!&lt;/p&gt;</description>
      <pubDate>Sun, 28 Jan 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070221.html</guid>
      <dc:date>2007-01-28T00:00:00Z</dc:date>
    </item>
    <item>
      <title>EJB DAO "data access layer" spring hibernate persistence</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070125.html</link>
      <description>&lt;p&gt;Before Spring/Hibernate/that whole wave came along, I don?t remember being particularly inspired to have persistence and business logic attached to the entities on which that logic acted? In fact, I rather disliked EJB?s entity beans pattern specifically because everything was on the bean itself. Often times it?d be on a SessionBean, and that?s good. But even there, entity beans have basic persistence, removal and lifecycle operations built into it. A Car doesn?t car how it?s persisted, does it?  &lt;br&gt;&lt;br&gt;Then along came Rails (the most infamous example of this pattern) and suddenly everything is built into the object itself. And, honestly, I like the pattern there. Everything is static if its an operation that would be done by a DAO in Java. It?s a property if its to be persisted. Simple. You know where you stand. I also like the DAO/domain objects mechanism in modern day Java. &lt;br&gt;&lt;br&gt;That said, I?m astonished at how ugly having the DAO functionality built into the domain object can get in Java. &lt;br&gt;&lt;br&gt;I ran across some code that has factory methods for returning the entity! Then, as you modify the properties in the entity (mutator by mutator), it writes them to the database! Ugh! Modify 10 properties on the object, and lo 10 update statements fly by your console. &lt;br&gt;&lt;br&gt;Furthermore, I?ve gotten used to the idea that you can have an interface defining a contract and then an implementation of that DAO?s interface. You can hide that implementation (especially with Spring) behind its contract through any number of remoting technologies, simple base casts and more in a local call, and more. You don?t have to include the accessor / mutators in the interface, too. That?s pretty remarkable.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Jan 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070125.html</guid>
      <dc:date>2007-01-25T00:00:00Z</dc:date>
    </item>
    <item>
      <title>Archy - a maven archetype aggregator, and the 10 minute test your project so richly deserves</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070124.html</link>
      <description>&lt;p&gt;I just found a tool called &lt;a href="https://www.twdata.org/projects/archy"&gt;"archy"&lt;/a&gt;!&lt;br&gt;&lt;br&gt;I have archetype-fever. I?m not ashamed of it. Long have I lusted over toolset x but not had the inner strength or resolve to spend the night setting up an ant build that MIGHT  one day be integrated into my workflow, let alone quick enough for a 5 minute test. Maven archetypes make the agile ?10 minute test? a possibility. Java?s robbed open source projects of their 10 minute tests by being so complicated to bootstrap. With installation and compilation the norm, configuration is par for the course. Who has time? Who has more than 10 minutes, anyway?&lt;br&gt;&lt;br&gt;A really polished project will have some sort of installation mechanism. But often times, it?s non standard, or half-assed. Download Tomcat for Windows and be received with a windows installer with all the bells and whistles. Download it for linux and?look forward to configuring a few things..&lt;br&gt;&lt;br&gt;If you?ve got a project that?s a webapplication and you?ve got an installation process, then that?s impressive! Tigris.org?s Scarab, for example, has an installer. That?s not to say that there?s no configuration at all,  What?s more, in Scarab?s case, I definitely would have preferred some documentation and a few bug fixes in lieu of that installer!&lt;br&gt;&lt;br&gt;Archetypes give the project the spotlight and take care of the minutiae. This is why, unless it?s &lt;i&gt;very&lt;/i&gt; exotic (J2ME and Jini spring to mind! A proposito: has any one found a useful maven 2 plugin for J2ME or GWT?), I wait for the archetype. Simply add the archetype?s repository to ~/.m2/settings.xml and run that familiar invocation, ?mvn archetype:create ??.  Voilą, out pops a working project. You invoke mvn idea:idea at the root and off you go building a new application!&lt;br&gt;&lt;br&gt;So fine, maven archetypes are amazing. Though, now you?re where you started, in a sense, aren?t you? Not quite as bad, but bad. You have to know where the archetypes are for them to be of any use to you!  You could easily spend the time just looking for a way to avoid getting invested too much into some technology without a result.&lt;br&gt;&lt;br&gt;That?s where archy comes in. It has a centralized listing of archetypes and their corresponding repositories and a command line interface to guide you through using any of them.  It reads from &lt;a href="http://docs.codehaus.org/display/MAVENUSER/Archetypes+List"&gt;this Wiki page&lt;/a&gt;, and it reads from archetypes.xml, on the local classpath. There doesn?t seem to be an easy to use way to expand that, though. I suppose you could just author your own archetypes.xml and put that on the root of classpath and it would resolve that, instead. I haven?t perused the source itself, so I don?t know.  I?ll certainly get into it as I add more archetypes to my arsenal.    Here are a few of note: &lt;a href="http://appfuse.org/display/APF/AppFuse+QuickStart#AppFuseQuickStart-create"&gt;Matt Raible's Appfuse&lt;/a&gt;, and a &lt;a href="http://www.lunarlogic.com/blog/show/maven_archetype_for_jboss_seam"&gt;JBoss Seam archetype&lt;/a&gt;.&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;I just found &lt;a href="http://pyx4me.com/" target="_blank"&gt;Pyx4me.com&lt;/a&gt;, which, among MANY other golden nuggets, seems to have a working Maven 2/J2ME plugin. Goodbye kludgy old Maven 1 / Antenna wrapper! I hope!&lt;br&gt;</description>
      <pubDate>Wed, 24 Jan 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070124.html</guid>
      <dc:date>2007-01-24T00:00:00Z</dc:date>
    </item>
    <item>
      <title>I just got married!</title>
      <link>http://www.joshlong.com:80/jl/blogPost/20070114.html</link>
      <description>&lt;p&gt;I just got married!&lt;br&gt;&lt;br&gt;It?s the morning after, 2:54 AM, Sunday, January 14, 2007. I was married yesterday, Saturday, January 13, 2007, at 10 AM, to my friend and console and? words fail me? to Richelle.&lt;br&gt;&lt;br&gt;Few things make me arch my head in utter stupor? Few things stun me. I work in computer science, after all. Technology is science, and science is constantly learning that unknown. It?s learning that je-ne-sais-quoi that keeps our curiosity working, nagging us into the early mornings. &lt;br&gt;&lt;br&gt;Richelle stuns me. &lt;br&gt;&lt;br&gt;I love you, Richelle. Here?s to whatever?s next. I?m curious.&lt;/p&gt;</description>
      <pubDate>Sun, 14 Jan 2007 00:00:00 GMT</pubDate>
      <guid>http://www.joshlong.com:80/jl/blogPost/20070114.html</guid>
      <dc:date>2007-01-14T00:00:00Z</dc:date>
    </item>
  </channel>
</rss>

