<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title type="html">Raible Designs</title>
    <subtitle type="html">&lt;a href="http://www.linkedin.com/in/mraible"&gt;Matt Raible&lt;/a&gt; is a UI Architect specializing in open source web frameworks. &lt;a href="http://raibledesigns.com/contact.jsp"&gt;Contact me&lt;/a&gt; for rates.</subtitle>
    <id>http://raibledesigns.com/rd/feed/entries/atom</id>
            
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/" />
        <updated>2009-07-15T22:39:28-06:00</updated>
    <generator uri="http://rollerweblogger.org" version="4.0 (20071120033321:dave)">Apache Roller (incubating)</generator>
        <link rel="self" href="http://feeds.feedburner.com/rd" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry>
        <id>http://raibledesigns.com/rd/entry/raible_road_trip_13_trip</id>
        <title type="html">Raible Road Trip #13 Trip Report</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/raible_road_trip_13_trip" />
        <published>2009-07-05T13:30:17-06:00</published>
        <updated>2009-07-05T13:41:20-06:00</updated> 
        <category term="/General" label="General" />
        <category term="montana" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="roadtrip" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="raibleroadtrip" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mountrushmore" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="fairmont" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://farm4.static.flickr.com/3613/3690322783_c1eb7e02fa.jpg" title="Mount Rushmore" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm4.static.flickr.com/3613/3690322783_c1eb7e02fa_t.jpg" width="100" height="75" alt="Mount Rushmore" class="picture" /&gt;&lt;/a&gt;

Last Monday morning, my Dad, Abbie, Jack and I loaded up our rig and embarked upon &lt;a href="http://raibledesigns.com/rd/entry/raible_road_trip_13"&gt;Raible Road Trip #13&lt;/a&gt;. We rolled through Custer, South Dakota around 4:30 in the afternoon and arrived at &lt;a href="http://www.nps.gov/moru/"&gt;Mount Rushmore&lt;/a&gt; just after 5. After gawking at Rushmore, we took a meandering route through 1-car tunnels and &lt;a href="http://www.sdgfp.info/Parks/Regions/Custer/custersp.htm"&gt;Custer State Park&lt;/a&gt;. We saw a plethora of bison, some antelope and lots of nice campsites. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2453/3691133554_69d0cefb88.jpg" title="Buffalo in Custer State Park" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2453/3691133554_69d0cefb88_t.jpg" width="100" height="75" alt="Buffalo in Custer State Park" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2524/3691134458_4c5c2874d7.jpg" title="Antelope in Custer State Park" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2524/3691134458_4c5c2874d7_t.jpg" width="100" height="75" alt="Antelope in Custer State Park" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3610/3691135156_e7732d6cbf.jpg" title="Campsite near Custer" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm4.static.flickr.com/3610/3691135156_e7732d6cbf_t.jpg" width="100" height="75" alt="Campsite near Custer" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;On Tuesday, we woke up early and began the 9-hour drive to Fairmont Hot Springs. We pulled in right around 5 and had a blast in the pool and on the water slide. When we got there, we discovered that the pools were open 24 hours. Abbie and I were still up when my Dad and Jack fell asleep, so we snuck out and played in the pool by the fading light of the 10:00 sunset.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2511/3690328411_9f867f6048.jpg" title="Fairmont Playground" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2511/3690328411_9f867f6048_t.jpg" width="100" height="75" alt="Fairmont Playground" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2549/3690329997_64a8493002.jpg" title="Kids loved the slide" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2549/3690329997_64a8493002_t.jpg" width="100" height="75" alt="Kids loved the slide" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;On Wednesday, we arrived at The Cabin around 5 after a brief stop in Missoula to get some clown costumes (for the parade) and have some of the &lt;a href="http://www.bigdippericecream.com/"&gt;best ice cream in the world&lt;/a&gt; (according to Jack). Abbie learned how to chop wood and Jack got to ride on all the tractors. My Mom arrived from Oregon later that night.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a href="http://farm3.static.flickr.com/2646/3690331995_64f15c4e35.jpg" title="Ha yah" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2646/3690331995_64f15c4e35_t.jpg" width="100" height="75" alt="Ha yah!" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2630/3690332917_42da05f5fd.jpg" rel="lightbox[rushmore]" title="Learned how to chop wood for the first time"&gt;&lt;img src="http://farm3.static.flickr.com/2630/3690332917_42da05f5fd_t.jpg" width="100" height="75" alt="Learned how to chop wood for the first time" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3636/3691142182_0842e6b575.jpg" title="Driving the Ford" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm4.static.flickr.com/3636/3691142182_0842e6b575_t.jpg" width="100" height="75" alt="Driving the Ford" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Thursday and Friday, we worked on The New Cabin and got ready for the Swan Valley 4th of July Parade.
While camping in Custer, Abbie and I decided to be clowns for the parade and we were fortunate enough to find costumes in Missoula. My Mom had to drastically shrink Abbie's to fit, but her hard work paid off when Abbie won 1st Place among all the walkers. She was sooo cute as a little clown and I was a proud Dad for pulling off another fun parade.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2471/3691148244_4e701ed211.jpg" title="Abbie the Clown" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2471/3691148244_4e701ed211_m.jpg" width="240" height="180" alt="Abbie the Clown" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2522/3690342917_0aecd9c9b8.jpg" title="Clown Family" rel="lightbox[rushmore]"&gt;&lt;img src="http://farm3.static.flickr.com/2522/3690342917_0aecd9c9b8_m.jpg" width="240" height="180" alt="Clown Family" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;After the parade, we ate some huckleberry ice cream and watched the O-Mok-See for a couple hours. Then we joined up with my friend Owen and his family and enjoyed an afternoon boating on Holland Lake. We closed the night watching fireworks and got to bed really late. 
&lt;/p&gt;
&lt;p&gt;
Since we've been here, we've seen a couple bears (while riding the 4-wheeler with each kid) and my Mom saw a mountain lion walk in front of the cabin this morning. The mosquitos are vicious, but the weather is beautiful. For more pictures from the last week, see my &lt;a href="http://www.flickr.com/photos/mraible/sets/72157620862227541/"&gt;Montana 2009 - Week 1&lt;/a&gt; set on Flickr.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/raible_road_trip_13</id>
        <title type="html">Raible Road Trip #13</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/raible_road_trip_13" />
        <published>2009-06-29T06:46:04-06:00</published>
        <updated>2009-06-29T06:50:28-06:00</updated> 
        <category term="/General" label="General" />
        <category term="fairmont" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="montana" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="cabin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mountrushmore" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="thecabin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="camping" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="roadtrip" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Another year has passed and it's time for the annual trek to &lt;a href="http://raibledesigns.com/rd/entry/the_cabin"&gt;The Cabin&lt;/a&gt; for the 4th of July. &lt;a href="http://raibledesigns.com/rd/entry/raible_road_trip_12"&gt;Last year&lt;/a&gt;, we took the  route through Yellowstone. This year, we're going to shake things up a bit and head through &lt;a href="http://www.nps.gov/moru/"&gt;Mount Rushmore&lt;/a&gt;. &lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://tinyurl.com/kwuza4"&gt;&lt;img src="http://static.raibledesigns.com/repository/images/raibleroadtrip13_map.png" width="484" height="360" style="border: 1px solid silver" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;One of the highlights of this trip is sure to be &lt;a href="http://www.fairmontmontana.com/"&gt;Fairmont Hot Springs&lt;/a&gt;. We're staying their tomorrow night and I'm sure Abbie and Jack will love it. 
&lt;/p&gt;
&lt;p&gt;
After 3 weeks at The Cabin, we'll be heading to &lt;a href="http://raibledesigns.com/rd/entry/costa_rica_was_awesome"&gt;Clint and Autumn's&lt;/a&gt; wedding reception in Idaho. Having so much time off from work is sure to be strange, but I'm sure I'll get used to it.
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Happy 4th everyone!&lt;/em&gt;
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/the_good_ol_job_hunt1</id>
        <title type="html">The good ol' Job Hunt</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/the_good_ol_job_hunt1" />
        <published>2009-06-26T15:30:42-06:00</published>
        <updated>2009-06-26T16:14:09-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="linkedin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="career" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="job" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="recruiters" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jobhunt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="evite" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Just over two years ago, I wrote about the &lt;a href="http://raibledesigns.com/rd/entry/the_good_ol_job_hunt"&gt;good ol' job hunt&lt;/a&gt;. Today, I find myself in a very similar situation. My Evite gig ends in a couple hours and I'm heading to &lt;a href="http://raibledesigns.com/rd/entry/the_cabin"&gt;The Cabin&lt;/a&gt; on Monday for a month of vacation. Similar to last time, there are opportunities out there, but most of them come through recruiters. 
&lt;/p&gt;
&lt;p&gt;I have to admit - it seems like I got lucky the last couple times I tried to find a gig. I simply blogged I was looking and found myself negotiating with companies a few days later. Getting &lt;a href="http://raibledesigns.com/rd/entry/linkedin_cuts_10_a_k"&gt;laid off from LinkedIn&lt;/a&gt; was awesome in that a few companies contacted me about hiring the whole team the next day. The ability to blog-and-get-a-gig was a great way to cut out the middle-man.&lt;/p&gt;
&lt;p&gt;Unfortunately, I think I got spoiled by my blog-and-get-a-gig success. I figured it would happen again this time... 
&lt;/p&gt;
&lt;p&gt;Not so much. 
&lt;/p&gt;
&lt;p&gt;
I don't know if it's because of the down economy or because I took the year off from speaking at conferences. Regardless, I'm in an interesting situation since I &lt;a href="http://raibledesigns.com/rd/entry/new_office_and_new_bike"&gt;signed a 1-year lease&lt;/a&gt; on an office in downtown Denver.  It's easy to market to companies in Denver, but if I land a gig here, there's a good chance the client is going to want me in the office everyday. That leaves me wondering: what's the best way to market to companies outside of Colorado? My ideal contract is one that 1) allows me to work remotely and 2) only requires me to travel once or twice a month. 
&lt;/p&gt;
&lt;p&gt;
I believe my ideal gigs are out there, but I think it's difficult to convince companies I'm a good remote worker. In an attempt to convince them otherwise, I'd like to offer recommendations from my last two clients.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
"Matt contributed dramatically to the engineering practice at Evite, both directly and indirectly.  Directly, he lead the effort to define and prove a successful new web UI architecture for us.  Indirectly, he brought senior engineering talent into the organization, and energized the existing team.  We are significantly better positioned to deliver on our Product goals as a result of having worked with Matt.  I'd love to work with him again someday."
&lt;span style="text-align: right; color: #666; display: block"&gt;
&lt;em&gt;&lt;a href="http://www.linkedin.com/profile?viewProfile=&amp;amp;key=494619&amp;amp;authToken=iMtW&amp;amp;authType=name" title="View David's Profile"&gt;David Thomas&lt;/a&gt;, VP of Technology, Evite&lt;/em&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
"Matt has unique abilities in the realm of software engineering. He brings great energy, an amazing breadth of knowledge in UI technologies, along with a can-do attitude that's refreshing to interact with. He is a great leader and communicator. In addition, Matt can apply his deep understanding of the technologies in question pragmatically to the engineering problem at hand, leading his team in execution and delivery. He's an excellent technical visionary to complement any team."
&lt;span style="text-align: right; color: #666; display: block; margin-top: 5px"&gt;
&lt;em&gt;&lt;a href="http://www.linkedin.com/profile?viewProfile=&amp;amp;key=3115840&amp;amp;authToken=xnlz&amp;amp;authType=name" title="View Arnold's Profile"&gt;Arnold Goldberg&lt;/a&gt;, Vice President  Platform Engineering, LinkedIn&lt;/em&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
If you're looking to hire someone with &lt;a href="http://www.linkedin.com/in/mraible"&gt;my skills&lt;/a&gt;, &lt;a href="http://raibledesigns.com/contact.jsp"&gt;let me know&lt;/a&gt; - there's a good chance you'll be glad you did. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/how_to_use_gwt_2</id>
        <title type="html">How to use GWT 2.0 with Maven and Generate SOYC Reports</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/how_to_use_gwt_2" />
        <published>2009-06-25T23:45:04-06:00</published>
        <updated>2009-06-25T23:48:17-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt-maven-plugin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="runasync" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="soyc" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">One of the most interesting features coming in GWT 2.0 is &lt;a href="http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting"&gt;code splitting&lt;/a&gt; and the ability to use GWT.runAsync() to reduce the size of your application's initial download. This week, I learned how to use GWT 2.0 with my GWT 1.6/Maven project. Below are instructions on how to build and use the latest GWT with Maven.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#compiling"&gt;Checkout GWT and setup GWT_TOOLS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Set a GWT_VERSION environment variable to &lt;em&gt;2.0.0-SNAPSHOT&lt;/em&gt; (export GWT_VERSION=2.0.0-SNAPSHOT).&lt;/li&gt;
&lt;li&gt;Build GWT with the &lt;em&gt;ant&lt;/em&gt; command.&lt;/li&gt;
&lt;li&gt;After building completes, install the GWT artifacts into your local Maven repository using the following commands: 
&lt;pre style="margin-top: 5px"&gt;mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-user -Dversion=2.0.0-SNAPSHOT \
-Dpackaging=jar -Dfile=build/lib/gwt-user.jar

mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-servlet -Dversion=2.0.0-SNAPSHOT \
-Dpackaging=jar -Dfile=build/lib/gwt-servlet.jar

mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-dev -Dversion=2.0.0-SNAPSHOT \
-Dclassifier=mac -Dpackaging=jar -Dfile=build/lib/gwt-dev-mac.jar

mkdir temp
tar -zxf build/dist/gwt-mac-2.0.0-SNAPSHOT.tar.gz -C temp
cd temp/gwt-mac-2.0.0-SNAPSHOT
zip -0 gwt-mac-2.0.0-SNAPSHOT.zip lib*.jnilib
cd ../..

mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-dev -Dversion=2.0.0-SNAPSHOT \
-Dclassifier=mac-libs -Dpackaging=zip \
-Dfile=temp/gwt-mac-2.0.0-SNAPSHOT/gwt-mac-2.0.0-SNAPSHOT.zip
&lt;/pre&gt;
&lt;div style="margin-bottom: 5px; text-align: right"&gt;&lt;em&gt;Thanks to &lt;a href="http://groups.google.com/group/codehaus-mojo-gwt-maven-plugin-users/browse_thread/thread/83e860b1de4565f5"&gt;Jason&lt;/a&gt; for his help with this script.&lt;/em&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Modify the pom.xml of your GWT project to use the the &lt;a href="http://mojo.codehaus.org/gwt-maven-plugin/"&gt;gwt-maven-plugin&lt;/a&gt; from Codehaus. Of course, you'll need to modify the &amp;lt;runTarget&amp;gt; to fit your project.
&lt;pre class="brush: xml"&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gwt-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;runTarget&amp;gt;org.appfuse.gwt.mvc.${entry.point}/${entry.point}.html&amp;lt;/runTarget&amp;gt;
    &amp;lt;/configuration&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;
                &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Modify your dependencies to match the ones below. With the Codehaus plugin, dependencies are much more concise.
&lt;pre class="brush: xml"&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.gwt&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gwt-servlet&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${gwt.version}&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.gwt&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gwt-user&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${gwt.version}&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Add &lt;em&gt;&amp;lt;gwt.version&gt;2.0.0-SNAPSHOT&amp;lt;/gwt.version&gt;&lt;/em&gt; to the properties section of your pom.xml.&lt;/li&gt;
&lt;li&gt;At this point, you should be able to compile your project with &lt;strong&gt;mvn gwt:compile&lt;/strong&gt; and run it in hosted mode using &lt;strong&gt;mvn gwt:run&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Generate SOYC Reports&lt;/strong&gt;&lt;br/&gt;
In Google's code splitting documentation, it mentions &lt;a href="http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting#The_Story_of_Your_Compile_(SOYC)"&gt;The Story of Your Compile (SOYC)&lt;/a&gt;. From the documentation:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
To obtain a SOYC report for your application, there are two steps necessary. First, add -soyc to the compilation options that are passed to the GWT compiler. This will cause the compiler to emit raw information about the compile to XML files in an -aux directory beside the rest of the compiled output. In that directory, you will see an XML file for each permutation and a manifest.xml file that describes the contents of all the others.
&lt;br/&gt;&lt;br/&gt;
The second step is to convert that raw information into viewable HTML. This is done with the SoycDashboard tool.
&lt;/p&gt;
&lt;p&gt;The first step is not currently possible with the gwt-maven-plugin, so I &lt;a href="http://jira.codehaus.org/browse/MGWT-92"&gt;created a patch for it&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style="margin-left: 20px; color: #666"&gt;&lt;em&gt;
If you patch the gwt-maven-plugin and install it locally, make sure and change the version in your pom.xml to &lt;strong&gt;1.2-SNAPSHOT&lt;/strong&gt;.
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To use the SoycDashboard tool, you'll need to install the gwt-soyc-vis.jar.
&lt;pre&gt;
mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-soyc-vis -Dversion=2.0.0-SNAPSHOT \
-Dpackaging=jar -Dfile=build/lib/gwt-soyc-vis.jar
&lt;/pre&gt;
&lt;p&gt;Now you can generate SOYC reports with &lt;strong&gt;mvn gwt:compile -Dgwt.compiler.soyc=true&lt;/strong&gt;. You can also add &amp;lt;soyc&amp;gt;true&amp;lt;/soyc&amp;gt; to the &amp;lt;configuration&amp;gt; section of the gwt-maven-plugin.&lt;/p&gt;
&lt;p&gt;The second step (converting the raw information into viewable HTML) is possible using &lt;em&gt;java&lt;/em&gt; from the command-line, or by using the &lt;a href="http://mojo.codehaus.org/exec-maven-plugin/"&gt;exec-maven-plugin&lt;/a&gt;. Here's the (lengthy) command-line version:&lt;/p&gt;
&lt;pre&gt;java -Xmx1024m -cp /Users/mraible/.m2/repository/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar:/Users/mraible/.m2/repository/com/google/gwt/gwt-dev/2.0.0-SNAPSHOT/gwt-dev-2.0.0-SNAPSHOT-mac.jar com.google.gwt.soyc.SoycDashboard -resources ~/.m2/repository/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar -out target/soyc-report target/extra/org.appfuse.gwt.mvc.MVC/soycReport/stories0.xml.gz target/extra/org.appfuse.gwt.mvc.MVC/soycReport/dependencies0.xml.gz target/extra/org.appfuse.gwt.mvc.MVC/soycReport/splitPoints0.xml.gz&lt;/pre&gt;
&lt;p&gt;In this example, I'm using the files from &lt;em&gt;stories0.xml.gz&lt;/em&gt;, &lt;em&gt;dependencies0.xml.gz&lt;/em&gt;, &lt;em&gt;splitPoints0.xml.gz&lt;/em&gt;. In the &lt;em&gt;soycReport&lt;/em&gt; output directory, there's 5 of each these files and I'm not sure what the difference between reports is. Hopefully someone on the GWT team can elaborate. The exec-maven-plugin version is as follows:&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;executable&amp;gt;java&amp;lt;/executable&amp;gt;
        &amp;lt;arguments&amp;gt;
            &amp;lt;argument&amp;gt;-cp&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;
                ${settings.localRepository}/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar:${settings.localRepository}/com/google/gwt/gwt-dev/2.0.0-SNAPSHOT/gwt-dev-2.0.0-SNAPSHOT-${platform}.jar
            &amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;com.google.gwt.soyc.SoycDashboard&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;-out&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;target/soyc-report&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;-resources&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;
                ${settings.localRepository}/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar
            &amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;${project.build.directory}/extra/org.appfuse.gwt.mvc.MVC/soycReport/stories0.xml.gz&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;${project.build.directory}/extra/org.appfuse.gwt.mvc.MVC/soycReport/dependencies0.xml.gz&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;${project.build.directory}/extra/org.appfuse.gwt.mvc.MVC/soycReport/splitPoints0.xml.gz&amp;lt;/argument&amp;gt;
        &amp;lt;/arguments&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After configuring this plugin in your project, you should be able to run &lt;strong&gt;mvn gwt:compile exec:exec&lt;/strong&gt; and open the generated report (at &lt;em&gt;target/soyc-report/SoycDashboard-index.html&lt;/em&gt;). Currently, there doesn't seem to be much documentation on SOYC. &lt;a href="http://www.slideshare.net/fredsa/gwt-overview-and-feature-preview-sv-web-jug-june-16-2009"&gt;Fred Sauer's recent presentation&lt;/a&gt; talks a bit about SOYC and GWT.runAsync(), but that's about it.&lt;/p&gt;
&lt;p&gt;To figure out how to use GWT 2.0 with Maven, I used my &lt;a href="http://raibledesigns.com/rd/entry/gxt_s_mvc_framework"&gt;GWT MVC Example&lt;/a&gt; project. The first SOYC report I generated said the initial download was 108,967 KB. To integrate GWT.runAsync(), I modified all the project's controllers so their &lt;em&gt;handleEvent()&lt;/em&gt; methods changed from this:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public void handleEvent(AppEvent&lt;?&gt; event) {
    onViewHome(event);
}
&lt;/pre&gt;
&lt;p&gt;To this:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public void handleEvent(final AppEvent&lt;?&gt; event) {
    GWT.runAsync(new RunAsyncCallback() {
        public void onFailure(Throwable throwable) {
            Window.alert(throwable.getMessage());
        }

        public void onSuccess() {
            onViewHome(event);
        }
    });
}

&lt;/pre&gt;&lt;p&gt;When I generated a new SOYC report, the initial download size was reduced to 56,718 KB. Furthermore, I was able to see that my "Leftovers code" consisted of 63,175 KB. I'm sure there's better ways to split my project using GWT.runAsync(), but I'm happy to see I was able to reduce the initial download by 50%. &lt;/p&gt;
&lt;p&gt;If you'd like to try GWT 2.0, you can can &lt;a href="http://static.raibledesigns.com/downloads/gwt-mvc-1.1.zip"&gt;download my gwt-mvc example project&lt;/a&gt;. To build/run this project, you'll need to 1) build and install GWT, 2) patch gwt-maven-plugin and 3) run &lt;strong&gt;mvn gwt:compile exec:exec&lt;/strong&gt; to generate the SOYC report. In an ideal world, the gwt-maven-plugin can be enhanced to generate the SOYC report (rather than using the exec-maven-plugin). In the meantime, I think it's pretty cool that you can try out GWT 2.0 features while they're still being developed.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/json_parsing_with_javascript_overlay</id>
        <title type="html">JSON Parsing with JavaScript Overlay Types in GWT</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/json_parsing_with_javascript_overlay" />
        <published>2009-06-24T09:52:49-06:00</published>
        <updated>2009-06-24T10:00:52-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="json" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javascript" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="twitter" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="overlaytypes" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="requestbuilder" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">A reader recently &lt;a href="http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt#comment-1245137914000"&gt;asked&lt;/a&gt;:&lt;/p&gt;
&lt;p style="color: #666" class="quote"&gt;
I would love to see a snippet of how to eval the JSON coming from RequestBuilder into the OverlayTypes. What is the mapping like? I used OverlayTypes to read in static data that I render into the head section of the hosted page, which is pretty easy and fast, but I don't know how to do this "reading" dynamically at runtime.&lt;/p&gt;
&lt;p&gt;If you're not familiar with GWT's Overlay Types (added in 1.5), see &lt;a href="http://googlewebtoolkit.blogspot.com/2008/08/getting-to-really-know-gwt-part-2.html"&gt;Getting to really know GWT, Part 2: JavaScript Overlay Types&lt;/a&gt;. In our project, we're using Overlay Types to simplify JSON parsing and make our application lean-and-mean as possible. 
&lt;/p&gt;
&lt;p&gt;
First of all, we have a JSOModel class that acts as our overlay type:
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
import java.util.HashSet;
import java.util.Set;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;

/**
 * Java overlay of a JavaScriptObject.
 */
public abstract class JSOModel extends JavaScriptObject {

    // Overlay types always have protected, zero-arg constructors
    protected JSOModel() {
    }

    /**
     * Create an empty instance.
     * 
     * @return new Object
     */
    public static native JSOModel create() /*-{
        return new Object();
    }-*/;

    /**
     * Convert a JSON encoded string into a JSOModel instance.
     * &amp;lt;p/&amp;gt;
     * Expects a JSON string structured like '{"foo":"bar","number":123}'
     *
     * @return a populated JSOModel object
     */
    public static native JSOModel fromJson(String jsonString) /*-{
        return eval('(' + jsonString + ')');
    }-*/;

    /**
     * Convert a JSON encoded string into an array of JSOModel instance.
     * &amp;lt;p/&amp;gt;
     * Expects a JSON string structured like '&amp;#91;{"foo":"bar","number":123}, {...}&amp;#93;'
     *
     * @return a populated JsArray
     */
    public static native JsArray&amp;lt;JSOModel&amp;gt; arrayFromJson(String jsonString) /*-{
        return eval('(' + jsonString + ')');
    }-*/;

    public final native boolean hasKey(String key) /*-{
        return this&amp;#91;key&amp;#93; != undefined;
    }-*/;

    public final native JsArrayString keys() /*-{
        var a = new Array();
        for (var p in this) { a.push(p); }
        return a;
    }-*/;

    @Deprecated
    public final Set&amp;lt;String&amp;gt; keySet() {
        JsArrayString array = keys();
        Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;String&amp;gt;();
        for (int i = 0; i &amp;lt; array.length(); i++) {
            set.add(array.get(i));
        }
        return set;
    }

    public final native String get(String key) /*-{
        return "" + this&amp;#91;key&amp;#93;;
    }-*/;

    public final native String get(String key, String defaultValue) /*-{
        return this&amp;#91;key&amp;#93; ? ("" + this&amp;#91;key&amp;#93;) : defaultValue;
    }-*/;

    public final native void set(String key, String value) /*-{
        this&amp;#91;key&amp;#93; = value;
    }-*/;

    public final int getInt(String key) {
        return Integer.parseInt(get(key));
    }

    public final boolean getBoolean(String key) {
        return Boolean.parseBoolean(get(key));
    }

    public final native JSOModel getObject(String key) /*-{
        return this&amp;#91;key&amp;#93;;
    }-*/;

    public final native JsArray&amp;lt;JSOModel&amp;gt; getArray(String key) /*-{
        return this&amp;#91;key&amp;#93; ? this&amp;#91;key&amp;#93; : new Array();
    }-*/;
}
&lt;/pre&gt;
&lt;p&gt;This class alone allows you to easily parse JSON returned in a callback. For example, here's an example of parsing &lt;a href="http://twitter.com/statuses/user_timeline.json"&gt;Twitter's User Timeline&lt;/a&gt; in my &lt;a href="http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt"&gt;OAuth with GWT&lt;/a&gt; application.
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
private class TwitterApiCallback implements RequestCallback {
    public void onResponseReceived(Request request, Response response) {
        if (response.getStatusCode() == 200) {
            JsArray&amp;lt;JSOModel&amp;gt; data = JSOModel.arrayFromJson(response.getText());
            List&amp;lt;JSOModel&amp;gt; statuses = new ArrayList&amp;lt;JSOModel&amp;gt;();
            for (int i = 0; i &amp;lt; data.length(); i++) {
                statuses.add(data.get(i));
            }

            // populate textarea with returned statuses
            for (JSOModel status : statuses) {
                payload.setValue(payload.getValue() + status.get("text") + "\n\n");
            }
            
            Label success = new Label("API call successful!");
            success.setStyleName("success");
            form.add(success);
        } else {
            onError(request, new RequestException(response.getText()));
        }
    }

    public void onError(Request request, Throwable throwable) {
        Window.alert("Calling API failed. " + OAuthPage.STANDARD_ERROR + "\n\n" + throwable.getMessage());
    }
}
&lt;/pre&gt;
&lt;p&gt;To simply things even more, we created a BaseModel class that can be extended.&lt;/p&gt;
&lt;pre class="brush: java"&gt;
import java.util.Map;
import java.util.HashMap;

import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.DOM;

public abstract class BaseModel {

    protected JSOModel data;

    public BaseModel(JSOModel data) {
        this.data = data;
    }

    public String get(String field) {
        String val = this.data.get(field);
        if (val != null &amp;amp;&amp;amp; "null".equals(val) || "undefined".equals(val)) {
            return null;
        } else {
            return escapeHtml(val);
        }
    }

    public Map&amp;lt;String, String&amp;gt; getFields() {
        Map&amp;lt;String, String&amp;gt; fieldMap = new HashMap&amp;lt;String, String&amp;gt;();

        if (data != null) {
            JsArrayString array = data.keys();

            for (int i = 0; i &amp;lt; array.length(); i++) {
                fieldMap.put(array.get(i), data.get(array.get(i)));
            }
        }
        return fieldMap;
    }

    private static String escapeHtml(String maybeHtml) {
        final Element div = DOM.createDiv();
        DOM.setInnerText(div, maybeHtml);
        return DOM.getInnerHTML(div);
    }
}
&lt;/pre&gt;
&lt;p&gt;You can extend this class and create model objects that represent a more Java-like view of your data. For example, I could create a Status class with the following code:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public class Status extends BaseModel {
    
    public Status(JSOModel data) {
        super(data);
    }

    public String getText() {
        return get("text");
    }
}
&lt;/pre&gt;
&lt;p&gt;Then I could change my JSON parsing in TwitterApiCallback to be:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
    private class TwitterApiCallback implements RequestCallback {
    public void onResponseReceived(Request request, Response response) {
        if (response.getStatusCode() == 200) {
            JsArray&amp;lt;JSOModel&amp;gt; data = JSOModel.arrayFromJson(response.getText());
            List&amp;lt;Status&amp;gt; statuses = new ArrayList&amp;lt;Status&amp;gt;();
            for (int i = 0; i &amp;lt; data.length(); i++) {
                Status s = new Status(data.get(i));
                statuses.add(s);
            }

            // populate textarea with returned statuses
            for (Status status : statuses) {
                payload.setValue(payload.getValue() + status.getText() + "\n\n");
            }

            Label success = new Label("API call successful!");
            success.setStyleName("success");
            form.add(success);
        } else {
            onError(request, new RequestException(response.getText()));
        }
    }

    public void onError(Request request, Throwable throwable) {
        Window.alert("Calling API failed. " + OAuthPage.STANDARD_ERROR + "\n\n" + throwable.getMessage());
    }
}
&lt;/pre&gt;
&lt;p&gt;That's how we're doing lightweight JSON parsing with GWT. I've updated my &lt;a href="http://demo.raibledesigns.com/gwt-oauth/"&gt;GWT with OAuth demo&lt;/a&gt; with this code. You can also &lt;a href="http://static.raibledesigns.com/downloads/gwt-oauth-1.1.zip"&gt;download the source&lt;/a&gt;. Please let me know if you have any questions. </content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/a_fun_father_s_day</id>
        <title type="html">A Fun Father's Day at Great Sand Dunes</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/a_fun_father_s_day" />
        <published>2009-06-23T23:28:13-06:00</published>
        <updated>2009-06-24T12:10:23-06:00</updated> 
        <category term="/General" label="General" />
        <category term="sanddunes" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="fathersday" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="camping" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="greatsanddunes" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dad" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="colorado" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="abbie" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jack" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="kids" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Our &lt;a href="http://raibledesigns.com/rd/entry/going_to_the_great_sand"&gt;Father's Day trip&lt;/a&gt; started out a bit rocky when my Dad's flight got delayed an entire day. Fortunately, it ended up being a blessing in disguise. As &lt;a href="http://raibledesigns.com/rd/entry/going_to_the_great_sand#comment-1245646443000"&gt;Doug commented&lt;/a&gt;, Friday night was wet and Saturday wasn't much better. Our friends, Jenny and Jeff, left early Saturday morning and arrived in time for a couple hours of rain. At 3:00 on Saturday afternoon, it cleared up and was beautiful for the rest of the weekend. 
&lt;/p&gt;
&lt;p&gt;
We showed up at 8:30 on Saturday night and stayed through Monday morning. If you asked Abbie and Jack, they'd say the best part was driving on the road past the &lt;a href="http://activities.wildernet.com/pages/activity.cfm?actid=SANDIO*16195prk"&gt;Point of No Return&lt;/a&gt;. My favorite moment was when they climbed to the top of a dune with me. The mosquitoes were mean and plentiful, but the campground was well equipped and had excellent views. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3410/3655575351_15034a94c7.jpg" title="Jack's first hike to The Dunes" rel="lightbox[sanddunes2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3410/3655575351_15034a94c7_m.jpg" width="240" height="180" alt="Jack's first hike to The Dunes" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3338/3656373540_a0dd349d0d.jpg" title="There's a good spot!" rel="lightbox[sanddunes2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3338/3656373540_a0dd349d0d_m.jpg" width="240" height="180" alt="There's a good spot!" style="border: 1px solid black; margin-left: 10px"  /&gt;&lt;/a&gt;

&lt;br/&gt;&lt;br/&gt;

&lt;a href="http://farm3.static.flickr.com/2461/3655577467_c84ac6e9d7.jpg" title="Running to see Jenny and Jeff" rel="lightbox[sanddunes2009]"&gt;&lt;img src="http://farm3.static.flickr.com/2461/3655577467_c84ac6e9d7_m.jpg" width="240" height="180" alt="Running to see Jenny and Jeff" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2471/3655577971_fbbbef5dc0.jpg" title="The Pratts" rel="lightbox[sanddunes2009]"&gt;&lt;img src="http://farm3.static.flickr.com/2471/3655577971_fbbbef5dc0_m.jpg" width="240" height="180" alt="The Pratts" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://farm3.static.flickr.com/2151/3656377546_58a9f59c25.jpg" title="Hiking back to campsite" rel="lightbox[sanddunes2009]"&gt;&lt;img src="http://farm3.static.flickr.com/2151/3656377546_58a9f59c25_m.jpg" width="240" height="180" alt="Hiking back to campsite" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3622/3656378886_c1806dfc33.jpg" title="Sunset at The Dunes" rel="lightbox[sanddunes2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3622/3656378886_c1806dfc33_m.jpg" width="240" height="180" alt="Sunset at The Dunes" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;If you ever get a chance to take your kids to &lt;a href="http://www.nps.gov/grsa/"&gt;Great Sand Dunes&lt;/a&gt;, you should jump at the opportunity. This place is simply awesome. For more pictures, see my &lt;a href="http://www.flickr.com/photos/mraible/sets/72157620431004902/"&gt;Great Sand Dunes 2009&lt;/a&gt; set on &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/going_to_the_great_sand</id>
        <title type="html">Going to the Great Sand Dunes for Father's Day</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/going_to_the_great_sand" />
        <published>2009-06-19T15:57:01-06:00</published>
        <updated>2009-06-19T20:56:35-06:00</updated> 
        <category term="/General" label="General" />
        <category term="camping" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="fathersday" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="greatsanddunes" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dad" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Last year's &lt;a href="http://raibledesigns.com/rd/entry/the_father_s_day_camping"&gt;Father's Day Camping Trip&lt;/a&gt; was quite the debacle. Regardless, we had a lot of fun and I'm committed to making it a tradition. This year, we're going camping at the &lt;a href="http://www.nps.gov/grsa/"&gt;Great Sand Dunes&lt;/a&gt; in Southern Colorado. The last time I went camping at the Sand Dunes was before Abbie was born, so I'm very much looking forward to it. It's really an amazing place that's somewhat indescribable with words. It's one of those places you have to see to believe.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://photography.nationalgeographic.com/photography/enlarge/great-sand-dunes_pod_image.html" title="The Great Sand Dunes"&gt;&lt;img src="http://farm4.static.flickr.com/3620/3642487758_c73e6de423.jpg" width="500" height="375" alt="The Great Sand Dunes" style="border: 1px solid black" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The funny part of this year's trip is it's already looking like we might have some good adventures. My dad was supposed to fly into Denver today at 3:00. It's a 4-hour drive to the dunes, which puts us arriving around 7:30. That's probably enough time to pitch a tent and have a beer or two. Instead, his &lt;a href="http://twitter.com/mraible/status/2241339305"&gt;flight is delayed&lt;/a&gt;. Arriving in the dark w/o a campsite seems like a bad idea, so I made a reservation at the KOA Campground in Alamosa. I'm somewhat disappointed we won't be camping at the dunes tonight, but we'll get to see the dunes first thing in the morning. &lt;/p&gt;
&lt;p&gt;To all the dads out there - I hope you have a great Father's Day weekend!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update @ 5:45 PM:&lt;/strong&gt; My dad just called and said United cancelled his flight. Apparently, they'll put him on the same flight tomorrow. That means we won't get to the dunes until 7:30 tomorrow night. &lt;img src="http://raibledesigns.com/images/smileys/sad.gif" class="smiley" alt=":(" title=":(" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt</id>
        <title type="html">Implementing OAuth with GWT</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt" />
        <published>2009-06-18T13:59:13-06:00</published>
        <updated>2009-06-18T15:35:46-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="javascript" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="oauth" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="google" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">I've heard about &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt; for quite some time, but never had an opportunity to implement it on a project. For a good explanation of what OAuth is, see its &lt;a href="http://oauth.net/about"&gt;Introduction&lt;/a&gt;. Here's an excerpt: &lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
...it allows you the User to grant access to your private resources on one site (which is called the Service Provider), to another site (called Consumer, not to be confused with you, the User). While OpenID is all about using a single identity to sign into many sites, OAuth is about giving access to your stuff without sharing your identity at all (or its secret parts).
&lt;/p&gt;
&lt;p&gt;The reason I needed OAuth was to interact with the &lt;a href="http://code.google.com/apis/contacts/"&gt;Google Contacts API&lt;/a&gt;. I've always hated how sites make you import all your contacts from Gmail. I wanted to develop a system that'd let you simply read your contacts from Google in real-time.
&lt;/p&gt;
&lt;p&gt;Since the &lt;a href="http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt"&gt;application I'm working on uses GWT&lt;/a&gt;, I chose to implement an OAuth client in GWT. After googling for "&lt;a href="http://www.google.com/search?q=gwt+oauth"&gt;gwt oauth&lt;/a&gt;", I found &lt;a href="http://code.google.com/p/gwt-examples/wiki/oAuth"&gt;two&lt;/a&gt; &lt;a href="www.sergimansilla.com/blog/?p=75"&gt;examples&lt;/a&gt;. Unfortunately, neither worked out-of-the-box. 
&lt;/p&gt;
&lt;p&gt;
The good news is I did manage to create a working solution. The bad news is it only seems to work at random. That's right folks, I created a solution that only works 50% of the time. I'm somewhat embarrassed to post it here, but I also realize the power of open source and community. By sharing, I hope we can find the flaws in my logic and come up with a solution for all GWT applications. 
&lt;/p&gt;
&lt;p&gt;The best project for OAuth libraries seems to be &lt;a href="http://code.google.com/p/oauth/"&gt;oauth on Google Code&lt;/a&gt;. However, you'll notice that there is no JavaScript implementation listed on the homepage. I did look at the &lt;a href="http://oauth.googlecode.com/svn/code/java/"&gt;Java&lt;/a&gt; implementation, but quickly realized it wouldn't be usable in GWT. Therefore, I opted for the &lt;a href="http://oauth.googlecode.com/svn/code/javascript/"&gt;JavaScript&lt;/a&gt; implementation.
&lt;/p&gt;
&lt;p&gt;OAuth consists of several steps. The following diagram explains the authentication flow nicely.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3384/3638983340_e353831f5c_o.png" title="OAuth Authentication Flow" rel="lightbox[gwt-oauth]"&gt;&lt;img src="http://farm4.static.flickr.com/3384/3638983340_4d939fd820.jpg" width="500" height="368" alt="OAuth Authentication Flow" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In a nutshell, you have to complete the following steps:
&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Get a token from the service provider.&lt;/li&gt;
&lt;li&gt;Redirect user to service provider to grant access and redirect back to application.&lt;/li&gt;
&lt;li&gt;Request access token to access protected resources.&lt;/li&gt;
&lt;li&gt;Access protected resources and pull/push data.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
To access a service provider's OAuth service, you'll likely need to start by registering your application. For Google, &lt;a href="http://code.google.com/apis/accounts/docs/OAuth.html"&gt;OAuth Authentication for Web Applications&lt;/a&gt; is an excellent resource. Google's &lt;a href="http://googlecodesamples.com/oauth_playground/"&gt;OAuth Playground&lt;/a&gt; is a great way to with the Google Data APIs after you've registered.
&lt;/p&gt;
&lt;p&gt;
Now that you know how OAuth works, let's look at how I implemented it with GWT.  I started by adding the necessary JavaScript references to my *.gwt.xml file.&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;script src="http://oauth.googlecode.com/svn/code/javascript/oauth.js"/&amp;gt;
&amp;lt;script src="http://oauth.googlecode.com/svn/code/javascript/sha1.js"/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, I needed a way to sign the request. I tried to use Sergi Mansilla's &lt;a href="http://sergimansilla.com/public/flyqlr/flyqlr/src/com/sergi/client/OAuth.java"&gt;OAuth.java&lt;/a&gt; for this, but discovered issues with how the parameters were being written with GWT 1.6. I opted for Paul Donnelly's &lt;a href="http://paul.donnelly.org/2008/10/31/2-legged-oauth-javascript-function-for-yql/"&gt;makeSignedRequest function&lt;/a&gt; instead. By adding this to my application's HTML page, I'm able to call it using the following JSNI method:
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public native static String signRequest(String key, String secret, String tokenSecret, String url) /*-{
    return $wnd.makeSignedRequest(key, secret, tokenSecret, url);
}-*/;
&lt;/pre&gt;
&lt;p&gt;After the URL is signed, it needs to be sent to the provider to get a &lt;em&gt;request token&lt;/em&gt;. To do this, I used GWT's RequestBuilder and created a &lt;em&gt;send()&lt;/em&gt; method:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
protected void send(RequestCallback cb, String URL) {
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL);
    builder.setTimeoutMillis(10000);
    builder.setCallback(cb);
    
    Request req = null;
    try {
        req = builder.send();
    } catch (RequestException e) {
        cb.onError(req, e);
    }
}
&lt;/pre&gt;
&lt;p&gt;If you try this with Google's &lt;a href="https://www.google.com/accounts/OAuthGetRequestToken"&gt;Request Token URL&lt;/a&gt; in GWT's hosted mode, nothing will happen. Compile/browse to Safari and you'll still see nothing. Try it in Firefox and you'll see the following.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img src="http://farm3.static.flickr.com/2437/3639119788_b675d86360_o.png" width="400" alt="SOP Error" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;To workaround browsers' &lt;a href="http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_SOP"&gt;Same Origin Policy&lt;/a&gt;I added a proxy servlet to send the requests. I started with Jason Edwards's &lt;a href="http://edwardstx.net/wiki/attach/HttpProxyServlet/ProxyServlet.java"&gt;ProxyServlet&lt;/a&gt; and modified it to fit my needs. I then registered it in both *.gwt.xml and web.xml.
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;servlet path="/google/" class="org.appfuse.gwt.servlet.AlternateHostProxyServlet"/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now, before calling the &lt;em&gt;send()&lt;/em&gt; method, I replace the start of the URL so the request would be routed through the servlet.&lt;/p&gt;
&lt;pre class="brush:java"&gt;
public void getToken(RequestCallback cb) {
    String url = signRequest(provider.getConsumerKey(), 
                             provider.getConsumerSecret(), 
                             "", provider.getRequestTokenURL());
    url = url.replace("https://www.google.com/", "/google/");
    send(cb, url);
}
&lt;/pre&gt;
&lt;p&gt;When the request returns, I create two cookies by calling a &lt;em&gt;createOAuthCookies()&lt;/em&gt; method with the payload returned:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public static String[] createOAuthCookies(String data) {
    String oauth_token = data.substring(data.indexOf("oauth_token=") + 12);
    oauth_token = oauth_token.substring(0, oauth_token.indexOf("&amp;"));

    String oauth_token_secret = data.substring(data.indexOf("oauth_token_secret=") + 19);

    Cookies.setCookie("oauth_token", URL.decode(oauth_token));
    Cookies.setCookie("oauth_token_secret", URL.decode(oauth_token_secret));
    return new String[]{oauth_token, oauth_token_secret};
}
&lt;/pre&gt;
&lt;p&gt;The next step is to authorize the token. This is where things got tricky with my proxy servlet and I had to add some special logic for GWT. Google was sending back a 302 with a Location header, but it wasn't hitting the &lt;em&gt;onResponseReceived()&lt;/em&gt; method in my callback. For this reason, I had to change it to a 200 status code and add the redirect location to the body. I also discovered that sometimes they'd return an HTML page with a &lt;code&gt;&amp;lt;meta http-equiv="refresh" ...&amp;gt;&lt;/code&gt; tag. When using Twitter, I discovered the full HTML for the allow/deny page was returned.
Below is the callback I'm using. &lt;a href="http://gwt-widget.sourceforge.net/docs/xref/org/gwtwidgets/client/util/WindowUtils.html"&gt;WindowUtils&lt;/a&gt; is a class I got from Robert Hanson and the &lt;a href="http://gwt-widget.sourceforge.net/"&gt;gwt-widget&lt;/a&gt; project.
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public void onResponseReceived(Request request, Response response) {
    String text = response.getText();
    if (response.getStatusCode() == 200 &amp;&amp; response.getText().startsWith("http")) {
        WindowUtils.changeLocation(response.getText());
    } else {
        // look for meta-tag that refreshes and grab its URL
        if (text.contains("&lt;meta http-equiv=\"refresh\"")) {
            String tokenToStartWith = "url=&amp;#39;";
            String tokenToEndWith = "&amp;#39;\"&gt;";
            String url = text.substring(text.indexOf(tokenToStartWith) + tokenToStartWith.length());
            url = url.substring(0, url.indexOf(tokenToEndWith) + tokenToEndWith.length());
            WindowUtils.changeLocation(url);
        } else {
            // Twitter returns a full HTML page, so redirect to the authorize URL manually
            if (provider instanceof Twitter) {
                String url = provider.getAuthorizeTokenURL();
                url = url.replace("$1", OAuthRequest.getAuthToken());
                url = url.replace("$2", DefaultRequest.getCurrentLocation());
                WindowUtils.changeLocation(url);
            } else {
                onError(request, new RequestException(text));
            }
        }
    }
}

public void onError(Request request, Throwable caught) {
    Window.alert("Calling authorize token failed. " + OAuthPage.STANDARD_ERROR + "\n\n" + caught.getMessage());
}&lt;/pre&gt;
&lt;p&gt;The 3rd step is to get an access token. The most important thing to remember when you do this is to include the "oauth_token_secret" value when signing the request.&lt;/p&gt;
&lt;pre class="brush: java"&gt;
signRequest(provider.getConsumerKey(), provider.getConsumerSecret(), 
            getAuthTokenSecret(), url);
&lt;/pre&gt;
&lt;p&gt;After this completes with a 200, I create the cookies again (since oauth_token and oauth_token_secret are returned in the body), then call the API to get a list of contacts. The ContactsRequests class is responsible for making the call. The DefaultRequest class contains the &lt;em&gt;send()&lt;/em&gt; method as well as utility methods to get the cookie values of the oauth tokens.&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public class ContactsRequest extends DefaultRequest {
    private static final String GOOGLE_CONTACTS_URL = 
        "http://www.google.com/m8/feeds/contacts/default/thin?oauth_token=$1";
    private OAuthProvider provider;

    public ContactsRequest(OAuthProvider provider) {
        this.provider = provider;
    }

    public void getContacts(RequestCallback cb) {
        String url = GOOGLE_CONTACTS_URL.replace("$1", getAuthToken());
        url = signRequest(provider.getConsumerKey(), provider.getConsumerSecret(), 
                          getAuthTokenSecret(), url);

        String proxiedURLPrefix = "/contacts/";
        // allow for deploying at /gwt-oauth context
        if (WindowUtils.getLocation().getPath().contains("gwt-oauth")) {
            proxiedURLPrefix = "/gwt-oauth" + proxiedURLPrefix;
        }

        url = url.replace("http://www.google.com/", proxiedURLPrefix);

        send(cb, url);
    }
}&lt;/pre&gt;
&lt;p&gt;If all goes well, the response contains the data you requested and it's used to populate a textarea (at least in this demo application). Of course, additional processing needs to occur to parse/format this data into something useful.&lt;/p&gt;
&lt;p&gt;This all sounds pretty useful for GWT applications, right? I believe it does - but only if it works consistently. I sent &lt;a href="http://groups.google.com/group/oauth/browse_thread/thread/e180000f5bd9dc2c"&gt;a message&lt;/a&gt; to the OAuth Google Group explaining the issues I've had.
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
I'm trying to use the JavaScript API to authenticate with OAuth from a
GWT application. I've got it working with both Google and Twitter's
OAuth implementations. However, it seems to fail to sign the URL at
random. In other words, it works 1 out of 3 times.
...
Any idea why this could be happening? 
&lt;/p&gt;
&lt;p&gt;I received a &lt;a href="http://groups.google.com/group/oauth/msg/ba2cb1bed6eecceb"&gt;response&lt;/a&gt; with a cleaner &lt;em&gt;makeSignedRequest()&lt;/em&gt; function. I tried it and, unfortunately, it seems to be equally unreliable. I suspect the problem is with the OAuth JavaScript implementation, GWT's interpretation of it, or that OAuth isn't as mature as it appears to be. I'd like to think one of the first two causes the problem.
&lt;/p&gt;
&lt;p&gt;To make it easier to create a robust example of GWT and OAuth, I created a gwt-oauth project you can &lt;a href="http://static.raibledesigns.com/downloads/gwt-oauth-1.0.zip"&gt;download&lt;/a&gt; or &lt;a href="http://demo.raibledesigns.com/gwt-oauth"&gt;view online&lt;/a&gt;. Please keep in mind the demo is likely to be flakey. If you're persistent and try enough times, it's likely to work. Firefox seems to succeed moreso than Safari or Chrome. If you have any suggestions for improving this example, please let me know.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt</id>
        <title type="html">Enhancing Evite.com with GWT and Grails</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt" />
        <published>2009-06-15T07:41:37-06:00</published>
        <updated>2009-06-15T07:45:56-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="rest" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gxt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="memcached" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="evite" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="grails" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="sofea" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://www.evite.com"&gt;&lt;img src="http://static.raibledesigns.com/repository/images/evite-logo.png" width="144" height="93" alt="Evite.com" class="picture" style="border: 1px solid silver" /&gt;&lt;/a&gt;
On my &lt;a href="http://www.linkedin.com/in/mraible"&gt;LinkedIn Profile&lt;/a&gt;, it says my current gig is a SOFEA consultant at a stealth-mode startup. &lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
SOFEA Consultant, Stealth Mode Startup, Los Angeles, CA. December 2008 -- Present.
&lt;/p&gt;
&lt;p&gt;
OK, I lied. It's not a startup, it's a well-known company that helps you plan parties.
For the last 5+ months, my &lt;a href="http://raibledesigns.com/rd/entry/what_s_next"&gt;UI team from LinkedIn&lt;/a&gt; has been working with &lt;a href="http://www.evite.com"&gt;Evite.com&lt;/a&gt; to enhance portions of their site with a &lt;a href="http://raibledesigns.com/rd/entry/re_life_above_the_service"&gt;SOFEA architecture&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;In January, we started &lt;a href="http://raibledesigns.com/rd/entry/choosing_an_ajax_framework"&gt;evaluating Ajax Frameworks&lt;/a&gt; and came to the conclusion that &lt;a href="http://raibledesigns.com/rd/entry/ajax_framework_analysis_results"&gt;GWT was right for us&lt;/a&gt;. After we chose the UI framework, other team members chose &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; and &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt; to develop scalable RESTful services. The architecture we implemented involves using GWT's &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/http/client/RequestBuilder.html"&gt;RequestBuilder&lt;/a&gt; to talk to Grails' services, which cache almost all their JSON output in memcached.
&lt;/p&gt;
&lt;p&gt;To see an example of a feature we developed with GWT, see Evite's &lt;a href="http://www.evite.com/party/invitations"&gt;Design Gallery&lt;/a&gt;. I personally worked on this feature and very much enjoyed becoming a GWT aficionado in the process. GWT's zero-turnaround feature made doing pure client-side work a lot of fun. It's definitely something I'd like to continuing doing at my next gig. &lt;/p&gt;
&lt;p&gt;Everyone from Evite is very happy with what we've been able to do with GWT and Grails. We have a stateless architecture and are quickly able to develop both client-side and server-side features. We've learned to scale the client by using out-of-the-box GWT components. We've scaled Grails by caching as much as possible. We serve up Ads and Analytics using the same JavaScript mechanisms that traditional server-side frameworks use. 
&lt;/p&gt;
&lt;p&gt;At the end of this month, my gig with Evite comes to an end. I'll be spending a few weeks at my family's cabin in Montana and then it's on to the next big thing. What's the next big thing? I'm not sure yet, hence the reason for writing this. If you're looking to develop a GWT application, introduce a SOFEA architecture at your company, or simply adopt some open source frameworks, I'd love to help out. &lt;a href="http://raibledesigns.com/contact.jsp"&gt;Drop me a line&lt;/a&gt; and let's start a conversation. </content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/2nd_row_at_red_rocks</id>
        <title type="html">2nd Row at Red Rocks and Elephant Rock Ride</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/2nd_row_at_red_rocks" />
        <published>2009-06-08T22:54:15-06:00</published>
        <updated>2009-06-08T23:01:39-06:00</updated> 
        <category term="/General" label="General" />
        <category term="bigheadtodd" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="elephantrock" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="riding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="biking" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="redrocks" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://farm4.static.flickr.com/3392/3609197663_ae8d26a755.jpg" title="Bear Lake Trail" rel="lightbox[bhtm2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3392/3609197663_ae8d26a755_t.jpg" width="100" height="75" alt="Bear Lake Trail" class="picture" /&gt;&lt;/a&gt;
This past weekend, I did a lot of traveling by 2 wheels. The weather was beautiful and - thanks to &lt;a href="http://bsnyderblog.blogspot.com/"&gt;Bruce&lt;/a&gt; - we had 2nd row seats to the &lt;a href="http://www.bigheadtodd.com/"&gt;Big Head Todd&lt;/a&gt; concert at Red Rocks. We did our &lt;a href="http://raibledesigns.com/rd/entry/riding_to_red_rocks"&gt;annual ride&lt;/a&gt;, leaving my house around 4 and arriving 30 minutes before the show began. Upon arrival, Bruce's odometer showed 21 miles. 
&lt;/p&gt;
&lt;p&gt;The seats were awesome - 2nd row, just left of center. They were so close, it felt like a private show. In fact, I got a head-nod from Jeremy (keyboardist) because he could see my face in the crowd.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2446/3609197875_74b0c9b694.jpg" title="First Band" rel="lightbox[bhtm2009]"&gt;&lt;img src="http://farm3.static.flickr.com/2446/3609197875_74b0c9b694_t.jpg" width="100" height="75" alt="First Band" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3609/3609197909_1b40f5a00f.jpg" title="View of the crowd" rel="lightbox[bhtm2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3609/3609197909_1b40f5a00f_t.jpg" width="100" height="75" alt="View of the crowd" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3407/3609197993_f8df3afd48.jpg" title="Big Head Todd" rel="lightbox[bhtm2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3407/3609197993_f8df3afd48_t.jpg" width="100" height="75" alt="Big Head Todd" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3662/3610011518_ed567e1d06.jpg" title="Incredible" rel="lightbox[bhtm2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3662/3610011518_ed567e1d06_t.jpg" width="100" height="75" alt="Incredible" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;The show ended around midnight and we hopped on our bikes for the ride home. This time, it only took 1:40 (it took 3 hours for the trip out) and I was in bed by 2. 

&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3333/3609198111_5f18a68db1.jpg" title="Halfway" rel="lightbox[bhtm2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3333/3609198111_5f18a68db1_t.jpg" width="100" height="75" alt="Halfway" class="picture" /&gt;&lt;/a&gt;
Sunday morning, I woke up at 7, looked up the &lt;a href="http://www.elephantrockride.com/"&gt;Elephant Rock&lt;/a&gt; start times and hit snooze for an hour.  The last start for the 25-mile off road ride was 9:30 and I left the starting gate at 9:28. I had a very enjoyable ride (temp was 65&amp;deg;F) and finished in 2.5 hours.&lt;/p&gt;
 &lt;p&gt;As you can imagine, I was pretty tired after 67 miles in 18 hours. I can't imagine what it'd be like to do 100 miles in a single day. Century riders are either impressive or crazy, I'm not sure which. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete</id>
        <title type="html">Creating a Facebook-style Autocomplete with GWT</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete" />
        <published>2009-06-05T07:05:10-06:00</published>
        <updated>2009-06-05T07:09:02-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="facebook" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="autocomplete" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jquery" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt-autocomplete" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="linkedin" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Have you used the "To:" widget on on Facebook or LinkedIn when composing a message? It's an autocompleter that looks up contact names and displays them as you type. It looks like a normal textbox (a.k.a. &amp;lt;input type="text"&amp;gt;), but wraps the contact name to allow you to easily delete it. Here's a screenshot of what Facebook's widget looks like.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img src="http://farm3.static.flickr.com/2468/3595186177_5334fff971.jpg" width="500" height="233" alt="Facebook Autocomplete" /&gt;
&lt;/p&gt;
&lt;p&gt;Last week, I was asked to create a similar widget with GWT. After searching the web and &lt;a href="
http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/627687a4b607ce02"&gt;not finding much&lt;/a&gt;, I decided to try writing my own. The best example I found on how to create this widget was from James Smith's &lt;a href="http://loopj.com/2009/04/25/jquery-plugin-tokenizing-autocomplete-text-entry/"&gt;Tokenizing Autocomplete jQuery Plugin&lt;/a&gt;. I used its &lt;a href="http://loopj.com/tokeninput/demo.html"&gt;demo&lt;/a&gt; to help me learn how the DOM changed after you selected a contact. 
&lt;/p&gt;
&lt;p&gt;GWT's &lt;a href="http://gwt.google.com/samples/Showcase/Showcase.html#CwSuggestBox"&gt;SelectBox&lt;/a&gt; allows you to easily create an autocompleter. However, &lt;a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=3044&amp;amp;can=5"&gt;it doesn't have support for multiple values&lt;/a&gt; (for example, a comma-delimited list). The good news is it's not difficult to add this functionality using &lt;a href="http://ljvjonok.blogspot.com/2008/10/gwt-suggestbox-how-to-make-multiple.html"&gt;Viktor Zaprudnev's HowTo&lt;/a&gt;. Another feature you might want in a SelectBox is to populate it with POJOs. &lt;a href="http://eggsylife.blogspot.com/2008/08/gwt-suggestbox-backed-by-dto-model.html"&gt;GWT SuggestBox backed by DTO Model&lt;/a&gt; is a good blog post that shows how to do this.&lt;/p&gt;
&lt;p&gt;Back to the Facebook Autocompleter. To demonstrate how to create this widget in GWT, I put together a simple application. You can &lt;a href="http://demo.raibledesigns.com/gwt-autocomplete"&gt;view the demo&lt;/a&gt; or &lt;a href="http://static.raibledesigns.com/downloads/gwt-autocomplete-1.0.zip"&gt;download it&lt;/a&gt;. The meat of this example is in an InputListWidget. After looking at the jQuery example, I learned the widget was a &amp;lt;div&amp;gt; with a unordered list (&amp;lt;ul&amp;gt;). It starts out looking like this:&lt;/p&gt;
&lt;pre class="brush:xml"&gt;
&amp;lt;ul class="token-input-list-facebook"&amp;gt;
    &amp;lt;li class="token-input-input-token-facebook"&amp;gt;
        &amp;lt;input type="text" style="outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;"/&amp;gt;
    &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I did this in GWT using custom BulletList and ListItem widgets (contained in the download).&lt;/p&gt;
&lt;pre class="brush:java"&gt;
final BulletList list = new BulletList();
list.setStyleName("token-input-list-facebook");

final ListItem item = new ListItem();
item.setStyleName("token-input-input-token-facebook");

final TextBox itemBox = new TextBox();
itemBox.getElement().setAttribute("style", 
        "outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;");

final SuggestBox box = new SuggestBox(getSuggestions(), itemBox);
box.getElement().setId("suggestion_box");

item.add(box);
list.add(item);
&lt;/pre&gt;
&lt;p&gt;After tabbing off the input, I noticed that it was removed and replaced with a &amp;lt;p&amp;gt; around the value and a &amp;lt;span&amp;gt; to show the "x" to delete it. After adding a couple items, the HTML is as follows:&lt;/p&gt;
&lt;pre class="brush:xml"&gt;
&amp;lt;ul class="token-input-list-facebook"&amp;gt;
    &amp;lt;li class="token-input-token-facebook"&amp;gt;
        &amp;lt;p&amp;gt;What's New Scooby-Doo?&amp;lt;/p&amp;gt;
        &amp;lt;span class="token-input-delete-token-facebook"&amp;gt;x&amp;lt;/span&amp;gt;
    &amp;lt;/li&amp;gt;
    &amp;lt;li class="token-input-token-facebook"&amp;gt;
        &amp;lt;p&amp;gt;Fear Factor&amp;lt;/p&amp;gt;
        &amp;lt;span class="token-input-delete-token-facebook"&amp;gt;x&amp;lt;/span&amp;gt;
     &amp;lt;/li&amp;gt;
     &amp;lt;li class="token-input-input-token-facebook"&amp;gt;
         &amp;lt;input type="text" style="outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;"/&amp;gt;
     &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To do this, I created a &lt;code&gt;deselectItem()&lt;/code&gt; method that triggers the DOM transformation.
&lt;/p&gt;
&lt;pre class="brush:java"&gt;
private void deselectItem(final TextBox itemBox, final BulletList list) {
    if (itemBox.getValue() != null &amp;&amp; !"".equals(itemBox.getValue().trim())) {
        /** Change to the following structure:
         * &amp;lt;li class="token-input-token-facebook"&amp;gt;
         * &amp;lt;p&amp;gt;What's New Scooby-Doo?&amp;lt;/p&amp;gt;
         * &amp;lt;span class="token-input-delete-token-facebook"&amp;gt;x&amp;lt;/span&amp;gt;
         * &amp;lt;/li&amp;gt;
         */

        final ListItem displayItem = new ListItem();
        displayItem.setStyleName("token-input-token-facebook");
        Paragraph p = new Paragraph(itemBox.getValue());

        displayItem.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent clickEvent) {
                displayItem.addStyleName("token-input-selected-token-facebook");
            }
        });

        Span span = new Span("x");
        span.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent clickEvent) {
                list.remove(displayItem);
            }
        });

        displayItem.add(p);
        displayItem.add(span);
        
        list.insert(displayItem, list.getWidgetCount() - 1);
        itemBox.setValue("");
        itemBox.setFocus(true);
    }
}
&lt;/pre&gt;
&lt;p&gt;This method is called after selecting a new item from the SuggestBox:&lt;/p&gt;
&lt;pre class="brush:java"&gt;
box.addSelectionHandler(new SelectionHandler&lt;SuggestOracle.Suggestion&gt;() {
    public void onSelection(SelectionEvent selectionEvent) {
        deselectItem(itemBox, list);
    }
});
&lt;/pre&gt;
&lt;p&gt;I also added the ability for you to type in an e-mail address manually and to delete the previous item when you backspace from the input field. Here's the handler that calls &lt;code&gt;deselectItem()&lt;/code&gt; and allows deleting with backspace:&lt;/p&gt;
&lt;pre class="brush:java"&gt;
// this needs to be on the itemBox rather than box, or backspace will get executed twice
itemBox.addKeyDownHandler(new KeyDownHandler() {
    public void onKeyDown(KeyDownEvent event) {
        if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
            // only allow manual entries with @ signs (assumed email addresses)
            if (itemBox.getValue().contains("@"))
                deselectItem(itemBox, list);
        }
        // handle backspace
        if (event.getNativeKeyCode() == KeyCodes.KEY_BACKSPACE) {
            if ("".equals(itemBox.getValue().trim())) {
                ListItem li = (ListItem) list.getWidget(list.getWidgetCount() - 2);
                Paragraph p = (Paragraph) li.getWidget(0);

                list.remove(li);
                itemBox.setFocus(true);
            }
        }
    }
});
&lt;/pre&gt;
&lt;p&gt;I'm happy with the results, and grateful for the &lt;a href="http://loopj.com/tokeninput/token-input-facebook.css"&gt;jQuery plugin's CSS&lt;/a&gt;. However, it still has one issue that I haven't been able to solve: I'm unable to click on a list item (to select it) and then delete it (with the backspace key). I believe this is because I'm unable to give focus to the list item. Here's the code that highlights the item and you can see the commented-out code that doesn't work.
&lt;/p&gt;
&lt;pre class="brush:java"&gt;
displayItem.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent clickEvent) {
        displayItem.addStyleName("token-input-selected-token-facebook");
    }
});

/** TODO: Figure out how to select item and allow deleting with backspace key
displayItem.addKeyDownHandler(new KeyDownHandler() {
    public void onKeyDown(KeyDownEvent event) {
        if (event.getNativeKeyCode() == KeyCodes.KEY_BACKSPACE) {
            list.remove(displayItem);
        }
    }
});
displayItem.addBlurHandler(new BlurHandler() {
    public void onBlur(BlurEvent blurEvent) {
        displayItem.removeStyleName("token-input-selected-token-facebook");
    }
});
*/
&lt;/pre&gt;
&lt;p&gt;If you know of a solution to this issue, please let me know. Feel free to use this widget and improve it as you see fit. I'd love to see this as a native widget in GWT. In the meantime, here's the &lt;a href="http://demo.raibledesigns.com/gwt-autocomplete"&gt;GWT Facebook-style Autocomplete demo&lt;/a&gt; and &lt;a href="http://static.raibledesigns.com/downloads/gwt-autocomplete-1.0.zip"&gt;code&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/the_end_of_colorado_software</id>
        <title type="html">The End of the Colorado Software Summit</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/the_end_of_colorado_software" />
        <published>2009-06-04T14:39:20-06:00</published>
        <updated>2009-06-04T20:54:56-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="softwaresummit" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">It looks like the &lt;a href="http://softwaresummit.com"&gt;Colorado Software Summit&lt;/a&gt; has come to an end.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
To Our Friends and Supporters,
&lt;br/&gt;&lt;br/&gt;
In these challenging economic times, business has slowed, many companies have had to resort to layoffs and/or closures, and everyone has been tightening their belts. Unfortunately, Colorado Software Summit has not been immune to this downturn. As have so many companies and individuals, we too have experienced a severe decline in our business, and as a result we are not able to continue producing this annual conference.
&lt;br/&gt;&lt;br/&gt;
This year would have been our 18th conference, and we had planned to continue through our 20th in 2011, but instead we must end it now. [&lt;a href="http://softwaresummit.com/"&gt;Read More&lt;/a&gt;]
&lt;/p&gt;
&lt;p&gt;I first attended this conference in &lt;a href="http://raibledesigns.com/rd/entry/heading_to_the_summit"&gt;October 2005&lt;/a&gt;. I enjoyed it so much, I returned again in &lt;a href="http://raibledesigns.com/rd/date/20061023"&gt;2006&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/date/20071023"&gt;2007&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/going_to_colorado_software_summit"&gt;2008&lt;/a&gt;. As I &lt;a href="http://raibledesigns.com/rd/entry/the_colorado_software_summit_and"&gt;mentioned last year&lt;/a&gt;, this was my favorite conference.
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
The reason I like it so much is because it's an annual gathering (this will be my 4th year) with friends and it's somewhat like a vacation, except you get to learn a lot.
&lt;/p&gt;
&lt;p&gt;While I'm sad to see it go, I completely understand Wayne and Peggy's decision. If you ever attended this conference, I encourage you to join the &lt;a href="http://www.linkedin.com/groups?gid=1083347"&gt;Colorado Software Summit LinkedIn Group&lt;/a&gt;. To see all my posts from the talks I attended at this conference, see my &lt;a href="http://raibledesigns.com/rd/tags/softwaresummit"&gt;softwaresummit&lt;/a&gt;-tagged entries.
&lt;/p&gt;
&lt;p&gt;
To Wayne and Peggy: thanks for all the great memories and for putting together such an excellent conference. Cheers to you both!</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/my_eye_surgery_experience</id>
        <title type="html">My Eye Surgery Experience</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/my_eye_surgery_experience" />
        <published>2009-06-03T00:46:18-06:00</published>
        <updated>2009-06-03T00:48:04-06:00</updated> 
        <category term="/General" label="General" />
        <category term="health" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="prk" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="eyesight" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="eye" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="eyesurgery" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="photorefractive_keratectomy" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="lasik" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="tlc" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="vision" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="lasereyesurgery" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">On May 7, I visited my local &lt;a href="http://www.tlcvision.com/"&gt;TLC Laser Eye Center&lt;/a&gt; for eye surgery. I began looking into eye surgery way back in December. At that time, I wore my glasses for a week, then waltzed into my local TLC and tried to get it done the next day. I quickly found out that 1) it wasn't possible for 2 weeks and 2) I couldn't ski for a couple weeks afterward. Since we were in the midst of a great ski season, I decided to schedule it for May.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.aucklandeye.co.nz/index.asp?PageID=2145866567"&gt;&lt;img src="http://tbn2.google.com/images?q=tbn:0igiNq5dr67w7M:http://www.aucklandeye.co.nz/images/Prk_assembled_procedure.jpg" alt="PRK" width="116" height="80" class="picture" /&gt;&lt;/a&gt;
I failed the LASIK-eligibility and learned I'd have to have &lt;a href="http://en.wikipedia.org/wiki/Photorefractive_keratectomy"&gt;PRK&lt;/a&gt; instead. The scars on my right eyeball caused me to fail. I received these scars as a boy when a friend and I blew up a &lt;a href="http://en.wikipedia.org/wiki/.45-70"&gt;.45-70&lt;/a&gt; bullet with a nail and sledgehammer. I was the one holding the nail and couldn't see for the next 3 days.
&lt;/p&gt;
&lt;p&gt;
In a nutshell: with LASIK they cut a flap, lift it up and shoot the laser under it. It heals quickly and is relatively painless. PRK has been around since before LASIK. With PRK, they seem to &lt;em&gt;shave your eyeball&lt;/em&gt; and then shoot a laser into it. PRK takes a lot longer to heal, but the results are often as good or better than LASIK. Wikipedia has a more technical &lt;a href="http://en.wikipedia.org/wiki/Photorefractive_keratectomy#PRK_versus_LASIK"&gt;PRK vs. LASIK&lt;/a&gt; reference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Procedure&lt;/strong&gt;&lt;br/&gt;
My mom flew into town for my surgery and drove me to TLC's office on that Thursday morning. It took 2 hours to prep for surgery, with most of the time spent sitting around and talking to my mom. Finally, they asked her to sit in the lobby and took me back to a waiting area. When I walked in the room, there were 2 other patients with surgery gear (funny hat and booties) and masks. They were leaning back, looking at the ceiling with their masks on and eyes closed. I quickly became the 3rd person who looked like this. Right before they started putting drops in my eyes, I remember being terrified that I might never see daylight again. At the very least, I thought I wouldn't see anything but black for the next 3 days.
&lt;/p&gt;
&lt;p&gt;Right before they called me in, the previous patient walked out and muttered "Damn, that burns." Believe me, this is &lt;em&gt;not&lt;/em&gt; what you want to hear right before it's your turn. I was led into the operating room, sat down and received numbing drops in my eyes. Less than a minute later, I was led over to the operating table. 
&lt;/p&gt;
&lt;p&gt;
The rest of the procedure lasted less than 5 minutes. They taped my left eye shut and told me to stare at the red light with my right eye. At this point, they used some contraption to shave my eyeball. It was slightly painful, similar to the mild pain you feel when getting a cavity drilled with Novocaine. After each stroke, the world would ripple like a pebble thrown into in a lake. After 10 strokes or so, they shot a laser into my eye for around 20 seconds. You don't actually &lt;em&gt;see&lt;/em&gt; the laser (the red light looks the same), but you can smell your eyeball burning. Each eye only took a few minutes. My mom was able to watch the entire surgery on a television on the other side of a glass wall.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The Recovery&lt;/strong&gt;&lt;br/&gt;
I was surprised to discover I was immediately able to open my eyes and see normally. Of course, my eyes felt heavy, so I didn't open them wide nor feel like I could. I was led back to the waiting room where I was given a Valium and sent home. I put my sunglasses on when we left and kept my eyes closed for the 5-minute drive home. After arriving at my house, I immediately downed some Tylenol PM and went to bed. It was hard to fall asleep and my eyes began tearing up. There was a dull pain in my eyes that kept the tears flowing for most of the afternoon. It took me 2 hours to fall asleep and I remember my eyes causing my nose to get stuffed up from all the tears.
&lt;/p&gt;
&lt;p&gt;When I woke up that evening, everything was blurry, but I was able to open my eyes and see better than I had previously w/o glasses. I didn't expect anything in the form of good vision and was mostly pre-occupied with trying to stop the pain (which wasn't &lt;em&gt;terrible&lt;/em&gt;, but definitely present). I was prescribed &lt;a href="http://en.wikipedia.org/wiki/Vicodin"&gt;Vicodin&lt;/a&gt; and started taking it on a regular basis. I was completely unable to watch TV at all that night. Viewing the computer screen was unthinkable.&lt;/p&gt;
&lt;p&gt;The next morning, my vision was a lot better as evidenced by the &lt;a href="http://twitter.com/mraible/status/1738496118" title="I guess you can say I'm recovering well if I can tweet this."&gt;tweet from my iPhone&lt;/a&gt;. Shortly after, my mom drove me to my eye doctor's office for a 1-day checkup. The &lt;a href="http://twitter.com/mraible/status/1739313338" title="Just got back from eye doctor. 20/20 in right eye, not as good in left eye. Apparently better than normal results for PRK this early."&gt;results&lt;/a&gt; were surprising.
&lt;/p&gt;
&lt;p&gt;Friday night was one of the &lt;a href="http://twitter.com/mraible/status/1742765806" title="Feels like I have sand in my eyes. Hard to keep them open, hurts to close. Youch!"&gt;most painful&lt;/a&gt;. Saturday wasn't very painful, but my eyesight was very blurry. That afternoon, it was hard to keep my eyes open. Every time I tried to open them, I felt like I had to sneeze. Fortunately, I was able to watch the &lt;a href="http://twitter.com/mraible/status/1756648655" title="Eyesight still blurry; a lot less pain today. As much as it hurt, I did get to watch a fair bit of the Nuggets; loved Melo's winning shot."&gt;Nuggets game&lt;/a&gt;. I couldn't see players' numbers, but I was able to see Melo's last-second 3-pointer to win.
&lt;/p&gt;
&lt;p&gt;On Monday, I was able to drive to TLC for my 3-day checkup. Things were definitely blurry, but I didn't feel like it was dangerous for me to be behind the wheel. I was able to work on Monday, but I also had to increase my font sizes to 36pt and used a 30" monitor all day. OS X's Universal Access -&gt; Zoom feature came in awful handy. That night, TV was a LOT clearer than the previous night, but it was still fuzzy.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What's it like now?&lt;/strong&gt;&lt;br/&gt;
It's been almost 4 weeks and I'm very glad that I had the surgery done. I haven't felt any pain since the Sunday after surgery and I haven't had any issues with dryness. My vision does fluctuate from day-to-day. Some days I feel like I have super-hero vision and other days there's a halo around objects beyond 10 feet. According to my doctor, fluctuations are expected to continue for 6 months. I don't mind since it never gets bad enough to seem strange.&lt;/p&gt;
&lt;p&gt;Now I enjoy not having to worry about glasses or contacts when traveling. I love waking up every morning and not having to do anything to improve my vision. I feel like I have more freedom in my life. Getting eye surgery is definitely one of the best things I've ever done.
</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/ryan_and_breanne_s_wedding</id>
        <title type="html">Ryan and Breanne's Wedding in Playa del Carmen</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/ryan_and_breanne_s_wedding" />
        <published>2009-06-01T21:53:44-06:00</published>
        <updated>2009-06-02T08:01:55-06:00</updated> 
        <category term="/General" label="General" />
        <category term="cancun" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="destinationwedding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="marriage" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="playadelcarmen" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mexico" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="travel" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="wedding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="vacation" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Despite the warnings about &lt;a href="http://fishbowl.pastiche.org/2009/04/28/swine_flu_faq/"&gt;Swine Flu&lt;/a&gt;, two weeks ago I flew to Cancun for my good friends' Ryan and Breanne's wedding. &lt;a href="http://twitter.com/mraible/status/1858047737"&gt;I didn't get much sleep the night before&lt;/a&gt;, but managed to get a good nap on the plane. We arrived in Cancun around 2:00pm and begin enjoying the beautiful weather of Mexico. We took a shuttle from CUN to the all-inclusive &lt;a href="http://www.iberostar.com/EN/Riviera-Maya-hotels/Iberostar-Paraiso-Maya_3_76.html"&gt;Paraiso Maya&lt;/a&gt;. Thanks to Swine Flu, we got upgraded twice and ended up paying $110/night for a place that's normally $450/night. &lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2438/3580780588_0b3376927a.jpg" title="Landing in Cancun" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm3.static.flickr.com/2438/3580780588_0b3376927a_t.jpg" width="100" height="75" alt="Landing in Cancun" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3568/3580780696_75ca362c2c.jpg" title="Navs and Colin" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3568/3580780696_75ca362c2c_t.jpg" width="100" height="75" alt="Navs and Colin" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3649/3580780966_5ce62f5457.jpg" title="Paraiso Maya" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3649/3580780966_5ce62f5457_t.jpg" width="100" height="75" alt="Paraiso Maya" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3352/3579971375_b70c67c6ac.jpg" title="Pool at Paraiso Maya"&gt;&lt;img src="http://farm4.static.flickr.com/3352/3579971375_b70c67c6ac_t.jpg" width="100" height="75" alt="Pool at Paraiso Maya" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;My two favorite parts of the trip were 1) the people and 2) the place. There was around 15 of us, many of which have been good friends since college. We stayed at the Paraiso Maya, which was a very nice hotel with beautiful pools, elaborate buffets and awesome beach access. We had a ton of fun at the pool bar, playing water basketball, jet skiing and playing beach volleyball. The dinners at the Steakhouses were great and The Galaxy (Star War themed) club created many good memories. It's great to travel with that many people, especially when the beer is flowing for (what seems like) free and you're partying with old friends.
 &lt;/p&gt;
&lt;p&gt;My third favorite part of the trip was watching the &lt;a href="http://nuggets.com"&gt;Nuggets&lt;/a&gt; vs. Lakers games. We watched 3 games in the resort's "Sports Bar" and had a blast doing it. Since we had a couple Lakers' fans in the mix, it made things interesting.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3653/3580782968_9fc2c33fcd.jpg" title="Wave Pool" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3653/3580782968_9fc2c33fcd_t.jpg" width="100" height="75" alt="Wave Pool" style="border: 1px solid black"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3662/3579970835_40e397088f.jpg" title="Water Basketball" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3662/3579970835_40e397088f_t.jpg" width="100" height="75" alt="Water Basketball" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3648/3579972225_d24d92ee28.jpg" title="Beach Volleyball" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3648/3579972225_d24d92ee28_t.jpg" width="100" height="75" alt="Beach Volleyball" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3617/3579972403_8b7c2d75c0.jpg" title="Breanne and Jenna" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3617/3579972403_8b7c2d75c0_t.jpg" width="100" height="75" alt="Breanne and Jenna" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;We spent 3 days at the pool and on the beach before the wedding happened on Saturday. It was a very cool ceremony and we enjoyed a &lt;a href="http://en.wikipedia.org/wiki/Mariachi"&gt;Mariachi band&lt;/a&gt; for a good hour afterward. I've definitely become a big fan of &lt;a href="http://raibledesigns.com/rd/entry/costa_rica_was_awesome"&gt;beach&lt;/a&gt; &lt;a href="http://raibledesigns.com/rd/entry/jason_and_holly_s_wedding"&gt;weddings&lt;/a&gt; in the last 6 months. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3618/3580803902_449464cf49.jpg" title="Ready for the Ceremony" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3618/3580803902_449464cf49_t.jpg" width="100" height="75" alt="Ready for the Ceremony" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3644/3579992115_05c0cb7b7f.jpg" title="Vows" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3644/3579992115_05c0cb7b7f_t.jpg" width="100" height="75" alt="Vows" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3153/3580823360_3e2e997894.jpg" title="Mariachi Band" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3153/3580823360_3e2e997894_t.jpg" width="100" height="75" alt="Mariachi Band" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3374/3580011379_fa403528cb.jpg" title="Mr. and Mrs. Johnson" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3374/3580011379_fa403528cb_t.jpg" width="100" height="75" alt="Mr. and Mrs. Johnson" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;


&lt;/p&gt;
&lt;p&gt;After 5 days in Playa del Carmen, my buddy (Kevin Navarro) and I spent 2 days at &lt;a href="http://www.starwoodhotels.com/westin/property/overview/index.html?propertyID=1092"&gt;The Westin&lt;/a&gt; in Cancun. This was a &lt;em&gt;very&lt;/em&gt; nice resort; especially since we had an ocean-front room.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3318/3580845054_52d7e6b2bd.jpg" title="View from room in Cancun" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3318/3580845054_52d7e6b2bd_t.jpg" width="100" height="75" alt="View from room in Cancun" style="border: 1px solid black"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3407/3580032391_fb0326e617.jpg" title="Poolside" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3407/3580032391_fb0326e617_t.jpg" width="100" height="75" alt="Poolside" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2426/3580845382_eb28850032.jpg" title="Beach" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm3.static.flickr.com/2426/3580845382_eb28850032_t.jpg" width="100" height="75" alt="Beach" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3601/3580845562_a89d289e81.jpg" title="Beach from Room" rel="lightbox[mexico2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3601/3580845562_a89d289e81_t.jpg" width="100" height="75" alt="Beach from Room"  style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt; 
&lt;p&gt;I had so much fun on this trip, I've been inspired to learn Spanish. I don't know when I'll carve out the time to do it, but I know I'll return to Mexico several times, so the sooner the better.
&lt;/p&gt;
&lt;p&gt;
To see all my pictures from this trip, see my &lt;a href="http://www.flickr.com/photos/mraible/collections/72157619028951930/"&gt;Mexico 2009 Collection&lt;/a&gt; on &lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/life_update_new_treehouse_new</id>
        <title type="html">Life Update: New Treehouse, New Kittens and More</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/life_update_new_treehouse_new" />
        <published>2009-05-06T07:19:59-06:00</published>
        <updated>2009-05-06T07:22:06-06:00</updated> 
        <category term="/General" label="General" />
        <category term="life" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="kittens" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="abbie" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="treehouse" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jack" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="eyesurgery" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="prk" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mexico" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="cancun" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="appfuse" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">It's been awhile since I wrote a life update post so here you go. After returning from &lt;a href="http://raibledesigns.com/rd/entry/jason_and_holly_s_wedding"&gt;Jason and Holly's Wedding&lt;/a&gt; in Florida, I took the next week off to "catch up on life". Having a vacation at home with no packing and lots of time to wipe my "to do" list clean was great. Not only that, but the weather was beautiful all week. If you ever get a chance to take a "catch up on life" vacation, I highly recommend it.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Treehouse&lt;/strong&gt;&lt;br/&gt;
I started out the week by doing something I've been telling the kids I'd do for the last year: building a treehouse. I used &lt;a href="http://www.ronhazelton.com/archives/howto/treehouse_construction.shtm"&gt;this tutorial&lt;/a&gt; as a guide for the "foundation" and had a lot of fun doing it. The best part was discovering my Dad had stocked my garage with many tools over the last couple years.  I had to make several runs to Home Depot and Ace Hardware for building supplies, but rarely had to buy any new tools. My Dad has been a carpenter for over 30 years (he used to do it for a living in Montana). I was pleasantly surprised to discover some of his skills have rubbed off on me. We still need to build the structure on top of the platform, but everyone is happy with the results so far.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3549/3471564772_1f9c19a38a.jpg" title="Day 1 - Sunset" rel="lightbox[lifeupdatespring2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3549/3471564772_1f9c19a38a_t.jpg" width="100" height="75" alt="Day 1 - Sunset" style="border: 1px solid black"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3593/3470750609_84bc33216b.jpg" title="Day 2 - Bolting frame in place" rel="lightbox[lifeupdatespring2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3593/3470750609_84bc33216b_t.jpg" width="100" height="75" alt="Day 2 - Bolting frame in place" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3656/3471565132_7a5e4ebdb2.jpg" title="Day 3 - They love it!" rel="lightbox[lifeupdatespring2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3656/3471565132_7a5e4ebdb2_t.jpg" width="100" height="75" alt="Day 3 - They love it!" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3545/3470751035_d016beb0d9.jpg" title="Day 4 - Floor completed" rel="lightbox[lifeupdatespring2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3545/3470751035_d016beb0d9_t.jpg" width="100" height="75" alt="Day 4 - Floor completed" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AppFuse&lt;/strong&gt;&lt;br/&gt;
After finishing Phase 1 of the treehouse, I started working on the next version of AppFuse. I've made good progress so far:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Archetypes now include all the source from web modules.&lt;/li&gt;
&lt;li&gt;Archetypes are now created using archetype:create-from-project, making things easier to maintain.&lt;/li&gt;
&lt;li&gt;Switched Cargo from downloaded Tomcat to embedded Jetty, allowing for faster builds.&lt;/li&gt;
&lt;li&gt;Upgraded to Struts 2.1.6 and Tapestry 5.0.18.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There's still &lt;a href="http://issues.appfuse.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=10160"&gt;lots of open issues&lt;/a&gt;, but I believe there's a lot of value in &lt;em&gt;starting&lt;/em&gt; the "working on the next version" process. With the way things are shaping up, I'm considering bumping the version to 2.5 or 3.0 instead of 2.1. 3.0 might be a little ambitious, but there are going to be a lot of improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Kittens&lt;/strong&gt;&lt;br/&gt;
Last weekend, I decided it was time to create some happy kids and get some pets in my house. On Saturday, we set out on a quest to find some kittens. We visited a couple shelters and a couple pet stores, but came home empty handed. We didn't look Sunday because we had &lt;a href="http://twitter.com/mraible/status/1687500847"&gt;more important things to do&lt;/a&gt;. On Monday, we hit up &lt;a href="http://denver.craigslist.org/search/pet?query=kittens"&gt;craigslist&lt;/a&gt; and found our kittens with a family in Thornton. Upon arrival, I figured they'd be good since the family had a 6-year old, a 4-year old and a 1-year old that was carrying a kitten around by the tail. At least their new home is slightly less chaotic than their last one. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3360/3505899171_3cb4e849b1.jpg" title="Jack and Olivia" rel="lightbox[lifeupdatespring2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3360/3505899171_3cb4e849b1_m.jpg" width="240" height="180" alt="Jack and Olivia" style="border: 1px solid black"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3562/3506709142_21fa103252.jpg" title="Abbie and Mittens" rel="lightbox[lifeupdatespring2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3562/3506709142_21fa103252_m.jpg" width="240" height="180" alt="Abbie and Mittens" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eye Surgery&lt;/strong&gt;&lt;br/&gt;
Today is my last day wearing glasses. Tomorrow morning, I'm scheduled to receive &lt;a href="http://www.jeffsandquist.com/recovering-from-prk-laser-eye-surgery/"&gt;PRK eye surgery&lt;/a&gt; at &lt;a href="http://lasik.com/"&gt;TLC Laser Eye Center&lt;/a&gt;. I'm nervous about the procedure and dreading the recovery. My mom is flying in tonight to assist me while I'm blind and in pain, so hopefully it won't be too bad. A co-worker has lots of books on tape that I'm borrowing to pass the time.
&lt;/p&gt;
&lt;p&gt;My life is showing no signs of slowing down anytime soon, but I will have lots of opportunities to relax. In two weeks, I'm heading to Cancun for a friend's wedding. Having a week on the sunny beaches of Mexico is always fun. My current contract expires a couple days after my return. I'm currently negotiating with a few potential clients and hope to have my summer work plans solidified before leaving for Mexico. More than anything, I'm looking forward to taking the entire month of July off and spending it at our cabin in Montana. My Dad is moving up there to work on The New Cabin and there's nothing I'd rather do than help him out. </content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/ajax_framework_analysis_results</id>
        <title type="html">Ajax Framework Analysis Results</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/ajax_framework_analysis_results" />
        <published>2009-04-23T20:34:44-06:00</published>
        <updated>2009-04-23T20:34:44-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jquery" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gxt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajax" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="smartgwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="extjs" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dojo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="yui" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Way back in January, I wrote about how my colleagues and I were &lt;a href="http://raibledesigns.com/rd/entry/choosing_an_ajax_framework"&gt;evaluating Ajax frameworks&lt;/a&gt; to build a SOFEA-style architecture. To make our choice, we used the following process:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose a short list of frameworks to prototype with.&lt;/li&gt;
&lt;li&gt;Create an application prototype with each framework.&lt;/li&gt;
&lt;li&gt;Document findings and create a matrix with important criteria.&lt;/li&gt;
&lt;li&gt;Create presentation to summarize document.&lt;/li&gt;
&lt;li&gt;Deliver document, presentation and recommendation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When I wrote that entry, we had just finished step 2 and were starting step 3. I first wrote this blog post a week later, when we delivered step 5. Here is the comparison and conclusion sections of the analysis document we composed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Framework Comparison&lt;/strong&gt;&lt;br/&gt;
In order to evaluate the different frameworks against important criteria, we created a matrix with weights and ranks for each framework. This matrix shows how our weighting and rankings lead us to the winner for our project.  You can &lt;a href="http://spreadsheets.google.com/ccc?key=p2SLd279MTmShLQdCjfi0OQ&amp;hl=en"&gt;view this matrix online&lt;/a&gt; or see below for a summary.
&lt;/p&gt;

&lt;iframe width='520' height='500' frameborder='0' src='http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;output=html&amp;gid=0&amp;single=true&amp;widget=true' style='margin: 0 auto'&gt;&lt;/iframe&gt;

&lt;p style="text-align: left"&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Criteria whose values were identical across all candidates were weighted at zero. 
Charting capability was weighted at zero b/c we decided to use Flash for this.
&lt;/p&gt;

&lt;p&gt;This matrix indicates that &lt;strong&gt;GWT&lt;/strong&gt; is the best candidate for our team to develop SOFEA-style applications with.
In addition to the matrix, below are graphs that illustrate interesting (and possibly meaningless) statistics about each project. 
&lt;p style="text-align: center"&gt;
&lt;img src="http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=1&amp;amp;output=image" width="320" alt="Number of Committers"/&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;!--img src="http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=2&amp;amp;output=image" width="320" alt="Mailing List Traffic"/&gt;
&lt;br/&gt;&lt;br/--&gt;
&lt;img src="http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=3&amp;amp;output=image" width="320" alt="Books on Amazon"/&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;

After working with the various frameworks, we believe that all the frameworks were very good and could be used to write applications with. If all weights are equal, these frameworks were almost even when compared against our evaluation criteria. The graph below illustrates this. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img src="http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=4&amp;amp;output=image" width="320" alt="Ranking with equal criteria weights"/&gt;
&lt;/p&gt;
&lt;p&gt;Even after applying the weighted criteria, the evenness doesn't change a whole lot. &lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;img src="http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=5&amp;amp;output=image" width="320" alt="Ranking with weighted criteria" /&gt;
&lt;/p&gt;
&lt;p&gt;
Without considering the even or weighted criteria, we believe the decision all comes down to what the developers on the project feel they will be most comfortable with. If you're developing with Dojo or YUI, chances are you're &lt;em&gt;dressing up&lt;/em&gt; existing HTML and possibly using &lt;a href="http://www.alistapart.com/articles/understandingprogressiveenhancement"&gt;progressive enhancement&lt;/a&gt; to add more rich functionality. On the other hand, Ext JS and GWT are similar to Swing programming where you build the UI with code (JavaScript for Ext JS, Java for GWT).
&lt;/p&gt;
&lt;p&gt;
The tools available for JavaScript development have gotten increasingly better in recent years. IntelliJ IDEA has a &lt;a href="http://www.jetbrains.com/idea/features/javascript_editor.html"&gt;JavaScript Editor&lt;/a&gt; that provides many of the same features as its Java editor. &lt;a href="http://www.aptana.com/studio"&gt;Aptana Studio&lt;/a&gt; also has excellent support for authoring and debugging JavaScript. However, we believe the Java debugging and authoring support in IDEs is much better. Furthermore, we are more familiar with organizing code in Java projects and feel more comfortable in this development environment. 
&lt;/p&gt;
&lt;p&gt;
Based on this evaluation, we believe that GWT is the best framework for our team to develop SOFEA-style applications with. 

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flash Forward to Today...&lt;/strong&gt;&lt;br/&gt;
The core GWT library from Google doesn't have a whole lot of widgets, nor do they look
good out-of-the-box.  So early on, we experimented with two alternative implementations
that continue to leverage GWT concepts and tools:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://extjs.com/products/gxt"&gt;GXT&lt;/a&gt;: a GWT version of Ext JS&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/smartgwt"&gt;SmartGWT&lt;/a&gt;: a GWT version of SmartClient&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Unfortunately, over the past few months, we've found that both of these implementations are too heavy for our requirements, mostly because of the file size of the generated JavaScript code. For example, a feature I wrote generated a 275K *.cache.html file using GXT. After determining that was too slow to give users the initial "pop", I re-wrote it &lt;em&gt;without&lt;/em&gt; GXT. After a day, we had an application with *.cache.html files of 133K. Yes, that's over a 50% reduction in size!&lt;a href="http://raibledesigns.com/rd/entry/ajax_framework_analysis_results#footnote-gxtmvc"&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
Because of these findings, we are proceeding with the core GWT library from Google and adding in new components as needed.
It is cool to know you can make a UI "pop" with GWT, as long as you stick to the core - close-to-the-metal - components. For those applications that can afford an initial "loading..." state, I'd definitely recommend looking at GXT and SmartGWT.
&lt;/p&gt;
&lt;p style="font-size: 90%"&gt;&lt;a name="footnote-gxtmvc"&gt;*&lt;/a&gt; To make refactoring easier, I copied &lt;a href="http://raibledesigns.com/rd/entry/gxt_s_mvc_framework"&gt;GXT MVC&lt;/a&gt; into our source tree and modified all imports.&lt;/p&gt;
&lt;p&gt;















</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/jason_and_holly_s_wedding</id>
        <title type="html">Jason and Holly's Wedding was a blast!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/jason_and_holly_s_wedding" />
        <published>2009-04-21T09:53:54-06:00</published>
        <updated>2009-04-21T09:55:59-06:00</updated> 
        <category term="/General" label="General" />
        <category term="travel" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="westpalmbeach" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="friends" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="family" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="abbie" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="florida" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jack" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="wedding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="beach" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This past weekend, I experienced an incredible 4 days in West Palm Beach, Florida. When Julie and I got married there in April 2000, we had so much fun that we always wanted to do it again. We had a lot of good friends and family fly in for the wedding. If you've ever experienced a beach holiday with many good friends, you'll know what I'm talking about. Julie is Holly's sister and Jason (her new husband) is one of my fraternity brothers. That means I knew both sides of the wedding party and it very much resembled the reunion we always wanted.&lt;/p&gt;
&lt;p&gt;I flew down on Thursday morning after a &lt;a href="http://twitter.com/mraible/status/1534664829"&gt;little bit of oversleeping&lt;/a&gt;. Because I flew into Orlando, I had to rent a car and drive 2 hours to West Palm.  This wasn't so bad since I got hooked up with a convertible and it was a beautiful 80&amp;deg;F on the drive. That night, I picked up Abbie and Jack from "Grammy's" house and they spent the night with me in my hotel.&lt;/p&gt;
&lt;p&gt;The next morning, we woke up and headed to &lt;a href="http://www.sailfishmarina.com/"&gt;Sailfish&lt;/a&gt; for a ride on a friend's boat. After a couple hours on the intercostal, we played in the pool, enjoyed the sun and started getting ready for the Rehearsal Dinner.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3620/3461902608_e81e4e0f95.jpg" title="Jack and Uncle Jason" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3620/3461902608_e81e4e0f95_t.jpg" width="100" height="75" alt="Jack and Uncle Jason" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3613/3461087705_536c853a65.jpg" title="The Hook" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3613/3461087705_536c853a65_t.jpg" width="100" height="75" alt="The Hook" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3480/3461087737_0f81b80e35.jpg" title="Kids are ready!" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3480/3461087737_0f81b80e35_t.jpg" width="100" height="75" alt="Kids are ready!" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;

&lt;a href="http://farm4.static.flickr.com/3607/3461902696_5d91ae0b06.jpg" title="Abbie and Jack on The Hook" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3607/3461902696_5d91ae0b06_t.jpg" width="100" height="75" alt="Abbie and Jack on The Hook" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3510/3461902732_1acf69afee.jpg" title="Crazy Abbie" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3510/3461902732_1acf69afee_t.jpg" width="100" height="75" alt="Crazy Abbie" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3525/3461902754_f0bbfb0acf.jpg" title="Captain Jack" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3525/3461902754_f0bbfb0acf_t.jpg" width="100" height="75" alt="Captain Jack" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;During the Rehearsal Dinner, a friend (Navarro) and I were bartenders while Abbie was in charge of making sure everyone's drinks were full. Below are some of my favorite pictures from Friday night.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3596/3461903020_3def9a02fb.jpg" title="The Bride-To-Be" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3596/3461903020_3def9a02fb_t.jpg" width="100" height="75" alt="The Bride-To-Be" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3506/3461090669_6a7f8ea4fc.jpg" title="The Crew" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3506/3461090669_6a7f8ea4fc_t.jpg" width="100" height="75" alt="The Crew" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3551/3461091113_32c91972ea.jpg" title="Julie, Holly and Jack" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3551/3461091113_32c91972ea_t.jpg" width="100" height="75" alt="Julie, Holly and Jack" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;a href="http://farm4.static.flickr.com/3510/3461094791_8476b34c33.jpg" title="Daddy and Jack" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3510/3461094791_8476b34c33_t.jpg" width="100" height="75" alt="Daddy and Jack" style="border: 1px solid black"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3537/3461910994_8af0aaacfd.jpg" title="Crazy Kids" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3537/3461910994_8af0aaacfd_t.jpg" width="100" height="75" alt="Crazy Kids" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3565/3461911848_2818619d57.jpg" title="Give me back that wine opener!" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3565/3461911848_2818619d57_t.jpg" width="100" height="75" alt="Give me back that wine opener!" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;After the rehearsal dinner, the party crowd headed to &lt;a href="http://www.yelp.com/biz/cruzan-rum-bar-north-palm-beach"&gt;Rum Bar&lt;/a&gt; and had lots of laughs and played many games of "hook". On the wedding day (Saturday), we took another boat ride, hung out on the beach and enjoyed a beautiful ceremony on the beach.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3587/3461099643_273bb5b404.jpg" title="Jack the ringbearer" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3587/3461099643_273bb5b404_t.jpg" width="100" height="75" alt="Jack the ringbearer" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3574/3461099973_2815a7e291.jpg" title="Flower Girls" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3574/3461099973_2815a7e291_t.jpg" width="100" height="75" alt="Flower Girls" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3602/3461915178_4e9dfaf11b.jpg" title="Awesome Wedding" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3602/3461915178_4e9dfaf11b_t.jpg" width="100" height="75" alt="Awesome Wedding" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The rest of the night was spent dancing and enjoying everyone's company. The party didn't end that night though. Sunday, Holly and Julie's mom had a brunch at her house where we all laid by the pool, played with the kids and sipped on many cold drinks. At sunset, we walked down to the beach so Mr. and Mrs. Harris could get some sand from their ceremony location.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3545/3461916124_11582cee7c.jpg" title="Mr. and Mrs. Harris" rel="lightbox[jasonandhollyswedding]"&gt;&lt;img src="http://farm4.static.flickr.com/3545/3461916124_11582cee7c_m.jpg" width="240" height="180" alt="Mr. and Mrs. Harris" style="border: 1px solid black"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It was a spectacular weekend with lots of good friends and a ton of great memories. Congratulations Jason and Holly!&lt;/p&gt;
&lt;p&gt;For more pictures, see &lt;a href="http://www.flickr.com/photos/mraible/sets/72157617023261045/"&gt;Flickr&lt;/a&gt; or &lt;a href="http://www.facebook.com/album.php?aid=88589&amp;amp;id=571296711&amp;amp;l=bbc7258898"&gt;Facebook&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/my_drunk_on_software_interview</id>
        <title type="html">My Drunk on Software Interview</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/my_drunk_on_software_interview" />
        <published>2009-04-05T22:23:57-06:00</published>
        <updated>2009-04-05T22:28:21-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="sofea" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajax" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="interview" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="drunkonsoftware" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="flex" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Back in February, I met up with &lt;a href="http://www.jamesward.com/blog/"&gt;James Ward&lt;/a&gt; and &lt;a href="http://ectropic.com/wordpress/"&gt;Jon Rose&lt;/a&gt; for a &lt;a href="http://www.drunkonsoftware.com/2009/04/05/episode-11-matt-raible/"&gt;Drunk on Software interview&lt;/a&gt;. We enjoyed some &lt;a href="http://www.gordonbiersch.com/restaurants/index.php?pg=beer"&gt;good beer&lt;/a&gt; and had a great conversation about SOFEA, open source and RIA. See larger video &lt;a href="http://www.drunkonsoftware.com/2009/04/05/episode-11-matt-raible/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;embed src="http://blip.tv/play/AfbqQpHGOw" type="application/x-shockwave-flash" width="500" height="281.25" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt; 
&lt;/p&gt;&lt;p&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/congratulations_on_retiring_dad</id>
        <title type="html">Congratulations on Retiring Dad!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/congratulations_on_retiring_dad" />
        <published>2009-03-31T16:46:47-06:00</published>
        <updated>2009-03-31T16:48:51-06:00</updated> 
        <category term="/General" label="General" />
        <category term="congratulations" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dad" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="thecabin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="joeraible" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="montana" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="career" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="retirement" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://farm3.static.flickr.com/2373/2360759827_bf5ac30092.jpg" title="Dad's New Rig" rel="lightbox[retiringdad]"&gt;&lt;img src="http://farm3.static.flickr.com/2373/2360759827_bf5ac30092_m.jpg" width="240" height="180" alt="Dad's New Rig" class="picture" /&gt;&lt;/a&gt;
Today is a very special day in my Dad's life. Today is his last day of work. Within the next hour, Joseph Edward Raible, Jr. will officially become retired and subsequently one of the happiest people I know. My dad has always had an interesting relationship with &lt;em&gt;work&lt;/em&gt;. I've never met someone who hated working for &lt;em&gt;The Man&lt;/em&gt; more, yet had such a strong work ethic.&lt;/p&gt;
&lt;p&gt;Growing up in Montana, my dad always had the shittiest jobs. When I was a toddler, he used to walk several miles to work, often during the cruel Montana winters. As I got older, I remember him working as a carpenter, logger, trail crew specialist, firefighter, radio technician and even a programmer. The reason his jobs were so shitty is because he told us they were. I don't think he made over $5/hour until I was in the second grade.&lt;/p&gt;
&lt;p&gt;
He was able to turn his career around in impressive fashion in the early 90s. He'd always been a "computer guy" at &lt;a href="http://raibledesigns.com/rd/entry/the_cabin"&gt;the cabin&lt;/a&gt;. He even went to Graduate School for his Masters in Computer Science. When we moved to Oregon, he volunteered at &lt;a href="http://www.blm.gov/or/districts/salem/index.php"&gt;my mom's new office&lt;/a&gt; as a Network Administrator. After 6 months, they hired him and he quickly moved up the ranks. I believe his current title is something fancy like Director of Wireless Communications. Over the last 19 years, he's worked for the BLM and done amazing things like setup radio networks in Honduras and Tanzania. He's turned into quite the world traveler.
&lt;/p&gt;
&lt;p&gt;The thing I remember the most is his perseverance. One winter when he couldn't find work, he &lt;a href="http://www.flickr.com/photos/mraible/208273170/in/set-72157594226552398/"&gt;built a barn&lt;/a&gt;. From scratch, mostly by himself.&lt;/p&gt;
&lt;p&gt;The other thing I remember well is how much he complained about work. It was never the actual work that he complained about, it was the "stupid fuckin' idiots" that he had to work with (or for). This is the reason that this is such a special day. I can't help but think a huge weight is being lifted from his shoulders and he's going to much happier. Then again, you know how these things go - he might actually miss having people around to complain about.&lt;/p&gt;
&lt;p&gt;One thing's for sure, I'm super pumped and happy for the guy. He plans on moving back to Montana for the summer to work on the New Cabin and it's likely I'll get to spend a lot more time with him in the coming years.&lt;/p&gt;
&lt;p&gt;Congratulations and cheers to you Dad. You did it. I'm extremely proud of you today. &lt;img src="http://raibledesigns.com/images/smileys/grin.gif" class="smiley" alt=":-D" title=":-D" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/new_office_and_new_bike</id>
        <title type="html">New Office and New Bike</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/new_office_and_new_bike" />
        <published>2009-03-30T23:51:39-06:00</published>
        <updated>2009-03-30T23:55:24-06:00</updated> 
        <category term="/General" label="General" />
        <category term="bike" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="commuting" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="riding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="biking" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="denver" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Back in January, I moved into a new office to work on my &lt;a href="http://raibledesigns.com/rd/entry/what_s_next"&gt;current project&lt;/a&gt;. The following week, &lt;a href="http://raibledesigns.com/rd/entry/r_i_p_giant_fcr3"&gt;my bike was stolen&lt;/a&gt;. The next day I &lt;a href="http://raibledesigns.com/rd/entry/running_to_work"&gt;ran to work&lt;/a&gt; and decided to do it for a couple months.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
My current goal is to run until April 1st or until I lose 20 pounds, whichever comes first.
&lt;/p&gt;
&lt;p&gt;The next week, my co-worker's bike was stolen and I knew I had to stick with my goal. The significance of April 1st was that our office lease expires on April 1st and we were planning on moving to a new office. While &lt;a href="http://denver.youroffice.com/"&gt;our office&lt;/a&gt; is nice, it is a large one-room office with no windows. The &lt;a href="http://www.flickr.com/photos/mraible/sets/72157605402333390/"&gt;previous office&lt;/a&gt; was quite a bit cooler, but also cost twice as much.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3585/3401026482_ce1c4b579b_o.jpg" title="Raible Designs HQ 2009" rel="lightbox[newofficenewbike]"&gt;&lt;img src="http://farm4.static.flickr.com/3585/3401026482_e79c859867_t.jpg" width="100" height="75" alt="Raible Designs HQ 2009" class="picture" /&gt;&lt;/a&gt;
A couple of weeks ago, we found a nice office near downtown. I signed a 1-year lease and moved in over the weekend. For folks in Denver, you might recognize the &lt;a href="http://www.forestroom5.com/"&gt;nice location&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
I did my final run to work last Thursday, in the midst the &lt;a href="http://www.associatedcontent.com/article/1603078/colorado_the_blizzard_of_2009.html"&gt;Blizzard of 2009&lt;/a&gt;. 

&lt;a href="http://farm4.static.flickr.com/3660/3401028776_b467c1f7e4_o.jpg" title="Almost Whiteout" rel="lightbox[newofficenewbike]"&gt;&lt;img src="http://farm4.static.flickr.com/3660/3401028776_2b2bff9ffc_t.jpg" width="100" height="75" alt="Almost Whiteout" class="picture" style="float: left; margin-top: 5px; margin-bottom: 5px; margin-left: 0" /&gt;&lt;/a&gt;

While running to work was a great experiment and I enjoyed telling people I was doing it, it wasn't &lt;em&gt;fun&lt;/em&gt;. I've been riding my bike to work for many years (first year was 1999). The one thing I've always enjoyed was the thrill of the ride in the morning. On a beautiful spring day, it's really a fantastic experience. It's easily been the best part of any job I've ever had.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3469/3400215481_14c2f6a057_o.jpg" title="New Trek FX 7.5" rel="lightbox[newofficenewbike]"&gt;&lt;img src="http://farm4.static.flickr.com/3469/3400215481_7e1e54002e_t.jpg" width="100" height="75" alt="New Trek FX 7.5" class="picture" /&gt;&lt;/a&gt;
With the new office secured and the running mission completed, I walked over to my &lt;a href="http://campuscycles.com/"&gt;favorite bike shop&lt;/a&gt; and picked up a &lt;a href="http://www.trekbikes.com/us/en/bikes/bike_path/fx/75fx/"&gt;Trek FX 7.5&lt;/a&gt; yesterday. To research and figure out which bike to buy, I &lt;a href="http://www.linkedin.com/groupAnswers?viewQuestionAndAnswers=&amp;amp;gid=91090amp;&amp;discussionID=2147567"&gt;asked my network&lt;/a&gt; on LinkedIn. 
&lt;/p&gt;
&lt;p&gt;
As luck would have it, my first ride to the new office was today and 
&lt;a href="http://farm4.static.flickr.com/3435/3400215459_9f8df5cb57_o.jpg" title="First Ride on New Trek" rel="lightbox[newofficenewbike]"&gt;&lt;img src="http://farm4.static.flickr.com/3435/3400215459_f60a4485ed_t.jpg" width="100" height="75" alt="First Ride on New Trek" class="picture" style="float: left; margin-top: 5px; margin-bottom: 5px; margin-left: 0" /&gt;&lt;/a&gt;
we woke up to a morning snow storm. 
Even though the ride was cold and wet, I still had a blast. I've enjoyed riding since I traversed the hills on a BMX bike back in Montana. Getting back in the saddle today was simply awesome and I can't wait to ride again tomorrow, regardless of the weather.
I know those nice spring days are just around the corner. &lt;img src="http://raibledesigns.com/images/smileys/grin.gif" class="smiley" alt=":-D" title=":-D" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/optimizing_a_gwt_application_with</id>
        <title type="html">Optimizing a GWT Application with Multiple EntryPoints</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/optimizing_a_gwt_application_with" />
        <published>2009-03-25T16:00:37-06:00</published>
        <updated>2009-03-25T16:00:52-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gzip" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="entrypoint" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt-maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="webframeworks" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="optimization" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Building a GWT application is an easy way for Java Developers to write Ajax applications. However, it can be difficult to release a GWT application to production before it's finished. One of the most important things I've learned in Software Development is to get a new application into production as soon as possible. Not only does getting it from dev &amp;rarr; qa &amp;rarr; prod verify your process works, it also can do a lot to test the viability of the new application.
&lt;/p&gt;
&lt;p&gt;One of the biggest issues with GWT applications is size. The project I'm working on compiles Java to JavaScript and creates ~570K *.cache.html files (one for each modern browser). These files end up being around 180K gzipped. I believe this is an OK size for an entire application. However, if you're going to &lt;em&gt;release early, release often&lt;/em&gt; with GWT, chances are you'll just want to release one feature at a time. &lt;/p&gt;
&lt;p&gt;When the first feature was completed on my project, the *.cache.html files were around 300K. Rather than using branches to release to QA and UAT, bug fixes and new features were developed on trunk. Unfortunately, the QA and UAT process took several weeks longer than expected so by the time the feature was ready to release, the *.cache.html files had grown to around ~570K. The reason the file had grown so much was because it included all of the other features.&lt;/p&gt;
&lt;p&gt;Earlier this week, while running to a dentist appointment, I thought of a solution to this problem. The basic idea was to optimize the compilation process so only the to-be-released feature was included. Even better, the solution didn't require &lt;a href="http://raibledesigns.com/rd/entry/modularizing_gwt_applications_with_gwt"&gt;more modularization&lt;/a&gt;. The results:&lt;/p&gt;
&lt;pre&gt;
Before: *.cache.html -&gt; 569K, gzipped 175K
After: *.cache.html -&gt; 314K, gzipped 100K
&lt;/pre&gt;
&lt;p&gt;According to my calculations, that's a 56% reduction in size. How did I do it?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Created a new &lt;code&gt;FeatureName.java&lt;/code&gt; EntryPoint with only the to-be-released features imported. &lt;/li&gt;
&lt;li&gt;Created a new &lt;code&gt;FeatureName.gwt.xml&lt;/code&gt; that references the new EntryPoint.&lt;/li&gt;
&lt;li&gt;Copied old (kitchen-sink) EntryPoint.html to &lt;code&gt;FeatureName.html&lt;/code&gt; and changed the reference to the nocache.js file.&lt;/li&gt;
&lt;li&gt;Created a Maven profile that allows using -PFeatureName to build a FeatureName-only module.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One downside to doing things this way is it's possible to create a WAR that has the same name and different features. Surely the Maven Overlords would frown upon this. Since this is just a temporary solution to release features incrementally, I'm not too worried about it. A possible workaround is to create different WAR names when a feature's profile is activated. I believe the true "Maven way" would be to make the "kitchen sink" application into a JAR and have several WAR modules with the different EntryPoints. Seems a bit complicated to me.
&lt;/p&gt;
&lt;p&gt;Other than this Maven publishing issue, the only other issue I can foresee is keeping the two EntryPoints and HTML files in synch. Then again, the separate files allow a feature to be customized for the release and can be deleted when its no longer needed.
&lt;/p&gt;
&lt;p&gt;What do you think? Do you know of a better way to compile a GWT application so it only contains certain features?</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/modularizing_gwt_applications_with_gwt</id>
        <title type="html">Modularizing GWT Applications with GWT-Maven</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/modularizing_gwt_applications_with_gwt" />
        <published>2009-03-23T10:36:08-06:00</published>
        <updated>2009-03-23T23:28:18-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwt-maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt-maven-plugin" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Last week, I spent some time modularizing the GWT application I'm working on. By &lt;em&gt;modularizing&lt;/em&gt;, I mean splitting the code from one GWT module into a "core" and "webapp" module. The reason for doing this was so the "core" module could be used by another GWT application. Creating &lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&amp;s=google-web-toolkit-doc-1-5&amp;t=DevGuideModules"&gt;GWT Modules&lt;/a&gt; is fairly straightforward, but it wasn't as intuitive as expected when using the &lt;a href="http://code.google.com/p/gwt-maven/"&gt;gwt-maven-plugin&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The hardest part of moving the code was figuring out how to run tests in the new "core" module. After getting it all working, it seems easy enough. Hopefully this post will make it easy for others. Here's the steps I'd recommend:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Convert your GWT project into a multi-module project where you have a top-level pom.xml and two sub-modules (e.g. gwt-core and gwt-webapp).&lt;/li&gt;
&lt;li&gt;Do the normal single-to-multi-project Maven stuff like declaring the &amp;lt;parent&amp;gt; element in the modules and moving plugins/dependencies to the top-level pom.xml.&lt;/li&gt;
&lt;li&gt;Refactor your gwt-webapp project to push down all shared classes (and their tests) to gwt-core.&lt;/li&gt;
&lt;li&gt;In the gwt-core project, include *.xml and *.java in your JAR so GWT can extract/compile the source code when building gwt-webapp.
&lt;pre class="brush:xml"&gt;
&amp;lt;resources&amp;gt;
    &amp;lt;resource&amp;gt;
        &amp;lt;directory&amp;gt;src/main/java&amp;lt;/directory&amp;gt;
        &amp;lt;includes&amp;gt;
            &amp;lt;include&amp;gt;**/*.java&amp;lt;/include&amp;gt;
            &amp;lt;include&amp;gt;**/*.xml&amp;lt;/include&amp;gt;
        &amp;lt;/includes&amp;gt;
    &amp;lt;/resource&amp;gt;
&amp;lt;/resources&amp;gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;gwt-core/src/main/java&lt;/code&gt;, create a &lt;code&gt;Core.gwt.xml&lt;/code&gt; that references the modules you'd like to use in all your applications. For example:
&lt;pre class="brush:xml"&gt;
&amp;lt;module&gt;
    &amp;lt;inherits name="com.google.gwt.user.User"/&gt;
    &amp;lt;inherits name="com.google.gwt.i18n.I18N"/&gt;
    &amp;lt;inherits name="com.extjs.gxt.ui.GXT"/&gt;
    &amp;lt;inherits name="pl.rmalinowski.gwt2swf.GWT2SWF"/&gt;
&amp;lt;/module&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Now the tricky part begins, mostly because of how the gwt-maven plugin currently works. In &lt;code&gt;src/test/java&lt;/code&gt;, create a &lt;code&gt;NoOpEntryPoint.gwt.xml&lt;/code&gt; that inherits your Core module and defines an EntryPoint.
&lt;pre class="brush:xml"&gt;
&amp;lt;module&amp;gt;
    &amp;lt;inherits name="com.company.app.Core"/&amp;gt;
    &amp;lt;entry-point class="com.company.app.NoOpEntryPoint"/&amp;gt;
&amp;lt;/module&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;NoOpEntryPoint.java&lt;/code&gt; class in the same directory as &lt;code&gt;NoOpEntryPoint.gwt.xml&lt;/code&gt;.&lt;/pre&gt;
&lt;pre class="brush:java"&gt;
public class NoOpEntryPoint implements EntryPoint {
    
    public void onModuleLoad() {
        // do nothing
    }
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;In any class that extends GWTTestCase (I usually create a parent class for all tests), reference the NoOpEntryPoint in the &lt;code&gt;getModuleName()&lt;/code&gt; method.
&lt;pre class="brush:java"&gt;
    @Override
    public String getModuleName() {
        return "com.company.app.NoOpEntryPoint";
    }
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Lastly, in the gwt-maven plugin's configuration (in gwt-core/pom.xml), reference the NoOpEntryPoint in &amp;lt;compileTargets&amp;gt;, a non-existent file in &amp;lt;runTarget&amp;gt; and only the "test" goal in the executions.
&lt;pre class="brush:xml"&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;com.totsp.gwt&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-googlewebtoolkit2-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.0-beta26&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;compileTargets&amp;gt;
            &amp;lt;value&amp;gt;com.company.app.NoOpEntryPoint&amp;lt;/value&amp;gt;
        &amp;lt;/compileTargets&amp;gt;
        &amp;lt;runTarget&amp;gt;com.company.app.NoOpEntryPoint/doesntexist.html&amp;lt;/runTarget&amp;gt;
        &amp;lt;logLevel&amp;gt;INFO&amp;lt;/logLevel&amp;gt;
        &amp;lt;style&amp;gt;OBF&amp;lt;/style&amp;gt;
        &amp;lt;noServer&amp;gt;false&amp;lt;/noServer&amp;gt;
        &amp;lt;extraJvmArgs&amp;gt;-Xmx512m&amp;lt;/extraJvmArgs&amp;gt;
        &amp;lt;gwtVersion&amp;gt;${gwtVersion}&amp;lt;/gwtVersion&amp;gt;
        &amp;lt;testFilter&amp;gt;*GwtTestSuite.java&amp;lt;/testFilter&amp;gt;
        &amp;lt;testSkip&amp;gt;${skipTests}&amp;lt;/testSkip&amp;gt;
    &amp;lt;/configuration&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The results of modularizing your application are beneficial (shared code) and detrimental (you have to &lt;code&gt;mvn install&lt;/code&gt; gwt-core whenever you make changes in shared classes). If you know of a way to configure the gwt-maven plugin to read sources from both gwt-core and gwt-webapp in hosted mode, I'd love to hear about it. </content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/gxt_s_mvc_framework</id>
        <title type="html">GXT's MVC Framework</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/gxt_s_mvc_framework" />
        <published>2009-03-13T11:48:41-06:00</published>
        <updated>2009-03-13T12:00:31-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="mvc" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gxt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="navigation" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">For the past couple of months, I've been developing a GWT application using a mix of &lt;a href="http://gwt.google.com/samples/Showcase/Showcase.html"&gt;plain ol' GWT&lt;/a&gt; and &lt;a href="http://extjs.com/explorer/#overview"&gt;GXT&lt;/a&gt; widgets. When I first started developing it, I didn't know how to best organize my code and separate the logic. The solution I came up with was to adopt some sort of MVC framework. Since I was already using GXT, I opted for GXT's &lt;a href="http://extjs.com/deploy/gxtdocs/com/extjs/gxt/ui/client/mvc/package-summary.html"&gt;lightweight MVC implementation&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;As mentioned in &lt;a href="http://raibledesigns.com/rd/entry/testing_gwt_applications"&gt;Testing GWT Applications&lt;/a&gt;, GXT's MVC &lt;a href="http://extjs.net/forum/showthread.php?t=55064"&gt;doesn't have much documentation&lt;/a&gt;. The best reference documentation seems to be &lt;a href="http://christianposta.com/blog/?p=6"&gt;Christian's Getting started with Ext-GWT: The Mail reference application&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Page Transitioning with Dispatcher&lt;/strong&gt;&lt;br/&gt;
After working with GXT MVC for a couple months, I'm still not sure I fully understand how navigation and event dispatching works. The biggest point of confusion for me is how to best use GXT's &lt;a href="http://extjs.com/deploy/gxtdocs/com/extjs/gxt/ui/client/mvc/Dispatcher.html"&gt;Dispatcher&lt;/a&gt; class.&lt;/p&gt;
&lt;p&gt;The problem with Dispatcher is it has a two methods that seem to do the same thing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;forwardEvent&lt;/code&gt; (4 variations)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dispatch&lt;/code&gt; (3 variations)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to these methods in Dispatcher, there's two &lt;code&gt;fireEvent&lt;/code&gt; methods in GXT's &lt;a href="http://extjs.com/deploy/gxtdocs/com/extjs/gxt/ui/client/mvc/View.html"&gt;View&lt;/a&gt; class. According to my calculations, that means there's 9 different options for transitioning from one view to the next. Which one is best to use?
&lt;/p&gt;
&lt;p&gt;
From what I've learned, I think it's best to use &lt;code&gt;fireEvent&lt;/code&gt; in Views and &lt;code&gt;forwardEvent&lt;/code&gt; in Controllers and other widgets. IMO, &lt;code&gt;dispatcher&lt;/code&gt; should never be used except in your HistoryListener's implementation &lt;code&gt;onHistoryChanged&lt;/code&gt; method.

The important thing to realize about this method is it &lt;em&gt;should&lt;/em&gt; only work if the View's Controller is registered for the event. 
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
  protected void fireEvent(AppEvent event) {
    Controller c = controller;
    while (c != null) {
      if (c.canHandle(event)) {
        c.handleEvent(event);
      }
      c = c.parent;
    }
  }
&lt;/pre&gt;
&lt;p&gt;However, &lt;code&gt;fireEvent&lt;/code&gt; seems to work even when the View's Controller isn't registered for that event. This is because &lt;code&gt;onHistoryChanged&lt;/code&gt; gets called in the EntryPoint. For experienced GXT MVC users, does this navigation handling mesh with your findings?&lt;/p&gt;
&lt;p&gt;The most important thing for navigation to work successfully is enabling History support. The next section talks about how to do this effectively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enabling History Support&lt;/strong&gt;&lt;br/&gt;
To help explain things better, I created a simple GWT MVC Example application and used Maven to create an archetype with it. You can create a project from the archetype using the following command:
&lt;/p&gt;
&lt;pre&gt;
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes \
-DarchetypeArtifactId=gwt-mvc -DarchetypeVersion=1.0-SNAPSHOT \
-DgroupId=com.mycompany.app -DartifactId=myproject \
-DremoteRepositories=http://oss.sonatype.org/content/repositories/appfuse-snapshots
&lt;/pre&gt;
&lt;p&gt;To enable history support in this application, I implemented &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/HistoryListener.html"&gt;HistoryListener&lt;/a&gt; in my EntryPoint (Application.java) and added the following logic to initialize:
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
// If the application starts with no history token, redirect to 'home' state
String initToken = History.getToken();
if (initToken.length() == 0) {
    History.newItem(HistoryTokens.HOME);
}

// Add history listener
History.addHistoryListener(this);

// Now that we've setup our listener, fire the initial history state.
History.fireCurrentHistoryState();
&lt;/pre&gt;
&lt;p&gt;In this example, HistoryTokens is a class that contains all the URLs of the "views" in the application.&lt;/p&gt;
&lt;pre class="brush: java"&gt;
public class HistoryTokens {
    public static final String HOME = "home";
    public static final String CALENDAR = "calendar";
    public static final String NOTES = "notes";
    public static final String SEARCH = "search";
}
&lt;/pre&gt;
&lt;p&gt;In order to make URLs like http://localhost:8080/#calendar go to the calendar view, the following logic exists in the &lt;code&gt;onHistoryChanged&lt;/code&gt; method.&lt;/p&gt;
&lt;pre class="brush: java"&gt;
        Dispatcher dispatcher = Dispatcher.get();

        if (historyToken != null) {
            if (historyToken.equals(HistoryTokens.HOME)) {
                dispatcher.dispatch(AppEvents.GoHome);
            } else if (historyToken.equals(HistoryTokens.CALENDAR)) {
                dispatcher.dispatch(AppEvents.Calendar);
            } else if (historyToken.equals(HistoryTokens.NOTES)) {
                dispatcher.dispatch(AppEvents.Notes);
            } else if (historyToken.equals(HistoryTokens.SEARCH)) {
                dispatcher.dispatch(AppEvents.Search);
            } else {
                GWT.log("HistoryToken '" + historyToken + "' not found!", null);
            }
        }
&lt;/pre&gt;
&lt;p&gt;Controllers are registered in the EntryPoint as follows:
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
        final Dispatcher dispatcher = Dispatcher.get();
        dispatcher.addController(new CalendarController());
        dispatcher.addController(new HomeController());
        dispatcher.addController(new NotesController());
        dispatcher.addController(new SearchController());
&lt;/pre&gt;
&lt;p&gt;Controllers respond to events they're registered for. This is done in their constructor:
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
    public CalendarController() {
        registerEventTypes(AppEvents.Calendar);
    }
&lt;/pre&gt;
&lt;p&gt;In order for navigation to work, you have to create links with history tokens&lt;sup&gt;1&lt;/sup&gt;. For example, here's a link from the &lt;code&gt;HomeView&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class="brush: java"&gt;
	Hyperlink notesLink = new Hyperlink("Notes", HistoryTokens.NOTES);
	notesLink.addClickListener(new ClickListener() {
	    public void onClick(Widget widget) {
	        Dispatcher.get().fireEvent(AppEvents.Notes);
	    }
	});
&lt;/pre&gt;
&lt;p&gt;You'll notice in this example, I'm using Dispatcher's &lt;code&gt;fireEvent&lt;/code&gt; method. If I wanted to pass some data with your event, you'll need to use &lt;code&gt;forwardEvent&lt;/code&gt;. Here's an example from &lt;code&gt;CalendarView&lt;/code&gt;:
&lt;/p&gt;
&lt;pre class="brush: java"&gt;
    Button submit = new Button("Submit");

    submit.addSelectionListener(new SelectionListener&amp;lt;ButtonEvent&gt;() {
        public void componentSelected(ButtonEvent ce) {
            AppEvent&amp;lt;Date&gt; event = 
                new AppEvent&amp;lt;Date&gt;(AppEvents.GoHome, date.getValue(), HistoryTokens.HOME);
            Dispatcher.forwardEvent(event);
        }
    });
&lt;/pre&gt;
&lt;p&gt;
In this example, you could also use &lt;code&gt;Dispatcher.dispatcher()&lt;/code&gt;, but I believe this will cause the transition to happen twice because the &lt;code&gt;onHistoryChanged&lt;/code&gt; method gets called too. This doesn't matter for the most part, except when you start to use &lt;a href="http://extjs.com/deploy/gxtdocs/com/extjs/gxt/ui/client/mvc/DispatcherListener.html"&gt;DispatcherListener&lt;/a&gt;s. 
&lt;/p&gt;
&lt;p&gt;Hopefully this article has helped you understand how GXT's MVC framework works. I'm interested in learning how other GWT MVC frameworks work. If you've used one, I'd love to hear about your experience.&lt;/p&gt;
&lt;p class="smokey"&gt;&lt;strong&gt;Friday Fun Test&lt;/strong&gt;&lt;br/&gt;
Here's a test for those interested in digging into the GXT MVC example. There's a bug in this application that prevents something from happening. I'll &lt;a href="http://www.givereal.com/"&gt;buy a drink&lt;/a&gt; for the person that finds the bug and I'll buy two drinks for the person that comes up with a solution. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;&lt;/p&gt; 
&lt;p&gt;
&lt;em&gt;1. If you use the default constructor on Hyperlink and use &lt;code&gt;setText()&lt;/code&gt;, make sure to call &lt;code&gt;setTargetHistoryToken()&lt;/code&gt; too. If you don't, a blank history token will be used and # causes the browser to scroll to the top before a page transition happens.&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/1st_hike_of_2009</id>
        <title type="html">1st Hike of 2009</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/1st_hike_of_2009" />
        <published>2009-03-09T22:28:20-06:00</published>
        <updated>2009-03-14T14:18:37-06:00</updated> 
        <category term="/General" label="General" />
        <category term="dakotaridge" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="hiking" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jack" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="camelbak" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="abbie" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="kids" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="colorado" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="denver" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This past Sunday, the kids and I loaded up our &lt;a href="http://www.camelbak.com"&gt;camelbaks&lt;/a&gt; and headed out for a hike to the top of &lt;a href="http://www.trailcentral.com/trail/trail_info.php?trail=102"&gt;Dakota Ridge Trail&lt;/a&gt;. We parked in the Green Mountain parking lot next to C-470 and trekked up the west-side of the mountain.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3416/3342669179_73d541fb87.jpg" title="Ready to go" rel="lightbox[firsthike2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3416/3342669179_73d541fb87_t.jpg" width="100" height="75" alt="Ready to go" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3603/3342669291_4ac5cebaf8.jpg" title="Hiking Jack" rel="lightbox[firsthike2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3603/3342669291_4ac5cebaf8_t.jpg" width="100" height="75" alt="Hiking Jack" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3593/3342669549_da6468e8a9.jpg" title="Heading up Dakota Ridge" rel="lightbox[firsthike2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3593/3342669549_da6468e8a9_t.jpg" width="100" height="75" alt="Heading up Dakota Ridge" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;First of all, I was impressed with their enthusiasm. Granted, it was a beautiful Denver spring day, but still - you know how 4 and 6 year olds are. I'm not sure how far it was, but I'd guess somewhere between 1 and 2 miles. Abbie was gung-ho the entire way up, while Jack kept saying he was tired and wanted me to carry him. I never broke down, kept encouraging him and they both made it to the top without any issues.
&lt;/p&gt;
&lt;p&gt;While at the top, they did some exploring and Abbie gathered a whole backpack full of rocks for the trip down. By the time she was done filling it, it must've weighed around 20 pounds. Even though it was pretty darn heavy, she carried it all the way down - stopping every-so-often to empty a few rocks out. We weighed it when we got home and discovered it was 10 pounds. I was very impressed with her strength and perseverance. 
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Well done kids!&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3593/3343505052_1740952621.jpg" title="Jack on Dakota Ridge" rel="lightbox[firsthike2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3593/3343505052_1740952621_t.jpg" width="100" height="75" alt="Jack on Dakota Ridge" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3413/3342671495_26f61f7d60.jpg" title="Collecting Rocks" rel="lightbox[firsthike2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3413/3342671495_26f61f7d60_t.jpg" width="100" height="75" alt="Collecting Rocks" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3658/3343506648_caa24e1d39.jpg" title="On the top" rel="lightbox[firsthike2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3658/3343506648_caa24e1d39_t.jpg" width="100" height="75" alt="On the top" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;How old do kids have to be before you take them up a &lt;a href="http://www.14ers.com/"&gt;14er&lt;/a&gt;? &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/nexus_is_a_kick_ass</id>
        <title type="html">Nexus is a kick-ass Repository Manager</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/nexus_is_a_kick_ass" />
        <published>2009-03-05T23:59:02-07:00</published>
        <updated>2009-03-05T23:59:02-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="nexus" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="sonatype" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="repositorymanager" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">I started my &lt;a href="http://raibledesigns.com/rd/entry/what_s_next"&gt;current gig&lt;/a&gt; at the end of last year. I've been enjoying the work and especially the project infrastructure we've been using. We're using the usual suspects: JIRA, Confluence, Hudson and Subversion. We're also using a couple new ones, namely &lt;a href="http://www.sventon.org/"&gt;sventon&lt;/a&gt; and &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt;. For building, we're using Maven and Ivy (as a Grails plugin). 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3626/3331881717_9cc73cf048_o.png" rel="lightbox[nexus]" title="Nexus"&gt;&lt;img src="http://farm4.static.flickr.com/3626/3331881717_0a224b75f6_m.jpg" width="157" height="240" alt="Nexus" class="picture" style="border: 0"/&gt;&lt;/a&gt;
I'm writing this post to talk about Nexus and how much I've enjoyed using it. I like Nexus for two reasons: it's &lt;a href="http://oss.sonatype.org/index.html"&gt;aesthetically pleasing&lt;/a&gt; and it's &lt;a href="http://www.sonatype.com/books/nexus-book/reference/index.html"&gt;well-documented&lt;/a&gt;. Another reason I really dig it is because I haven't had to touch it since I first configured it. Software that just keeps on humming is always fun to work with.
&lt;/p&gt;
&lt;p&gt;Initially, I remember having &lt;a href="http://nexus.sonatype.org/mailing-list-user-archives.html"&gt;some issues&lt;/a&gt; setting up repositories. I also remember solving them after learning &lt;a href="http://www.sonatype.com/books/nexus-book/reference/config.html#config-sect-managing-groups"&gt;how groups work&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;In addition to on-the-job, I've started to use Nexus more and more in my open source life. With the help of &lt;a href="http://www.sonatype.com/people/author/jason/"&gt;Jason van Zyl&lt;/a&gt;, I recently moved AppFuse's repository to Sonatype's &lt;a href="http://oss.sonatype.org"&gt;oss.sonatype.org&lt;/a&gt;. I also noticed there's &lt;a href="https://repository.apache.org/index.html"&gt;a Nexus instance for Apache projects&lt;/a&gt;. If that's not enough, you can &lt;a href="http://www.sonatype.com/products/nexus/oss_license_request"&gt;get Nexus Pro free&lt;/a&gt; if you're an open source project.
&lt;/p&gt;
&lt;p&gt;Personally, the open source version of Nexus seems good enough for me. While the &lt;a href="http://vimeo.com/2985451"&gt;Staging Suite&lt;/a&gt; looks nice, I think it's possible to do a lot of similar things with good communication. After all, it's not going to free you from having to wrestle with the &lt;a href="http://maven.apache.org/plugins/maven-release-plugin/"&gt;maven-release-plugin&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Next week, I'm helping to polish and document our entire release process (from dev &amp;rarr; qa &amp;rarr; production). If you have any advice on how to best perform releases with Maven, Grails and/or Nexus, I'd love to hear about it. My goal is extreme efficiency so releases can be done very quickly and with minimal effort.

</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/gwt_and_appfuse</id>
        <title type="html">GWT and AppFuse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/gwt_and_appfuse" />
        <published>2009-03-04T22:50:26-07:00</published>
        <updated>2009-03-04T22:51:23-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="rest" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Someone recently sent me the following e-mail asking about GWT integration in &lt;a href="http://appfuse.org"&gt;AppFuse&lt;/a&gt;.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
I see from your blog that you're spending some time with GWT at the moment. What's your plan, are you going to integrate GWT as another UI Option for AppFuse?
&lt;br/&gt;&lt;br/&gt;
The reason I'm asking is that I actually checked out all of the AppFuse code from the svn repository yesterday, with the intention of starting off adding some GWT stuff in there. My intention was to start by getting a basic Maven archetype together for GWT as an AppFuse UI.
&lt;br/&gt;&lt;br/&gt;
However, if you're planning on doing this yourself in the near future, then there's no point in me starting doing it, I'd have to learn how to write archetype's for a start (not that it looks too difficult) but you'd obviously do it much quicker.
&lt;/p&gt;
&lt;p&gt;Being a good open-source developer, I moved the discussion to the developer mailing list and &lt;a href="http://www.nabble.com/Re%3A-GWT---Appfuse-to22184159s2369.html"&gt;replied there&lt;/a&gt;:&lt;/p&gt;
&lt;div class="quote" style="color: #666; margin-left: 0; margin-bottom: 10px"&gt;
&lt;p&gt;It's likely I'll create a version of AppFuse Light with GWT, but I 
doubt I'll do it in the near future. I hope to release AppFuse 2.1 
first (which will include "light" archetypes). I wouldn't get your 
hopes up in waiting for me to do the work. However, I'd be happy to 
assist you in doing it. AppFuse Light is now modular and uses the 
AppFuse backend. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven"&gt;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Here's how I believe GWT should be integrated: 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an appfuse-ws archetype that serves up RESTful services 
(&lt;a href="http://issues.appfuse.org/browse/APF-897"&gt;http://issues.appfuse.org/browse/APF-897&lt;/a&gt;). &lt;/li&gt;
&lt;li&gt; Create an appfuse-gwt archetype that consumes those services. This 
archetype would contain a proxy servlet that allows #1 to be on a 
separate host/port. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
In addition to #1, I hope to convert the Struts 2 and Spring MVC 
archetypes to use those frameworks' REST support. 
&lt;/p&gt;
&lt;p style="margin-bottom: 0"&gt;
For #2, we could use SmartGWT or GXT. SmartGWT might be better since 
Sanjiv is a committer on this project. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I know I've been slacking on AppFuse development, but it &lt;em&gt;is&lt;/em&gt; ski season and running to work seems to drain my late-night coding ambitions. With that being said, I'm committed to getting AppFuse 2.1 released by JavaOne (hopefully sooner). I figure it's a good week's worth of work and I'll probably have to do it late at night to find the time. That's OK though, I usually really start to enjoy it once I get into it.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/new_15_macbook_pro_with</id>
        <title type="html">New 15" MacBook Pro with SSD</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/new_15_macbook_pro_with" />
        <published>2009-03-02T07:24:28-07:00</published>
        <updated>2009-03-03T12:16:39-07:00</updated> 
        <category term="/Mac OS X" label="Mac OS X" />
        <category term="ssd" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="macbookpro" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="osx" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="apple" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Just over a month ago, I &lt;a href="http://raibledesigns.com/rd/entry/bye_bye_dream_machine"&gt;reduced my computing machinery&lt;/a&gt; from 3 to 1. Since I was &lt;a href="http://raibledesigns.com/rd/entry/running_to_work"&gt;running to work&lt;/a&gt;, this quickly presented a problem of how to get my laptop to/from the office. I decided to go for the "no home computer" about half the time and it was a fairly pleasant experience. It's hard to stay up late and hack away on open source when all you have is an iPhone.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://store.apple.com/us/browse/home/shop_mac/family/macbook_pro"&gt;&lt;img src="http://static.raibledesigns.com/repository/images/mbp_15.jpg" width="108" height="99" class="picture" style="border: 0" /&gt;&lt;/a&gt;
To be perfectly honest, I only made it about &lt;a href="http://twitter.com/mraible/status/1188283175"&gt;2 weeks&lt;/a&gt; before I ordered a new laptop, but I cancelled the order shortly after. Last weekend, I re-ordered and my new 15" MacBook Pro arrived this past weekend. Here's the specs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Processor:&lt;/strong&gt; 2.8 GHz Intel Core 2 Duo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory:&lt;/strong&gt; 4 GB 1067 MHz DDR3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also chose the solid-state drive (SSD) because I'd heard it's faster.  I did some rough performance comparisons against my old laptop (&lt;a href="http://raibledesigns.com/rd/entry/a_new_17_powerhouse"&gt;a 2-year-old 17" MacBook Pro&lt;/a&gt;) and found it's quite a bit faster.&lt;/p&gt;
&lt;p&gt;
For these tests, the computers have &lt;em&gt;exactly&lt;/em&gt; the same software and OS (I restored my new MBP from my old one). 
For the tests below, I used Java version "1.5.0_16" and had JAVA_OPTS set to the following: 
&lt;/p&gt;
&lt;pre&gt;
-Xms512M -Xmx768M -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC. 
&lt;/pre&gt;
&lt;table class="comparison" cellpadding="3" cellspacing="0" style="width: 95%"&gt;
&lt;tr&gt;&lt;th style="text-align: left"&gt;Computer&lt;/th&gt;&lt;th style="text-align: left; width: 140px"&gt;Operation&lt;/th&gt;&lt;th style="text-align: center"&gt;Time (mm:ss)&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;New MacBook Pro&lt;/b&gt; with OS X 10.5.6 (2.8 GHz, 4 GB RAM)&lt;/td&gt;&lt;td&gt;appfuse: mvn install&lt;/td&gt;&lt;td style="text-align: center"&gt;3:23&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;cp -r appfuse appfuse2&lt;/td&gt;&lt;td style="text-align: center"&gt;0:28&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;gwt-project: mvn install&lt;/td&gt;&lt;td style="text-align: center"&gt;1:24&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Old MacBook Pro&lt;/b&gt; with OS X 10.5.6 (2.33 GHz, 3 GB RAM)&lt;/td&gt;&lt;td&gt;appfuse: mvn install&lt;/td&gt;&lt;td style="text-align: center"&gt;4:11&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;cp -r appfuse appfuse2&lt;/td&gt;&lt;td style="text-align: center"&gt;0:56&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;gwt-project: mvn install&lt;/td&gt;&lt;td style="text-align: center"&gt;2:21&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;From these numbers, you can see that it's around 20% faster for building AppFuse (2.1-SNAPSHOT) and almost twice as fast at copying files and building the GWT project I'm working on. Needless to say, I'm impressed and pleased with my purchase.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; New MacBook Pros &lt;a href="http://www.tuaw.com/2009/03/03/but-wait-theres-more-macbook-pro-gets-a-small-speed-boost/"&gt;came out today&lt;/a&gt; with a faster CPU (2.93 GHz) and 256 GB SSD. I was able to call Apple and get a full refund on mine. &lt;em&gt;Thanks Apple!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/gwttestsuite_makes_builds_faster_but</id>
        <title type="html">GWTTestSuite makes builds faster, but requires JUnit 4.1</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/gwttestsuite_makes_builds_faster_but" />
        <published>2009-02-27T11:58:12-07:00</published>
        <updated>2009-02-27T16:11:24-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwttestsuite" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="junit" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt-maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="hudson" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Earlier this week, I spent some time implementing &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/junit/tools/GWTTestSuite.html"&gt;GWTTestSuite&lt;/a&gt; to speed up my project's build process. In Hudson, the project was taking around 15 minutes to build, locally it was only taking 5 minutes for &lt;em&gt;mvn test&lt;/em&gt;. 
In IDEA, I could run all the tests in under a minute. While 15 minutes isn't a long time for a build to execute, a co-worker expressed some concern:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Does Maven have to run GWT test and individual Java processes? (See target/gwtTest/*.sh) This arrangement and the overhead of JVM launches is another reason why builds take so long. As we add more GWT tests we are going to test that LinkedIn record for the slowest build ever.
&lt;/p&gt;
&lt;p&gt;
After this comment, I started looking into GWTTestSuite using &lt;a href="http://development.lombardi.com/?p=409"&gt;Olivier Modica's blog entry&lt;/a&gt; as a guide. It was very easy to get things working in IDEA. However, when I'd run &lt;em&gt;mvn test&lt;/em&gt;, I'd get the following error:
&lt;/p&gt;
&lt;pre&gt;
Error: java.lang.ClassCastException
&lt;/pre&gt;
&lt;p&gt;No line numbers. No class information. Zilch. After comparing my project's pom.xml with the one from the default &lt;a href="http://gwt-maven.googlecode.com/svn/docs/maven-googlewebtoolkit2-plugin/archetype.html"&gt;gwt-maven archetype&lt;/a&gt;, I noticed the default used JUnit 4.1, while I had the latest-and-supposedly-greatest JUnit 4.4. Reverting to JUnit 4.1 fixed the problem. Now Hudson takes 3:15 to execute the build instead of 15 minutes.
&lt;/p&gt;
&lt;p&gt;
The reason for this blog post is this doesn't seem to be documented anywhere. Hopefully other developers will find this entry when googling for this issue.&lt;/p&gt;
&lt;p&gt;Related to making GWT faster, I also added the following line to my Application.gwt.xml file:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;set-property name="user.agent" value="safari" /&gt;
&lt;/pre&gt; 
&lt;p&gt;This dropped the &lt;code&gt;gwt:compile&lt;/code&gt; time from 1 minute to 25 seconds. As &lt;a href="http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_CompileOnePermutation"&gt;explained in the documentation&lt;/a&gt;, you can use the "user.agent" setting to only generate one JS file for your app instead of 4. The strange thing about adding this setting was I pretty much forgot about it since everything seemed to work fine on both Safari and Firefox. When I started testing things in IE6, I started seeing a lot of JavaScript errors. After debugging for an hour or so, I realized this setting was there, removed it, and everything started working great in all browsers.
&lt;/p&gt;
&lt;p&gt;Now if I could just figure out how to use safari-only for development, but remove the line when building the WAR. Suggestions welcome.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/enhancing_your_gwt_application_with</id>
        <title type="html">Enhancing your GWT Application with the UrlRewriteFilter</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/enhancing_your_gwt_application_with" />
        <published>2009-02-23T17:02:29-07:00</published>
        <updated>2009-02-24T13:26:08-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwt-maven-plugin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="maven" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="urlrewritefilter" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Last week, I spent some time trying to &lt;a href="http://code.google.com/p/google-web-toolkit-doc-1-4/wiki/FAQ_ChangeLocationGWTApplicationFiles"&gt;change the location of my cache/nocache HTML files&lt;/a&gt; in my GWT project. I started the project with the &lt;a href="http://gwt-maven.googlecode.com/svn/docs/maven-googlewebtoolkit2-plugin/archetype.html"&gt;gwt-maven-plugin's archetype&lt;/a&gt;. The &lt;a href="http://groups.google.com/group/gwt-maven/browse_thread/thread/a46f540ca823e3d3"&gt;message&lt;/a&gt; I posted to the gwt-maven Google Group is below.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Rather than having my application's HTML file in
src/main/java/com/mycompany/Application.html, I'd like to move it to
src/main/webapp/index.html. I tried copying the HTML and adding the
following to my index.html, but no dice:
&lt;br/&gt;&lt;br/&gt;
&amp;lt;meta name="gwt:module" content="com.mycompany.Application"/&gt;
&lt;br/&gt;&lt;br/&gt;
Is this possible with the gwt-maven-plugin? I'd like to have my main
HTML and CSS at the root of my application.
&lt;/p&gt;
&lt;p&gt;
The good news is I figured out a solution using the &lt;a href="http://tuckey.org/urlrewrite/"&gt;UrlRewriteFilter&lt;/a&gt; that 1) allows hosted mode to work as usual and 2) allows your app to be served up from the root URL (/ instead of /com.company.Module/Application.html). Here's the urlrewrite.xml that makes it all possible.&lt;/p&gt;
&lt;pre&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
        "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"&amp;gt;

&amp;lt;urlrewrite&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;^/$&amp;lt;/from&amp;gt;
        &amp;lt;to type="forward" last="true"&amp;gt;/com.mycompany.app.Application/Application.html&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;/index.html&amp;lt;/from&amp;gt;
        &amp;lt;to type="forward" last="true"&amp;gt;/com.mycompany.app.Application/Application.html&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
    &amp;lt;-- This last rule is necessary for JS and CSS files --&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;^/(.*)\.(.*)$&amp;lt;/from&amp;gt;
        &amp;lt;to type="forward"&amp;gt;/com.mycompany.app.Application/$1.$2&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
&amp;lt;/urlrewrite&amp;gt;
&lt;/pre&gt;
&lt;p&gt; 
If you're using the gwt-maven plugin, this file goes in &lt;code&gt;src/main/webapp/WEB-INF&lt;/code&gt;. In addition, you'll need to add the following to your web.xml.
&lt;/p&gt;
&lt;pre&gt;
    &amp;lt;filter&amp;gt;
        &amp;lt;filter-name&amp;gt;rewriteFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;filter-class&amp;gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&amp;lt;/filter-class&amp;gt;
    &amp;lt;/filter&amp;gt;

    &amp;lt;filter-mapping&amp;gt;
        &amp;lt;filter-name&amp;gt;rewriteFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Finally, add the UrlRewriteFilter dependency in your pom.xml:
&lt;/p&gt;
&lt;pre&gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.tuckey&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;urlrewritefilter&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Please let me know if you have any questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/jeff_genender.html"&gt;Jeff&lt;/a&gt; posted an &lt;a href="http://groups.google.com/group/gwt-maven/msg/28146682e6ab510d"&gt;alternative configuration&lt;/a&gt; that allows you to eliminate the last rule in urlrewrite.xml, as well as use the beloved &lt;strong&gt;mvn jetty:run&lt;/strong&gt; command. To use cleaner WAR packaging and the Jetty plugin, add the following to your pom.xml:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;webappDirectory&amp;gt;
            ${project.build.directory}/${project.build.finalName}/com.mycompany.app.Application
        &amp;lt;/webappDirectory&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-jetty-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;6.1.14&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;webAppConfig&amp;gt;
            &amp;lt;contextPath&amp;gt;/&amp;lt;/contextPath&amp;gt;
            &amp;lt;baseResource implementation="org.mortbay.resource.ResourceCollection"&amp;gt;
                &amp;lt;resourcesAsCSV&amp;gt;
                    ${basedir}/src/main/webapp,
                    ${project.build.directory}/${project.build.finalName}/com.mycompany.app.Application
                &amp;lt;/resourcesAsCSV&amp;gt;
            &amp;lt;/baseResource&amp;gt;
        &amp;lt;/webAppConfig&amp;gt;
        &amp;lt;scanIntervalSeconds&amp;gt;3&amp;lt;/scanIntervalSeconds&amp;gt;
        &amp;lt;scanTargets&amp;gt;
            &amp;lt;scanTarget&amp;gt;${basedir}/src/main/resources&amp;lt;/scanTarget&amp;gt;
            &amp;lt;scanTarget&amp;gt;${basedir}/src/main/webapp/WEB-INF&amp;lt;/scanTarget&amp;gt;
            &amp;lt;scanTarget&amp;gt;
                ${project.build.directory}/${project.build.finalName}/com.mycompany.app.Application
            &amp;lt;/scanTarget&amp;gt;
        &amp;lt;/scanTargets&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Then you can trim your urlrewrite.xml down to:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;urlrewrite&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;^/$&amp;lt;/from&amp;gt;
        &amp;lt;to type="forward" last="true"&amp;gt;/Application.html&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;/index.html&amp;lt;/from&amp;gt;
        &amp;lt;to type="forward" last="true"&amp;gt;/Application.html&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
&amp;lt;/urlrewrite&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Of course, you could also change the welcome-file in your web.xml or use index.html and the &amp;lt;meta http-equiv="REFRESH"&amp;gt; option. Personally, I have so much affection for the UrlRewriteFilter that I like having it in my project. I'm sure I'll need it someday.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks Jeff!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/comparing_web_frameworks_book</id>
        <title type="html">Comparing Web Frameworks Book</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/comparing_web_frameworks_book" />
        <published>2009-02-23T09:49:15-07:00</published>
        <updated>2009-02-23T09:52:25-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="book" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="struts" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="zend" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="webframeworks" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="django" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">A publisher recently sent me an e-mail asking some advice. They received a proposal for a book that compares CakePHP, Symfony, Zend, TurboGears, Django, Struts, RoR. Here's a quote from the proposal:
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
We would like to compare a couple of frameworks and present their advantages and disadvantages in various applications.
&lt;br/&gt;&lt;br/&gt;
Obviously, that kind of manual would be very useful for readers who are starting their 'adventures' with web applications, as it would facilitate their choosing the best framework for their particular application. The manuscript would offer a comparison of the most popular solutions (CakePHP, Symfony, Zend Framework, TurboGears, Django, Struts, Ruby on Rails) and demonstrate the main differences between each.
&lt;br/&gt;&lt;br/&gt;
Therefore, the target audience would mainly be project managers, responsible for deciding on the technologies to be used for in-house projects, as well as less experienced, web application beginners.
&lt;br/&gt;&lt;br/&gt;
Another purpose of the book would be to present 'good practices' in various frameworks, such as code re-factoring, design patterns and application security. From this point of view, it could become a valuable asset for experienced and learner programmers alike.
&lt;/p&gt;
&lt;p&gt;Since I got a lot of feedback from my &lt;a href="http://twitter.com/mraible/status/1240791644"&gt;tweet on this subject&lt;/a&gt;, I figured I'd ask it here. 
&lt;/p&gt;
&lt;p&gt;
What do you think of such a book?&lt;/p&gt;
&lt;p&gt;
Here's my response:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
How do PHP books do these days? Of the list of frameworks (CakePHP,
Symfony, Zend Framework, TurboGears, Django, Struts, Ruby on Rails), I
think there's interest in Django and Rails, but not so much the
others. And Struts sucks, so having that as a comparison is obviously
going to make it look bad. I wouldn't buy it, but I'm a Java guy
that's mostly interested in web frameworks that make developing
SOFEA-based applications easier. In my mind, these are Flex and GWT.
&lt;br/&gt;&lt;br/&gt;
The book I'd like to see would cover developing RESTful backends and
SOFEA front-ends. RoR, Grails or Django could be used to develop the
backend and Flex, GWT and X could be for the front-end. In reality,
this is probably a tough book to write b/c things move so fast. If you
decide to do it, I'd keep it short and sweet so you can get it to
market and update it quickly.
&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/a_fall_from_grace</id>
        <title type="html">My Dad's Fall from Grace</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/a_fall_from_grace" />
        <published>2009-02-22T14:56:05-07:00</published>
        <updated>2009-02-23T09:31:16-07:00</updated> 
        <category term="/General" label="General" />
        <category term="fallfromgrace" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dad" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="goodstory" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">My Dad sent my sister and I the following e-mail yesterday afternoon. I enjoyed his so much I couldn't resist posting it here. Great story Dad - get well soon!&lt;/p&gt;
&lt;p class="smokey"&gt;
&lt;strong&gt;Subject: A Fall from Grace&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
Hello my children,
&lt;br/&gt;&lt;br/&gt;
My nights at the gym have paid off.  While beginning to remove the
solar panels I lost my situational awareness and stepped backwards
off of the dormer.   I'm bruised, but not broken anywhere.  I can
forget about this bone spur and rotator cuff healing real soon
because that's the side that hit first.  
&lt;br/&gt;&lt;br/&gt;
I have a natural ability to
land on my elbows without breaking them when I fall; so, that's what
took the brunt of it.  When falling at 32 ft per sec. for 8 ft. I
didn't have much time to think about it and prepare for a hard
landing.  I did notice after the side of my head hit the roof and my
glasses and hat headed for the gutter that I was apparently doing the
same.  
&lt;br/&gt;&lt;br/&gt;
As like the time I started to slide down a steep snow bank on
Lion Creek working on the Trail Crew early one spring I was looking
for an anchor.  There happened to be a vent pipe sticking up that I
was able to grab with the inside of my knee.  
&lt;br/&gt;&lt;br/&gt;
While I was wondering
what I broke I heard a voice say from below &amp;quot;Are you alright?&amp;quot;   It
was my neighbor who was out on her porch kitty-corner from us having
a cigarette when she noticed my fall from grace.  I asked her if I
bounced and she said that it looked like I hit pretty hard.  Later, I
considered myself lucky that I didn't impale myself on either of the
vent pipes sticking out of the roof.
&lt;br/&gt;&lt;br/&gt;
   Figuring that I wouldn't be able to walk the next day I decided to
finish the job.  It went fairly well and I shouldn't have to go up
there anymore; altho, the moss will need to be removed when we try to
sell the place.  Maybe my fears of early onset are grounded as I will
be for the next month.  I am sore; but can walk.  Later this afternoon
I'll see if I can carry any weight on my left side.
&lt;br/&gt;&lt;br/&gt;
Love,&lt;br/&gt;&lt;br/&gt;
Dad
&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/what_s_the_best_retirement</id>
        <title type="html">What's the Best Retirement Plan for Independent Consultants?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/what_s_the_best_retirement" />
        <published>2009-02-13T13:44:52-07:00</published>
        <updated>2009-02-13T14:02:29-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="ira" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="softwaredevelopment" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="consulting" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="sep" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="financialplanning" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="retirement" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="independent" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="finance" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Before writing &lt;a href="http://raibledesigns.com/rd/entry/how_to_setup_your_own"&gt;How To Setup Your Own Software Development Company&lt;/a&gt;, I sent my Financial Planner the following e-mail.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;
I'm writing up a blog post on how to setup a Software Development Company for consultants and wanted to see what retirement plan I have. I'd like to recommend it (or others, if there's better deals). Do you have the name and a 2-3 sentence description?
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;Below is his response:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
You have a SEP IRA but depending on how much they make and their savings objective they may also want an Individual 401K and/or Defined Benefit Plan.
&lt;br/&gt;&lt;br/&gt;
A SEP IRA allows you to set aside up to 20% of your income after business expenses, up to $49,000 for those with income of $245,000 or more in 2009.  An Individual 401K allows you to save a higher percentage of your income depending on your age and income.  If you are under age 50 you are able to save $16,500 so long as your income is at least $16,500 (plus FICA, etc) and $22,000 for those over age 55.  You are also able to set aside profit sharing and matching contributions in a 401K Plan.  Those under age 50 have a maximum of $49,000 while those over age 50 have an increased limit of $54,000.  Finally, for those who wish to save more, you could establish a Defined Benefit Plan and make contributions based on your age and income that total potentially more than $200,000 per year.  If you establish a Defined Benefit Plan you are still able to have an Individual 401K Plan but the limits are the employee contribution amount ($16,500 or $22,000) plus 6% of your income up to $245,000 (another $14,700) for a combined total that could be well over $200,000 depending on your age and income.
&lt;br/&gt;&lt;br/&gt;
There is always the Roth and Traditional IRA but those are very basic planning tools - they should still be used and considered but everyone should be familiar with them.  2009 allows $5,000 deposit for under age 50 and $6,000 for over age 50.  Roth contributions are limited starting at $105,000 if filing single and $166,000 if married filing joint.
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Of course, a perk of working for a company with benefits is they sometimes do 401K matching. However, I'd expect many company to be cutting back on that in this economy. If you're an independent consultant, do you have a retirement plan? Do you think you're doing as well as you could if you were a full-time employee?</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/writing_off_home_office_space</id>
        <title type="html">Writing Off Home Office Space</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/writing_off_home_office_space" />
        <published>2009-02-11T20:28:59-07:00</published>
        <updated>2009-02-13T13:39:52-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="taxes" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="writeoffs" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="accountant" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="softwaredevelopment" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="employment" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="homeoffice" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="consulting" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="career" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Before writing yesterday's post on &lt;a href="http://raibledesigns.com/rd/entry/how_to_setup_your_own"&gt;How To Setup Your Own Software Development Company&lt;/a&gt;, I sent my Accountant the following e-mail.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;
I'm writing up a blog post on how to setup a Software Development Company for consultants. I remember talking to you a few years ago about writing off my home office space. At that time, you recommended I didn't because it'd end up on my personal taxes (or something like that). Do you remember that conversation and reasoning? I'd like to post a 2-3 sentence explanation of why this is not a good idea to readers of my blog.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;Below is her response:&lt;/p&gt;

&lt;p class="quote" style="color: rgb(102, 102, 102);"&gt;
It's not that it is a bad idea, it just doesn't always result in a big tax savings.  There are a lot of factors to consider, but I would not post something that says it's a bad idea.  There are types of entities and situations where it is beneficial.  Everyone's circumstances are different, so I would not suggest that you make a blanket statement stating that it is not a good idea.
&lt;br&gt;&lt;br&gt;
In your particular case, you are an S Corp, which is a pass thru entity...meaning the S Corp does not pay taxes.  So, if you want to take a home office deduction you would have your business pay rent to you.  In return you would have to claim rental income on that money.  So, you could take the deduction on the business side but have to claim it on the personal side...making it a wash.  However, where you would get the tax savings, is that you can write off a portion of your utilities against the rental income of the office.  It is usually small, like around 10% or so, but it is something.
&lt;br&gt;&lt;br&gt;
The only issue is that when you sell your house, you are supposed to treat the sale as two different things...a personal sale and a business sale (for the office).  You can often exclude the gain on the personal sale, but can not exclude the gain on the office.  So, if the house goes up significantly in value, you could find yourself paying tax on a large gain.
&lt;/p&gt;
&lt;p&gt;Do you have your own company and write-off your home office space? If so, what kind of company do you have and does it save you a lot of money?</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/how_to_setup_your_own</id>
        <title type="html">How To Setup Your Own Software Development Company</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/how_to_setup_your_own" />
        <published>2009-02-10T12:23:10-07:00</published>
        <updated>2009-02-18T09:48:14-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="employment" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="contract" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="irs" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="thehartford" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="taxes" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ehealthinsurance" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="career" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="paycycle" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="independent" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="contractor" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="softwaredevelopment" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="wellsfargo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="economy" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="quickbooks" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This post was originally titled "FTE vs. Contract in this Economy", but it didn't seem to capture the essence of this entry. I wanted to write about why I think contracting is better in this down economy, but I also wanted to write about how you you might go about setting up your own company. Starting a company is relatively easy from a legal standpoint, and hopefully I can provide some resources that'll make it even easier.
&lt;/p&gt;
&lt;p&gt;
First of all, I believe that contracting is better in this economy for a very simple reason:&lt;/p&gt;
&lt;/p&gt;
&lt;p style="margin-left: 20px"&gt;&lt;strong&gt;When you're a contractor, you're prepared to be let go.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There's really nothing like being laid off. It sucks. It often shocks you and makes you depressed. The good part is you usually get a good afternoon's worth of drinking out of it, but that's about it. Severance is cool, but let's face it - you'd much rather be employed.&lt;/p&gt;
&lt;p&gt;As a contractor, you're always looking for your next gig. You're prepared for the worst. You're more motivated to learn marketable skills. You're constantly thinking about how you can market yourself better. Writing (blogging, articles, books) is an excellent way to do this and I believe it's rare that FTE are as motivated to do these kinds of things.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Being a contractor forces you to better yourself so you're more marketable.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;People's biggest fear of contracting is that they'll have a hard time finding their next gig. In my career, I've rarely had an issue with this. There's always contracts available, it's just a matter of how much you're going to get paid. Yes, I've had to suck-it-up and make $55/hour instead of $125/hour, but that was back in 2003 and $55/hour is still more than I would have made as a FTE.
&lt;/p&gt;
&lt;p&gt;The other thing that makes me believe contracting is better in this economy is I believe companies are hiring more short-term contractors than employees. I don't know if this is because they consider employees liabilities and contractors expenses, but something about it seems to make the books look better. 
&lt;/p&gt;
&lt;p&gt;So you've decided to take my advice and try your hand at contracting. Should you setup your own Corporation or LLC?
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Starting a Company&lt;/strong&gt;&lt;br/&gt;
Yes, you should absolutely start your own company. As a Software Developer, chances are you're going to make enough to put you in the highest tax bracket. If you're a Sole Proprietor (no company), you will pay something like 35% of your income to taxes and you can be sued for everything you own by your clients.&lt;/p&gt;
&lt;p&gt;Should you create an LLC or Corporation? I started Raible Designs in May 1998. I started out as an LLC and later converted to an S Corp. For the first few years, I made $30-$55/hour and this seemed to work pretty well. I believe this was similar to having a Sole Proprietorship (because I was the only employee), except that I was protected from lawsuits.
&lt;/p&gt;
&lt;p&gt;In 2001, I got my first high-paying gig at $90/hour and my Accountant suggested I change to an S Corp to save 10K+ on self-employment tax. I'm certainly not an expert on the different types of business entities, but this path seemed to work well for me. It was $50 to convert from an LLC to an S Corp. I'm not sure if you can go from an S Corp to an LLC. The beauty of an S Corp is the corporation typically gets taxed at 15%, so you can run a lot of things through your business and pay less taxes. Date nights can be business meetings, vacations can be Shareholders Meetings, seasons tickets can be client entertainment and you can write off your car and fuel costs. 
&lt;/p&gt;
&lt;p&gt;There's lots of good resources on the web that describe the different business entity options. My favorite is A List Apart's &lt;a href="http://alistapart.com/articles/business4"&gt;This Web Business IV: Business Entity Options&lt;/a&gt;. Another good resource is &lt;a href="http://www.nolo.com/article.cfm/objectID/FC4734C6-FE8E-4D5C-BFE5E43131AEBA1F/111/182/245/ART/"&gt;How to form an LLC&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The hardest part of starting a new business is coming up with a good name. My advice is to make sure the domain name is available and pick something you like. I chose &lt;em&gt;Raible Designs&lt;/em&gt; because I designed web sites at the time. Raible is a pretty unique name, so that's worked well having it as part of my business name. Googlability is important - don't choose a generic name that will make you difficult to find. Potential clients should be able to google your business name and find you easily.&lt;/p&gt;

&lt;p&gt;Once you've picked a name, the business establishment part is pretty easy. In Colorado, you can &lt;a href="http://www.sos.state.co.us/biz/FileDoc.do"&gt;File a Document&lt;/a&gt; with the Secretary of State. Their site also allows you to reserve a name if you're not quite ready to make the leap.&lt;/p&gt;
&lt;p&gt;You'll also need to get a Federal Employer Identification Number (FEIN) from the IRS. The IRS has a good &lt;a href="http://www.irs.gov/businesses/small/article/0,,id=99336,00.html"&gt;Starting a Business&lt;/a&gt; article and also allows you to &lt;a href="http://www.irs.gov/businesses/small/article/0,,id=102767,00.html"&gt;Apply for an Employer Identification Number (EIN) Online&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Once you've got all the documents setup, you'll want to create a bank account for your business. I'm currently using Wells Fargo and really like how software-friendly they are. Their online banking is clean and easy to use. They also support QuickBooks for the Mac. They have Payroll Services to allow you to pay your quarterly taxes online as well as setup direct deposit, but I'm not using them.
&lt;/p&gt;
&lt;p&gt;For payroll, I use &lt;a href="http://paycycle.com"&gt;PayCycle&lt;/a&gt; and have &lt;span style="text-decoration: line-through"&gt;nothing but good things to say about them&lt;/span&gt; (see update below). I have the &lt;a href="https://www.paycycle.com/external/business/overview.jsp?name=small_business_learn_more"&gt;Small Business Package&lt;/a&gt; at $42.99 per month. This package allows me to pay myself and employees + up to 5 sub-contractors with direct deposit. It also allows me to pay both Federal and State quarterly taxes online. Of course, if you can also get an Accountant to do this for you.
&lt;/p&gt;
&lt;p&gt;Having a good Accountant and Financial Advisor (for your retirement plan) will likely be an essential part of your business.. &lt;a href="http://www.linkedin.com/svpRecommendations
"&gt;LinkedIn's Service Providers&lt;/a&gt; is a good way to find recommended professionals in your area. For example, &lt;a href="http://www.linkedin.com/svpRecommendations?scp=&amp;amp;dgre=-1&amp;amp;cat=ACC&amp;amp;sort=byDate"&gt;click here to search for Accountants&lt;/a&gt; and then click the &lt;strong&gt;change location&lt;/strong&gt; link in the top right corner to specify your zip code.
&lt;/p&gt;
&lt;p&gt;Finally, you'll need insurance. The Hartford has a good &lt;a href="http://sb.thehartford.com/determine_your_needs/"&gt;Small Business&lt;/a&gt; package that costs around $500/year. It's liability limits have worked for all of my clients and I'm covered if my laptop ever gets stolen. 
For Health Insurance, I recommend using &lt;a href="http://ehealthinsurance.com"&gt;eHealthInsurance.com&lt;/a&gt; to find a good provider for you. I don't get sick or hurt much, so I typically get a &lt;em&gt;disaster prevention&lt;/em&gt; plan with a $5K deductible. For dental insurance, brush your teeth. Vision insurance typically sucks, so I wouldn't buy it. Yes, our health care system in the US needs work and I believe if everyone had a small business, it might get more affordable a lot quicker. 
&lt;/p&gt;
&lt;p&gt;Over the next few days, I'll post some additional advice I've received on retirement plans, deducting a home office, drawing up contracts and how to come up with a good rate. If you're an Independent Software Developer and have any additional advice, I'd love to hear it.
&lt;/p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; I take back what I said about PayCycle. After having a couple of insufficient funds when re-activating my account in January (they were pulling from the wrong account), they've changed my direct deposit lead-time to 5 days for the next 6 months. This means I forget to create checks on time since their reminder gets sent 2 days before. Time to try Wells Fargo.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/testing_gwt_applications</id>
        <title type="html">Testing GWT Applications</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/testing_gwt_applications" />
        <published>2009-02-09T15:27:36-07:00</published>
        <updated>2009-02-09T15:29:35-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="idea" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="emma" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="eclipse" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="junit" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwttestcase" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="testing" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="codecoverage" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="extjs" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gxt" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">Last week, I did some research on GWT, how to test it and code coverage options for tests that extend &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/junit/client/GWTTestCase.html"&gt;GWTTestCase&lt;/a&gt;. The reason I did this is because I've found that most of the GWT tests I write have to extend GWTTestCase and I'd like to have code coverage reports. Read below for more information on my findings for testing GWT classes.
&lt;/p&gt;
&lt;p&gt;There are quite a few articles about testing GWT applications. Here are a few samples:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://blog.danielwellman.com/2008/11/test-first-gwt-article-in-november-2008-better-software-magazine.html"&gt;Test-First GWT&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://robvanmaris.jteam.nl/2008/03/09/test-driven-development-for-gwt-ui-code/"&gt;Test driven development for GWT UI code&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://robvanmaris.jteam.nl/2008/04/22/test-driven-development-for-gwt-ui-code-with-asynchronous-rpc/"&gt;Test driven development for GWT UI code with asynchronous RPC&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.springsource.com/2008/02/19/enabling-test-driven-development-in-gwt-client-code/"&gt;Enabling Test Driven Development in GWT client code&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/10f8b38455e4102a"&gt;JUnit tests for widgets&lt;/a&gt; - thread about which components to test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main gist of these articles is that you should structure your code to make the core functionality of your application testable without having to depend on GWTTestCase.&lt;/p&gt;

&lt;p&gt;All of them also advocate using an MVC or MVP (Model View Presenter) pattern. Currently, I'm using &lt;a href="http://extjs.com/products/gxt/"&gt;GXT&lt;/a&gt; and its MVC Framework. Unfortunately, GXT's MVC &lt;a href="http://extjs.net/forum/showthread.php?t=55064"&gt;doesn't have much documentation&lt;/a&gt;. The good news is there is a &lt;a href="http://christianposta.com/blog/?p=6"&gt;good article&lt;/a&gt; that explained enough that I was able to refactor my project to use it.&lt;/p&gt;

&lt;p&gt;The unfortunate side of this refactoring was I discovered that classes that extend GXT's MVC Framework &lt;a href="http://extjs.net/forum/showthread.php?t=58837"&gt;have to be tested with GWTTestCase&lt;/a&gt;. The downside to extending GWTTestCase is there is it's difficult to create code coverage reports.&lt;/p&gt;

&lt;p&gt;GWT's &lt;a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=779"&gt;issue 799&lt;/a&gt; has some patches that should make code coverage possible. I tried to implement code coverage with Eclipse and &lt;a href="http://www.eclemma.org/"&gt;EclEmma&lt;/a&gt; using &lt;a href="http://code.google.com/p/google-web-toolkit/source/browse/tools/redist/emma/README.txt"&gt;this README&lt;/a&gt;, but failed. In the process, I discovered &lt;a href="http://tinyurl.com/al8rke"&gt;an issue with Eclipse 3.4 and JUnit on OS X&lt;/a&gt;. Reverting to Eclipse 3.3 solved this problem, but I was &lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/c05d331decd2405e/94d738c3134efb30?#94d738c3134efb30"&gt;still unable to make EclEmma work with GWT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After failing with Eclipse, I tried to use the emma-maven-plugin. I was also unable to get this to work, with my findings documented in &lt;a href="http://groups.google.com/group/gwt-maven/browse_thread/thread/de736df5c99a58e6"&gt;this thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, I did have some luck with getting IDEA's built-in code coverage feature working. However, after getting it to work once, it failed to work for the rest of the day and I haven't had success since.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Code Coverage and GWT&lt;/b&gt;&lt;br&gt;
Because of these issues with GWT 1.5 and code coverage, I think I'll wait until GWT 1.6 to worry about it. The good news is &lt;a href="http://www.ongwt.com/post/2009/02/07/GWT-16-M1"&gt;1.6 M1 was released last Friday&lt;/a&gt;. If continuing to use GWTTestCase becomes an issue, I may write my own MVC Framework that doesn't use classes that call native JavaScript. Hopefully GXT MVC's framework will provide a good example.&lt;/p&gt;

&lt;p&gt;In addition to trying to get code coverage working, I used the internets to figure out how run GWT tests inside of Eclipse and IDEA. I don't remember the resources I used, but hopefully this up-to-date documentation will help others. The nice thing about using an IDE to run these tests is they typically execute much faster.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Running GWT Tests in Eclipse&lt;/strong&gt;&lt;br/&gt;
You should be able to run most of your GWT tests from within Eclipse using the following steps.
&lt;ol&gt;
&lt;li&gt;Right-click on a test that extends GWTTestCase and go to &lt;strong&gt;Run As&lt;/strong&gt; &gt; &lt;strong&gt;JUnit Test&lt;/strong&gt;. It's likely you will see the error message below.
&lt;pre style="color: red; margin-top: 5px"&gt;Invalid launch configuration: -XstartOnFirstThread not specified.

On Mac OS X, GWT requires that the Java virtual machine be invoked with the
-XstartOnFirstThread VM argument.

Example:
  java -XstartOnFirstThread -cp gwt-dev-mac.jar com.google.gwt.dev.GWTShell
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
To fix this error, go to &lt;strong&gt;Run&lt;/strong&gt; &gt; &lt;strong&gt;Open Run Dialog&lt;/strong&gt;. Click on the &lt;strong&gt;Arguments&lt;/strong&gt; tab and add the following values. The 2nd value is to increase the amount of memory available to the test and avoid an OOM error.
&lt;pre style="margin-top: 5px"&gt;-XstartOnFirstThread -Xmx512M&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;When you re-run the test, you will probably see the following error:
&lt;pre style="margin-top: 5px"&gt;com.google.gwt.junit.JUnitFatalLaunchException: The test class 'org.richresume.client.home.HomeControllerGwtTest' 
was not found in module 'org.richresume.client.Application'; no compilation unit for that type was seen
  at com.google.gwt.junit.JUnitShell.checkTestClassInCurrentModule(JUnitShell.java:193)
  at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:628)
  at com.google.gwt.junit.JUnitShell.runTest(JUnitShell.java:150)
  at com.google.gwt.junit.client.GWTTestCase.runTest(GWTTestCase.java:219)
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;To fix this, open the Run Dialog again, click on the &lt;strong&gt;Classpath&lt;/strong&gt; tab and click on &lt;strong&gt;User Entries&lt;/strong&gt;. Click on the &lt;strong&gt;Advanced&lt;/strong&gt; button and select &lt;strong&gt;Add Folders&lt;/strong&gt;. In the Folder Selection dialog, select your source and test directories (e.g. &lt;code&gt;src/main/java&lt;/code&gt; and &lt;code&gt;src/test/java&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run the test again and you should see a green bar in your JUnit tab.&lt;/li&gt;
&lt;li&gt;To create a JUnit configuration that runs all tests, duplicate the previously mentioned run configuration. Then change the name to "All Tests" and select the 2nd radio button to run all tests in the project. &lt;/li&gt;
&lt;li&gt;Click Run to execute all the tests in the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Running GWT Tests in IDEA&lt;/strong&gt;&lt;br/&gt;
You should be able to run your GWT tests from within IDEA using the following steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click on a test that extends GWTTestCase and go to &lt;strong&gt;Run "&lt;em&gt;TestName&lt;/em&gt;GwtTes..."&lt;/strong&gt;. It's likely you will see the error message below.
&lt;pre style="color: red; margin-top: 5px"&gt;Invalid launch configuration: -XstartOnFirstThread not specified.

On Mac OS X, GWT requires that the Java virtual machine be invoked with the
-XstartOnFirstThread VM argument.

Example:
  java -XstartOnFirstThread -cp gwt-dev-mac.jar com.google.gwt.dev.GWTShell
&lt;/pre&gt;	
&lt;/li&gt;
&lt;li&gt;If you get a compiler error instead, you may need to add the GWT Facet to your project. To do this, right-click on your project's top-most folder in the left pane. Select &lt;strong&gt;Module Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Facets&lt;/strong&gt; and enable GWT for your module. &lt;/li&gt;
&lt;li&gt;To fix the &lt;code&gt;-XstartOnFirstThread&lt;/code&gt; issue, go to &lt;strong&gt;Run&lt;/strong&gt; &amp;gt; &lt;strong&gt;Edit Configurations&lt;/strong&gt;. Add the following values to the VM Arguments field. The 2nd value is to increase the amount of memory available to the test and avoid an OOM error. 
&lt;pre style="margin-top: 5px; margin-bottom: 5px"&gt;-XstartOnFirstThread -Xmx512M&lt;/pre&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; If you still get a compiler error, see &lt;a href="http://www.jetbrains.net/devnet/docs/DOC-1114"&gt;this page&lt;/a&gt; for a possible solution.&lt;/li&gt;
&lt;li&gt;Run the test again and you should see a green bar in your Run tab.&lt;/li&gt;
&lt;li&gt;To create a JUnit configuration that runs all tests, duplicate the previously mentioned run configuration. Then change the name to "All Tests" and change the Test configuration to search for tests in the whole project.&lt;/li&gt;
&lt;li&gt;Run the new configuration to execute all the tests in the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Testing GWT applications isn't as straightforward as writing JUnit tests, but I do believe it's getting better. If you have any additional tips and tricks, please let me know.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/what_s_the_best_java</id>
        <title type="html">What's the best Java Hosting Solution?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/what_s_the_best_java" />
        <published>2009-02-07T10:21:28-07:00</published>
        <updated>2009-03-04T08:42:50-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="kgbinternet" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="kattare" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="contegix" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="hosting" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">A friend recently asked me who I'd recommend for a Java hosting provider. Since I get asked this question every-so-often, it seemed appropriate to post my answer here. 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.kgbinternet.com"&gt;KGB Internet&lt;/a&gt; - I use KGB for this site. I have my own JVM and have full control over what I want to install. I can control Tomcat versions and upgrade as needed. I don't know if I'd recommend him for a business site as he can take up to 12 hours to respond to requests.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kattare.com"&gt;Kattare&lt;/a&gt; - These guys will give you your own Tomcat instance and seem to have reasonable prices. They do seem to take quite some time to respond to requests (24-48 hours). I have a free instance that I use for a non-profit, so that could be the reason.
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.contegix.com"&gt;Contegix&lt;/a&gt; - These guys are far-and-away the best company for Java-based hosting. They're not cheap though. However, they have the best customer service in the business - often responding to e-mails in less than a minute.
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do you agree with these recommendations? If not, who do you recommend for Java hosting and why?</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/ajax_the_state_of_the</id>
        <title type="html">Ajax: The State of the Art with Dion and Ben</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/ajax_the_state_of_the" />
        <published>2009-02-05T11:03:10-07:00</published>
        <updated>2009-02-05T11:03:11-07:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="ben" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="bespin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="thunderhead" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="frameworks" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="html5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajaxian" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="opera" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="firefox" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="canvas" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajax" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This morning, I added Dion and Ben's talk titled &lt;a href="http://north.webdirections.org/program#ajax-the-state-of-the-art"&gt;Ajax: The State of the Art&lt;/a&gt;. Below are my notes from the event.
&lt;/p&gt;
&lt;p&gt;
Ajax started out as a bunch of hacks. It showed that we could take our web interfaces and do a lot more with them. A hack isn't necessarily a bad thing. Often, they turn into something much more elegant over time. The new browsers have many amazing capabilities that we haven't taken advantage of yet. We've seen discussions on Ajax go from how to do XHR to frameworks and how rich and mature they are. Dojo is great for Enterprise Development (packing system, namespaces). jQuery is well-suited for lightweight developers (PHP). Prototype is fantastic for people who do a lot of JavaScript development and take it very seriously. 
&lt;/p&gt;
&lt;p&gt;
Today's Ajax landscape is mature, really rich, and really exciting. Today, Dion and Ben are going to talk about technologies they're really excited about for the future. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Canvas&lt;/strong&gt;&lt;br/&gt;
The building blocks of the web are text, boxes and images. With canvas, it really makes a lot more things possible. You can do bitmap rendering and image manipulation. They're showing a slide with Doom and Mario Kart running. Canvas 3D does true 3D rendering. Firefox and Opera have done prototypes of this. Can you do canvas-type things today in a browser? Yes, if you use Flash or Curl. Dion and Ben are excited about canvas over plugins for the following reasons:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No start-up delay&lt;/li&gt;
&lt;li&gt;Available on mobile devices today&lt;/li&gt;
&lt;li&gt;Rendering fidelity with browser (especially important for typography)&lt;/li&gt;
&lt;li&gt;No bridges necessary (no marshalling/unmarshalling)&lt;/li&gt;
&lt;li&gt;Not a plug-in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &amp;lt;canvas&amp;gt; tag originally came from Apple's Dashboard. Dashboard's programming model was in HTML and JavaScript. Dashboard is using WebKit under the covers. Today, canvas support exists in every major browser except for IE. The good news is there are Flash and Silverlight bridges to add support to IE. There's also an ActiveX component that wraps the Firefox implementation and allows it to run in IE.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SVG&lt;/strong&gt;&lt;br/&gt;
Dion and Ben aren't that excited about SVG because it's such a huge spec. We've been struggling with the HTML standard for the last 10 years and the thought of another huge spec for the next 10 years isn't that appealing.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast JavaScript&lt;/strong&gt;&lt;br/&gt;
Almost all major browsers have a Fast JavaScript implementation. Chrome has V8, Safari has SquirrelFish Extreme, Firefox has TraceMonkey and Opera has Carakan. This is exciting because of industry trends and how companies are trying to reduce computation cycles in data centers. The more computing that can be put on the client, the better. IE doesn't have anything, but Dion and Ben believe they are working on something.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web Workers&lt;/strong&gt;&lt;br/&gt;
Interface latency is awful for applications. Jakob Nielsen once said:
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
0.1 second is about the limit for having the user feel that the system is reacting instantaneously. 1.0 second is about the limit for the user's flow of thought to stay uninterrupted, even though the user will notice the delay.&lt;/p&gt;
&lt;p&gt;
Anything that takes longer than a tenth of a second should be pushed to a background thread. Unfortunately, there are no threads in the web. Maybe we can add threads to JavaScript? Brendan Eich has said that "Threads suck" and there's very little chance for threads getting into JavaScript. Gears brought Worker Pools and this is going into HTML 5 as Web Workers. You could also use Java applets to do this. With the latest Java Plugin, many of applets' long-standing issues have been solved.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Desktop Integration&lt;/strong&gt;&lt;br/&gt;
The ability to build desktop apps as web apps is very exciting. There's a few technologies that demonstrate this: Fluid, Mozilla Prism, Adobe AIR, Appcelerator Titanium and Gears. The Palm Pre demonstrates the logical extension of this. The Palm Pre uses the web stack as its developer SDK. It's very cool that web developers don't have to learn anything new to become a Palm developer. Desktop integration is exciting especially if we can access desktop applications like email and address book. 
&lt;/p&gt;
&lt;p&gt;
The Ajax frameworks that are out there have done a lot to make web development simpler. However, there's still a lot of pain with CSS and cross-browser issues. What if you took canvas and combined it with a sophisticated grid-based layout in JavaScript? 
&lt;/p&gt;
&lt;p&gt;
There's a lot of platforms out there: Microsoft Silverlight, Adobe Flash, Apple Cocoa and Sun's JavaFX. The web often isn't considered a platform. Dion and Ben believe there should be an &lt;em&gt;Open Web Platform&lt;/em&gt;. The problem right now is there is no central location to find out how to get stuff done. You have to search and find resources from many different locations. Mozilla is putting it's resources into creating an Open Web Platform. This site will consist of 4 different areas:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home&lt;/li&gt;
&lt;li&gt;Documentation (for different frameworks, browsers, quirks)&lt;/li&gt;
&lt;li&gt;Dashboard (state of the open web)&lt;/li&gt;
&lt;li&gt;Roadmap (what's going on)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This is not just Mozilla, it's very much a community effort. This is something that Ben and Dion have been working on. But there's something else they've been working on too. They've been talking about all these cool things, but what about an interesting application to test all these technologies?
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Bespin&lt;/strong&gt;&lt;br/&gt;
As they looked at code editors, most of them provide awful user experiences. Bespin is the Editor of Your Dreams and contains the following features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accessible from anywhere - any device in any location&lt;/li&gt;
&lt;li&gt;Simple to use, like Textmate (not heavyweight like Eclipse) - an editor, not an IDE&lt;/li&gt;
&lt;li&gt;Wicked Fast - performance, performance, performance&lt;/li&gt;
&lt;li&gt;Rock-solid real-time collaboration, like SubEthaEdit - it just works&lt;/li&gt;
&lt;li&gt;Integrated command-line, like vi - Fun like Quicksilver, social like Ubiquity&lt;/li&gt;
&lt;li&gt;"Self-hosted" environment, like Emacs - For extreme extensibility, but with JavaScript!&lt;/li&gt;
&lt;/ul&gt;
Dion and Ben are showed a screen shot of Bespin and now they're doing a demo. The core editor has what you'd expect with syntax highlighting and line numbers. Canvas doesn't have text-selection by default, so they had to write it from scratch. The command line allows you to get help, run core command and also to subscribe to commands that others write. You can change your keybindings to emacs or vi as well as many other settings. Much of Bespin is event-driven, so you can easily plugin new behavior for different events. 
&lt;/p&gt;
&lt;p&gt;
For viewing files, they couldn't bring themselves to use a tree. Instead, they developed a file-browsing interface that looks very much like Apple's Finder. Personally, I like Finder, but wish it had Windows Explorer's path bar that allows you to simply type in the path without mouse clicks. Back to the command line. They've done a lot to make things more discoverable so users can easily find the power of the editor.
&lt;/p&gt;
&lt;p&gt;
Bespin could be used to engage developers more with open source projects. Checking out projects, modifying code and creating patches can be a real pain. Bespin could be used to interface with open source projects in the cloud. You could login, modify code and easily patch/build with the click of a button. One other thing they want to do is to have the server do code-analysis as you're developing.
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Is it OK to love a software tool? You &lt;em&gt;must&lt;/em&gt; love your software tools. What we do as Software Developers is one of the most difficult jobs on the planet. Programmers, like poets, start with a blank slate and create something from nothing. If you don't love your tools, you'll start resenting what you do. If you don't love your tools, it shows in your work. &lt;em&gt;-- Dave Thomas at RubyConf08&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Thunderhead&lt;/strong&gt;&lt;br/&gt;
A GUI Toolkit written with canvas and JavaScript. Allows you to do layouts with very little thought. It's a lab experiment that's in progress, stay tuned for more information.
&lt;p&gt;
All users care about is the user interface. Dion and Ben believe there's a key to creating compelling user experiences. It all has to do with &lt;em&gt;managing expectations&lt;/em&gt;. 
It's not that different from how you manage relationships in your life. Expectations for movies and games have changes drastically over the years. What used to be the web (animated gifs and awful web pages) has also changed drastically (video of Apple's online store). What was cool with MapQuest got changed drastically with Google Maps. What we have today isn't the end of the game - expectations will continue to change. However, users have different expectations for software. 
&lt;/p&gt;
&lt;p&gt;
Alan Cooper has done some interesting work in this area. The software designer needs to focus in on a user's goals. There are basic things you can apply to all users, for instance "sex sells". An example of this is Delicious Library. This application allows you to keep track of things in your home such as books, movies, music and games. They made $500K in 3 months and made $54K the first day, with no advertising. 
&lt;/p&gt;
&lt;p&gt;
The quality of any software is determined by the interaction. If the interaction isn't good, it will poison the entire experience. Donald Norman has a good quote: "Attractive things work better". In society, this is often called "Dress for Success". 
&lt;/p&gt;
&lt;p&gt;
The Open Web is hear to stay because it has:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Easy Programming Model&lt;/li&gt;
&lt;li&gt;Easy Remoting&lt;/li&gt;
&lt;li&gt;Extensive Customization Vectors (e.g. GreaseMonkey)&lt;/li&gt;
&lt;li&gt;Easy Deployment&lt;/li&gt;
&lt;li&gt;Great Widgets&lt;/li&gt;
&lt;li&gt;Great Visual Effects&lt;/li&gt;
&lt;li&gt;Great Mobile Story&lt;/li&gt;
&lt;li&gt;Desktop Integration&lt;/li&gt;
&lt;li&gt;State-of-the-Art Plug-ins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Bespin is a tech preview that they hope to release next week. Thunderhead will be released at the same time.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
This was a great talk and easily the most inspiring of the conference. Dion and Ben always do a great job and the sexiness of their presentation made it all the more appealing. </content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/the_state_of_the_web</id>
        <title type="html">The State of the Web 2009</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/the_state_of_the_web" />
        <published>2009-02-04T18:05:38-07:00</published>
        <updated>2009-02-04T18:11:52-07:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="scottgegette" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="opera" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="adobe" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="larserikbolstad" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="wdn09" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="w3c" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="danconnolly" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="web" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="chriswilson" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="microsoft" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="johnallsopp" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="webdirectionsnorth" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This afternoon, I attended &lt;a href="http://north.webdirections.org/program#the-state-of-the-web-2009"&gt;The State of the Web 2009&lt;/a&gt; at &lt;a href="http://north.webdirections.org"&gt;Web Directions North&lt;/a&gt;. Below are my notes from this session.
&lt;/p&gt;
&lt;p&gt;
This panel has quite the list of superstars:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://north.webdirections.org/speakers/#chris-wilson"&gt;Chris Wilson&lt;/a&gt; (Microsoft)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://north.webdirections.org/speakers/#dan-connolly"&gt;Dan Connolly&lt;/a&gt; (W3C HTML Working Group)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://north.webdirections.org/speakers#michael-tm-smith"&gt;Mike (TM) Smith&lt;/a&gt; (W3C HTML Working Group)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://north.webdirections.org/speakers/#lars-erik-bolstad"&gt;Lars Erik Bolstad&lt;/a&gt; (Opera)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://north.webdirections.org/speakers/#scott-fegette"&gt;Scott Fegette&lt;/a&gt; (Adobe)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://north.webdirections.org/speakers/#john-allsopp"&gt;John Allsopp&lt;/a&gt; (Organizer and &lt;a href="http://westciv.com/style_master/index.html"&gt;Style Master&lt;/a&gt; Developer)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
John is moderating this session and is starting by asking each panelist to speak about what they believe the state of the web is. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chris Wilson&lt;/strong&gt;&lt;br/&gt;
The future of the web may be as ubiquitous as electricity. Chris has a desktop, two laptops (one 10" NetBook, one is a 13" MacBook) and an iPhone. There's a lot of difference between these devices, especially when it comes to screen size. Chris uses a number of different browsers throughout the day. The web isn't just one browser, it isn't just one platform. He's showing a slide with a browser market share graph from &lt;a href="http://www.netapplications.com"&gt;http://www.netapplications.com&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Many different browsers are a reality. Many different devices are a reality. Web builders need to learn to write scalable applications that run across multiple browsers, devices and environments. They need to use progressive functionality and learn the tools they have in CSS and HTML. Semantic structuring helps. 
&lt;/p&gt;
&lt;p&gt;
Developers need to learn to live with multiple browsers. Cross-browser interoperability will get better, but it's likely to be an issue forever. Test suites with new specifications are helping. Developers should build for browsers of today &lt;em&gt;and&lt;/em&gt; tomorrow. 
&lt;/p&gt;
&lt;p&gt;You should build the applications you want to build and then figure out how how to make them degrade gracefully on the web.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lars Erik Bolstad&lt;/strong&gt;&lt;br/&gt;
Opera Software has 600 employees in 10 countries. They've been developing Opera and other browsers since 1995. The bulk of what Opera does is based on commercial browser deliveries to OEMs around the world. 
&lt;/p&gt;
&lt;p&gt;Devices, platforms and networks: they come in all shapes and sizes. Only one thing unifies them: &lt;strong&gt;The Web&lt;/strong&gt;. The browser is becoming more and more important on these devices. Users are not satisfied with WAP-based content anymore, they want the same content no matter which device they're using.&lt;/p&gt;
&lt;p&gt;Opera Mini does its processing on the server-side. This allows Opera to gather statistics. These stats show that users around the world hit the same top sites on their mobile devices as they do on their desktops. It's a one-to-one match. Opera is seeing tremendous growth in the usage of Opera Mini, both in developed countries and emerging markets. 
&lt;/p&gt;
&lt;p&gt;The point: don't just develop for desktop browsers. The mobile market seems to be growing much faster. The problem is actually more in the hands of browser developers since they have to satisfy the user's desire to see the same content on mobile vs. desktop. 
&lt;/p&gt;
&lt;p&gt;Opera is focusing on advancing core browser technology in three areas:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web standards&lt;/strong&gt;: CSS (webfonts, backgrounds/borders, transitions, transforms), HTML 5 (video/audio, persistent storage, drag and drop) and W3C Geolocation API and "Mobile DOM" API (access to camera, address book, calendars).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: VEGA (vector graphics-based rendering, hardware acceleration) and CARAKAN (new JavaScript engine, native compilation). For more details, see &lt;a href="http://my.opera.com/core"&gt;http://my.opera.com/core&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web applications&lt;/strong&gt;: Standalone web apps, RIAs, Widgets. Gears support and &lt;a href="http://www.opera.com/dragonfly"&gt;Developer Tools&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Dan Connolly&lt;/strong&gt;&lt;br/&gt;
The web is kinda important these days. It's a big deal. Make a mistake and 300 million dollars go away (see end of last entry about United news). One of the beauties of the web is you can easily participate as an individual. You can report bugs, write articles and be a part of many web standards groups. Most of the other systems in the world don't provide this kind of access.
&lt;/p&gt;
&lt;p&gt;Dan has been under a rock for the last 5 years working on Semantic Web stuff. Now that he's back in the game, it's incredible how much stuff is going on. He's glad there's JavaScript frameworks so he doesn't have to learn everything. The default security policies in browsers are a little rickety at this point. They allow you to download and run JavaScript from virtually any site. &lt;a href="http://code.google.com/p/google-caja/"&gt;Caja&lt;/a&gt; might help to solve this. Dan believes that security will become more important and stricter to protect web users.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scott Fegette&lt;/strong&gt;&lt;br/&gt;
Scott is a Product Manager in the Web Group of Adobe. At the beginning of each year, they do heavy user research. Adobe wants people that develop content for the web to be as expressive as possible. Scott is going to give us a peak into the conversations he's had with the web community.
&lt;/p&gt;
&lt;p&gt;One of the biggest topics on people's minds is The Economy, but it's not negative as you might think. Small web designers are actually getting more business in the downturn, likely because companies are polishing their presence on the web. People are working much more distributed these days. There's a few areas that Adobe generally asks about: CSS, JavaScript, HTML (both statically and dynamically).
&lt;/p&gt;
&lt;p&gt;Frameworks are becoming more important to developers, as well as with clients. They've even seen some clients demand certain frameworks. Two years ago, when Adobe talked to small design shops and agencies, most web sites were built statically. Now they're developing with frameworks like WordPress. Out of 60 folks they talked to, only 2 were using static systems and not CMSes.
&lt;/p&gt;
&lt;p&gt;In the JavaScript frameworks arena, jQuery is the dominant leader. Shops are starting to use CSS frameworks as well. The only one Scott mentioned was Reset. Design is becoming a technical discipline and Adobe is calling this &lt;em&gt;Stateful Design&lt;/em&gt;. WYSIWIG is definitely dying and designers aren't developing with visual tools.
&lt;/p&gt;
&lt;p&gt;The kind of projects that people are working on has changed a lot. Many shops are being asked to do work on mobile development. The iPhone has done wonders for the industry in raising the awareness of what a mobile device can do.&lt;/p&gt;
&lt;p&gt;The other big investments for Adobe is RIAs and AIR. Ajax has matured enough that it can now compete with proprietary plugins like Flash. The reason for AIR is to allow web developers to use their skills to develop desktop applications. Flash and Flex are often overkill for browser-based applications, but they do often handle video and audio better than Ajax applications.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mike (TM) Smith&lt;/strong&gt;&lt;br/&gt;
Mike is also known as the "W3C HTML jackass". Mike thinks the state of the web is that it's a mess in a lot of ways. If you don't believe him, ask Doug Crockford. Most of this stuff is going to remain a mess for the next 20 years, unless another genius like Tim Berners-Lee comes along and invents something new. However, the good part about it being a mess is that we all have jobs.
&lt;/p&gt;
&lt;p&gt;
One of the biggest things they're trying to do with HTML 5 is not breaking backward compatibility. Other working groups at the W3C don't share this philosophy, hence the reason they don't have browser vendors participating. Many of the ideas for HTML 5 game from Gears and Ajax Framework developers like &lt;a href="http://ejohn.org"&gt;John Resig&lt;/a&gt;. All this will make things less messy, especially with the help of browser vendors.
&lt;/p&gt;
&lt;p&gt;Developers like the ubiquitous web and are pushing the mobile web. Mike thinks everyone just needs to get a life (big applause). For mobile, SVG has already been a big success. You will see significant great things with SVN happen in major browsers by next fall. If you're a web developer, you should spend some time experiment with SVG. It will payoff for you. If it doesn't pay off for you and you see Mike next year at Web Directions North, you can punch him in the face.
&lt;/p&gt;
&lt;p&gt;Location-aware applications will be big as well. Browser vendors are implementing the Geo Location API. It's implemented in Opera, Firefox, WebKit and Gears. Video on the web will be significant as well. The SVG working group pioneered video support into standards, before HTML 5. Many of the problems they face are related to video codecs. The only way to solve the problems with video on the web is with money and lawyers. Very specifically, there's no royalty-free codec for video. This is nothing that standards bodies can solve. The most promising is that Sun Microsystems is developing an open codec and spending money to make sure they're not infringing on patents. &lt;/p&gt;
&lt;p&gt;Not only is the HTML Working Group improving markup in HTML, they're also working on coming up with new APIs that give you access to features. If you have ideas that aren't included in HTML 5, the group is definitely interested in hearing about them. 
&lt;/p&gt;
&lt;p&gt;
After each panelist talked, John asked them questions about what's the biggest thing they'd like to see implemented by everyone (open video codec, geo location api were the winners). Mike also did some complaining about XML and how broken it is because there's no failure mechanism. There was some audience banter with Chris about SVG in IE. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
This was a very interesting session, especially to hear from the people who are building/supporting the future of the web. I liked Scott's talk on what Adobe's hearing from their users. I also liked hearing Mike (TM)'s opinionated thoughts on XML and his non-marketing approach to most everything related to the web. Lars from Opera had a marketing-ish presentation, but it was nevertheless interesting to hear what Opera's working on. Good stuff.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/changes_in_the_languages_of</id>
        <title type="html">Changes in the Languages of the Web with Dan Connolly</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/changes_in_the_languages_of" />
        <published>2009-02-04T11:34:54-07:00</published>
        <updated>2009-02-04T11:34:54-07:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="opensource" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="html" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xhtml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="webdirectionsnorth" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="css" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="languages" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="web" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="wdn09" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="danconnolly" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://north.webdirections.org" title="Web Directions North"&gt;&lt;img src="http://farm4.static.flickr.com/3437/3253069385_f3afc41182_o.png" width="248" height="68" alt="Web Directions North Logo" class="picture" style="border: 0" /&gt;&lt;/a&gt;
Web Directions is held in Australia and Japan and now the US. A few months ago, they were a bit hesitant about doing it in Denver in the middle of winter. However, they've discovered our best-kept secret: it's beautiful and sunny all week. People are attending this conference from all around the world. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.w3.org/People/Connolly/"&gt;Dan Connolly&lt;/a&gt; is the keynote speaker. He's played some very important roles, such as Chairmain of the HTML Working Group during HTML 4. He's also a research scientist at the Computer Science and Artificial Intelligence Laboratory at MIT and a member of the technical staff at the W3C. &lt;/p&gt;
&lt;p&gt;Dan's talk is titled &lt;strong&gt;Changes in the Languages of the Web&lt;/strong&gt; and you can view it online at &lt;a href="http://www.w3.org/2009/Talks/02wdn/slides"&gt;http://www.w3.org/2009/Talks/02wdn/slides&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Web Languages are like languages of the world. Like programming languages, web languages are artificial. Web-native languages are PHP and JavaScript. A Web Language is influenced by natural languages but are artificial. Learning languages is like reading music. With music, most learn from good ol' fashion sheet music. Nowadays, many are learning to read music from Rock Band (the game).&lt;/p&gt;
&lt;p&gt;Is there a web language for music? It's not mp3/ogg and it's not Apple's GarageBand. ABC music notation is close and fake-book style cords mostly works. The problem is often these sites and specifications disappear because copyright holders come and scare them away.
&lt;/p&gt;
&lt;p&gt;Technology deployment rides on the practice of sharing media and culture. Open standards preserve freedom to tinker and supports cultural heritage. &lt;a href="http://www.lessig.org/blog/"&gt;Lawrence Lessig&lt;/a&gt; at OSCON 2002:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creativity and innovation always builds on the past.&lt;/li&gt;
&lt;li&gt;The past always tries to control the creativity that builds upon it.&lt;/li&gt;
&lt;li&gt;Free societies enable the future by limiting this power of the past.&lt;/li&gt;
&lt;li&gt;Our is less and less a free society.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Lastly, Lawrence asked &lt;strong&gt;what have you done about it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
In 1991, some places would fire you for looking at code from the Net. At the time, Dan worked at Convex, who encouraged participation in Free Software. Convex did business with HP; HP used SGML; HTML was SGML (almost). When Dan read about the World Wide Web from &lt;a href="http://www.w3.org/People/Berners-Lee/"&gt;Tim Berners-Lee&lt;/a&gt;, he had an excuse to look at HTML as part of his day job.
&lt;/p&gt;
&lt;p&gt;
Computer Science students and hackers learn &lt;a href="http://www.cui.unige.ch/db-research/Enseignement/analyseinfo/AboutBNF.html"&gt;BNF&lt;/a&gt; and parse trees. SGML is a little funny looking, but works mostly like BNF. Feedback loop: 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Draft a DTD&lt;/li&gt;
&lt;li&gt;Run some tests, &lt;em&gt;ask the computer&lt;/em&gt; if it matches the test cases&lt;/li&gt;
&lt;li&gt;Discover an issue; repeat&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
While Dan was at Hal in Austin in 1994, and adding HTML support in products, he:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Asked other HTML Working Group members to try James Clark's &lt;code&gt;sgmls&lt;/code&gt; parser&lt;/li&gt;
&lt;li&gt;Not many of them were in the habit of building software from source&lt;/li&gt;
&lt;li&gt;Mark Gaither and Dan installed &lt;code&gt;sgmls&lt;/code&gt; as a CGI service&lt;/li&gt;
&lt;li&gt;Feedback loops works over the Web!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Dan was first the editor and then the chair of the standardization of HTML 4. HTML's standardization timeline: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;November 1995: HTML 2.0&lt;/li&gt;
&lt;li&gt;January 1997: HTML 3.2&lt;/li&gt;
&lt;li&gt;December 1997: HTML 4.0&lt;/li&gt;
&lt;li&gt;December 199: HTML 4.0.1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Browser marketplace explodes and then stagnates. Early 1990's - lots of little projects. In 1995, Netscape Navigator IPO rewrites the business books. In the late 90's IE takes over Netscape. After HTML, Dan started working on other stuff: Feb 98 (XML 1.0), Jan 99 (Namespaces in XML), Jan 00 (XHTML 1.0), Feb 04 (RDF and OWL), Apr 06 (SPARQL) and Sep 2007 (GRDDL). 
&lt;/p&gt;
&lt;p&gt;
W3C fostered many of the technologies of Ajax and Web 2.0:
&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;HTML, CSS, DOM, XML from W3C circa 2000&lt;/li&gt;
&lt;li&gt;JavaScript from Netscape, ECMA in 1995&lt;/li&gt;
&lt;li&gt;XMLHttpRequest from Microsoft in 1999&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
W3C's efforts since then lacked clear deployment paths. 
&lt;/p&gt;
&lt;p class="quote" style="color: #999"&gt;
XHTML is not the solution to a problem that concerns anybody except the guys who have to write parsers that convert markup into DOM trees. It turns out that XHTML put the validation on the wrong end of the network. It turned out that the market didn't put much value in a document delivery system that could decide to not display the document because there was an unrecognized attribute on an invisible meta tag.&lt;br/&gt;
&lt;span style="float: right"&gt;&lt;em&gt;-- &lt;a href="http://blog.360.yahoo.com/blog-TBPekxc1dLNy5DOloPfzVvFIVOWMB0li?p=736"&gt;Doug Crockford Jan 2008&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;
The web isn't just for computer geeks anymore. From The Future of Information by &lt;a href="http://en.wikipedia.org/wiki/Ted_Nelson"&gt;Ted Nelson&lt;/a&gt; in 1997:&lt;/p&gt;

&lt;p class="quote" style="color: #666"&gt;
The software world currently corresponds to the Pre-Director stage in movie-making (1893-1904). During those years, when short films were already being shown in theaters, the job of making the movie was given to the cameraman - because he knew how to work the equipment.
&lt;br/&gt;&lt;br/&gt;
That is how it is with software today. Today's software designers are those who only understand the technicalities, and not - with rare exceptions - those who understand how to integrate the &lt;strong&gt;presentation of ideas to the mind and heart&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
The Web facilitates a shift from mass media to participatory culture. Worth watching: &lt;a href="http://www.youtube.com/watch?v=TPAO-lZ4_hU"&gt;An Anthropological Introduction to YouTube&lt;/a&gt; by Michael Wesch and the Digital Ethnography Working Group.
&lt;/p&gt;
&lt;p&gt;
The W3C HTML Working Group charted in March 2007 and ended up with hundreds of participants (most prior working groups had 20-30 people). In November 2007, there was an HTML WG meeting at W3C Technical Plenary and was very much an unconference. The HTML 5 Working draft was published in January 2008. Goals for HTML 5:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Off-the-shelf parsers and tools for reading web pages like browsers do, including &lt;em&gt;tag soup&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Modern test materials&lt;/li&gt;
&lt;li&gt;Standardize successful experiments in the Web Applications platform to balance the attraction of proprietary approaches:
&lt;ul&gt;
 &lt;li&gt;&amp;lt;video&gt;, &amp;lt;audio&gt;&lt;/li&gt;
 &lt;li&gt;scripting details, security policies&lt;/li&gt;
 &lt;li&gt;offline storage&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
HTML 5 co-chairs: Chris Wilson (Microsoft) and Sam Ruby (IBM) with W3C staff support from Mike Smith and Dan Connolly.
&lt;/p&gt;
&lt;p&gt;
Some ideas from the &lt;a href="http://esw.w3.org/topic/CssValidator#head-5af29f77778fcf8e536ae2aa959b11753c380dae"&gt;CSS validator roadmap&lt;/a&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript CSS parser&lt;/li&gt;
&lt;li&gt;Support for CSS 2.1 forward-compatible grammar&lt;/li&gt;
&lt;li&gt;Integrate test-result data showing browser support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The browser marketplace is moving again. 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
2003: Internet Explorer, Firefox, Safari, Opera. 
&lt;/li&gt;
&lt;li&gt;April 2006: &lt;a href="http://www.ipsos-na.com/news/pressrelease.cfm?id=3049"&gt;Mobile Phones Poised To Overtake The PC As The Dominate Internet Platform In Some Markets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;August 2007: iPhone&lt;/li&gt;
&lt;li&gt;Sep 2008: Google Chrome&lt;/li&gt;
&lt;li&gt;Jan 2009: Internet Explorer 8 Release Candidate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
How about authors? How do they feel about HTML 5? Two days ago, Dan &lt;a href="http://www.w3.org/News/2009#item11"&gt;received support from Adobe&lt;/a&gt; to work on HTML 5 materials for authors. 
&lt;/p&gt;
&lt;p&gt;
Design Principles Last Through Change. From &lt;a href="http://twitter.com/zeldman/status/1137456194"&gt;Zeldman on Twitter&lt;/a&gt;: Client who saves $5K buying cut-rate non-semantic HTML will later spend $25K on SEO consultant to compensate. &lt;/p&gt;
&lt;p&gt;
There's still something to the nothing behind XHTML+CSS Web Design. Kudos to whoever designed the &lt;a href="https://www.accesskansas.org/ssrv-webfile/index.html"&gt;Kansas Tax web site&lt;/a&gt; (Dan is from Kansas City).
&lt;/p&gt;
&lt;p&gt;
Sharing data in documents is one of the original goals of the WWW. Dan has been investing some of his own time into microformats. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://tantek.com/log/2006/06.html#d17t2231"&gt;Tantek Çelik in June 2006&lt;/a&gt;: "XML formats in the long run are not better than propriety binary formats."
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XML, both in technology (namespaces...) and as a "technical culture" is too biased towards Tower of Babel outcomes.&lt;/li&gt;
&lt;li&gt;A few XML formats may survive and converge (RSS, maybe Atom).&lt;/li&gt;
&lt;li&gt;But for now, XHTML is the only longterm reliable XML format that has more to do with it being based on HTML than it being XML.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And if longevity is not a goal, try JSON - it's yummy.
&lt;/p&gt;
&lt;p&gt;
Microformats are not just technical ideas, but it's something that you can actually use in your life. XSPF - what if media players had used an XHTML dialect a la hMedia. RSS and hAtom - will feed readers grow native support for hAtom? Will calendar subscription clients grow native support for hCalendar?  The process and the technology of microformats provide an 80% solution for global scale problems. 
&lt;/p&gt;
&lt;p&gt;
The Personal Information Disaster: The bane of my existence is doing things I know the computer could do for me. -- &lt;a href="http://www.nature.com/nature/webmatters/xml/xml.html"&gt;The XML Revolution&lt;/a&gt;, Nature Web Matters Oct 1998. 
&lt;/p&gt;
&lt;p&gt;
Let's find ways to make it cost-effective record and share knowledge &lt;em&gt;formally&lt;/em&gt;, i.e. so that computers can manipulate it. How great would it be if your kid's soccer coach could distribute a schedule that would feed into everyone's calendaring system?
&lt;/p&gt;
&lt;p&gt;
Flickr, Facebook and Twitter demonstrate the attraction of hosted services. Identi.ca supports federation (OpenMicroBlogging). Instant Messaging is much like e-mail used to be, where you couldn't e-mail folks that used a different provider.
&lt;/p&gt;
&lt;p&gt;
Be careful not to delegate &lt;i&gt;too much&lt;/i&gt; to machines!
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A United Airlines near-bankruptcy item from 2002 appeared as 2008 news via Google News&lt;/li&gt;
&lt;li&gt;Syndication continued up to a Bloomberg news flash.&lt;/li&gt;
&lt;li&gt;UAL stock cratered from $12 to $3 ($1.14 billion in market cap).&lt;/li&gt;
&lt;li&gt;The stock recovered within the day to $10 (down $300M in market cap)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something to keep an eye on - &lt;em&gt;SEC Interactive DATA and XBRL&lt;/em&gt;. Three dozen companies, representing more than $1 trillion of market value, have joined the SEC's test group. Have been working on this since 2005.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
The balance between proprietary risk/reward and open standards is delicate. Media independence is more important than ever as mobile emerges. When content doesn't match specs, changing browsers is cheap compared to changing all the content, authors. Web technology is deeply intertwingled with social, economic context.
&lt;/p&gt;
&lt;p&gt;I enjoyed Dan's talk. He's obviously a smart guy and has been involved with the web since before it even existed. More than anything, I like the conference location. It's 1/2 block from my office and has &lt;a href="http://twitpic.com/1bs8c"&gt;excellent views&lt;/a&gt;. I hope to return for &lt;a href="http://north.webdirections.org/program#the-state-of-the-web-2009"&gt;The State of the Web 2009&lt;/a&gt; later this afternoon.
</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/epic_weekend_at_silverton_mountain</id>
        <title type="html">Epic Weekend at Silverton Mountain</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/epic_weekend_at_silverton_mountain" />
        <published>2009-02-03T08:56:24-07:00</published>
        <updated>2009-02-03T09:15:08-07:00</updated> 
        <category term="/General" label="General" />
        <category term="travel" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="pagosasprings" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="skiing" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="colorado" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="silverton" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="vacation" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="friends" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="wolfcreek" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://farm4.static.flickr.com/3060/3250795610_45d85200bd.jpg" title="Hiking to White Wave" rel="lightbox[silverton2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3060/3250795610_45d85200bd_m.jpg" width="240" height="180" alt="Hiking to White Wave" class="picture"/&gt;&lt;/a&gt;
This past weekend, I joined some of my best friends for a weekend of skiing at &lt;a href="http://www.silvertonmountain.com/page/home"&gt;Silverton Mountain&lt;/a&gt; and &lt;a href="http://www.wolfcreekski.com/"&gt;Wolf Creek&lt;/a&gt; in south central Colorado. Most of the guys went last year and I knew I had to go this year after hearing about their thigh-deep powder experience.&lt;/p&gt;
&lt;p&gt;The trip started out kinda rocky when we left on Friday afternoon. There were 3 different cars that drove and we were the last ones to leave Denver. We took my car, but I had a friend drive since I'd had a &lt;a href="http://twitter.com/mraible/status/1161372798"&gt;late night&lt;/a&gt; on Thursday night. About 2 hours into the trip, one of our friends called us to warn us about the speeding tickets the other cars had gotten. In fact, one of the guys had gotten two! I handed the phone to the driver so he could find out where, but he had to cut the conversation short as the police car's lights started flashing in the rear-view mirror. If only they'd called us 5 minutes earlier!&lt;/p&gt;
&lt;p&gt;
After the speeding ticket delay, we pulled into &lt;a href="http://www.pagosahotsprings.com/"&gt;Pagosa Hot Springs&lt;/a&gt; around 11. With 18 soaking pools, this turned out to be the perfect place to stay.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3128/3249967889_a90f2ebb53.jpg" rel="lightbox[silverton2009]" title="All the way to the top"&gt;&lt;img src="http://farm4.static.flickr.com/3128/3249967889_a90f2ebb53_t.jpg" width="75" height="100" alt="All the way to the top" class="picture" /&gt;&lt;/a&gt;
On Saturday morning, we woke up at 5 and drove 2 hours to Silverton Mountain. I didn't know what to expect at first. I had it in my mind that we'd be hiking for 5 hours and get one run in the entire day. I was pleasantly surprised to find you 1) ride the lift up and 2) hike to your run. We had a guide named "Ronbo" and our first hike took 1.5 hours. It was very steep and steep like a ladder in some sections. The &lt;em&gt;White Wave&lt;/em&gt; run was awesome in the middle, but somewhat skied off at the top. The powder was around boot-deep and the weather was beautiful.&lt;/p&gt;

&lt;p&gt;After a 2nd run and a much shorter hike, 5 of us decided we had to take the leap and do a &lt;a href="http://www.silvertonmountain.com/page/experience/heli"&gt;heli-drop&lt;/a&gt;. We rode to the top of the lift, got picked up by the chopper and rode for about 2 minutes to a neighboring peak. This was by far the best run of the day and one of my favorite ski experiences of my life.
&lt;/p&gt;
&lt;p&gt;We figured we couldn't top heli-skiing, so 3 of us called it a day around 3 o'clock. We did 3 runs all day and we were exhausted. A couple guys took a 4th run and the guys that didn't do heli-skiing got 5 runs in. A 2-hour drive back, some fireworks in Durango and a night of soaking at Pagosa Springs made us all very happy campers.&lt;/p&gt;
&lt;p&gt;On Sunday, we woke up and headed to Wolf Creek for a few hours. It was Local Appreciation Day and tickets were a mere $31! We did some hiking, found some powder and enjoyed some of the best skiing weather of the year. We hopped in the car around 2, kept the cruise control on 5-over-the-speed-limit and made it home in time to catch the Super Bowl (thanks to my DVR).
&lt;/p&gt;
&lt;p&gt;If you're in shape and are an expert skier, I highly recommend you take a trip to Silverton Mountain. It's truly epic.&lt;/p&gt;
&lt;p&gt;For more pictures from this trip, see my &lt;a href="http://flickr.com/photos/mraible/sets/72157613281253157/"&gt;Silverton 2009 set&lt;/a&gt; on Flickr.
</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/bye_bye_dream_machine</id>
        <title type="html">Bye Bye Dream Machine</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/bye_bye_dream_machine" />
        <published>2009-01-26T22:18:33-07:00</published>
        <updated>2009-06-18T14:41:49-06:00</updated> 
        <category term="/Mac OS X" label="Mac OS X" />
        <category term="macpro" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="linkedin" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dreammachine" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://raibledesigns.com/rd/entry/new_mac_pro" title="Mac Pro"&gt;&lt;img src="http://farm4.static.flickr.com/3049/2555084936_c6c0ec5a4b_t.jpg" width="51" height="100" alt="Mac Pro" class="picture" style="border: 0"/&gt;&lt;/a&gt;
This evening, I'm shipping back one of my &lt;a href="http://raibledesigns.com/rd/entry/new_mac_pro"&gt;favorite machines of all time&lt;/a&gt;. I received a fully-loaded Mac Pro as part of my employment with &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt; last June. It was necessary to run the LinkedIn application locally and I thoroughly enjoyed using it for the last 6 months. With 12GB of RAM and two 23" monitors, it was a great employee perk. 
&lt;/p&gt;
&lt;p&gt;
When I became a &lt;a href="http://raibledesigns.com/rd/entry/what_s_next"&gt;contractor again&lt;/a&gt;, they let me take my dream machine home. I promptly plugged in my &lt;a href="http://raibledesigns.com/rd/entry/life_with_a_30_monitor"&gt;30" monitor&lt;/a&gt; and I've been loving my home work environment ever since. I could have bought the machine from LinkedIn, but I discovered I can buy a brand new machine with similar specs for less than their asking price. 
&lt;/p&gt;
&lt;p&gt;The good news is I'm now able to answer the question I asked a couple years ago: &lt;a href="http://raibledesigns.com/rd/entry/one_30_monitor_or_two"&gt;One 30" monitor or two 23" monitors?&lt;/a&gt; IMO, one 30" monitor is definitely better and two 30" monitors would be awesome.
&lt;/p&gt;
&lt;p&gt;
In addition to the Mac Pro, I'll also be shipping back the 15" MacBook Pro they gave me. This leaves me with my &lt;a href="http://raibledesigns.com/rd/entry/macbook_pro_kicking_ass_and"&gt;17" MacBook Pro&lt;/a&gt; and an old &lt;a href="http://raibledesigns.com/rd/entry/new_computer_should_i_keep"&gt;HP Pavilion&lt;/a&gt; with Windows XP. I was hoping to plug my 30" into the HP, but I discovered I don't have a DVI card that will handle it. Over the next few months, I do plan on buying a new MacBook Pro (for work) and a Mac Pro (for home). With my &lt;a href="http://raibledesigns.com/rd/entry/running_to_work"&gt;running commute&lt;/a&gt;, I need to leave one machine downtown and I like to have one at home for the kids + late night hacking. 
&lt;/p&gt;
&lt;p&gt;
I'm currently having a hard time deciding if I should buy a MacBook Pro now or make do with what I have and just buy a new DVI card for my Windows box. I'm leaning towards a new 15" MacBook Pro (17" is too big to travel with). If I could get one with a 256GB SSD, I'd definitely be sold. 
&lt;/p&gt;
&lt;p&gt;
What would you do?</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/running_to_work</id>
        <title type="html">Running to Work</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/running_to_work" />
        <published>2009-01-26T21:55:36-07:00</published>
        <updated>2009-01-26T21:56:01-07:00</updated> 
        <category term="/General" label="General" />
        <category term="commute" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="challenge" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="running" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="commuting" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">A little over two weeks ago, &lt;a href="http://raibledesigns.com/rd/entry/r_i_p_giant_fcr3"&gt;my commuter bike was stolen&lt;/a&gt;. At the end of that entry, I wrote:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Rather than buying a new one, I think it's a good opportunity to take things up a notch and start running to work instead. It's 6 miles and surely doable with some practice. There's also a good chance it's the worst idea I've had in a long time.
&lt;/p&gt;
&lt;p&gt;The next day, I &lt;a href="http://twitter.com/mraible/status/1107133561"&gt;ran my first commute&lt;/a&gt; and discovered it was 5.1 miles instead of 6. It also took me just under an hour (with a 10 minute cool down at the end), indicating an average of 11 minute miles. Yeah, that's slow. Since then, I've run most of the time I've been in town. Currently, I'm only running 3 times per week because I've found back-to-back days make me ridiculously tired.&lt;/p&gt;
&lt;p&gt;I do hope to make it up to 4-days per week and possibly even do a couple round trips. Why am I doing this? Part of me wants to get in better shape, and the other part is too stubborn to buy a new bike. Yes, I will buy a new commuter bike eventually. My current goal is to run until April 1st or until I lose 20 pounds, whichever comes first.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3511/3229944271_5197a9c4df.jpg" title="After the run home" rel="lightbox[commutejan2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3511/3229944271_5197a9c4df_t.jpg" width="100" height="75" alt="After the run home" class="picture"/&gt;&lt;/a&gt;
The downside of running is it's easily the worst part of my day. It's the part I dread the most, especially on nights like tonight. When I left the office, it was dark and 6&amp;deg;F (-10&amp;deg;F with wind chill). Amazingly, I didn't get cold thanks to good layering. My face did end up with a lot of ice on it as evidenced by the photo on the right. I know the next couple months aren't going to be easy, but I always like a good challenge. 
&lt;/p&gt;
&lt;p&gt;
How have you challenged yourself lately?</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/the_kids_actually_like_skiing</id>
        <title type="html">The kids actually like skiing!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/the_kids_actually_like_skiing" />
        <published>2009-01-24T17:24:34-07:00</published>
        <updated>2009-01-24T17:27:57-07:00</updated> 
        <category term="/General" label="General" />
        <category term="jack" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="abbie" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="skiing" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="winterpark" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://farm4.static.flickr.com/3304/3224085560_21f71f1c2a.jpg" title="Helmet Stickers" rel="lightbox[wpjan2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3304/3224085560_21f71f1c2a_m.jpg" width="240" height="180" alt="Helmet Stickers" class="picture"/&gt;&lt;/a&gt;
The kids and I had a blast skiing at Winter Park today. I can't remember a day I've been more proud of my kids and their willingness to ski. I woke them up just before 6 AM this morning. I was very impressed when they both popped out of bed with huge smiles on their faces. They were actually &lt;em&gt;excited&lt;/em&gt; to go skiing. Their enthusiasm didn't end throughout the day and we had a ton of fun.&lt;/p&gt;
&lt;p&gt;I was most impressed with Abbie - she now wants to ski blues all the time. Not only that, but when she falls she has no problem getting up herself. Jack, on the other hand, can barely do "Pizza" and says "I can't" and "I'm scared" most of the time. I somehow convinced Abbie that if you believe you can do something, you can do it. She's been using that mantra whenever we ski and it's worked awesome for her.&lt;/p&gt;
&lt;p&gt;For the last run today, I told Abbie we could do a blue; Jack would only do it if I carried him. We rode to the top of Winter Park and skied down a steep blue/black. I imagine it was a pretty funny scene because it looked like I was in way over my head. Abbie was going slow, snow-plowing like mad, and I was skiing with Jack in my arms while he carried my poles. Several folks stopped to see if we needed help, but I told them it was all pre-planned. Abbie fell several times, but got up by herself every time and even got "the burn" towards the bottom. It's a good thing I've been running to work lately, carrying a 4-year-old top-to-bottom on a steep blue with 8" of powder can be quite a workout.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/traveling_to_tahoe_without_a</id>
        <title type="html">Traveling to Tahoe without a Driver's License</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/traveling_to_tahoe_without_a" />
        <published>2009-01-22T16:09:27-07:00</published>
        <updated>2009-01-23T00:19:45-07:00</updated> 
        <category term="/General" label="General" />
        <category term="tahoe" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="travel" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="rentalcar" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="vacation" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;a href="http://farm4.static.flickr.com/3468/3217382493_6471c50afd.jpg" rel="lightbox[tahoe2009]" title="View from our room"&gt;&lt;img src="http://farm4.static.flickr.com/3468/3217382493_6471c50afd_m.jpg" width="240" height="180" alt="View from our room" class="picture"/&gt;&lt;/a&gt;
This past weekend, I had quite the adventure traveling to Lake Tahoe. On Thursday night, I flew into Denver from LA and had a busy night tidying up loose ends. After 3 hours of sleep and a late start, I was on my way to DIA early Friday morning. As I was approaching the parking garage, the lights went on in my review mirror. 
&lt;/p&gt;
&lt;p&gt;
When the cop asked me for my license and registration, I opened my wallet and felt my heart sink. 
&lt;/p&gt;
&lt;p&gt;My driver's license was missing.&lt;/p&gt;
&lt;p&gt;I quickly realized I left it in my pants the night before and explained this to the officer. Luckily, I found my birth certificate in my car's console and was able to show him that. He still wasn't convinced. Then he looked at my coat and said "What about your ski pass?" It had a picture on it and seemed to satisfy his identification criteria.&lt;/p&gt;
&lt;p&gt;The cop then asked me why I was speeding (63 in a 45) and I politely explained my flight was departing in 30 minutes and I was hoping to make it. He said, "You won't make it. They won't let you check-in." I said I checked in online. He seemed to know this might work and quickly filled out the rest of my ticket. At this point, I didn't think it was possible to make my flight. I felt defeated and dreaded waiting all day until the next Frontier flight to Sacramento.&lt;/p&gt;
&lt;p&gt;I arrived at the counter (to check-in my skis) 20 minutes before the flight was scheduled for departure. Frontier was awesome - they checked in my bags and sent me on my way as fast as they could. TSA wasn't too bad; I just had to go through the extra screening. Of course, I had to run all the way through Terminal A to make my flight on time.&lt;/p&gt;
&lt;p&gt;While taxiing to the runway, I &lt;a href="http://twitter.com/mraible/status/1123896745"&gt;reflected&lt;/a&gt; on how awesome it was that I was utterly defeated 30 minutes prior and how the good people of Frontier Airlines made it all possible. Of course, when I arrived in Sacramento, my adventures continued with &lt;a href="http://twitter.com/mraible/status/1124377716"&gt;late baggage&lt;/a&gt; and &lt;a href="http://twitter.com/mraible/status/1124463554"&gt;rental car issues&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The good news is it all worked out in the end and I had a great weekend of skiing at Heavenly and Kirkwood. The snow wasn't great, but we skied in t-shirts all weekend. The Tahoe Trip seems to have become an annual tradition. Next year I'll make sure and bring my license. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/la_tech_meetup_tonight</id>
        <title type="html">LA Tech Meetup Tonight</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/la_tech_meetup_tonight" />
        <published>2009-01-14T11:40:12-07:00</published>
        <updated>2009-01-14T11:40:12-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="beer" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="la" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="techmeetup" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="meetup" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">If you live in LA - or just happen to be in town - you should join us for some beers and tech talk this evening. We're meeting at &lt;a href="http://losangeles.citysearch.com/profile/44702154/los_angeles_ca/the_village_idiot.html"&gt;The Village Idiot&lt;/a&gt; around 7 and plan on being there until 9. Hope to see you there!&lt;/p&gt;
&lt;p&gt;In other Tech Meetup News, it &lt;a href="http://twitter.com/sogrady/status/1116775965"&gt;looks like&lt;/a&gt; we'll be doing one in Denver next Thursday (January 22nd). Venue TBD.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/choosing_an_ajax_framework</id>
        <title type="html">Choosing an Ajax Framework</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/choosing_an_ajax_framework" />
        <published>2009-01-08T21:36:22-07:00</published>
        <updated>2009-01-08T21:42:59-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="extjs" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="frameworks" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="dojo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="comparison" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="webframeworks" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="gwt" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="yui" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajax" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This past week, my colleagues and I have been researching Ajax Frameworks. We're working on a project that's following SOFEA-style architecture principles and we want the best framework for our needs. I'm writing this post to see 1) if you, the community, agree with our selection process and 2) to learn about your experiences with the frameworks we're evaluating. Below is the process we're following to make our choice.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose a short list of frameworks to prototype with.&lt;/li&gt;
&lt;li&gt;Create an application prototype with each framework.&lt;/li&gt;
&lt;li&gt;Document findings and create a matrix with important criteria.&lt;/li&gt;
&lt;li&gt;Create presentation to summarize document.&lt;/li&gt;
&lt;li&gt;Deliver document, presentation (with demos) and recommendation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For #1, we chose  &lt;a href="http://extjs.com/products/extjs/"&gt;Ext JS&lt;/a&gt;, &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt; and &lt;a href="http://code.google.com/intl/nl/webtoolkit/"&gt;GWT&lt;/a&gt; because we feel these Ajax libraries offer the most UI widgets. We also considered Prototype/Scriptaculous, jQuery and MooTools, but decided against them because of their lack of UI widgets.&lt;/p&gt;
&lt;p&gt;For #2, we time-boxed ourselves to 3 days of development. In addition to basic functionality, we added several features (i.e. edit in place, drag and drop, calendar widgets, transitions, charts, grid) that might be used in the production application. We all were able to complete most of the functionality of the application. Of course, there's still some code cleanup as well as styling to make each app look good for the demo. The nice thing about doing this is we're able to look at each others code and see how the same thing is done in each framework. None of us are experts in any of the frameworks, so it's possible we could do things better. However, I think it's good we all started somewhat green because it shows what's possible for someone relatively new to the frameworks.&lt;/p&gt;
&lt;p&gt;For #3, we're creating a document with the following outline:&lt;/p&gt;
&lt;pre style="font-family: inherit; background: #CDFFCC; border: 1px solid #54FF52; width: 250px; padding-left: 20px"&gt;
Introduction

Ajax Framework Candidates
(intro and explanation)

  Project Information
  (history)
  (license / cost)
  (number of committers)
  (support options)
  (mailing list traffic (nov/dec 2008))

Matrix and Notes

Conclusion
&lt;/pre&gt;
&lt;p&gt;For the Matrix referenced in the outline above, we're using a table with weights and ranks:&lt;/p&gt;

&lt;table class="comparison" style="width: 500px"&gt;
    &lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;Weight&lt;/th&gt;
        &lt;th&gt;Criteria&lt;/th&gt;
        &lt;th&gt;Dojo&lt;/th&gt;
        &lt;th&gt;YUI&lt;/th&gt;
        &lt;th&gt;GWT&lt;/th&gt;
        &lt;th style="white-space: nowrap"&gt;Ext JS&lt;/th&gt;
        &lt;th&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;#&lt;/td&gt;
        &lt;td&gt;Important Criteria for Customer&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;Notes about rankings&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Our strategy for filling in this matrix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customer adjusts the weight for each criteria (removing/adding as needed) so all weights add up to 1.&lt;/li&gt;
&lt;li&gt;We rank each framework with 0, .5 or 1 where 0 = doesn't satisfy criteria, .5 = partially satisfies, 1 = satisfies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The list of criteria provided to us by our client is as follows (in no particular order).&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Quality of Documentation/Tutorials/Self Help&lt;/li&gt;
&lt;li&gt;Browser support (most important browsers/versions based on web stats)&lt;/li&gt;
&lt;li&gt;Testability (esp. Selenium compatibility)&lt;/li&gt;
&lt;li&gt;Licensing&lt;/li&gt;
&lt;li&gt;Project health/adoption&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Flexibility/extensibility&lt;/li&gt;
&lt;li&gt;Productivity (app dev, web dev)&lt;/li&gt;
&lt;li&gt;Richness of widget/component library&lt;/li&gt;
&lt;li&gt;Charting capability&lt;/li&gt;
&lt;li&gt;Ability to create new widgets&lt;/li&gt;
&lt;li&gt;Match to existing Java team skill-set&lt;/li&gt;
&lt;li&gt;Ease of deployment (on Ops, QA, Users)&lt;/li&gt;
&lt;li&gt;Degree of risk generally&lt;/li&gt;
&lt;li&gt;Ability to integrate with existing site (which includes Prototype)&lt;/li&gt;
&lt;li&gt;Easy to style with CSS&lt;/li&gt;
&lt;li&gt;Validation (esp. marking form elements invalid)&lt;/li&gt;
&lt;li&gt;Component Theme-ing/Decoration&lt;/li&gt;
&lt;li&gt;CDN Availability (i.e. Google's Ajax Libraries API or Ext CDN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do you think? How could this process be improved? Of course, if you have framework answers (0, .5 or 1) for our matrix, we'd love to hear your opinions.</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/r_i_p_giant_fcr3</id>
        <title type="html">R.I.P. Giant FCR3</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/r_i_p_giant_fcr3" />
        <published>2009-01-08T21:08:37-07:00</published>
        <updated>2009-01-09T10:36:04-07:00</updated> 
        <category term="/General" label="General" />
        <category term="bike" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="biking" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="giant" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">This week, I started a new gig at a new office in downtown Denver. On the first day, I was disappointed to find our building doesn't allow bikes inside. The next day, I went out and bought a new lock. Today, I walked out for the ride home to discover my bike had been stolen. &lt;img src="http://raibledesigns.com/images/smileys/cry.gif" class="smiley" alt=":'(" title=":'("/&gt;

&lt;/p&gt;
&lt;p&gt;At first I was shocked, then pissed, and then I noticed my lock was still there. This means, 1) I didn't wrap it around a tube or 2) someone cracked the lock and re-locked it. Of course, I find it hard to believe after all these years that I'd miss the tube when locking my bike. However, it'd be pretty strange if someone stole it and then went through the trouble to lock the lock again. Regardless, the &lt;a href="http://raibledesigns.com/rd/entry/new_bike_giant_fcr3"&gt;awesome commuter&lt;/a&gt; I bought over 3 years ago is gone. You will be missed my friend.&lt;/p&gt;

&lt;p style="text-align: center"&gt;
&lt;a href="http://www.flickr.com/photos/mraible/25102822/" title="New Commuter - Giant FCR3"&gt;&lt;img src="http://photos21.flickr.com/25102822_e08781d94f_m.jpg" width="240" height="180" alt="New Commuter - Giant FCR3" style="border: 1px solid black" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Rather than buying a new one, I think it's a good opportunity to take things up a notch and start running to work instead. It's 6 miles and surely doable with some practice. There's also a good chance it's the worst idea I've had in a long time. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://twitter.com/mraible/status/1107133561"&gt;Running wasn't too bad&lt;/a&gt;. </content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/happy_birthday_mom</id>
        <title type="html">Happy Birthday Mom!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/happy_birthday_mom" />
        <published>2009-01-04T12:08:28-07:00</published>
        <updated>2009-01-24T22:22:13-07:00</updated> 
        <category term="/General" label="General" />
        <category term="birthday" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="friends" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="travel" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="skiing" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="family" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mom" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="oregon" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="vacation" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">For the last couple weeks, I've been enjoying a great Christmas vacation in Oregon with most of my family. Abbie and Jack didn't join me, but they got to spend 3 weeks in West Palm Beach, Florida. Poor kids.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3215/3096148357_837b9df9e0.jpg" title="Mom on Playa Carrillo" rel="lightbox[mombirthday2009]"&gt;&lt;img src="http://farm4.static.flickr.com/3215/3096148357_837b9df9e0_m.jpg" width="240" height="180" alt="Mom on Playa Carrillo" class="picture" /&gt;&lt;/a&gt;
I made sure the end of my vacation would land on a very special person's birthday. My Mom. Not only is my mom one of the coolest people in the world, she also has an excellent job title: &lt;strong&gt;Burn Boss&lt;/strong&gt;. Growing up in Montana, I was always proud that Barb Raible was my mom. She was famous for her kindness in the Swan Valley. I hope she's always famous for her &lt;a href="http://raibledesigns.com/rd/entry/a_story_about_my_mom"&gt;story about nailing a bear's nuts to a tree&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;My mom is a Montana Native who wasn't afraid to raise her kids in the backwoods at her family's homestead. It sounds like a crazy idea to me, but she made it happen - cooking over a wood stove every day and working at the Swan Valley Ranger Station to make ends meet. She was responsible for getting us out of Montana and onto Oregon. She went back to school in her early 40s, got a degree in Forestry from the University of Montana and moved the whole family to Oregon for a job with the BLM.&lt;/p&gt;
&lt;p&gt;I moved to Oregon on June 14, 1990 driving a '73 Plymouth Duster with a homemade International trailer in tow. We certainly looked like we were from Montana when we rolled into town. We moved into a house on &lt;em&gt;Felony Flats&lt;/em&gt;. My sister and I got jobs at McDonald's (Dad's advice) and started school at North Salem High school in the fall. I met many good friends at North Salem - Jess, Matt, Clint and Michelle becoming favorites over the years.&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://twitpic.com/show/thumb/yypc.jpg" width="150" height="150" alt="Sunrise in Bend" class="picture"&gt;
For New Years, Jess, Clint and I rented a condo in Bend, Oregon. Matt joined us on Friday after most of us experienced an Epic Powder Day at Mt. Bachelor. It was the first time we'd all been together in 9 years. We &lt;a href="http://twitter.com/mraible/status/1092628714"&gt;had a blast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This vacation in Oregon has been very special to me. I've reunited with many old friends, enjoyed 2 epic powder days and had a great time with my Mom, Dad, Sister and her fiancé Mya. 
&lt;/p&gt;
&lt;p&gt;
As much fun as I've had, I'm looking forward to getting back to Denver and hanging out with my kids. January 2009 is sure to be one for the books. I start a new gig at a new office tomorrow. On Wednesday, the kids return from Florida to a mountain of presents at my house. My parents are coming to town next weekend, followed by a trip to Tahoe and a weekend in Steamboat to finish out the month. 
&lt;/p&gt;
&lt;p&gt;
Yeah, 2009 is going to be a lot of fun. Maybe I'll see you on the slopes. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/2008_a_year_in_review</id>
        <title type="html">2008 - A Year in Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/2008_a_year_in_review" />
        <published>2008-12-31T16:56:32-07:00</published>
        <updated>2008-12-31T16:59:54-07:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="yearinreview" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="blogging" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="roller" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="newyear" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="happynewyear" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">In &lt;a href="http://raibledesigns.com/rd/entry/2005_a_year_in_review"&gt;2005&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/2006_a_year_in_review"&gt;2006&lt;/a&gt;, I did "A Year in Review" entries. 2007 was the year I got divorced, which probably motivated me to &lt;a href="http://raibledesigns.com/rd/entry/goodbye_2007_hello_2008"&gt;write a bit less&lt;/a&gt;. This year I'm back and ready to spend the next few hours writing, copying/pasting and linking like a madman. Hope you enjoy!&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm3.static.flickr.com/2193/2176801650_2f3ef1a989_o.jpg" title="Workin' on the Feedlot" rel="lightbox[2008yearinreview]"&gt;&lt;img src="http://farm3.static.flickr.com/2193/2176801650_ba719a1151_t.jpg" width="100" height="75" alt="Workin' on the Feedlot" class="picture"/&gt;&lt;/a&gt;
2008 was the year I traveled the world and developed a true passion for skiing. In January, my good friend Jason Miller moved back to Denver after quitting his job at Bear Stearns in NYC. We spent the first &lt;a href="http://raibledesigns.com/rd/entry/a_weekend_in_nebraska"&gt;weekend in Nebraska working on Cletus's feedlot&lt;/a&gt;. The next week, &lt;a href="http://raibledesigns.com/rd/entry/snow_white_gets_molested"&gt;my car stereo got stolen&lt;/a&gt; and I wondered if my &lt;a href="http://raibledesigns.com/rd/entry/bad_knee"&gt;bad knee&lt;/a&gt; would make it through the ski season (the good news is not only did I ski the rest of the season, but my knee healed itself over the summer).

&lt;!--MotorWorks Restorations &lt;a href="http://raibledesigns.com/rd/entry/bus_project_update2"&gt;stopped by&lt;/a&gt; to take a look at the bus and I planned ski trips to &lt;a href="http://raibledesigns.com/rd/entry/tahoe_whistler_oregon_and_vegas"&gt;Tahoe and Whistler&lt;/a&gt;.--&gt;

&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm3.static.flickr.com/2201/2223691373_aecfdc3f2e_o.jpg" title="Abbie and Jack on Green Mountain" rel="lightbox[2008yearinreview]"&gt;&lt;img src="http://farm3.static.flickr.com/2201/2223691373_d8cce62ff7_t.jpg" width="100" height="75" alt="Abbie and Jack on Green Mountain" class="picture" /&gt;&lt;/a&gt;

At the end of January, the kids and I &lt;a href="http://raibledesigns.com/rd/entry/hike_up_green_mountain"&gt;hiked to the top of Green Mountain&lt;/a&gt; and Don Brown made &lt;a href="http://raibledesigns.com/rd/entry/don_brown_makes_maven_2"&gt;Maven not suck&lt;/a&gt;. Then I wondered if there was &lt;a href="http://raibledesigns.com/rd/entry/is_there_room_for_both"&gt;room for both Rails and Grails at a company&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/how_do_you_get_up"&gt;quickly learned both&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
February started fantastically with a &lt;a href="http://raibledesigns.com/rd/entry/powder_day_at_steamboat"&gt;14" Powder Day at Steamboat&lt;/a&gt;. I wondered if &lt;a href="http://raibledesigns.com/rd/entry/there_is_no_best_web"&gt;there is no "best" web framework&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/book_reviews_getting_started_with"&gt;reviewed Grails and Rails books&lt;/a&gt;. After spending an &lt;a href="http://raibledesigns.com/rd/entry/awesome_weekend_in_tahoe"&gt;awesome weekend in Tahoe&lt;/a&gt;, I took the kids on &lt;a href="http://raibledesigns.com/rd/entry/the_ski_train"&gt;The Ski Train&lt;/a&gt; and learned more about &lt;a href="http://raibledesigns.com/rd/entry/last_night_s_selenium_users"&gt;Selenium at Google&lt;/a&gt;.

&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2174/2277016439_2830b2b6a7_o.jpg" rel="lightbox[2008yearinreview]" title="Breathtaking"&gt;&lt;img src="http://farm3.static.flickr.com/2174/2277016439_10e2b92518_t.jpg" width="100" height="75" alt="Breathtaking" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2088/2277803758_3b0e52f526_o.jpg" rel="lightbox[2008yearinreview]" title="Miller and Vial"&gt;&lt;img src="http://farm3.static.flickr.com/2088/2277803758_2df8d91b36_t.jpg" width="100" height="75" alt="Miller and Vial" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;

&lt;a href="http://farm3.static.flickr.com/2355/2277815164_2d3080a4ed_o.jpg" title="Lake Tahoe - Last Run" rel="lightbox[2008yearinreview]"&gt;&lt;img src="http://farm3.static.flickr.com/2355/2277815164_beeb462e63_t.jpg" width="100" height="75" alt="Lake Tahoe - Last Run" style="border: 1px solid black; margin-left: 10px"/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This brings us to one of my favorite posts of all time. On February 28th, &lt;a href="http://raibledesigns.com/rd/entry/jack_s_got_a_bead"&gt;Jack got a bead stuck in his nose&lt;/a&gt;. After taking him to the ER and paying $800, we found out magic recipe for bead removal is to "hold one nostril and give him a CPR-type breath/blow into his mouth". The reason I love the post so much is it's solved the problem for other frantic parents when they Google for "&lt;a href="http://www.google.com/search?q=bead+stuck+in+nose"&gt;bead stuck in nose&lt;/a&gt;". Whenever I get a new comment, it always makes me smile.&lt;/p&gt;
&lt;p&gt;March started out with a 
&lt;a href="http://raibledesigns.com/rd/entry/powder_day_at_whistler"&gt;Powder Day at Whistler&lt;/a&gt;. I thoroughly enjoyed the &lt;a href="http://raibledesigns.com/rd/entry/spectacular_weekend_at_whistler"&gt;rest of the weekend&lt;/a&gt; with good friends Jarvis and Korn Dog. After returning to Denver, I was allowed to blog about &lt;a href="http://raibledesigns.com/rd/entry/the_linkedin_journey_continues"&gt;building a UI Frameworks Team at LinkedIn&lt;/a&gt; and posted my thoughts on &lt;a href="http://raibledesigns.com/rd/entry/grails_vs_rails_my_thoughts"&gt;Grails vs. Rails&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3209/2335710992_edd490ce6b_o.jpg" rel="lightbox[2008yearinreview]" title="View from Our Condo"&gt;&lt;img src="http://farm4.static.flickr.com/3209/2335710992_8c992727de_t.jpg" width="100" height="75" alt="View from Our Condo" class="picture" style="float: left" /&gt;&lt;/a&gt;
In mid-March, I achieved an &lt;a href="http://raibledesigns.com/rd/entry/my_entire_family_is_now"&gt;all-Mac family&lt;/a&gt; and traveled to &lt;a href="http://raibledesigns.com/rd/entry/lake_chelan"&gt;Lake Chelan&lt;/a&gt; for my sister's birthday. Shortly after, &lt;a href="http://raibledesigns.com/rd/entry/the_appfuse_primer_is_now"&gt;The AppFuse Primer&lt;/a&gt; was released. At the end of the month, I attended &lt;a href="http://raibledesigns.com/rd/entry/tssjs_vegas_begins"&gt;TSSJS in Vegas&lt;/a&gt; and moderated a &lt;a href="http://raibledesigns.com/rd/entry/the_web_framework_smackdown_questions"&gt;Web Framework Smackdown&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;In April, the &lt;a href="http://www.flickr.com/photos/mraible/sets/72157605402333390/"&gt;LinkedIn Denver office&lt;/a&gt; opened and we all celebrated by attending the Rockie's Home Opener. The &lt;a href="http://raibledesigns.com/rd/entry/the_2007_8_ski_season"&gt;ski season came to an end&lt;/a&gt; and I wrote a howto for &lt;a href="http://raibledesigns.com/rd/entry/apache_2_on_os_x"&gt;configuring Apache with mod_proxy and SSL on OS X&lt;/a&gt;. Then I discovered the &lt;a href="http://raibledesigns.com/rd/entry/javaone_where_are_the_good"&gt;JavaOne parties&lt;/a&gt; and wrote about &lt;a href="http://raibledesigns.com/rd/entry/running_spring_mvc_web_applications"&gt;running Spring MVC Web Applications in OSGi&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;April ended with 82&amp;deg;F and &lt;a href="http://raibledesigns.com/rd/entry/denver_weather1"&gt;May started with snow&lt;/a&gt;. I attended JavaOne (or at least the &lt;a href="http://raibledesigns.com/rd/entry/javaone_parties"&gt;parties&lt;/a&gt;), released &lt;a href="http://raibledesigns.com/rd/entry/appfuse_2_0_2_released"&gt;AppFuse 2.0.2&lt;/a&gt; and figured out &lt;a href="http://raibledesigns.com/rd/entry/extensionless_urls_in_java_web"&gt;how to do extensionless URLs with the UrlRewriteFilter&lt;/a&gt;. The kids and I spent &lt;a href="http://raibledesigns.com/rd/entry/an_afternoon_in_rocky_mountain"&gt;an afternoon in Rocky Mountain National Park&lt;/a&gt; and I did some coding in &lt;a href="http://raibledesigns.com/rd/entry/it_s_a_beautiful_night"&gt;my backyard&lt;/a&gt;. 
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm3.static.flickr.com/2003/2500490237_9d63b4e1ab_o.jpg" rel="lightbox[2008yearinreview]" title="Jack's Special Rock"&gt;&lt;img src="http://farm3.static.flickr.com/2003/2500490237_538e3c7e72_t.jpg" width="100" height="75" alt="Jack's Special Rock" style="border: 1px solid black" /&gt;&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2068/2500489689_3d02e76562_o.jpg" rel="lightbox[2008yearinreview]" title="Nice Trail"&gt;&lt;img src="http://farm3.static.flickr.com/2068/2500489689_7eded80450_t.jpg" width="100" height="75" alt="Nice Trail" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2376/2501319338_4108f16ec7_o.jpg" rel="lightbox[2008yearinreview]" title="Beautiful Smile"&gt;&lt;img src="http://farm3.static.flickr.com/2376/2501319338_485e94c7bb_t.jpg" width="100" height="75" alt="Beautiful Smile" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2286/2501319868_0895a29abb_o.jpg" rel="lightbox[2008yearinreview]" title="Here's Hoping for another run in October"&gt;&lt;img src="http://farm3.static.flickr.com/2286/2501319868_f9f610b160_t.jpg" width="100" height="75" alt="Here's Hoping for another run in October" style="border: 1px solid black; margin-left: 10px" /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;On Memorial Day, I enjoyed a liver-wrenching, Rockies-filled weekend with my sister her girlfriend Mya and Mr. Miller. I also contemplated &lt;a href="http://raibledesigns.com/rd/entry/should_we_retool_appfuse_to"&gt;making AppFuse Struts 2-specific&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;June started with some &lt;a href="http://raibledesigns.com/rd/entry/deer_creek_trail"&gt;mountain bike riding&lt;/a&gt;, planning some &lt;a href="http://raibledesigns.com/rd/entry/2008_the_year_of_beer"&gt;excellent vacations&lt;/a&gt; and getting a &lt;a href="http://raibledesigns.com/rd/entry/new_mac_pro"&gt;dream machine&lt;/a&gt;. I rode the &lt;a href="http://raibledesigns.com/rd/entry/riding_to_red_rocks"&gt;annual trip to Big Head Todd at Red Rocks&lt;/a&gt; with Matt and &lt;a href="http://bruceblog.org"&gt;Bruce&lt;/a&gt;. I took the kids on their first &lt;a href="http://raibledesigns.com/rd/entry/the_father_s_day_camping"&gt;camping trip for Father's Day&lt;/a&gt; and had a blast. It took us several hours to find the campsite and my car kept starting all night long. It's sure to be a family tradition from now on.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm4.static.flickr.com/3027/2583211974_01828c7c51.jpg" rel="lightbox[2008yearinreview]" title="Abbie Camping"&gt;&lt;img src="http://farm4.static.flickr.com/3027/2583211974_01828c7c51_t.jpg" width="100" height="75" alt="" style="border: 1px solid black" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3084/2582383333_ef7a747b67.jpg" rel="lightbox[2008yearinreview]" title="Camping!"&gt;&lt;img src="http://farm4.static.flickr.com/3084/2582383333_ef7a747b67_t.jpg" width="100" height="75" alt="" style="border: 1px solid black;margin-left: 10px" /&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3043/2582383491_39f25894e6.jpg" rel="lightbox[2008yearinreview]" title="Catchin' Bugs"&gt;&lt;img src="http://farm4.static.flickr.com/3043/2582383491_39f25894e6_t.jpg" width="100" height="75" alt="Catchin' Bugs" style="border: 1px solid black;margin-left: 10px" /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
The next weekend, I attended the &lt;a href="http://raibledesigns.com/rd/entry/traveled_coast_to_coast_last"&gt;American Craft Beer Fest in Boston&lt;/a&gt;. To end the month, I embarked upon &lt;a href="http://raibledesigns.com/rd/entry/raible_road_trip_12"&gt;Raible Road Trip #12&lt;/a&gt; with Abbie, Jack and my Dad.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3188/2644734419_4567732e7d.jpg" rel="lightbox[2008yearinreview]" title="Grand Tetons"&gt;&lt;img src="http://farm4.static.flickr.com/3188/2644734419_4567732e7d_t.jpg" width="100" height="75" alt="Grand Tetons" class="picture" style="float: left" /&gt;&lt;/a&gt;
In July, the &lt;a href="http://raibledesigns.com/rd/entry/bus_project_update3"&gt;bus project began&lt;/a&gt; and I &lt;a href="http://raibledesigns.com/rd/entry/raible_road_trip_12_vacation"&gt;posted pictures&lt;/a&gt; of the trip to Montana. This year, I hope to spend the whole month of July at the cabin. I bought an &lt;a href="http://raibledesigns.com/rd/entry/my_iphone_review"&gt;iPhone&lt;/a&gt; (one of my best technology-related purchases to date). &lt;a href="http://raibledesigns.com/rd/entry/oscon_2008_wrapup"&gt;OSCON&lt;/a&gt; was fun but the &lt;a href="http://raibledesigns.com/rd/entry/the_oscon_aftermath"&gt;week after&lt;/a&gt; wasn't.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3272/2737564340_c0e6f5bd79.jpg" title="Nice 'n Snug" rel="lightbox[2008yearinreview]"&gt;&lt;img src="http://farm4.static.flickr.com/3272/2737564340_c0e6f5bd79_t.jpg" width="100" height="75" alt="Nice 'n Snug" class="picture" /&gt;&lt;/a&gt;
August revealed &lt;a href="http://raibledesigns.com/rd/entry/awesome_birthday_present_a_kegerator"&gt;my favorite birthday present&lt;/a&gt;. I didn't blog much the rest of the month, &lt;a href="http://raibledesigns.com/rd/entry/why_such_a_busy_week"&gt;revealing why&lt;/a&gt; later. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm4.static.flickr.com/3156/2831144149_83b82ee681.jpg" title="Jack on his 4th Birthday" rel="lightbox[2008yearinreview]"&gt;&lt;img src="http://farm4.static.flickr.com/3156/2831144149_83b82ee681_t.jpg" width="100" height="75" alt="Jack on his 4th Birthday" class="picture" style="float: left" /&gt;&lt;/a&gt;
&lt;a href="http://raibledesigns.com/rd/entry/happy_birthday_jack2"&gt;Jack's Birthday Weekend&lt;/a&gt; was an outstandingly fun mixture of old friends and good Colorado beer. In September, I went to &lt;a href="http://raibledesigns.com/rd/entry/pictures_of_the_bus_at"&gt;see the bus at MotorWorks&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/entry/abbie_gets_her_first_tooth"&gt;Abbie lost her first tooth&lt;/a&gt; and co-workers and I &lt;a href="http://raibledesigns.com/rd/entry/performance_testing_memcached"&gt;performance tested Memcached&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;What followed was wonderful. Miller and I headed to &lt;a href="http://raibledesigns.com/rd/entry/my_oktoberfest_adventure_begins"&gt;Oktoberfest&lt;/a&gt; for the &lt;a href="http://raibledesigns.com/rd/entry/oktoberfest_best_vacation_ever"&gt;Best. Vacation. Ever.&lt;/a&gt; We still talk about how much fun we had on that vacation. October finished with the &lt;a href="http://raibledesigns.com/rd/entry/colorado_software_summit_2008_wrapup"&gt;Colorado Software Summit&lt;/a&gt; and a &lt;a href="http://raibledesigns.com/rd/entry/great_weekend_in_montana"&gt;hunting trip to the cabin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;November was a crazy month. I &lt;a href="http://raibledesigns.com/rd/entry/linkedin_cuts_10_a_k"&gt;got laid off&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/happy_birthday_abbie4"&gt;celebrated Abbie's birthday&lt;/a&gt; on the same day. &lt;a href="http://raibledesigns.com/rd/entry/jack_s_mohawk"&gt;Jack got a mohawk&lt;/a&gt; and I traveled &lt;a href="http://twitter.com/mraible/status/1011089121"&gt;coast&lt;/a&gt;-to-&lt;a href="http://twitter.com/mraible/status/1013365839"&gt;coast&lt;/a&gt; in the same week. To close the month, I announced &lt;a href="http://raibledesigns.com/rd/entry/what_s_next"&gt;what's next&lt;/a&gt; and headed to Costa Rica.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://www.flickr.com/photos/rmisek/3059809175/" title="Costa Rica, courtesy of Rob Misek"&gt;&lt;img src="http://farm4.static.flickr.com/3054/3059809175_9cac54fbba_m.jpg" style="border: 1px solid black" width="240" height="160" alt="Costa Rica, courtesy of Rob Misek" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I had a &lt;a href="http://raibledesigns.com/rd/entry/costa_rica_was_awesome"&gt;fantastic time in Costa Rica&lt;/a&gt; and was impressed to see &lt;a href="http://raibledesigns.com/rd/entry/abbie_is_a_blue_skier"&gt;Abbie is a blue skier&lt;/a&gt; shortly after. I did a &lt;a href="http://raibledesigns.com/rd/entry/dojo_comet_support_in_java"&gt;Dojo/Comet Research Project&lt;/a&gt; for a week and enjoyed the &lt;a href="http://twitter.com/mraible/status/1074357106"&gt;location of my newest client&lt;/a&gt; last week. A &lt;a href="http://raibledesigns.com/rd/entry/my_christmas_travel_adventure"&gt;small adventure&lt;/a&gt; turned into a &lt;a href="http://raibledesigns.com/rd/entry/my_almost_slept_in_a"&gt;scary adventure&lt;/a&gt; and I enjoyed telling my stories to &lt;a href="http://raibledesigns.com/rd/entry/portland_tech_meetup_tomorrow_night"&gt;fellow Java Enthusiasts&lt;/a&gt; in Portland. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Phew!&lt;/em&gt; It's been quite a year. For 2009, I'm still hoping for what I &lt;a href="http://twitter.com/mraible/statuses/1047760670"&gt;tweeted shortly after Costa Rica&lt;/a&gt;. I'd like to visit 3 foreign countries, take 3 months of vacation and spend 1 month in Montana. I have technology goals too, but those aren't nearly as much fun to dream about. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Happy New Year!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>http://raibledesigns.com/rd/entry/portland_tech_meetup_tomorrow_night</id>
        <title type="html">Portland Tech Meetup Tomorrow Night</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="http://raibledesigns.com/rd/entry/portland_tech_meetup_tomorrow_night" />
        <published>2008-12-28T16:18:35-07:00</published>
        <updated>2008-12-28T16:22:05-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="beer" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="portland" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="meetup" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="techmeetup" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">If you live in Portland, Oregon - or just happen to be in town - you might want to join us for some beers and tech talk tomorrow (Monday) night. &lt;a href="http://lightbody.net/blog/"&gt;Patrick Lightbody&lt;/a&gt;, &lt;a href="http://tapestryjava.blogspot.com/"&gt;Howard Lewis Ship&lt;/a&gt; and myself will be meeting around 6:30 at the &lt;a href="http://www.rogue.com/locations/locations.php#5"&gt;Rogue Distillery &amp;amp; Public House&lt;/a&gt; (&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=1339+NW+Flanders%2C+Portland%2C+OR"&gt;map&lt;/a&gt;). With 36 taps and the delicious beer from Rogue Ales, this is sure to be a fun night.&lt;/p&gt;
&lt;p&gt;If you're on Facebook, you can let us know you're coming by &lt;a href="http://www.facebook.com/event.php?eid=42198451686"&gt;RSVP'ing to the Event&lt;/a&gt;. Otherwise, please leave a comment or just show up. </content>
    </entry>
</feed>
